This repository was archived by the owner on Oct 22, 2024. It is now read-only.

Cleanup and fixes - #69

Open
lemonyte wants to merge 13 commits into
deta:nextfrom
lemonyte:master
Open

Cleanup and fixes#69
lemonyte wants to merge 13 commits into
deta:nextfrom
lemonyte:master

Conversation

@lemonyte

Copy link
Copy Markdown
Contributor

Cleaned up and formatted the code, also fixed a couple broken tests.
Changes:

  • Changed minimum supported Python version to 3.6 since f-strings and async yield are used
  • Replaced type() check with isinstance() check
  • Replaced asserts in main package code with proper exceptions
  • Replaced .format() calls with f-strings since they are already used in other places
  • Added host parameter to Base() and Drive() functions not in the Deta class
  • Removed accidental unused import
  • Removed trailing and blank line whitespace
  • Fixed test command in CONTRIBUTING.md
  • Fixed test_ttl test
  • Added DETA_SDK_TEST_TTL_ATTRIBUTE to env.sample as seen in the pull request workflow
  • Various other formatting and style changes using flake8
  • Formatted using black -l 100 (same as Clean-Up #48)

What is the purpose of the Deta class in __init__.py? It doesn't seem to accomplish anything new that isn't already available when using the module directly, other than setting the project key and id manually. It's a little confusing having two almost identical sets of methods. Perhaps a better solution would be to have an init() function to manually set the project key and id.

@abdelhaiabdelhai mentioned this pull request May 16, 2022
@abdelhai

Copy link
Copy Markdown
Contributor

hi @LemonPi314 thanks for the great PR!
what are your thought about the previous PRs we received? Worth reworking them in this PR?

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

what are your thought about the previous PRs we received? Worth reworking them in this PR?

I would be happy to do that, or if you prefer I could open a new PR. Any in particular you want me to take a look at?

@abdelhai

Copy link
Copy Markdown
Contributor

@LemonPi314 thanks for the quick response! i feel all are worth taking a look at, you could help us decide which ones we should consider merging. one new monolithic PR would be awesome!

i'm assuming this/the new pr will be breaking and we'll have to release a major version. rn, maybe we could group that with async support... what do you think?

@abdelhai
abdelhai self-requested a review May 17, 2022 21:22
@abdelhaiabdelhai added WIP major new features, api-breaking and removed investigating labels May 17, 2022
@lemonyte

Copy link
Copy Markdown
ContributorAuthor

So far nothing in any of the PRs are breaking changes (type hints, formatting, and an added argument to the AsyncBase class).
I will integrate #14#68 and #70 into this PR.
As for async support, I do think that would be better off separate, since that may include some breaking changes.

@abdelhai

Copy link
Copy Markdown
Contributor

i believe yours already does as you're raising a ValueError instead of other exceptions/errors.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

That is true. In that case it may be worth changing the package behavior slightly as described in my original comment since it is a breaking change as well.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

A few questions:

  • For type hints is typing.Optional preferred for all the optional arguments (where None is the default value)?
  • Should I add an argument for an external session here or wait until it gets resolved in its own PR?

@abdelhai

Copy link
Copy Markdown
Contributor

the reason behind the Deta class is that you configure the Deta cloient once and you can use all the services. (on Micros, it's per-configured, hence why you can just import the service "class". It's a better devex imo:

# this is the original apifromdetaimportDetadeta=Deta(<mykey/futureconfig>)
users=deta.Base("users")
photos=deta.Drive("photos")
# this is just a convenience api that works on Micros OR if the project key is set in the environmentfromdetaimportBase, Driveusers=Base("users")
photos=Drive("photos")

We can require devs to put the project key in the env, but what happens if we need more config?

For type hints is typing.Optional preferred for all the optional arguments (where None is the default value)?

is this the pythonic way of doing it? haven't touch python code for a while.

Should I add an argument for an external session here or wait until it gets resolved in its own PR?

you are right, let's keep async separate. i need to think about the api design

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

is this the pythonic way of doing it?

It is good practice to explicitly specify that a parameter type can be None when its default value is a literal None. However it adds a bit of bloat to the code so if you're against it do let me know.
The slight difference shows up in editor tooltips.
image
image

Without Optional (original):

defBase(self, name: str, host: str=None):

With Optional:

defBase(self, name: str, host: typing.Optional[str] =None):

For methods where there are two mutually exclusive parameters, like expire_in and expire_at, I will add overloads for better clarity.

@abdelhai

Copy link
Copy Markdown
Contributor

thanks for the clarification! I'm not seeing the benefit from typing.Optional[str], the first screenshot shows everything the developer needs to know to use the API. So, I would leave it out to reduce bloat.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

Update:

  • Improved type hints across all files
  • Added overloads for some methods
  • Minor refactoring changes
  • Combined fetch() and _fetch() methods in _Base() class
  • Minor changes in tests
  • Updated scripts according to CONTRIBUTING.md

@abdelhai
abdelhai requested a review from aavshrMay 30, 2022 19:43
@lemonyte

Copy link
Copy Markdown
ContributorAuthor

@abdelhai it seems the checks are failing due to missing project keys. Can you check the workflow secrets?

@lemonyte
lemonyte changed the base branch from master to nextAugust 19, 2022 18:10
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

help wantedExtra attention is neededmajornew features, api-breakingWIP

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@lemonyte@abdelhai@pomdtr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Oct 22, 2024. It is now read-only.

Cleanup and fixes - #69

Open
lemonyte wants to merge 13 commits into
deta:nextfrom
lemonyte:master
Open

Cleanup and fixes#69
lemonyte wants to merge 13 commits into
deta:nextfrom
lemonyte:master

Conversation

@lemonyte

Copy link
Copy Markdown
Contributor

Cleaned up and formatted the code, also fixed a couple broken tests.
Changes:

  • Changed minimum supported Python version to 3.6 since f-strings and async yield are used
  • Replaced type() check with isinstance() check
  • Replaced asserts in main package code with proper exceptions
  • Replaced .format() calls with f-strings since they are already used in other places
  • Added host parameter to Base() and Drive() functions not in the Deta class
  • Removed accidental unused import
  • Removed trailing and blank line whitespace
  • Fixed test command in CONTRIBUTING.md
  • Fixed test_ttl test
  • Added DETA_SDK_TEST_TTL_ATTRIBUTE to env.sample as seen in the pull request workflow
  • Various other formatting and style changes using flake8
  • Formatted using black -l 100 (same as Clean-Up #48)

What is the purpose of the Deta class in __init__.py? It doesn't seem to accomplish anything new that isn't already available when using the module directly, other than setting the project key and id manually. It's a little confusing having two almost identical sets of methods. Perhaps a better solution would be to have an init() function to manually set the project key and id.

@abdelhaiabdelhai mentioned this pull request May 16, 2022
@abdelhai

Copy link
Copy Markdown
Contributor

hi @LemonPi314 thanks for the great PR!
what are your thought about the previous PRs we received? Worth reworking them in this PR?

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

what are your thought about the previous PRs we received? Worth reworking them in this PR?

I would be happy to do that, or if you prefer I could open a new PR. Any in particular you want me to take a look at?

@abdelhai

Copy link
Copy Markdown
Contributor

@LemonPi314 thanks for the quick response! i feel all are worth taking a look at, you could help us decide which ones we should consider merging. one new monolithic PR would be awesome!

i'm assuming this/the new pr will be breaking and we'll have to release a major version. rn, maybe we could group that with async support... what do you think?

@abdelhai
abdelhai self-requested a review May 17, 2022 21:22
@abdelhaiabdelhai added WIP major new features, api-breaking and removed investigating labels May 17, 2022
@lemonyte

Copy link
Copy Markdown
ContributorAuthor

So far nothing in any of the PRs are breaking changes (type hints, formatting, and an added argument to the AsyncBase class).
I will integrate #14#68 and #70 into this PR.
As for async support, I do think that would be better off separate, since that may include some breaking changes.

@abdelhai

Copy link
Copy Markdown
Contributor

i believe yours already does as you're raising a ValueError instead of other exceptions/errors.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

That is true. In that case it may be worth changing the package behavior slightly as described in my original comment since it is a breaking change as well.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

A few questions:

  • For type hints is typing.Optional preferred for all the optional arguments (where None is the default value)?
  • Should I add an argument for an external session here or wait until it gets resolved in its own PR?

@abdelhai

Copy link
Copy Markdown
Contributor

the reason behind the Deta class is that you configure the Deta cloient once and you can use all the services. (on Micros, it's per-configured, hence why you can just import the service "class". It's a better devex imo:

# this is the original apifromdetaimportDetadeta=Deta(<mykey/futureconfig>)
users=deta.Base("users")
photos=deta.Drive("photos")
# this is just a convenience api that works on Micros OR if the project key is set in the environmentfromdetaimportBase, Driveusers=Base("users")
photos=Drive("photos")

We can require devs to put the project key in the env, but what happens if we need more config?

For type hints is typing.Optional preferred for all the optional arguments (where None is the default value)?

is this the pythonic way of doing it? haven't touch python code for a while.

Should I add an argument for an external session here or wait until it gets resolved in its own PR?

you are right, let's keep async separate. i need to think about the api design

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

is this the pythonic way of doing it?

It is good practice to explicitly specify that a parameter type can be None when its default value is a literal None. However it adds a bit of bloat to the code so if you're against it do let me know.
The slight difference shows up in editor tooltips.
image
image

Without Optional (original):

defBase(self, name: str, host: str=None):

With Optional:

defBase(self, name: str, host: typing.Optional[str] =None):

For methods where there are two mutually exclusive parameters, like expire_in and expire_at, I will add overloads for better clarity.

@abdelhai

Copy link
Copy Markdown
Contributor

thanks for the clarification! I'm not seeing the benefit from typing.Optional[str], the first screenshot shows everything the developer needs to know to use the API. So, I would leave it out to reduce bloat.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

Update:

  • Improved type hints across all files
  • Added overloads for some methods
  • Minor refactoring changes
  • Combined fetch() and _fetch() methods in _Base() class
  • Minor changes in tests
  • Updated scripts according to CONTRIBUTING.md

@abdelhai
abdelhai requested a review from aavshrMay 30, 2022 19:43
@lemonyte

Copy link
Copy Markdown
ContributorAuthor

@abdelhai it seems the checks are failing due to missing project keys. Can you check the workflow secrets?

@lemonyte
lemonyte changed the base branch from master to nextAugust 19, 2022 18:10
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

help wantedExtra attention is neededmajornew features, api-breakingWIP

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@lemonyte@abdelhai@pomdtr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Oct 22, 2024. It is now read-only.

Cleanup and fixes - #69

Open
lemonyte wants to merge 13 commits into
deta:nextfrom
lemonyte:master
Open

Cleanup and fixes#69
lemonyte wants to merge 13 commits into
deta:nextfrom
lemonyte:master

Conversation

@lemonyte

Copy link
Copy Markdown
Contributor

Cleaned up and formatted the code, also fixed a couple broken tests.
Changes:

  • Changed minimum supported Python version to 3.6 since f-strings and async yield are used
  • Replaced type() check with isinstance() check
  • Replaced asserts in main package code with proper exceptions
  • Replaced .format() calls with f-strings since they are already used in other places
  • Added host parameter to Base() and Drive() functions not in the Deta class
  • Removed accidental unused import
  • Removed trailing and blank line whitespace
  • Fixed test command in CONTRIBUTING.md
  • Fixed test_ttl test
  • Added DETA_SDK_TEST_TTL_ATTRIBUTE to env.sample as seen in the pull request workflow
  • Various other formatting and style changes using flake8
  • Formatted using black -l 100 (same as Clean-Up #48)

What is the purpose of the Deta class in __init__.py? It doesn't seem to accomplish anything new that isn't already available when using the module directly, other than setting the project key and id manually. It's a little confusing having two almost identical sets of methods. Perhaps a better solution would be to have an init() function to manually set the project key and id.

@abdelhaiabdelhai mentioned this pull request May 16, 2022
@abdelhai

Copy link
Copy Markdown
Contributor

hi @LemonPi314 thanks for the great PR!
what are your thought about the previous PRs we received? Worth reworking them in this PR?

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

what are your thought about the previous PRs we received? Worth reworking them in this PR?

I would be happy to do that, or if you prefer I could open a new PR. Any in particular you want me to take a look at?

@abdelhai

Copy link
Copy Markdown
Contributor

@LemonPi314 thanks for the quick response! i feel all are worth taking a look at, you could help us decide which ones we should consider merging. one new monolithic PR would be awesome!

i'm assuming this/the new pr will be breaking and we'll have to release a major version. rn, maybe we could group that with async support... what do you think?

@abdelhai
abdelhai self-requested a review May 17, 2022 21:22
@abdelhaiabdelhai added WIP major new features, api-breaking and removed investigating labels May 17, 2022
@lemonyte

Copy link
Copy Markdown
ContributorAuthor

So far nothing in any of the PRs are breaking changes (type hints, formatting, and an added argument to the AsyncBase class).
I will integrate #14#68 and #70 into this PR.
As for async support, I do think that would be better off separate, since that may include some breaking changes.

@abdelhai

Copy link
Copy Markdown
Contributor

i believe yours already does as you're raising a ValueError instead of other exceptions/errors.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

That is true. In that case it may be worth changing the package behavior slightly as described in my original comment since it is a breaking change as well.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

A few questions:

  • For type hints is typing.Optional preferred for all the optional arguments (where None is the default value)?
  • Should I add an argument for an external session here or wait until it gets resolved in its own PR?

@abdelhai

Copy link
Copy Markdown
Contributor

the reason behind the Deta class is that you configure the Deta cloient once and you can use all the services. (on Micros, it's per-configured, hence why you can just import the service "class". It's a better devex imo:

# this is the original apifromdetaimportDetadeta=Deta(<mykey/futureconfig>)
users=deta.Base("users")
photos=deta.Drive("photos")
# this is just a convenience api that works on Micros OR if the project key is set in the environmentfromdetaimportBase, Driveusers=Base("users")
photos=Drive("photos")

We can require devs to put the project key in the env, but what happens if we need more config?

For type hints is typing.Optional preferred for all the optional arguments (where None is the default value)?

is this the pythonic way of doing it? haven't touch python code for a while.

Should I add an argument for an external session here or wait until it gets resolved in its own PR?

you are right, let's keep async separate. i need to think about the api design

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

is this the pythonic way of doing it?

It is good practice to explicitly specify that a parameter type can be None when its default value is a literal None. However it adds a bit of bloat to the code so if you're against it do let me know.
The slight difference shows up in editor tooltips.
image
image

Without Optional (original):

defBase(self, name: str, host: str=None):

With Optional:

defBase(self, name: str, host: typing.Optional[str] =None):

For methods where there are two mutually exclusive parameters, like expire_in and expire_at, I will add overloads for better clarity.

@abdelhai

Copy link
Copy Markdown
Contributor

thanks for the clarification! I'm not seeing the benefit from typing.Optional[str], the first screenshot shows everything the developer needs to know to use the API. So, I would leave it out to reduce bloat.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

Update:

  • Improved type hints across all files
  • Added overloads for some methods
  • Minor refactoring changes
  • Combined fetch() and _fetch() methods in _Base() class
  • Minor changes in tests
  • Updated scripts according to CONTRIBUTING.md

@abdelhai
abdelhai requested a review from aavshrMay 30, 2022 19:43
@lemonyte

Copy link
Copy Markdown
ContributorAuthor

@abdelhai it seems the checks are failing due to missing project keys. Can you check the workflow secrets?

@lemonyte
lemonyte changed the base branch from master to nextAugust 19, 2022 18:10
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

help wantedExtra attention is neededmajornew features, api-breakingWIP

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@lemonyte@abdelhai@pomdtr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Oct 22, 2024. It is now read-only.

Cleanup and fixes - #69

Open
lemonyte wants to merge 13 commits into
deta:nextfrom
lemonyte:master
Open

Cleanup and fixes#69
lemonyte wants to merge 13 commits into
deta:nextfrom
lemonyte:master

Conversation

@lemonyte

Copy link
Copy Markdown
Contributor

Cleaned up and formatted the code, also fixed a couple broken tests.
Changes:

  • Changed minimum supported Python version to 3.6 since f-strings and async yield are used
  • Replaced type() check with isinstance() check
  • Replaced asserts in main package code with proper exceptions
  • Replaced .format() calls with f-strings since they are already used in other places
  • Added host parameter to Base() and Drive() functions not in the Deta class
  • Removed accidental unused import
  • Removed trailing and blank line whitespace
  • Fixed test command in CONTRIBUTING.md
  • Fixed test_ttl test
  • Added DETA_SDK_TEST_TTL_ATTRIBUTE to env.sample as seen in the pull request workflow
  • Various other formatting and style changes using flake8
  • Formatted using black -l 100 (same as Clean-Up #48)

What is the purpose of the Deta class in __init__.py? It doesn't seem to accomplish anything new that isn't already available when using the module directly, other than setting the project key and id manually. It's a little confusing having two almost identical sets of methods. Perhaps a better solution would be to have an init() function to manually set the project key and id.

@abdelhaiabdelhai mentioned this pull request May 16, 2022
@abdelhai

Copy link
Copy Markdown
Contributor

hi @LemonPi314 thanks for the great PR!
what are your thought about the previous PRs we received? Worth reworking them in this PR?

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

what are your thought about the previous PRs we received? Worth reworking them in this PR?

I would be happy to do that, or if you prefer I could open a new PR. Any in particular you want me to take a look at?

@abdelhai

Copy link
Copy Markdown
Contributor

@LemonPi314 thanks for the quick response! i feel all are worth taking a look at, you could help us decide which ones we should consider merging. one new monolithic PR would be awesome!

i'm assuming this/the new pr will be breaking and we'll have to release a major version. rn, maybe we could group that with async support... what do you think?

@abdelhai
abdelhai self-requested a review May 17, 2022 21:22
@abdelhaiabdelhai added WIP major new features, api-breaking and removed investigating labels May 17, 2022
@lemonyte

Copy link
Copy Markdown
ContributorAuthor

So far nothing in any of the PRs are breaking changes (type hints, formatting, and an added argument to the AsyncBase class).
I will integrate #14#68 and #70 into this PR.
As for async support, I do think that would be better off separate, since that may include some breaking changes.

@abdelhai

Copy link
Copy Markdown
Contributor

i believe yours already does as you're raising a ValueError instead of other exceptions/errors.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

That is true. In that case it may be worth changing the package behavior slightly as described in my original comment since it is a breaking change as well.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

A few questions:

  • For type hints is typing.Optional preferred for all the optional arguments (where None is the default value)?
  • Should I add an argument for an external session here or wait until it gets resolved in its own PR?

@abdelhai

Copy link
Copy Markdown
Contributor

the reason behind the Deta class is that you configure the Deta cloient once and you can use all the services. (on Micros, it's per-configured, hence why you can just import the service "class". It's a better devex imo:

# this is the original apifromdetaimportDetadeta=Deta(<mykey/futureconfig>)
users=deta.Base("users")
photos=deta.Drive("photos")
# this is just a convenience api that works on Micros OR if the project key is set in the environmentfromdetaimportBase, Driveusers=Base("users")
photos=Drive("photos")

We can require devs to put the project key in the env, but what happens if we need more config?

For type hints is typing.Optional preferred for all the optional arguments (where None is the default value)?

is this the pythonic way of doing it? haven't touch python code for a while.

Should I add an argument for an external session here or wait until it gets resolved in its own PR?

you are right, let's keep async separate. i need to think about the api design

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

is this the pythonic way of doing it?

It is good practice to explicitly specify that a parameter type can be None when its default value is a literal None. However it adds a bit of bloat to the code so if you're against it do let me know.
The slight difference shows up in editor tooltips.
image
image

Without Optional (original):

defBase(self, name: str, host: str=None):

With Optional:

defBase(self, name: str, host: typing.Optional[str] =None):

For methods where there are two mutually exclusive parameters, like expire_in and expire_at, I will add overloads for better clarity.

@abdelhai

Copy link
Copy Markdown
Contributor

thanks for the clarification! I'm not seeing the benefit from typing.Optional[str], the first screenshot shows everything the developer needs to know to use the API. So, I would leave it out to reduce bloat.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

Update:

  • Improved type hints across all files
  • Added overloads for some methods
  • Minor refactoring changes
  • Combined fetch() and _fetch() methods in _Base() class
  • Minor changes in tests
  • Updated scripts according to CONTRIBUTING.md

@abdelhai
abdelhai requested a review from aavshrMay 30, 2022 19:43
@lemonyte

Copy link
Copy Markdown
ContributorAuthor

@abdelhai it seems the checks are failing due to missing project keys. Can you check the workflow secrets?

@lemonyte
lemonyte changed the base branch from master to nextAugust 19, 2022 18:10
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

help wantedExtra attention is neededmajornew features, api-breakingWIP

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@lemonyte@abdelhai@pomdtr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Oct 22, 2024. It is now read-only.

Cleanup and fixes - #69

Open
lemonyte wants to merge 13 commits into
deta:nextfrom
lemonyte:master
Open

Cleanup and fixes#69
lemonyte wants to merge 13 commits into
deta:nextfrom
lemonyte:master

Conversation

@lemonyte

Copy link
Copy Markdown
Contributor

Cleaned up and formatted the code, also fixed a couple broken tests.
Changes:

  • Changed minimum supported Python version to 3.6 since f-strings and async yield are used
  • Replaced type() check with isinstance() check
  • Replaced asserts in main package code with proper exceptions
  • Replaced .format() calls with f-strings since they are already used in other places
  • Added host parameter to Base() and Drive() functions not in the Deta class
  • Removed accidental unused import
  • Removed trailing and blank line whitespace
  • Fixed test command in CONTRIBUTING.md
  • Fixed test_ttl test
  • Added DETA_SDK_TEST_TTL_ATTRIBUTE to env.sample as seen in the pull request workflow
  • Various other formatting and style changes using flake8
  • Formatted using black -l 100 (same as Clean-Up #48)

What is the purpose of the Deta class in __init__.py? It doesn't seem to accomplish anything new that isn't already available when using the module directly, other than setting the project key and id manually. It's a little confusing having two almost identical sets of methods. Perhaps a better solution would be to have an init() function to manually set the project key and id.

@abdelhaiabdelhai mentioned this pull request May 16, 2022
@abdelhai

Copy link
Copy Markdown
Contributor

hi @LemonPi314 thanks for the great PR!
what are your thought about the previous PRs we received? Worth reworking them in this PR?

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

what are your thought about the previous PRs we received? Worth reworking them in this PR?

I would be happy to do that, or if you prefer I could open a new PR. Any in particular you want me to take a look at?

@abdelhai

Copy link
Copy Markdown
Contributor

@LemonPi314 thanks for the quick response! i feel all are worth taking a look at, you could help us decide which ones we should consider merging. one new monolithic PR would be awesome!

i'm assuming this/the new pr will be breaking and we'll have to release a major version. rn, maybe we could group that with async support... what do you think?

@abdelhai
abdelhai self-requested a review May 17, 2022 21:22
@abdelhaiabdelhai added WIP major new features, api-breaking and removed investigating labels May 17, 2022
@lemonyte

Copy link
Copy Markdown
ContributorAuthor

So far nothing in any of the PRs are breaking changes (type hints, formatting, and an added argument to the AsyncBase class).
I will integrate #14#68 and #70 into this PR.
As for async support, I do think that would be better off separate, since that may include some breaking changes.

@abdelhai

Copy link
Copy Markdown
Contributor

i believe yours already does as you're raising a ValueError instead of other exceptions/errors.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

That is true. In that case it may be worth changing the package behavior slightly as described in my original comment since it is a breaking change as well.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

A few questions:

  • For type hints is typing.Optional preferred for all the optional arguments (where None is the default value)?
  • Should I add an argument for an external session here or wait until it gets resolved in its own PR?

@abdelhai

Copy link
Copy Markdown
Contributor

the reason behind the Deta class is that you configure the Deta cloient once and you can use all the services. (on Micros, it's per-configured, hence why you can just import the service "class". It's a better devex imo:

# this is the original apifromdetaimportDetadeta=Deta(<mykey/futureconfig>)
users=deta.Base("users")
photos=deta.Drive("photos")
# this is just a convenience api that works on Micros OR if the project key is set in the environmentfromdetaimportBase, Driveusers=Base("users")
photos=Drive("photos")

We can require devs to put the project key in the env, but what happens if we need more config?

For type hints is typing.Optional preferred for all the optional arguments (where None is the default value)?

is this the pythonic way of doing it? haven't touch python code for a while.

Should I add an argument for an external session here or wait until it gets resolved in its own PR?

you are right, let's keep async separate. i need to think about the api design

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

is this the pythonic way of doing it?

It is good practice to explicitly specify that a parameter type can be None when its default value is a literal None. However it adds a bit of bloat to the code so if you're against it do let me know.
The slight difference shows up in editor tooltips.
image
image

Without Optional (original):

defBase(self, name: str, host: str=None):

With Optional:

defBase(self, name: str, host: typing.Optional[str] =None):

For methods where there are two mutually exclusive parameters, like expire_in and expire_at, I will add overloads for better clarity.

@abdelhai

Copy link
Copy Markdown
Contributor

thanks for the clarification! I'm not seeing the benefit from typing.Optional[str], the first screenshot shows everything the developer needs to know to use the API. So, I would leave it out to reduce bloat.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

Update:

  • Improved type hints across all files
  • Added overloads for some methods
  • Minor refactoring changes
  • Combined fetch() and _fetch() methods in _Base() class
  • Minor changes in tests
  • Updated scripts according to CONTRIBUTING.md

@abdelhai
abdelhai requested a review from aavshrMay 30, 2022 19:43
@lemonyte

Copy link
Copy Markdown
ContributorAuthor

@abdelhai it seems the checks are failing due to missing project keys. Can you check the workflow secrets?

@lemonyte
lemonyte changed the base branch from master to nextAugust 19, 2022 18:10
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

help wantedExtra attention is neededmajornew features, api-breakingWIP

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@lemonyte@abdelhai@pomdtr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Oct 22, 2024. It is now read-only.

Cleanup and fixes - #69

Open
lemonyte wants to merge 13 commits into
deta:nextfrom
lemonyte:master
Open

Cleanup and fixes#69
lemonyte wants to merge 13 commits into
deta:nextfrom
lemonyte:master

Conversation

@lemonyte

Copy link
Copy Markdown
Contributor

Cleaned up and formatted the code, also fixed a couple broken tests.
Changes:

  • Changed minimum supported Python version to 3.6 since f-strings and async yield are used
  • Replaced type() check with isinstance() check
  • Replaced asserts in main package code with proper exceptions
  • Replaced .format() calls with f-strings since they are already used in other places
  • Added host parameter to Base() and Drive() functions not in the Deta class
  • Removed accidental unused import
  • Removed trailing and blank line whitespace
  • Fixed test command in CONTRIBUTING.md
  • Fixed test_ttl test
  • Added DETA_SDK_TEST_TTL_ATTRIBUTE to env.sample as seen in the pull request workflow
  • Various other formatting and style changes using flake8
  • Formatted using black -l 100 (same as Clean-Up #48)

What is the purpose of the Deta class in __init__.py? It doesn't seem to accomplish anything new that isn't already available when using the module directly, other than setting the project key and id manually. It's a little confusing having two almost identical sets of methods. Perhaps a better solution would be to have an init() function to manually set the project key and id.

@abdelhaiabdelhai mentioned this pull request May 16, 2022
@abdelhai

Copy link
Copy Markdown
Contributor

hi @LemonPi314 thanks for the great PR!
what are your thought about the previous PRs we received? Worth reworking them in this PR?

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

what are your thought about the previous PRs we received? Worth reworking them in this PR?

I would be happy to do that, or if you prefer I could open a new PR. Any in particular you want me to take a look at?

@abdelhai

Copy link
Copy Markdown
Contributor

@LemonPi314 thanks for the quick response! i feel all are worth taking a look at, you could help us decide which ones we should consider merging. one new monolithic PR would be awesome!

i'm assuming this/the new pr will be breaking and we'll have to release a major version. rn, maybe we could group that with async support... what do you think?

@abdelhai
abdelhai self-requested a review May 17, 2022 21:22
@abdelhaiabdelhai added WIP major new features, api-breaking and removed investigating labels May 17, 2022
@lemonyte

Copy link
Copy Markdown
ContributorAuthor

So far nothing in any of the PRs are breaking changes (type hints, formatting, and an added argument to the AsyncBase class).
I will integrate #14#68 and #70 into this PR.
As for async support, I do think that would be better off separate, since that may include some breaking changes.

@abdelhai

Copy link
Copy Markdown
Contributor

i believe yours already does as you're raising a ValueError instead of other exceptions/errors.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

That is true. In that case it may be worth changing the package behavior slightly as described in my original comment since it is a breaking change as well.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

A few questions:

  • For type hints is typing.Optional preferred for all the optional arguments (where None is the default value)?
  • Should I add an argument for an external session here or wait until it gets resolved in its own PR?

@abdelhai

Copy link
Copy Markdown
Contributor

the reason behind the Deta class is that you configure the Deta cloient once and you can use all the services. (on Micros, it's per-configured, hence why you can just import the service "class". It's a better devex imo:

# this is the original apifromdetaimportDetadeta=Deta(<mykey/futureconfig>)
users=deta.Base("users")
photos=deta.Drive("photos")
# this is just a convenience api that works on Micros OR if the project key is set in the environmentfromdetaimportBase, Driveusers=Base("users")
photos=Drive("photos")

We can require devs to put the project key in the env, but what happens if we need more config?

For type hints is typing.Optional preferred for all the optional arguments (where None is the default value)?

is this the pythonic way of doing it? haven't touch python code for a while.

Should I add an argument for an external session here or wait until it gets resolved in its own PR?

you are right, let's keep async separate. i need to think about the api design

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

is this the pythonic way of doing it?

It is good practice to explicitly specify that a parameter type can be None when its default value is a literal None. However it adds a bit of bloat to the code so if you're against it do let me know.
The slight difference shows up in editor tooltips.
image
image

Without Optional (original):

defBase(self, name: str, host: str=None):

With Optional:

defBase(self, name: str, host: typing.Optional[str] =None):

For methods where there are two mutually exclusive parameters, like expire_in and expire_at, I will add overloads for better clarity.

@abdelhai

Copy link
Copy Markdown
Contributor

thanks for the clarification! I'm not seeing the benefit from typing.Optional[str], the first screenshot shows everything the developer needs to know to use the API. So, I would leave it out to reduce bloat.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

Update:

  • Improved type hints across all files
  • Added overloads for some methods
  • Minor refactoring changes
  • Combined fetch() and _fetch() methods in _Base() class
  • Minor changes in tests
  • Updated scripts according to CONTRIBUTING.md

@abdelhai
abdelhai requested a review from aavshrMay 30, 2022 19:43
@lemonyte

Copy link
Copy Markdown
ContributorAuthor

@abdelhai it seems the checks are failing due to missing project keys. Can you check the workflow secrets?

@lemonyte
lemonyte changed the base branch from master to nextAugust 19, 2022 18:10
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

help wantedExtra attention is neededmajornew features, api-breakingWIP

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@lemonyte@abdelhai@pomdtr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Oct 22, 2024. It is now read-only.

Cleanup and fixes - #69

Open
lemonyte wants to merge 13 commits into
deta:nextfrom
lemonyte:master
Open

Cleanup and fixes#69
lemonyte wants to merge 13 commits into
deta:nextfrom
lemonyte:master

Conversation

@lemonyte

Copy link
Copy Markdown
Contributor

Cleaned up and formatted the code, also fixed a couple broken tests.
Changes:

  • Changed minimum supported Python version to 3.6 since f-strings and async yield are used
  • Replaced type() check with isinstance() check
  • Replaced asserts in main package code with proper exceptions
  • Replaced .format() calls with f-strings since they are already used in other places
  • Added host parameter to Base() and Drive() functions not in the Deta class
  • Removed accidental unused import
  • Removed trailing and blank line whitespace
  • Fixed test command in CONTRIBUTING.md
  • Fixed test_ttl test
  • Added DETA_SDK_TEST_TTL_ATTRIBUTE to env.sample as seen in the pull request workflow
  • Various other formatting and style changes using flake8
  • Formatted using black -l 100 (same as Clean-Up #48)

What is the purpose of the Deta class in __init__.py? It doesn't seem to accomplish anything new that isn't already available when using the module directly, other than setting the project key and id manually. It's a little confusing having two almost identical sets of methods. Perhaps a better solution would be to have an init() function to manually set the project key and id.

@abdelhaiabdelhai mentioned this pull request May 16, 2022
@abdelhai

Copy link
Copy Markdown
Contributor

hi @LemonPi314 thanks for the great PR!
what are your thought about the previous PRs we received? Worth reworking them in this PR?

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

what are your thought about the previous PRs we received? Worth reworking them in this PR?

I would be happy to do that, or if you prefer I could open a new PR. Any in particular you want me to take a look at?

@abdelhai

Copy link
Copy Markdown
Contributor

@LemonPi314 thanks for the quick response! i feel all are worth taking a look at, you could help us decide which ones we should consider merging. one new monolithic PR would be awesome!

i'm assuming this/the new pr will be breaking and we'll have to release a major version. rn, maybe we could group that with async support... what do you think?

@abdelhai
abdelhai self-requested a review May 17, 2022 21:22
@abdelhaiabdelhai added WIP major new features, api-breaking and removed investigating labels May 17, 2022
@lemonyte

Copy link
Copy Markdown
ContributorAuthor

So far nothing in any of the PRs are breaking changes (type hints, formatting, and an added argument to the AsyncBase class).
I will integrate #14#68 and #70 into this PR.
As for async support, I do think that would be better off separate, since that may include some breaking changes.

@abdelhai

Copy link
Copy Markdown
Contributor

i believe yours already does as you're raising a ValueError instead of other exceptions/errors.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

That is true. In that case it may be worth changing the package behavior slightly as described in my original comment since it is a breaking change as well.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

A few questions:

  • For type hints is typing.Optional preferred for all the optional arguments (where None is the default value)?
  • Should I add an argument for an external session here or wait until it gets resolved in its own PR?

@abdelhai

Copy link
Copy Markdown
Contributor

the reason behind the Deta class is that you configure the Deta cloient once and you can use all the services. (on Micros, it's per-configured, hence why you can just import the service "class". It's a better devex imo:

# this is the original apifromdetaimportDetadeta=Deta(<mykey/futureconfig>)
users=deta.Base("users")
photos=deta.Drive("photos")
# this is just a convenience api that works on Micros OR if the project key is set in the environmentfromdetaimportBase, Driveusers=Base("users")
photos=Drive("photos")

We can require devs to put the project key in the env, but what happens if we need more config?

For type hints is typing.Optional preferred for all the optional arguments (where None is the default value)?

is this the pythonic way of doing it? haven't touch python code for a while.

Should I add an argument for an external session here or wait until it gets resolved in its own PR?

you are right, let's keep async separate. i need to think about the api design

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

is this the pythonic way of doing it?

It is good practice to explicitly specify that a parameter type can be None when its default value is a literal None. However it adds a bit of bloat to the code so if you're against it do let me know.
The slight difference shows up in editor tooltips.
image
image

Without Optional (original):

defBase(self, name: str, host: str=None):

With Optional:

defBase(self, name: str, host: typing.Optional[str] =None):

For methods where there are two mutually exclusive parameters, like expire_in and expire_at, I will add overloads for better clarity.

@abdelhai

Copy link
Copy Markdown
Contributor

thanks for the clarification! I'm not seeing the benefit from typing.Optional[str], the first screenshot shows everything the developer needs to know to use the API. So, I would leave it out to reduce bloat.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

Update:

  • Improved type hints across all files
  • Added overloads for some methods
  • Minor refactoring changes
  • Combined fetch() and _fetch() methods in _Base() class
  • Minor changes in tests
  • Updated scripts according to CONTRIBUTING.md

@abdelhai
abdelhai requested a review from aavshrMay 30, 2022 19:43
@lemonyte

Copy link
Copy Markdown
ContributorAuthor

@abdelhai it seems the checks are failing due to missing project keys. Can you check the workflow secrets?

@lemonyte
lemonyte changed the base branch from master to nextAugust 19, 2022 18:10
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

help wantedExtra attention is neededmajornew features, api-breakingWIP

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@lemonyte@abdelhai@pomdtr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Oct 22, 2024. It is now read-only.

Cleanup and fixes - #69

Open
lemonyte wants to merge 13 commits into
deta:nextfrom
lemonyte:master
Open

Cleanup and fixes#69
lemonyte wants to merge 13 commits into
deta:nextfrom
lemonyte:master

Conversation

@lemonyte

Copy link
Copy Markdown
Contributor

Cleaned up and formatted the code, also fixed a couple broken tests.
Changes:

  • Changed minimum supported Python version to 3.6 since f-strings and async yield are used
  • Replaced type() check with isinstance() check
  • Replaced asserts in main package code with proper exceptions
  • Replaced .format() calls with f-strings since they are already used in other places
  • Added host parameter to Base() and Drive() functions not in the Deta class
  • Removed accidental unused import
  • Removed trailing and blank line whitespace
  • Fixed test command in CONTRIBUTING.md
  • Fixed test_ttl test
  • Added DETA_SDK_TEST_TTL_ATTRIBUTE to env.sample as seen in the pull request workflow
  • Various other formatting and style changes using flake8
  • Formatted using black -l 100 (same as Clean-Up #48)

What is the purpose of the Deta class in __init__.py? It doesn't seem to accomplish anything new that isn't already available when using the module directly, other than setting the project key and id manually. It's a little confusing having two almost identical sets of methods. Perhaps a better solution would be to have an init() function to manually set the project key and id.

@abdelhaiabdelhai mentioned this pull request May 16, 2022
@abdelhai

Copy link
Copy Markdown
Contributor

hi @LemonPi314 thanks for the great PR!
what are your thought about the previous PRs we received? Worth reworking them in this PR?

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

what are your thought about the previous PRs we received? Worth reworking them in this PR?

I would be happy to do that, or if you prefer I could open a new PR. Any in particular you want me to take a look at?

@abdelhai

Copy link
Copy Markdown
Contributor

@LemonPi314 thanks for the quick response! i feel all are worth taking a look at, you could help us decide which ones we should consider merging. one new monolithic PR would be awesome!

i'm assuming this/the new pr will be breaking and we'll have to release a major version. rn, maybe we could group that with async support... what do you think?

@abdelhai
abdelhai self-requested a review May 17, 2022 21:22
@abdelhaiabdelhai added WIP major new features, api-breaking and removed investigating labels May 17, 2022
@lemonyte

Copy link
Copy Markdown
ContributorAuthor

So far nothing in any of the PRs are breaking changes (type hints, formatting, and an added argument to the AsyncBase class).
I will integrate #14#68 and #70 into this PR.
As for async support, I do think that would be better off separate, since that may include some breaking changes.

@abdelhai

Copy link
Copy Markdown
Contributor

i believe yours already does as you're raising a ValueError instead of other exceptions/errors.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

That is true. In that case it may be worth changing the package behavior slightly as described in my original comment since it is a breaking change as well.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

A few questions:

  • For type hints is typing.Optional preferred for all the optional arguments (where None is the default value)?
  • Should I add an argument for an external session here or wait until it gets resolved in its own PR?

@abdelhai

Copy link
Copy Markdown
Contributor

the reason behind the Deta class is that you configure the Deta cloient once and you can use all the services. (on Micros, it's per-configured, hence why you can just import the service "class". It's a better devex imo:

# this is the original apifromdetaimportDetadeta=Deta(<mykey/futureconfig>)
users=deta.Base("users")
photos=deta.Drive("photos")
# this is just a convenience api that works on Micros OR if the project key is set in the environmentfromdetaimportBase, Driveusers=Base("users")
photos=Drive("photos")

We can require devs to put the project key in the env, but what happens if we need more config?

For type hints is typing.Optional preferred for all the optional arguments (where None is the default value)?

is this the pythonic way of doing it? haven't touch python code for a while.

Should I add an argument for an external session here or wait until it gets resolved in its own PR?

you are right, let's keep async separate. i need to think about the api design

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

is this the pythonic way of doing it?

It is good practice to explicitly specify that a parameter type can be None when its default value is a literal None. However it adds a bit of bloat to the code so if you're against it do let me know.
The slight difference shows up in editor tooltips.
image
image

Without Optional (original):

defBase(self, name: str, host: str=None):

With Optional:

defBase(self, name: str, host: typing.Optional[str] =None):

For methods where there are two mutually exclusive parameters, like expire_in and expire_at, I will add overloads for better clarity.

@abdelhai

Copy link
Copy Markdown
Contributor

thanks for the clarification! I'm not seeing the benefit from typing.Optional[str], the first screenshot shows everything the developer needs to know to use the API. So, I would leave it out to reduce bloat.

@lemonyte

Copy link
Copy Markdown
ContributorAuthor

Update:

  • Improved type hints across all files
  • Added overloads for some methods
  • Minor refactoring changes
  • Combined fetch() and _fetch() methods in _Base() class
  • Minor changes in tests
  • Updated scripts according to CONTRIBUTING.md

@abdelhai
abdelhai requested a review from aavshrMay 30, 2022 19:43
@lemonyte

Copy link
Copy Markdown
ContributorAuthor

@abdelhai it seems the checks are failing due to missing project keys. Can you check the workflow secrets?

@lemonyte
lemonyte changed the base branch from master to nextAugust 19, 2022 18:10
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

help wantedExtra attention is neededmajornew features, api-breakingWIP

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@lemonyte@abdelhai@pomdtr