Use binary_type in MongoDBStore.__getitem__ for Python 2 only - #401

Merged
jakirkham merged 2 commits into
zarr-developers:masterfrom
jakirkham:drop_binary_type_cast
Feb 13, 2019
Merged

Use binary_type in MongoDBStore.__getitem__ for Python 2 only#401
jakirkham merged 2 commits into
zarr-developers:masterfrom
jakirkham:drop_binary_type_cast

Conversation

@jakirkham

@jakirkhamjakirkham commented Feb 12, 2019

Copy link
Copy Markdown
Member

Previously there were some test failures on Python 2 and referenced in this comment (and later discussion). Turns out on Python 2 a bson.Binary instance is returned, which subclasses bytes, as explained in the docs. So the coercion to bytes is only needed on Python 2 to convert bson.Binary to bytes. As Python 3 already returns a bytes instance, there is nothing we need to do there. Thus we restrict the binary_type call to Python 2. Should avoid a copy on Python 3.

xref: #372

TODO:

  • Add unit tests and/or doctests in docstrings
  • Add docstrings and API docs for any new/modified user-facing classes and functions
  • New/modified features documented in docs/tutorial.rst
  • Changes documented in docs/release.rst
  • Docs build locally (e.g., run tox -e docs)
  • AppVeyor and Travis CI passes
  • Test coverage is 100% (Coveralls passes)

@pep8speaks

pep8speaks commented Feb 12, 2019

Copy link
Copy Markdown

Hello @jakirkham! Thanks for updating the PR.

Line 4:80: E501 line too long (80 > 79 characters)
Line 8:80: E501 line too long (86 > 79 characters)
Line 9:80: E501 line too long (82 > 79 characters)
Line 10:80: E501 line too long (84 > 79 characters)
Line 11:80: E501 line too long (84 > 79 characters)
Line 12:80: E501 line too long (85 > 79 characters)
Line 13:80: E501 line too long (81 > 79 characters)
Line 14:80: E501 line too long (89 > 79 characters)
Line 43:80: E501 line too long (84 > 79 characters)
Line 44:80: E501 line too long (80 > 79 characters)
Line 102:80: E501 line too long (83 > 79 characters)
Line 125:80: E501 line too long (84 > 79 characters)
Line 151:80: E501 line too long (85 > 79 characters)
Line 152:80: E501 line too long (83 > 79 characters)
Line 164:80: E501 line too long (85 > 79 characters)
Line 210:80: E501 line too long (92 > 79 characters)
Line 281:80: E501 line too long (86 > 79 characters)
Line 308:80: E501 line too long (80 > 79 characters)
Line 317:80: E501 line too long (90 > 79 characters)
Line 326:80: E501 line too long (85 > 79 characters)
Line 327:80: E501 line too long (80 > 79 characters)
Line 377:80: E501 line too long (81 > 79 characters)
Line 380:80: E501 line too long (83 > 79 characters)
Line 382:80: E501 line too long (89 > 79 characters)
Line 406:80: E501 line too long (94 > 79 characters)
Line 467:80: E501 line too long (80 > 79 characters)
Line 673:80: E501 line too long (80 > 79 characters)
Line 705:80: E501 line too long (84 > 79 characters)
Line 706:80: E501 line too long (83 > 79 characters)
Line 754:80: E501 line too long (83 > 79 characters)
Line 765:80: E501 line too long (87 > 79 characters)
Line 922:80: E501 line too long (80 > 79 characters)
Line 937:80: E501 line too long (80 > 79 characters)
Line 1014:80: E501 line too long (85 > 79 characters)
Line 1024:80: E501 line too long (82 > 79 characters)
Line 1025:80: E501 line too long (83 > 79 characters)
Line 1072:80: E501 line too long (80 > 79 characters)
Line 1074:80: E501 line too long (83 > 79 characters)
Line 1085:80: E501 line too long (80 > 79 characters)
Line 1097:80: E501 line too long (80 > 79 characters)
Line 1104:80: E501 line too long (88 > 79 characters)
Line 1108:80: E501 line too long (82 > 79 characters)
Line 1117:80: E501 line too long (88 > 79 characters)
Line 1126:80: E501 line too long (84 > 79 characters)
Line 1127:80: E501 line too long (83 > 79 characters)
Line 1141:80: E501 line too long (87 > 79 characters)
Line 1145:80: E501 line too long (80 > 79 characters)
Line 1159:80: E501 line too long (89 > 79 characters)
Line 1333:80: E501 line too long (85 > 79 characters)
Line 1336:80: E501 line too long (88 > 79 characters)
Line 1346:80: E501 line too long (80 > 79 characters)
Line 1359:80: E501 line too long (80 > 79 characters)
Line 1361:80: E501 line too long (80 > 79 characters)
Line 1365:80: E501 line too long (84 > 79 characters)
Line 1376:80: E501 line too long (80 > 79 characters)
Line 1388:80: E501 line too long (80 > 79 characters)
Line 1390:80: E501 line too long (80 > 79 characters)
Line 1394:80: E501 line too long (82 > 79 characters)
Line 1395:80: E501 line too long (83 > 79 characters)
Line 1418:80: E501 line too long (83 > 79 characters)
Line 1457:80: E501 line too long (83 > 79 characters)
Line 1460:80: E501 line too long (87 > 79 characters)
Line 1527:80: E501 line too long (83 > 79 characters)
Line 1536:80: E501 line too long (87 > 79 characters)
Line 1547:80: E501 line too long (80 > 79 characters)
Line 1560:80: E501 line too long (80 > 79 characters)
Line 1562:80: E501 line too long (80 > 79 characters)
Line 1566:80: E501 line too long (84 > 79 characters)
Line 1572:80: E501 line too long (86 > 79 characters)
Line 1573:80: E501 line too long (90 > 79 characters)
Line 1575:80: E501 line too long (87 > 79 characters)
Line 1576:80: E501 line too long (86 > 79 characters)
Line 1583:80: E501 line too long (89 > 79 characters)
Line 1584:80: E501 line too long (87 > 79 characters)
Line 1591:80: E501 line too long (83 > 79 characters)
Line 1592:80: E501 line too long (84 > 79 characters)
Line 1593:80: E501 line too long (89 > 79 characters)
Line 1597:80: E501 line too long (84 > 79 characters)
Line 1598:80: E501 line too long (87 > 79 characters)
Line 1701:80: E501 line too long (81 > 79 characters)
Line 1702:80: E501 line too long (80 > 79 characters)
Line 1711:80: E501 line too long (87 > 79 characters)
Line 1720:80: E501 line too long (90 > 79 characters)
Line 1727:80: E501 line too long (91 > 79 characters)
Line 1731:80: E501 line too long (91 > 79 characters)
Line 1749:80: E501 line too long (82 > 79 characters)
Line 1750:80: E501 line too long (89 > 79 characters)
Line 1755:80: E501 line too long (82 > 79 characters)
Line 1797:80: E501 line too long (83 > 79 characters)
Line 1813:80: E501 line too long (86 > 79 characters)
Line 1861:80: E501 line too long (86 > 79 characters)
Line 1898:80: E501 line too long (80 > 79 characters)
Line 2110:80: E501 line too long (80 > 79 characters)
Line 2215:80: E501 line too long (80 > 79 characters)
Line 2278:80: E501 line too long (80 > 79 characters)
Line 2292:80: E501 line too long (86 > 79 characters)
Line 2325:80: E501 line too long (85 > 79 characters)

Comment last updated on February 13, 2019 at 06:37 Hours UTC

@jakirkhamjakirkham mentioned this pull request Feb 12, 2019
7 tasks
@jhamman

Copy link
Copy Markdown
Member

Still seems to be failing. This by the way was why I opened #393.

On both Python 2 and Python 3, PyMongo converts `binary_type` (i.e.
`bytes`) to BSON type 5 (Binary data) with subtype 0 to store in the
MongoDB instance. When reading that data back out, PyMongo handles BSON
type 5 (Binary data) with subtype 0 differently depending on the Python
version.
On Python 2, it creates a `bson.Binary` instance with the data. Normally
we would coerce this to a `bytes` object using `ensure_bytes`. However
that fails as `bson.Binary` is a subclass of `bytes`. So instead we
explicitly force it to `bytes` (i.e. `binary_type`). On Python 3,
PyMongo automatically converts the data to `bytes`. Thus we don't need
to do anything there.
ref: http://api.mongodb.com/python/current/python3.html#id3
ref: http://api.mongodb.com/python/current/api/bson/binary.html#bson.binary.Binary
@jakirkhamjakirkham changed the title Drop binary_type cast in MongoDBStore.__getitem__Use binary_type in MongoDBStore.__getitem__ for Python 2 onlyFeb 13, 2019
@jakirkham

Copy link
Copy Markdown
MemberAuthor

That's right. Just wanted to see if that was still the case after the dust settled.

After doing a little research, it looks like we can safely constrain this coercion to Python 2 only. Have updated the PR to do that. Should make it easier for us to remember to remove when we do drop Python 2.

Could you please give it another look? :)

@jhamman

Copy link
Copy Markdown
Member

yep, this looks right. I agree, this will make it easier to undo when PY2 goes away. Thanks.

@jakirkham

Copy link
Copy Markdown
MemberAuthor

Thanks @jhamman :)

@jakirkham
jakirkham merged commit 3c0e0f5 into zarr-developers:masterFeb 13, 2019
@jakirkham
jakirkham deleted the drop_binary_type_cast branch February 13, 2019 19:31
@jakirkhamjakirkham added this to the v2.3 milestone Feb 13, 2019
@alimanfoo

Copy link
Copy Markdown
Member

Thanks @jakirkham for this, nice to know exactly what's going on 👍

@jakirkhamjakirkham mentioned this pull request Feb 21, 2019
8 tasks
@jakirkham

Copy link
Copy Markdown
MemberAuthor

Of course. 😄

FWIW I think we can get a better handle on this behavior by adding a flag to the ensure_* functions to handle subclasses of the expected type (e.g. bytes in this case). Opened PR ( zarr-developers/numcodecs#173 ) along these lines.

@jakirkhamjakirkham mentioned this pull request Apr 15, 2019
7 tasks
@jakirkhamjakirkham mentioned this pull request Dec 3, 2020
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jakirkham@pep8speaks@jhamman@alimanfoo
, '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

Use binary_type in MongoDBStore.__getitem__ for Python 2 only - #401

Merged
jakirkham merged 2 commits into
zarr-developers:masterfrom
jakirkham:drop_binary_type_cast
Feb 13, 2019
Merged

Use binary_type in MongoDBStore.__getitem__ for Python 2 only#401
jakirkham merged 2 commits into
zarr-developers:masterfrom
jakirkham:drop_binary_type_cast

Conversation

@jakirkham

@jakirkhamjakirkham commented Feb 12, 2019

Copy link
Copy Markdown
Member

Previously there were some test failures on Python 2 and referenced in this comment (and later discussion). Turns out on Python 2 a bson.Binary instance is returned, which subclasses bytes, as explained in the docs. So the coercion to bytes is only needed on Python 2 to convert bson.Binary to bytes. As Python 3 already returns a bytes instance, there is nothing we need to do there. Thus we restrict the binary_type call to Python 2. Should avoid a copy on Python 3.

xref: #372

TODO:

  • Add unit tests and/or doctests in docstrings
  • Add docstrings and API docs for any new/modified user-facing classes and functions
  • New/modified features documented in docs/tutorial.rst
  • Changes documented in docs/release.rst
  • Docs build locally (e.g., run tox -e docs)
  • AppVeyor and Travis CI passes
  • Test coverage is 100% (Coveralls passes)

@pep8speaks

pep8speaks commented Feb 12, 2019

Copy link
Copy Markdown

Hello @jakirkham! Thanks for updating the PR.

Line 4:80: E501 line too long (80 > 79 characters)
Line 8:80: E501 line too long (86 > 79 characters)
Line 9:80: E501 line too long (82 > 79 characters)
Line 10:80: E501 line too long (84 > 79 characters)
Line 11:80: E501 line too long (84 > 79 characters)
Line 12:80: E501 line too long (85 > 79 characters)
Line 13:80: E501 line too long (81 > 79 characters)
Line 14:80: E501 line too long (89 > 79 characters)
Line 43:80: E501 line too long (84 > 79 characters)
Line 44:80: E501 line too long (80 > 79 characters)
Line 102:80: E501 line too long (83 > 79 characters)
Line 125:80: E501 line too long (84 > 79 characters)
Line 151:80: E501 line too long (85 > 79 characters)
Line 152:80: E501 line too long (83 > 79 characters)
Line 164:80: E501 line too long (85 > 79 characters)
Line 210:80: E501 line too long (92 > 79 characters)
Line 281:80: E501 line too long (86 > 79 characters)
Line 308:80: E501 line too long (80 > 79 characters)
Line 317:80: E501 line too long (90 > 79 characters)
Line 326:80: E501 line too long (85 > 79 characters)
Line 327:80: E501 line too long (80 > 79 characters)
Line 377:80: E501 line too long (81 > 79 characters)
Line 380:80: E501 line too long (83 > 79 characters)
Line 382:80: E501 line too long (89 > 79 characters)
Line 406:80: E501 line too long (94 > 79 characters)
Line 467:80: E501 line too long (80 > 79 characters)
Line 673:80: E501 line too long (80 > 79 characters)
Line 705:80: E501 line too long (84 > 79 characters)
Line 706:80: E501 line too long (83 > 79 characters)
Line 754:80: E501 line too long (83 > 79 characters)
Line 765:80: E501 line too long (87 > 79 characters)
Line 922:80: E501 line too long (80 > 79 characters)
Line 937:80: E501 line too long (80 > 79 characters)
Line 1014:80: E501 line too long (85 > 79 characters)
Line 1024:80: E501 line too long (82 > 79 characters)
Line 1025:80: E501 line too long (83 > 79 characters)
Line 1072:80: E501 line too long (80 > 79 characters)
Line 1074:80: E501 line too long (83 > 79 characters)
Line 1085:80: E501 line too long (80 > 79 characters)
Line 1097:80: E501 line too long (80 > 79 characters)
Line 1104:80: E501 line too long (88 > 79 characters)
Line 1108:80: E501 line too long (82 > 79 characters)
Line 1117:80: E501 line too long (88 > 79 characters)
Line 1126:80: E501 line too long (84 > 79 characters)
Line 1127:80: E501 line too long (83 > 79 characters)
Line 1141:80: E501 line too long (87 > 79 characters)
Line 1145:80: E501 line too long (80 > 79 characters)
Line 1159:80: E501 line too long (89 > 79 characters)
Line 1333:80: E501 line too long (85 > 79 characters)
Line 1336:80: E501 line too long (88 > 79 characters)
Line 1346:80: E501 line too long (80 > 79 characters)
Line 1359:80: E501 line too long (80 > 79 characters)
Line 1361:80: E501 line too long (80 > 79 characters)
Line 1365:80: E501 line too long (84 > 79 characters)
Line 1376:80: E501 line too long (80 > 79 characters)
Line 1388:80: E501 line too long (80 > 79 characters)
Line 1390:80: E501 line too long (80 > 79 characters)
Line 1394:80: E501 line too long (82 > 79 characters)
Line 1395:80: E501 line too long (83 > 79 characters)
Line 1418:80: E501 line too long (83 > 79 characters)
Line 1457:80: E501 line too long (83 > 79 characters)
Line 1460:80: E501 line too long (87 > 79 characters)
Line 1527:80: E501 line too long (83 > 79 characters)
Line 1536:80: E501 line too long (87 > 79 characters)
Line 1547:80: E501 line too long (80 > 79 characters)
Line 1560:80: E501 line too long (80 > 79 characters)
Line 1562:80: E501 line too long (80 > 79 characters)
Line 1566:80: E501 line too long (84 > 79 characters)
Line 1572:80: E501 line too long (86 > 79 characters)
Line 1573:80: E501 line too long (90 > 79 characters)
Line 1575:80: E501 line too long (87 > 79 characters)
Line 1576:80: E501 line too long (86 > 79 characters)
Line 1583:80: E501 line too long (89 > 79 characters)
Line 1584:80: E501 line too long (87 > 79 characters)
Line 1591:80: E501 line too long (83 > 79 characters)
Line 1592:80: E501 line too long (84 > 79 characters)
Line 1593:80: E501 line too long (89 > 79 characters)
Line 1597:80: E501 line too long (84 > 79 characters)
Line 1598:80: E501 line too long (87 > 79 characters)
Line 1701:80: E501 line too long (81 > 79 characters)
Line 1702:80: E501 line too long (80 > 79 characters)
Line 1711:80: E501 line too long (87 > 79 characters)
Line 1720:80: E501 line too long (90 > 79 characters)
Line 1727:80: E501 line too long (91 > 79 characters)
Line 1731:80: E501 line too long (91 > 79 characters)
Line 1749:80: E501 line too long (82 > 79 characters)
Line 1750:80: E501 line too long (89 > 79 characters)
Line 1755:80: E501 line too long (82 > 79 characters)
Line 1797:80: E501 line too long (83 > 79 characters)
Line 1813:80: E501 line too long (86 > 79 characters)
Line 1861:80: E501 line too long (86 > 79 characters)
Line 1898:80: E501 line too long (80 > 79 characters)
Line 2110:80: E501 line too long (80 > 79 characters)
Line 2215:80: E501 line too long (80 > 79 characters)
Line 2278:80: E501 line too long (80 > 79 characters)
Line 2292:80: E501 line too long (86 > 79 characters)
Line 2325:80: E501 line too long (85 > 79 characters)

Comment last updated on February 13, 2019 at 06:37 Hours UTC

@jakirkhamjakirkham mentioned this pull request Feb 12, 2019
7 tasks
@jhamman

Copy link
Copy Markdown
Member

Still seems to be failing. This by the way was why I opened #393.

On both Python 2 and Python 3, PyMongo converts `binary_type` (i.e.
`bytes`) to BSON type 5 (Binary data) with subtype 0 to store in the
MongoDB instance. When reading that data back out, PyMongo handles BSON
type 5 (Binary data) with subtype 0 differently depending on the Python
version.
On Python 2, it creates a `bson.Binary` instance with the data. Normally
we would coerce this to a `bytes` object using `ensure_bytes`. However
that fails as `bson.Binary` is a subclass of `bytes`. So instead we
explicitly force it to `bytes` (i.e. `binary_type`). On Python 3,
PyMongo automatically converts the data to `bytes`. Thus we don't need
to do anything there.
ref: http://api.mongodb.com/python/current/python3.html#id3
ref: http://api.mongodb.com/python/current/api/bson/binary.html#bson.binary.Binary
@jakirkhamjakirkham changed the title Drop binary_type cast in MongoDBStore.__getitem__Use binary_type in MongoDBStore.__getitem__ for Python 2 onlyFeb 13, 2019
@jakirkham

Copy link
Copy Markdown
MemberAuthor

That's right. Just wanted to see if that was still the case after the dust settled.

After doing a little research, it looks like we can safely constrain this coercion to Python 2 only. Have updated the PR to do that. Should make it easier for us to remember to remove when we do drop Python 2.

Could you please give it another look? :)

@jhamman

Copy link
Copy Markdown
Member

yep, this looks right. I agree, this will make it easier to undo when PY2 goes away. Thanks.

@jakirkham

Copy link
Copy Markdown
MemberAuthor

Thanks @jhamman :)

@jakirkham
jakirkham merged commit 3c0e0f5 into zarr-developers:masterFeb 13, 2019
@jakirkham
jakirkham deleted the drop_binary_type_cast branch February 13, 2019 19:31
@jakirkhamjakirkham added this to the v2.3 milestone Feb 13, 2019
@alimanfoo

Copy link
Copy Markdown
Member

Thanks @jakirkham for this, nice to know exactly what's going on 👍

@jakirkhamjakirkham mentioned this pull request Feb 21, 2019
8 tasks
@jakirkham

Copy link
Copy Markdown
MemberAuthor

Of course. 😄

FWIW I think we can get a better handle on this behavior by adding a flag to the ensure_* functions to handle subclasses of the expected type (e.g. bytes in this case). Opened PR ( zarr-developers/numcodecs#173 ) along these lines.

@jakirkhamjakirkham mentioned this pull request Apr 15, 2019
7 tasks
@jakirkhamjakirkham mentioned this pull request Dec 3, 2020
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jakirkham@pep8speaks@jhamman@alimanfoo
, '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

Use binary_type in MongoDBStore.__getitem__ for Python 2 only - #401

Merged
jakirkham merged 2 commits into
zarr-developers:masterfrom
jakirkham:drop_binary_type_cast
Feb 13, 2019
Merged

Use binary_type in MongoDBStore.__getitem__ for Python 2 only#401
jakirkham merged 2 commits into
zarr-developers:masterfrom
jakirkham:drop_binary_type_cast

Conversation

@jakirkham

@jakirkhamjakirkham commented Feb 12, 2019

Copy link
Copy Markdown
Member

Previously there were some test failures on Python 2 and referenced in this comment (and later discussion). Turns out on Python 2 a bson.Binary instance is returned, which subclasses bytes, as explained in the docs. So the coercion to bytes is only needed on Python 2 to convert bson.Binary to bytes. As Python 3 already returns a bytes instance, there is nothing we need to do there. Thus we restrict the binary_type call to Python 2. Should avoid a copy on Python 3.

xref: #372

TODO:

  • Add unit tests and/or doctests in docstrings
  • Add docstrings and API docs for any new/modified user-facing classes and functions
  • New/modified features documented in docs/tutorial.rst
  • Changes documented in docs/release.rst
  • Docs build locally (e.g., run tox -e docs)
  • AppVeyor and Travis CI passes
  • Test coverage is 100% (Coveralls passes)

@pep8speaks

pep8speaks commented Feb 12, 2019

Copy link
Copy Markdown

Hello @jakirkham! Thanks for updating the PR.

Line 4:80: E501 line too long (80 > 79 characters)
Line 8:80: E501 line too long (86 > 79 characters)
Line 9:80: E501 line too long (82 > 79 characters)
Line 10:80: E501 line too long (84 > 79 characters)
Line 11:80: E501 line too long (84 > 79 characters)
Line 12:80: E501 line too long (85 > 79 characters)
Line 13:80: E501 line too long (81 > 79 characters)
Line 14:80: E501 line too long (89 > 79 characters)
Line 43:80: E501 line too long (84 > 79 characters)
Line 44:80: E501 line too long (80 > 79 characters)
Line 102:80: E501 line too long (83 > 79 characters)
Line 125:80: E501 line too long (84 > 79 characters)
Line 151:80: E501 line too long (85 > 79 characters)
Line 152:80: E501 line too long (83 > 79 characters)
Line 164:80: E501 line too long (85 > 79 characters)
Line 210:80: E501 line too long (92 > 79 characters)
Line 281:80: E501 line too long (86 > 79 characters)
Line 308:80: E501 line too long (80 > 79 characters)
Line 317:80: E501 line too long (90 > 79 characters)
Line 326:80: E501 line too long (85 > 79 characters)
Line 327:80: E501 line too long (80 > 79 characters)
Line 377:80: E501 line too long (81 > 79 characters)
Line 380:80: E501 line too long (83 > 79 characters)
Line 382:80: E501 line too long (89 > 79 characters)
Line 406:80: E501 line too long (94 > 79 characters)
Line 467:80: E501 line too long (80 > 79 characters)
Line 673:80: E501 line too long (80 > 79 characters)
Line 705:80: E501 line too long (84 > 79 characters)
Line 706:80: E501 line too long (83 > 79 characters)
Line 754:80: E501 line too long (83 > 79 characters)
Line 765:80: E501 line too long (87 > 79 characters)
Line 922:80: E501 line too long (80 > 79 characters)
Line 937:80: E501 line too long (80 > 79 characters)
Line 1014:80: E501 line too long (85 > 79 characters)
Line 1024:80: E501 line too long (82 > 79 characters)
Line 1025:80: E501 line too long (83 > 79 characters)
Line 1072:80: E501 line too long (80 > 79 characters)
Line 1074:80: E501 line too long (83 > 79 characters)
Line 1085:80: E501 line too long (80 > 79 characters)
Line 1097:80: E501 line too long (80 > 79 characters)
Line 1104:80: E501 line too long (88 > 79 characters)
Line 1108:80: E501 line too long (82 > 79 characters)
Line 1117:80: E501 line too long (88 > 79 characters)
Line 1126:80: E501 line too long (84 > 79 characters)
Line 1127:80: E501 line too long (83 > 79 characters)
Line 1141:80: E501 line too long (87 > 79 characters)
Line 1145:80: E501 line too long (80 > 79 characters)
Line 1159:80: E501 line too long (89 > 79 characters)
Line 1333:80: E501 line too long (85 > 79 characters)
Line 1336:80: E501 line too long (88 > 79 characters)
Line 1346:80: E501 line too long (80 > 79 characters)
Line 1359:80: E501 line too long (80 > 79 characters)
Line 1361:80: E501 line too long (80 > 79 characters)
Line 1365:80: E501 line too long (84 > 79 characters)
Line 1376:80: E501 line too long (80 > 79 characters)
Line 1388:80: E501 line too long (80 > 79 characters)
Line 1390:80: E501 line too long (80 > 79 characters)
Line 1394:80: E501 line too long (82 > 79 characters)
Line 1395:80: E501 line too long (83 > 79 characters)
Line 1418:80: E501 line too long (83 > 79 characters)
Line 1457:80: E501 line too long (83 > 79 characters)
Line 1460:80: E501 line too long (87 > 79 characters)
Line 1527:80: E501 line too long (83 > 79 characters)
Line 1536:80: E501 line too long (87 > 79 characters)
Line 1547:80: E501 line too long (80 > 79 characters)
Line 1560:80: E501 line too long (80 > 79 characters)
Line 1562:80: E501 line too long (80 > 79 characters)
Line 1566:80: E501 line too long (84 > 79 characters)
Line 1572:80: E501 line too long (86 > 79 characters)
Line 1573:80: E501 line too long (90 > 79 characters)
Line 1575:80: E501 line too long (87 > 79 characters)
Line 1576:80: E501 line too long (86 > 79 characters)
Line 1583:80: E501 line too long (89 > 79 characters)
Line 1584:80: E501 line too long (87 > 79 characters)
Line 1591:80: E501 line too long (83 > 79 characters)
Line 1592:80: E501 line too long (84 > 79 characters)
Line 1593:80: E501 line too long (89 > 79 characters)
Line 1597:80: E501 line too long (84 > 79 characters)
Line 1598:80: E501 line too long (87 > 79 characters)
Line 1701:80: E501 line too long (81 > 79 characters)
Line 1702:80: E501 line too long (80 > 79 characters)
Line 1711:80: E501 line too long (87 > 79 characters)
Line 1720:80: E501 line too long (90 > 79 characters)
Line 1727:80: E501 line too long (91 > 79 characters)
Line 1731:80: E501 line too long (91 > 79 characters)
Line 1749:80: E501 line too long (82 > 79 characters)
Line 1750:80: E501 line too long (89 > 79 characters)
Line 1755:80: E501 line too long (82 > 79 characters)
Line 1797:80: E501 line too long (83 > 79 characters)
Line 1813:80: E501 line too long (86 > 79 characters)
Line 1861:80: E501 line too long (86 > 79 characters)
Line 1898:80: E501 line too long (80 > 79 characters)
Line 2110:80: E501 line too long (80 > 79 characters)
Line 2215:80: E501 line too long (80 > 79 characters)
Line 2278:80: E501 line too long (80 > 79 characters)
Line 2292:80: E501 line too long (86 > 79 characters)
Line 2325:80: E501 line too long (85 > 79 characters)

Comment last updated on February 13, 2019 at 06:37 Hours UTC

@jakirkhamjakirkham mentioned this pull request Feb 12, 2019
7 tasks
@jhamman

Copy link
Copy Markdown
Member

Still seems to be failing. This by the way was why I opened #393.

On both Python 2 and Python 3, PyMongo converts `binary_type` (i.e.
`bytes`) to BSON type 5 (Binary data) with subtype 0 to store in the
MongoDB instance. When reading that data back out, PyMongo handles BSON
type 5 (Binary data) with subtype 0 differently depending on the Python
version.
On Python 2, it creates a `bson.Binary` instance with the data. Normally
we would coerce this to a `bytes` object using `ensure_bytes`. However
that fails as `bson.Binary` is a subclass of `bytes`. So instead we
explicitly force it to `bytes` (i.e. `binary_type`). On Python 3,
PyMongo automatically converts the data to `bytes`. Thus we don't need
to do anything there.
ref: http://api.mongodb.com/python/current/python3.html#id3
ref: http://api.mongodb.com/python/current/api/bson/binary.html#bson.binary.Binary
@jakirkhamjakirkham changed the title Drop binary_type cast in MongoDBStore.__getitem__Use binary_type in MongoDBStore.__getitem__ for Python 2 onlyFeb 13, 2019
@jakirkham

Copy link
Copy Markdown
MemberAuthor

That's right. Just wanted to see if that was still the case after the dust settled.

After doing a little research, it looks like we can safely constrain this coercion to Python 2 only. Have updated the PR to do that. Should make it easier for us to remember to remove when we do drop Python 2.

Could you please give it another look? :)

@jhamman

Copy link
Copy Markdown
Member

yep, this looks right. I agree, this will make it easier to undo when PY2 goes away. Thanks.

@jakirkham

Copy link
Copy Markdown
MemberAuthor

Thanks @jhamman :)

@jakirkham
jakirkham merged commit 3c0e0f5 into zarr-developers:masterFeb 13, 2019
@jakirkham
jakirkham deleted the drop_binary_type_cast branch February 13, 2019 19:31
@jakirkhamjakirkham added this to the v2.3 milestone Feb 13, 2019
@alimanfoo

Copy link
Copy Markdown
Member

Thanks @jakirkham for this, nice to know exactly what's going on 👍

@jakirkhamjakirkham mentioned this pull request Feb 21, 2019
8 tasks
@jakirkham

Copy link
Copy Markdown
MemberAuthor

Of course. 😄

FWIW I think we can get a better handle on this behavior by adding a flag to the ensure_* functions to handle subclasses of the expected type (e.g. bytes in this case). Opened PR ( zarr-developers/numcodecs#173 ) along these lines.

@jakirkhamjakirkham mentioned this pull request Apr 15, 2019
7 tasks
@jakirkhamjakirkham mentioned this pull request Dec 3, 2020
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jakirkham@pep8speaks@jhamman@alimanfoo
, '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

Use binary_type in MongoDBStore.__getitem__ for Python 2 only - #401

Merged
jakirkham merged 2 commits into
zarr-developers:masterfrom
jakirkham:drop_binary_type_cast
Feb 13, 2019
Merged

Use binary_type in MongoDBStore.__getitem__ for Python 2 only#401
jakirkham merged 2 commits into
zarr-developers:masterfrom
jakirkham:drop_binary_type_cast

Conversation

@jakirkham

@jakirkhamjakirkham commented Feb 12, 2019

Copy link
Copy Markdown
Member

Previously there were some test failures on Python 2 and referenced in this comment (and later discussion). Turns out on Python 2 a bson.Binary instance is returned, which subclasses bytes, as explained in the docs. So the coercion to bytes is only needed on Python 2 to convert bson.Binary to bytes. As Python 3 already returns a bytes instance, there is nothing we need to do there. Thus we restrict the binary_type call to Python 2. Should avoid a copy on Python 3.

xref: #372

TODO:

  • Add unit tests and/or doctests in docstrings
  • Add docstrings and API docs for any new/modified user-facing classes and functions
  • New/modified features documented in docs/tutorial.rst
  • Changes documented in docs/release.rst
  • Docs build locally (e.g., run tox -e docs)
  • AppVeyor and Travis CI passes
  • Test coverage is 100% (Coveralls passes)

@pep8speaks

pep8speaks commented Feb 12, 2019

Copy link
Copy Markdown

Hello @jakirkham! Thanks for updating the PR.

Line 4:80: E501 line too long (80 > 79 characters)
Line 8:80: E501 line too long (86 > 79 characters)
Line 9:80: E501 line too long (82 > 79 characters)
Line 10:80: E501 line too long (84 > 79 characters)
Line 11:80: E501 line too long (84 > 79 characters)
Line 12:80: E501 line too long (85 > 79 characters)
Line 13:80: E501 line too long (81 > 79 characters)
Line 14:80: E501 line too long (89 > 79 characters)
Line 43:80: E501 line too long (84 > 79 characters)
Line 44:80: E501 line too long (80 > 79 characters)
Line 102:80: E501 line too long (83 > 79 characters)
Line 125:80: E501 line too long (84 > 79 characters)
Line 151:80: E501 line too long (85 > 79 characters)
Line 152:80: E501 line too long (83 > 79 characters)
Line 164:80: E501 line too long (85 > 79 characters)
Line 210:80: E501 line too long (92 > 79 characters)
Line 281:80: E501 line too long (86 > 79 characters)
Line 308:80: E501 line too long (80 > 79 characters)
Line 317:80: E501 line too long (90 > 79 characters)
Line 326:80: E501 line too long (85 > 79 characters)
Line 327:80: E501 line too long (80 > 79 characters)
Line 377:80: E501 line too long (81 > 79 characters)
Line 380:80: E501 line too long (83 > 79 characters)
Line 382:80: E501 line too long (89 > 79 characters)
Line 406:80: E501 line too long (94 > 79 characters)
Line 467:80: E501 line too long (80 > 79 characters)
Line 673:80: E501 line too long (80 > 79 characters)
Line 705:80: E501 line too long (84 > 79 characters)
Line 706:80: E501 line too long (83 > 79 characters)
Line 754:80: E501 line too long (83 > 79 characters)
Line 765:80: E501 line too long (87 > 79 characters)
Line 922:80: E501 line too long (80 > 79 characters)
Line 937:80: E501 line too long (80 > 79 characters)
Line 1014:80: E501 line too long (85 > 79 characters)
Line 1024:80: E501 line too long (82 > 79 characters)
Line 1025:80: E501 line too long (83 > 79 characters)
Line 1072:80: E501 line too long (80 > 79 characters)
Line 1074:80: E501 line too long (83 > 79 characters)
Line 1085:80: E501 line too long (80 > 79 characters)
Line 1097:80: E501 line too long (80 > 79 characters)
Line 1104:80: E501 line too long (88 > 79 characters)
Line 1108:80: E501 line too long (82 > 79 characters)
Line 1117:80: E501 line too long (88 > 79 characters)
Line 1126:80: E501 line too long (84 > 79 characters)
Line 1127:80: E501 line too long (83 > 79 characters)
Line 1141:80: E501 line too long (87 > 79 characters)
Line 1145:80: E501 line too long (80 > 79 characters)
Line 1159:80: E501 line too long (89 > 79 characters)
Line 1333:80: E501 line too long (85 > 79 characters)
Line 1336:80: E501 line too long (88 > 79 characters)
Line 1346:80: E501 line too long (80 > 79 characters)
Line 1359:80: E501 line too long (80 > 79 characters)
Line 1361:80: E501 line too long (80 > 79 characters)
Line 1365:80: E501 line too long (84 > 79 characters)
Line 1376:80: E501 line too long (80 > 79 characters)
Line 1388:80: E501 line too long (80 > 79 characters)
Line 1390:80: E501 line too long (80 > 79 characters)
Line 1394:80: E501 line too long (82 > 79 characters)
Line 1395:80: E501 line too long (83 > 79 characters)
Line 1418:80: E501 line too long (83 > 79 characters)
Line 1457:80: E501 line too long (83 > 79 characters)
Line 1460:80: E501 line too long (87 > 79 characters)
Line 1527:80: E501 line too long (83 > 79 characters)
Line 1536:80: E501 line too long (87 > 79 characters)
Line 1547:80: E501 line too long (80 > 79 characters)
Line 1560:80: E501 line too long (80 > 79 characters)
Line 1562:80: E501 line too long (80 > 79 characters)
Line 1566:80: E501 line too long (84 > 79 characters)
Line 1572:80: E501 line too long (86 > 79 characters)
Line 1573:80: E501 line too long (90 > 79 characters)
Line 1575:80: E501 line too long (87 > 79 characters)
Line 1576:80: E501 line too long (86 > 79 characters)
Line 1583:80: E501 line too long (89 > 79 characters)
Line 1584:80: E501 line too long (87 > 79 characters)
Line 1591:80: E501 line too long (83 > 79 characters)
Line 1592:80: E501 line too long (84 > 79 characters)
Line 1593:80: E501 line too long (89 > 79 characters)
Line 1597:80: E501 line too long (84 > 79 characters)
Line 1598:80: E501 line too long (87 > 79 characters)
Line 1701:80: E501 line too long (81 > 79 characters)
Line 1702:80: E501 line too long (80 > 79 characters)
Line 1711:80: E501 line too long (87 > 79 characters)
Line 1720:80: E501 line too long (90 > 79 characters)
Line 1727:80: E501 line too long (91 > 79 characters)
Line 1731:80: E501 line too long (91 > 79 characters)
Line 1749:80: E501 line too long (82 > 79 characters)
Line 1750:80: E501 line too long (89 > 79 characters)
Line 1755:80: E501 line too long (82 > 79 characters)
Line 1797:80: E501 line too long (83 > 79 characters)
Line 1813:80: E501 line too long (86 > 79 characters)
Line 1861:80: E501 line too long (86 > 79 characters)
Line 1898:80: E501 line too long (80 > 79 characters)
Line 2110:80: E501 line too long (80 > 79 characters)
Line 2215:80: E501 line too long (80 > 79 characters)
Line 2278:80: E501 line too long (80 > 79 characters)
Line 2292:80: E501 line too long (86 > 79 characters)
Line 2325:80: E501 line too long (85 > 79 characters)

Comment last updated on February 13, 2019 at 06:37 Hours UTC

@jakirkhamjakirkham mentioned this pull request Feb 12, 2019
7 tasks
@jhamman

Copy link
Copy Markdown
Member

Still seems to be failing. This by the way was why I opened #393.

On both Python 2 and Python 3, PyMongo converts `binary_type` (i.e.
`bytes`) to BSON type 5 (Binary data) with subtype 0 to store in the
MongoDB instance. When reading that data back out, PyMongo handles BSON
type 5 (Binary data) with subtype 0 differently depending on the Python
version.
On Python 2, it creates a `bson.Binary` instance with the data. Normally
we would coerce this to a `bytes` object using `ensure_bytes`. However
that fails as `bson.Binary` is a subclass of `bytes`. So instead we
explicitly force it to `bytes` (i.e. `binary_type`). On Python 3,
PyMongo automatically converts the data to `bytes`. Thus we don't need
to do anything there.
ref: http://api.mongodb.com/python/current/python3.html#id3
ref: http://api.mongodb.com/python/current/api/bson/binary.html#bson.binary.Binary
@jakirkhamjakirkham changed the title Drop binary_type cast in MongoDBStore.__getitem__Use binary_type in MongoDBStore.__getitem__ for Python 2 onlyFeb 13, 2019
@jakirkham

Copy link
Copy Markdown
MemberAuthor

That's right. Just wanted to see if that was still the case after the dust settled.

After doing a little research, it looks like we can safely constrain this coercion to Python 2 only. Have updated the PR to do that. Should make it easier for us to remember to remove when we do drop Python 2.

Could you please give it another look? :)

@jhamman

Copy link
Copy Markdown
Member

yep, this looks right. I agree, this will make it easier to undo when PY2 goes away. Thanks.

@jakirkham

Copy link
Copy Markdown
MemberAuthor

Thanks @jhamman :)

@jakirkham
jakirkham merged commit 3c0e0f5 into zarr-developers:masterFeb 13, 2019
@jakirkham
jakirkham deleted the drop_binary_type_cast branch February 13, 2019 19:31
@jakirkhamjakirkham added this to the v2.3 milestone Feb 13, 2019
@alimanfoo

Copy link
Copy Markdown
Member

Thanks @jakirkham for this, nice to know exactly what's going on 👍

@jakirkhamjakirkham mentioned this pull request Feb 21, 2019
8 tasks
@jakirkham

Copy link
Copy Markdown
MemberAuthor

Of course. 😄

FWIW I think we can get a better handle on this behavior by adding a flag to the ensure_* functions to handle subclasses of the expected type (e.g. bytes in this case). Opened PR ( zarr-developers/numcodecs#173 ) along these lines.

@jakirkhamjakirkham mentioned this pull request Apr 15, 2019
7 tasks
@jakirkhamjakirkham mentioned this pull request Dec 3, 2020
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jakirkham@pep8speaks@jhamman@alimanfoo
, '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

Use binary_type in MongoDBStore.__getitem__ for Python 2 only - #401

Merged
jakirkham merged 2 commits into
zarr-developers:masterfrom
jakirkham:drop_binary_type_cast
Feb 13, 2019
Merged

Use binary_type in MongoDBStore.__getitem__ for Python 2 only#401
jakirkham merged 2 commits into
zarr-developers:masterfrom
jakirkham:drop_binary_type_cast

Conversation

@jakirkham

@jakirkhamjakirkham commented Feb 12, 2019

Copy link
Copy Markdown
Member

Previously there were some test failures on Python 2 and referenced in this comment (and later discussion). Turns out on Python 2 a bson.Binary instance is returned, which subclasses bytes, as explained in the docs. So the coercion to bytes is only needed on Python 2 to convert bson.Binary to bytes. As Python 3 already returns a bytes instance, there is nothing we need to do there. Thus we restrict the binary_type call to Python 2. Should avoid a copy on Python 3.

xref: #372

TODO:

  • Add unit tests and/or doctests in docstrings
  • Add docstrings and API docs for any new/modified user-facing classes and functions
  • New/modified features documented in docs/tutorial.rst
  • Changes documented in docs/release.rst
  • Docs build locally (e.g., run tox -e docs)
  • AppVeyor and Travis CI passes
  • Test coverage is 100% (Coveralls passes)

@pep8speaks

pep8speaks commented Feb 12, 2019

Copy link
Copy Markdown

Hello @jakirkham! Thanks for updating the PR.

Line 4:80: E501 line too long (80 > 79 characters)
Line 8:80: E501 line too long (86 > 79 characters)
Line 9:80: E501 line too long (82 > 79 characters)
Line 10:80: E501 line too long (84 > 79 characters)
Line 11:80: E501 line too long (84 > 79 characters)
Line 12:80: E501 line too long (85 > 79 characters)
Line 13:80: E501 line too long (81 > 79 characters)
Line 14:80: E501 line too long (89 > 79 characters)
Line 43:80: E501 line too long (84 > 79 characters)
Line 44:80: E501 line too long (80 > 79 characters)
Line 102:80: E501 line too long (83 > 79 characters)
Line 125:80: E501 line too long (84 > 79 characters)
Line 151:80: E501 line too long (85 > 79 characters)
Line 152:80: E501 line too long (83 > 79 characters)
Line 164:80: E501 line too long (85 > 79 characters)
Line 210:80: E501 line too long (92 > 79 characters)
Line 281:80: E501 line too long (86 > 79 characters)
Line 308:80: E501 line too long (80 > 79 characters)
Line 317:80: E501 line too long (90 > 79 characters)
Line 326:80: E501 line too long (85 > 79 characters)
Line 327:80: E501 line too long (80 > 79 characters)
Line 377:80: E501 line too long (81 > 79 characters)
Line 380:80: E501 line too long (83 > 79 characters)
Line 382:80: E501 line too long (89 > 79 characters)
Line 406:80: E501 line too long (94 > 79 characters)
Line 467:80: E501 line too long (80 > 79 characters)
Line 673:80: E501 line too long (80 > 79 characters)
Line 705:80: E501 line too long (84 > 79 characters)
Line 706:80: E501 line too long (83 > 79 characters)
Line 754:80: E501 line too long (83 > 79 characters)
Line 765:80: E501 line too long (87 > 79 characters)
Line 922:80: E501 line too long (80 > 79 characters)
Line 937:80: E501 line too long (80 > 79 characters)
Line 1014:80: E501 line too long (85 > 79 characters)
Line 1024:80: E501 line too long (82 > 79 characters)
Line 1025:80: E501 line too long (83 > 79 characters)
Line 1072:80: E501 line too long (80 > 79 characters)
Line 1074:80: E501 line too long (83 > 79 characters)
Line 1085:80: E501 line too long (80 > 79 characters)
Line 1097:80: E501 line too long (80 > 79 characters)
Line 1104:80: E501 line too long (88 > 79 characters)
Line 1108:80: E501 line too long (82 > 79 characters)
Line 1117:80: E501 line too long (88 > 79 characters)
Line 1126:80: E501 line too long (84 > 79 characters)
Line 1127:80: E501 line too long (83 > 79 characters)
Line 1141:80: E501 line too long (87 > 79 characters)
Line 1145:80: E501 line too long (80 > 79 characters)
Line 1159:80: E501 line too long (89 > 79 characters)
Line 1333:80: E501 line too long (85 > 79 characters)
Line 1336:80: E501 line too long (88 > 79 characters)
Line 1346:80: E501 line too long (80 > 79 characters)
Line 1359:80: E501 line too long (80 > 79 characters)
Line 1361:80: E501 line too long (80 > 79 characters)
Line 1365:80: E501 line too long (84 > 79 characters)
Line 1376:80: E501 line too long (80 > 79 characters)
Line 1388:80: E501 line too long (80 > 79 characters)
Line 1390:80: E501 line too long (80 > 79 characters)
Line 1394:80: E501 line too long (82 > 79 characters)
Line 1395:80: E501 line too long (83 > 79 characters)
Line 1418:80: E501 line too long (83 > 79 characters)
Line 1457:80: E501 line too long (83 > 79 characters)
Line 1460:80: E501 line too long (87 > 79 characters)
Line 1527:80: E501 line too long (83 > 79 characters)
Line 1536:80: E501 line too long (87 > 79 characters)
Line 1547:80: E501 line too long (80 > 79 characters)
Line 1560:80: E501 line too long (80 > 79 characters)
Line 1562:80: E501 line too long (80 > 79 characters)
Line 1566:80: E501 line too long (84 > 79 characters)
Line 1572:80: E501 line too long (86 > 79 characters)
Line 1573:80: E501 line too long (90 > 79 characters)
Line 1575:80: E501 line too long (87 > 79 characters)
Line 1576:80: E501 line too long (86 > 79 characters)
Line 1583:80: E501 line too long (89 > 79 characters)
Line 1584:80: E501 line too long (87 > 79 characters)
Line 1591:80: E501 line too long (83 > 79 characters)
Line 1592:80: E501 line too long (84 > 79 characters)
Line 1593:80: E501 line too long (89 > 79 characters)
Line 1597:80: E501 line too long (84 > 79 characters)
Line 1598:80: E501 line too long (87 > 79 characters)
Line 1701:80: E501 line too long (81 > 79 characters)
Line 1702:80: E501 line too long (80 > 79 characters)
Line 1711:80: E501 line too long (87 > 79 characters)
Line 1720:80: E501 line too long (90 > 79 characters)
Line 1727:80: E501 line too long (91 > 79 characters)
Line 1731:80: E501 line too long (91 > 79 characters)
Line 1749:80: E501 line too long (82 > 79 characters)
Line 1750:80: E501 line too long (89 > 79 characters)
Line 1755:80: E501 line too long (82 > 79 characters)
Line 1797:80: E501 line too long (83 > 79 characters)
Line 1813:80: E501 line too long (86 > 79 characters)
Line 1861:80: E501 line too long (86 > 79 characters)
Line 1898:80: E501 line too long (80 > 79 characters)
Line 2110:80: E501 line too long (80 > 79 characters)
Line 2215:80: E501 line too long (80 > 79 characters)
Line 2278:80: E501 line too long (80 > 79 characters)
Line 2292:80: E501 line too long (86 > 79 characters)
Line 2325:80: E501 line too long (85 > 79 characters)

Comment last updated on February 13, 2019 at 06:37 Hours UTC

@jakirkhamjakirkham mentioned this pull request Feb 12, 2019
7 tasks
@jhamman

Copy link
Copy Markdown
Member

Still seems to be failing. This by the way was why I opened #393.

On both Python 2 and Python 3, PyMongo converts `binary_type` (i.e.
`bytes`) to BSON type 5 (Binary data) with subtype 0 to store in the
MongoDB instance. When reading that data back out, PyMongo handles BSON
type 5 (Binary data) with subtype 0 differently depending on the Python
version.
On Python 2, it creates a `bson.Binary` instance with the data. Normally
we would coerce this to a `bytes` object using `ensure_bytes`. However
that fails as `bson.Binary` is a subclass of `bytes`. So instead we
explicitly force it to `bytes` (i.e. `binary_type`). On Python 3,
PyMongo automatically converts the data to `bytes`. Thus we don't need
to do anything there.
ref: http://api.mongodb.com/python/current/python3.html#id3
ref: http://api.mongodb.com/python/current/api/bson/binary.html#bson.binary.Binary
@jakirkhamjakirkham changed the title Drop binary_type cast in MongoDBStore.__getitem__Use binary_type in MongoDBStore.__getitem__ for Python 2 onlyFeb 13, 2019
@jakirkham

Copy link
Copy Markdown
MemberAuthor

That's right. Just wanted to see if that was still the case after the dust settled.

After doing a little research, it looks like we can safely constrain this coercion to Python 2 only. Have updated the PR to do that. Should make it easier for us to remember to remove when we do drop Python 2.

Could you please give it another look? :)

@jhamman

Copy link
Copy Markdown
Member

yep, this looks right. I agree, this will make it easier to undo when PY2 goes away. Thanks.

@jakirkham

Copy link
Copy Markdown
MemberAuthor

Thanks @jhamman :)

@jakirkham
jakirkham merged commit 3c0e0f5 into zarr-developers:masterFeb 13, 2019
@jakirkham
jakirkham deleted the drop_binary_type_cast branch February 13, 2019 19:31
@jakirkhamjakirkham added this to the v2.3 milestone Feb 13, 2019
@alimanfoo

Copy link
Copy Markdown
Member

Thanks @jakirkham for this, nice to know exactly what's going on 👍

@jakirkhamjakirkham mentioned this pull request Feb 21, 2019
8 tasks
@jakirkham

Copy link
Copy Markdown
MemberAuthor

Of course. 😄

FWIW I think we can get a better handle on this behavior by adding a flag to the ensure_* functions to handle subclasses of the expected type (e.g. bytes in this case). Opened PR ( zarr-developers/numcodecs#173 ) along these lines.

@jakirkhamjakirkham mentioned this pull request Apr 15, 2019
7 tasks
@jakirkhamjakirkham mentioned this pull request Dec 3, 2020
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jakirkham@pep8speaks@jhamman@alimanfoo
, '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

Use binary_type in MongoDBStore.__getitem__ for Python 2 only - #401

Merged
jakirkham merged 2 commits into
zarr-developers:masterfrom
jakirkham:drop_binary_type_cast
Feb 13, 2019
Merged

Use binary_type in MongoDBStore.__getitem__ for Python 2 only#401
jakirkham merged 2 commits into
zarr-developers:masterfrom
jakirkham:drop_binary_type_cast

Conversation

@jakirkham

@jakirkhamjakirkham commented Feb 12, 2019

Copy link
Copy Markdown
Member

Previously there were some test failures on Python 2 and referenced in this comment (and later discussion). Turns out on Python 2 a bson.Binary instance is returned, which subclasses bytes, as explained in the docs. So the coercion to bytes is only needed on Python 2 to convert bson.Binary to bytes. As Python 3 already returns a bytes instance, there is nothing we need to do there. Thus we restrict the binary_type call to Python 2. Should avoid a copy on Python 3.

xref: #372

TODO:

  • Add unit tests and/or doctests in docstrings
  • Add docstrings and API docs for any new/modified user-facing classes and functions
  • New/modified features documented in docs/tutorial.rst
  • Changes documented in docs/release.rst
  • Docs build locally (e.g., run tox -e docs)
  • AppVeyor and Travis CI passes
  • Test coverage is 100% (Coveralls passes)

@pep8speaks

pep8speaks commented Feb 12, 2019

Copy link
Copy Markdown

Hello @jakirkham! Thanks for updating the PR.

Line 4:80: E501 line too long (80 > 79 characters)
Line 8:80: E501 line too long (86 > 79 characters)
Line 9:80: E501 line too long (82 > 79 characters)
Line 10:80: E501 line too long (84 > 79 characters)
Line 11:80: E501 line too long (84 > 79 characters)
Line 12:80: E501 line too long (85 > 79 characters)
Line 13:80: E501 line too long (81 > 79 characters)
Line 14:80: E501 line too long (89 > 79 characters)
Line 43:80: E501 line too long (84 > 79 characters)
Line 44:80: E501 line too long (80 > 79 characters)
Line 102:80: E501 line too long (83 > 79 characters)
Line 125:80: E501 line too long (84 > 79 characters)
Line 151:80: E501 line too long (85 > 79 characters)
Line 152:80: E501 line too long (83 > 79 characters)
Line 164:80: E501 line too long (85 > 79 characters)
Line 210:80: E501 line too long (92 > 79 characters)
Line 281:80: E501 line too long (86 > 79 characters)
Line 308:80: E501 line too long (80 > 79 characters)
Line 317:80: E501 line too long (90 > 79 characters)
Line 326:80: E501 line too long (85 > 79 characters)
Line 327:80: E501 line too long (80 > 79 characters)
Line 377:80: E501 line too long (81 > 79 characters)
Line 380:80: E501 line too long (83 > 79 characters)
Line 382:80: E501 line too long (89 > 79 characters)
Line 406:80: E501 line too long (94 > 79 characters)
Line 467:80: E501 line too long (80 > 79 characters)
Line 673:80: E501 line too long (80 > 79 characters)
Line 705:80: E501 line too long (84 > 79 characters)
Line 706:80: E501 line too long (83 > 79 characters)
Line 754:80: E501 line too long (83 > 79 characters)
Line 765:80: E501 line too long (87 > 79 characters)
Line 922:80: E501 line too long (80 > 79 characters)
Line 937:80: E501 line too long (80 > 79 characters)
Line 1014:80: E501 line too long (85 > 79 characters)
Line 1024:80: E501 line too long (82 > 79 characters)
Line 1025:80: E501 line too long (83 > 79 characters)
Line 1072:80: E501 line too long (80 > 79 characters)
Line 1074:80: E501 line too long (83 > 79 characters)
Line 1085:80: E501 line too long (80 > 79 characters)
Line 1097:80: E501 line too long (80 > 79 characters)
Line 1104:80: E501 line too long (88 > 79 characters)
Line 1108:80: E501 line too long (82 > 79 characters)
Line 1117:80: E501 line too long (88 > 79 characters)
Line 1126:80: E501 line too long (84 > 79 characters)
Line 1127:80: E501 line too long (83 > 79 characters)
Line 1141:80: E501 line too long (87 > 79 characters)
Line 1145:80: E501 line too long (80 > 79 characters)
Line 1159:80: E501 line too long (89 > 79 characters)
Line 1333:80: E501 line too long (85 > 79 characters)
Line 1336:80: E501 line too long (88 > 79 characters)
Line 1346:80: E501 line too long (80 > 79 characters)
Line 1359:80: E501 line too long (80 > 79 characters)
Line 1361:80: E501 line too long (80 > 79 characters)
Line 1365:80: E501 line too long (84 > 79 characters)
Line 1376:80: E501 line too long (80 > 79 characters)
Line 1388:80: E501 line too long (80 > 79 characters)
Line 1390:80: E501 line too long (80 > 79 characters)
Line 1394:80: E501 line too long (82 > 79 characters)
Line 1395:80: E501 line too long (83 > 79 characters)
Line 1418:80: E501 line too long (83 > 79 characters)
Line 1457:80: E501 line too long (83 > 79 characters)
Line 1460:80: E501 line too long (87 > 79 characters)
Line 1527:80: E501 line too long (83 > 79 characters)
Line 1536:80: E501 line too long (87 > 79 characters)
Line 1547:80: E501 line too long (80 > 79 characters)
Line 1560:80: E501 line too long (80 > 79 characters)
Line 1562:80: E501 line too long (80 > 79 characters)
Line 1566:80: E501 line too long (84 > 79 characters)
Line 1572:80: E501 line too long (86 > 79 characters)
Line 1573:80: E501 line too long (90 > 79 characters)
Line 1575:80: E501 line too long (87 > 79 characters)
Line 1576:80: E501 line too long (86 > 79 characters)
Line 1583:80: E501 line too long (89 > 79 characters)
Line 1584:80: E501 line too long (87 > 79 characters)
Line 1591:80: E501 line too long (83 > 79 characters)
Line 1592:80: E501 line too long (84 > 79 characters)
Line 1593:80: E501 line too long (89 > 79 characters)
Line 1597:80: E501 line too long (84 > 79 characters)
Line 1598:80: E501 line too long (87 > 79 characters)
Line 1701:80: E501 line too long (81 > 79 characters)
Line 1702:80: E501 line too long (80 > 79 characters)
Line 1711:80: E501 line too long (87 > 79 characters)
Line 1720:80: E501 line too long (90 > 79 characters)
Line 1727:80: E501 line too long (91 > 79 characters)
Line 1731:80: E501 line too long (91 > 79 characters)
Line 1749:80: E501 line too long (82 > 79 characters)
Line 1750:80: E501 line too long (89 > 79 characters)
Line 1755:80: E501 line too long (82 > 79 characters)
Line 1797:80: E501 line too long (83 > 79 characters)
Line 1813:80: E501 line too long (86 > 79 characters)
Line 1861:80: E501 line too long (86 > 79 characters)
Line 1898:80: E501 line too long (80 > 79 characters)
Line 2110:80: E501 line too long (80 > 79 characters)
Line 2215:80: E501 line too long (80 > 79 characters)
Line 2278:80: E501 line too long (80 > 79 characters)
Line 2292:80: E501 line too long (86 > 79 characters)
Line 2325:80: E501 line too long (85 > 79 characters)

Comment last updated on February 13, 2019 at 06:37 Hours UTC

@jakirkhamjakirkham mentioned this pull request Feb 12, 2019
7 tasks
@jhamman

Copy link
Copy Markdown
Member

Still seems to be failing. This by the way was why I opened #393.

On both Python 2 and Python 3, PyMongo converts `binary_type` (i.e.
`bytes`) to BSON type 5 (Binary data) with subtype 0 to store in the
MongoDB instance. When reading that data back out, PyMongo handles BSON
type 5 (Binary data) with subtype 0 differently depending on the Python
version.
On Python 2, it creates a `bson.Binary` instance with the data. Normally
we would coerce this to a `bytes` object using `ensure_bytes`. However
that fails as `bson.Binary` is a subclass of `bytes`. So instead we
explicitly force it to `bytes` (i.e. `binary_type`). On Python 3,
PyMongo automatically converts the data to `bytes`. Thus we don't need
to do anything there.
ref: http://api.mongodb.com/python/current/python3.html#id3
ref: http://api.mongodb.com/python/current/api/bson/binary.html#bson.binary.Binary
@jakirkhamjakirkham changed the title Drop binary_type cast in MongoDBStore.__getitem__Use binary_type in MongoDBStore.__getitem__ for Python 2 onlyFeb 13, 2019
@jakirkham

Copy link
Copy Markdown
MemberAuthor

That's right. Just wanted to see if that was still the case after the dust settled.

After doing a little research, it looks like we can safely constrain this coercion to Python 2 only. Have updated the PR to do that. Should make it easier for us to remember to remove when we do drop Python 2.

Could you please give it another look? :)

@jhamman

Copy link
Copy Markdown
Member

yep, this looks right. I agree, this will make it easier to undo when PY2 goes away. Thanks.

@jakirkham

Copy link
Copy Markdown
MemberAuthor

Thanks @jhamman :)

@jakirkham
jakirkham merged commit 3c0e0f5 into zarr-developers:masterFeb 13, 2019
@jakirkham
jakirkham deleted the drop_binary_type_cast branch February 13, 2019 19:31
@jakirkhamjakirkham added this to the v2.3 milestone Feb 13, 2019
@alimanfoo

Copy link
Copy Markdown
Member

Thanks @jakirkham for this, nice to know exactly what's going on 👍

@jakirkhamjakirkham mentioned this pull request Feb 21, 2019
8 tasks
@jakirkham

Copy link
Copy Markdown
MemberAuthor

Of course. 😄

FWIW I think we can get a better handle on this behavior by adding a flag to the ensure_* functions to handle subclasses of the expected type (e.g. bytes in this case). Opened PR ( zarr-developers/numcodecs#173 ) along these lines.

@jakirkhamjakirkham mentioned this pull request Apr 15, 2019
7 tasks
@jakirkhamjakirkham mentioned this pull request Dec 3, 2020
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jakirkham@pep8speaks@jhamman@alimanfoo
, '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

Use binary_type in MongoDBStore.__getitem__ for Python 2 only - #401

Merged
jakirkham merged 2 commits into
zarr-developers:masterfrom
jakirkham:drop_binary_type_cast
Feb 13, 2019
Merged

Use binary_type in MongoDBStore.__getitem__ for Python 2 only#401
jakirkham merged 2 commits into
zarr-developers:masterfrom
jakirkham:drop_binary_type_cast

Conversation

@jakirkham

@jakirkhamjakirkham commented Feb 12, 2019

Copy link
Copy Markdown
Member

Previously there were some test failures on Python 2 and referenced in this comment (and later discussion). Turns out on Python 2 a bson.Binary instance is returned, which subclasses bytes, as explained in the docs. So the coercion to bytes is only needed on Python 2 to convert bson.Binary to bytes. As Python 3 already returns a bytes instance, there is nothing we need to do there. Thus we restrict the binary_type call to Python 2. Should avoid a copy on Python 3.

xref: #372

TODO:

  • Add unit tests and/or doctests in docstrings
  • Add docstrings and API docs for any new/modified user-facing classes and functions
  • New/modified features documented in docs/tutorial.rst
  • Changes documented in docs/release.rst
  • Docs build locally (e.g., run tox -e docs)
  • AppVeyor and Travis CI passes
  • Test coverage is 100% (Coveralls passes)

@pep8speaks

pep8speaks commented Feb 12, 2019

Copy link
Copy Markdown

Hello @jakirkham! Thanks for updating the PR.

Line 4:80: E501 line too long (80 > 79 characters)
Line 8:80: E501 line too long (86 > 79 characters)
Line 9:80: E501 line too long (82 > 79 characters)
Line 10:80: E501 line too long (84 > 79 characters)
Line 11:80: E501 line too long (84 > 79 characters)
Line 12:80: E501 line too long (85 > 79 characters)
Line 13:80: E501 line too long (81 > 79 characters)
Line 14:80: E501 line too long (89 > 79 characters)
Line 43:80: E501 line too long (84 > 79 characters)
Line 44:80: E501 line too long (80 > 79 characters)
Line 102:80: E501 line too long (83 > 79 characters)
Line 125:80: E501 line too long (84 > 79 characters)
Line 151:80: E501 line too long (85 > 79 characters)
Line 152:80: E501 line too long (83 > 79 characters)
Line 164:80: E501 line too long (85 > 79 characters)
Line 210:80: E501 line too long (92 > 79 characters)
Line 281:80: E501 line too long (86 > 79 characters)
Line 308:80: E501 line too long (80 > 79 characters)
Line 317:80: E501 line too long (90 > 79 characters)
Line 326:80: E501 line too long (85 > 79 characters)
Line 327:80: E501 line too long (80 > 79 characters)
Line 377:80: E501 line too long (81 > 79 characters)
Line 380:80: E501 line too long (83 > 79 characters)
Line 382:80: E501 line too long (89 > 79 characters)
Line 406:80: E501 line too long (94 > 79 characters)
Line 467:80: E501 line too long (80 > 79 characters)
Line 673:80: E501 line too long (80 > 79 characters)
Line 705:80: E501 line too long (84 > 79 characters)
Line 706:80: E501 line too long (83 > 79 characters)
Line 754:80: E501 line too long (83 > 79 characters)
Line 765:80: E501 line too long (87 > 79 characters)
Line 922:80: E501 line too long (80 > 79 characters)
Line 937:80: E501 line too long (80 > 79 characters)
Line 1014:80: E501 line too long (85 > 79 characters)
Line 1024:80: E501 line too long (82 > 79 characters)
Line 1025:80: E501 line too long (83 > 79 characters)
Line 1072:80: E501 line too long (80 > 79 characters)
Line 1074:80: E501 line too long (83 > 79 characters)
Line 1085:80: E501 line too long (80 > 79 characters)
Line 1097:80: E501 line too long (80 > 79 characters)
Line 1104:80: E501 line too long (88 > 79 characters)
Line 1108:80: E501 line too long (82 > 79 characters)
Line 1117:80: E501 line too long (88 > 79 characters)
Line 1126:80: E501 line too long (84 > 79 characters)
Line 1127:80: E501 line too long (83 > 79 characters)
Line 1141:80: E501 line too long (87 > 79 characters)
Line 1145:80: E501 line too long (80 > 79 characters)
Line 1159:80: E501 line too long (89 > 79 characters)
Line 1333:80: E501 line too long (85 > 79 characters)
Line 1336:80: E501 line too long (88 > 79 characters)
Line 1346:80: E501 line too long (80 > 79 characters)
Line 1359:80: E501 line too long (80 > 79 characters)
Line 1361:80: E501 line too long (80 > 79 characters)
Line 1365:80: E501 line too long (84 > 79 characters)
Line 1376:80: E501 line too long (80 > 79 characters)
Line 1388:80: E501 line too long (80 > 79 characters)
Line 1390:80: E501 line too long (80 > 79 characters)
Line 1394:80: E501 line too long (82 > 79 characters)
Line 1395:80: E501 line too long (83 > 79 characters)
Line 1418:80: E501 line too long (83 > 79 characters)
Line 1457:80: E501 line too long (83 > 79 characters)
Line 1460:80: E501 line too long (87 > 79 characters)
Line 1527:80: E501 line too long (83 > 79 characters)
Line 1536:80: E501 line too long (87 > 79 characters)
Line 1547:80: E501 line too long (80 > 79 characters)
Line 1560:80: E501 line too long (80 > 79 characters)
Line 1562:80: E501 line too long (80 > 79 characters)
Line 1566:80: E501 line too long (84 > 79 characters)
Line 1572:80: E501 line too long (86 > 79 characters)
Line 1573:80: E501 line too long (90 > 79 characters)
Line 1575:80: E501 line too long (87 > 79 characters)
Line 1576:80: E501 line too long (86 > 79 characters)
Line 1583:80: E501 line too long (89 > 79 characters)
Line 1584:80: E501 line too long (87 > 79 characters)
Line 1591:80: E501 line too long (83 > 79 characters)
Line 1592:80: E501 line too long (84 > 79 characters)
Line 1593:80: E501 line too long (89 > 79 characters)
Line 1597:80: E501 line too long (84 > 79 characters)
Line 1598:80: E501 line too long (87 > 79 characters)
Line 1701:80: E501 line too long (81 > 79 characters)
Line 1702:80: E501 line too long (80 > 79 characters)
Line 1711:80: E501 line too long (87 > 79 characters)
Line 1720:80: E501 line too long (90 > 79 characters)
Line 1727:80: E501 line too long (91 > 79 characters)
Line 1731:80: E501 line too long (91 > 79 characters)
Line 1749:80: E501 line too long (82 > 79 characters)
Line 1750:80: E501 line too long (89 > 79 characters)
Line 1755:80: E501 line too long (82 > 79 characters)
Line 1797:80: E501 line too long (83 > 79 characters)
Line 1813:80: E501 line too long (86 > 79 characters)
Line 1861:80: E501 line too long (86 > 79 characters)
Line 1898:80: E501 line too long (80 > 79 characters)
Line 2110:80: E501 line too long (80 > 79 characters)
Line 2215:80: E501 line too long (80 > 79 characters)
Line 2278:80: E501 line too long (80 > 79 characters)
Line 2292:80: E501 line too long (86 > 79 characters)
Line 2325:80: E501 line too long (85 > 79 characters)

Comment last updated on February 13, 2019 at 06:37 Hours UTC

@jakirkhamjakirkham mentioned this pull request Feb 12, 2019
7 tasks
@jhamman

Copy link
Copy Markdown
Member

Still seems to be failing. This by the way was why I opened #393.

On both Python 2 and Python 3, PyMongo converts `binary_type` (i.e.
`bytes`) to BSON type 5 (Binary data) with subtype 0 to store in the
MongoDB instance. When reading that data back out, PyMongo handles BSON
type 5 (Binary data) with subtype 0 differently depending on the Python
version.
On Python 2, it creates a `bson.Binary` instance with the data. Normally
we would coerce this to a `bytes` object using `ensure_bytes`. However
that fails as `bson.Binary` is a subclass of `bytes`. So instead we
explicitly force it to `bytes` (i.e. `binary_type`). On Python 3,
PyMongo automatically converts the data to `bytes`. Thus we don't need
to do anything there.
ref: http://api.mongodb.com/python/current/python3.html#id3
ref: http://api.mongodb.com/python/current/api/bson/binary.html#bson.binary.Binary
@jakirkhamjakirkham changed the title Drop binary_type cast in MongoDBStore.__getitem__Use binary_type in MongoDBStore.__getitem__ for Python 2 onlyFeb 13, 2019
@jakirkham

Copy link
Copy Markdown
MemberAuthor

That's right. Just wanted to see if that was still the case after the dust settled.

After doing a little research, it looks like we can safely constrain this coercion to Python 2 only. Have updated the PR to do that. Should make it easier for us to remember to remove when we do drop Python 2.

Could you please give it another look? :)

@jhamman

Copy link
Copy Markdown
Member

yep, this looks right. I agree, this will make it easier to undo when PY2 goes away. Thanks.

@jakirkham

Copy link
Copy Markdown
MemberAuthor

Thanks @jhamman :)

@jakirkham
jakirkham merged commit 3c0e0f5 into zarr-developers:masterFeb 13, 2019
@jakirkham
jakirkham deleted the drop_binary_type_cast branch February 13, 2019 19:31
@jakirkhamjakirkham added this to the v2.3 milestone Feb 13, 2019
@alimanfoo

Copy link
Copy Markdown
Member

Thanks @jakirkham for this, nice to know exactly what's going on 👍

@jakirkhamjakirkham mentioned this pull request Feb 21, 2019
8 tasks
@jakirkham

Copy link
Copy Markdown
MemberAuthor

Of course. 😄

FWIW I think we can get a better handle on this behavior by adding a flag to the ensure_* functions to handle subclasses of the expected type (e.g. bytes in this case). Opened PR ( zarr-developers/numcodecs#173 ) along these lines.

@jakirkhamjakirkham mentioned this pull request Apr 15, 2019
7 tasks
@jakirkhamjakirkham mentioned this pull request Dec 3, 2020
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jakirkham@pep8speaks@jhamman@alimanfoo
, '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

Use binary_type in MongoDBStore.__getitem__ for Python 2 only - #401

Merged
jakirkham merged 2 commits into
zarr-developers:masterfrom
jakirkham:drop_binary_type_cast
Feb 13, 2019
Merged

Use binary_type in MongoDBStore.__getitem__ for Python 2 only#401
jakirkham merged 2 commits into
zarr-developers:masterfrom
jakirkham:drop_binary_type_cast

Conversation

@jakirkham

@jakirkhamjakirkham commented Feb 12, 2019

Copy link
Copy Markdown
Member

Previously there were some test failures on Python 2 and referenced in this comment (and later discussion). Turns out on Python 2 a bson.Binary instance is returned, which subclasses bytes, as explained in the docs. So the coercion to bytes is only needed on Python 2 to convert bson.Binary to bytes. As Python 3 already returns a bytes instance, there is nothing we need to do there. Thus we restrict the binary_type call to Python 2. Should avoid a copy on Python 3.

xref: #372

TODO:

  • Add unit tests and/or doctests in docstrings
  • Add docstrings and API docs for any new/modified user-facing classes and functions
  • New/modified features documented in docs/tutorial.rst
  • Changes documented in docs/release.rst
  • Docs build locally (e.g., run tox -e docs)
  • AppVeyor and Travis CI passes
  • Test coverage is 100% (Coveralls passes)

@pep8speaks

pep8speaks commented Feb 12, 2019

Copy link
Copy Markdown

Hello @jakirkham! Thanks for updating the PR.

Line 4:80: E501 line too long (80 > 79 characters)
Line 8:80: E501 line too long (86 > 79 characters)
Line 9:80: E501 line too long (82 > 79 characters)
Line 10:80: E501 line too long (84 > 79 characters)
Line 11:80: E501 line too long (84 > 79 characters)
Line 12:80: E501 line too long (85 > 79 characters)
Line 13:80: E501 line too long (81 > 79 characters)
Line 14:80: E501 line too long (89 > 79 characters)
Line 43:80: E501 line too long (84 > 79 characters)
Line 44:80: E501 line too long (80 > 79 characters)
Line 102:80: E501 line too long (83 > 79 characters)
Line 125:80: E501 line too long (84 > 79 characters)
Line 151:80: E501 line too long (85 > 79 characters)
Line 152:80: E501 line too long (83 > 79 characters)
Line 164:80: E501 line too long (85 > 79 characters)
Line 210:80: E501 line too long (92 > 79 characters)
Line 281:80: E501 line too long (86 > 79 characters)
Line 308:80: E501 line too long (80 > 79 characters)
Line 317:80: E501 line too long (90 > 79 characters)
Line 326:80: E501 line too long (85 > 79 characters)
Line 327:80: E501 line too long (80 > 79 characters)
Line 377:80: E501 line too long (81 > 79 characters)
Line 380:80: E501 line too long (83 > 79 characters)
Line 382:80: E501 line too long (89 > 79 characters)
Line 406:80: E501 line too long (94 > 79 characters)
Line 467:80: E501 line too long (80 > 79 characters)
Line 673:80: E501 line too long (80 > 79 characters)
Line 705:80: E501 line too long (84 > 79 characters)
Line 706:80: E501 line too long (83 > 79 characters)
Line 754:80: E501 line too long (83 > 79 characters)
Line 765:80: E501 line too long (87 > 79 characters)
Line 922:80: E501 line too long (80 > 79 characters)
Line 937:80: E501 line too long (80 > 79 characters)
Line 1014:80: E501 line too long (85 > 79 characters)
Line 1024:80: E501 line too long (82 > 79 characters)
Line 1025:80: E501 line too long (83 > 79 characters)
Line 1072:80: E501 line too long (80 > 79 characters)
Line 1074:80: E501 line too long (83 > 79 characters)
Line 1085:80: E501 line too long (80 > 79 characters)
Line 1097:80: E501 line too long (80 > 79 characters)
Line 1104:80: E501 line too long (88 > 79 characters)
Line 1108:80: E501 line too long (82 > 79 characters)
Line 1117:80: E501 line too long (88 > 79 characters)
Line 1126:80: E501 line too long (84 > 79 characters)
Line 1127:80: E501 line too long (83 > 79 characters)
Line 1141:80: E501 line too long (87 > 79 characters)
Line 1145:80: E501 line too long (80 > 79 characters)
Line 1159:80: E501 line too long (89 > 79 characters)
Line 1333:80: E501 line too long (85 > 79 characters)
Line 1336:80: E501 line too long (88 > 79 characters)
Line 1346:80: E501 line too long (80 > 79 characters)
Line 1359:80: E501 line too long (80 > 79 characters)
Line 1361:80: E501 line too long (80 > 79 characters)
Line 1365:80: E501 line too long (84 > 79 characters)
Line 1376:80: E501 line too long (80 > 79 characters)
Line 1388:80: E501 line too long (80 > 79 characters)
Line 1390:80: E501 line too long (80 > 79 characters)
Line 1394:80: E501 line too long (82 > 79 characters)
Line 1395:80: E501 line too long (83 > 79 characters)
Line 1418:80: E501 line too long (83 > 79 characters)
Line 1457:80: E501 line too long (83 > 79 characters)
Line 1460:80: E501 line too long (87 > 79 characters)
Line 1527:80: E501 line too long (83 > 79 characters)
Line 1536:80: E501 line too long (87 > 79 characters)
Line 1547:80: E501 line too long (80 > 79 characters)
Line 1560:80: E501 line too long (80 > 79 characters)
Line 1562:80: E501 line too long (80 > 79 characters)
Line 1566:80: E501 line too long (84 > 79 characters)
Line 1572:80: E501 line too long (86 > 79 characters)
Line 1573:80: E501 line too long (90 > 79 characters)
Line 1575:80: E501 line too long (87 > 79 characters)
Line 1576:80: E501 line too long (86 > 79 characters)
Line 1583:80: E501 line too long (89 > 79 characters)
Line 1584:80: E501 line too long (87 > 79 characters)
Line 1591:80: E501 line too long (83 > 79 characters)
Line 1592:80: E501 line too long (84 > 79 characters)
Line 1593:80: E501 line too long (89 > 79 characters)
Line 1597:80: E501 line too long (84 > 79 characters)
Line 1598:80: E501 line too long (87 > 79 characters)
Line 1701:80: E501 line too long (81 > 79 characters)
Line 1702:80: E501 line too long (80 > 79 characters)
Line 1711:80: E501 line too long (87 > 79 characters)
Line 1720:80: E501 line too long (90 > 79 characters)
Line 1727:80: E501 line too long (91 > 79 characters)
Line 1731:80: E501 line too long (91 > 79 characters)
Line 1749:80: E501 line too long (82 > 79 characters)
Line 1750:80: E501 line too long (89 > 79 characters)
Line 1755:80: E501 line too long (82 > 79 characters)
Line 1797:80: E501 line too long (83 > 79 characters)
Line 1813:80: E501 line too long (86 > 79 characters)
Line 1861:80: E501 line too long (86 > 79 characters)
Line 1898:80: E501 line too long (80 > 79 characters)
Line 2110:80: E501 line too long (80 > 79 characters)
Line 2215:80: E501 line too long (80 > 79 characters)
Line 2278:80: E501 line too long (80 > 79 characters)
Line 2292:80: E501 line too long (86 > 79 characters)
Line 2325:80: E501 line too long (85 > 79 characters)

Comment last updated on February 13, 2019 at 06:37 Hours UTC

@jakirkhamjakirkham mentioned this pull request Feb 12, 2019
7 tasks
@jhamman

Copy link
Copy Markdown
Member

Still seems to be failing. This by the way was why I opened #393.

On both Python 2 and Python 3, PyMongo converts `binary_type` (i.e.
`bytes`) to BSON type 5 (Binary data) with subtype 0 to store in the
MongoDB instance. When reading that data back out, PyMongo handles BSON
type 5 (Binary data) with subtype 0 differently depending on the Python
version.
On Python 2, it creates a `bson.Binary` instance with the data. Normally
we would coerce this to a `bytes` object using `ensure_bytes`. However
that fails as `bson.Binary` is a subclass of `bytes`. So instead we
explicitly force it to `bytes` (i.e. `binary_type`). On Python 3,
PyMongo automatically converts the data to `bytes`. Thus we don't need
to do anything there.
ref: http://api.mongodb.com/python/current/python3.html#id3
ref: http://api.mongodb.com/python/current/api/bson/binary.html#bson.binary.Binary
@jakirkhamjakirkham changed the title Drop binary_type cast in MongoDBStore.__getitem__Use binary_type in MongoDBStore.__getitem__ for Python 2 onlyFeb 13, 2019
@jakirkham

Copy link
Copy Markdown
MemberAuthor

That's right. Just wanted to see if that was still the case after the dust settled.

After doing a little research, it looks like we can safely constrain this coercion to Python 2 only. Have updated the PR to do that. Should make it easier for us to remember to remove when we do drop Python 2.

Could you please give it another look? :)

@jhamman

Copy link
Copy Markdown
Member

yep, this looks right. I agree, this will make it easier to undo when PY2 goes away. Thanks.

@jakirkham

Copy link
Copy Markdown
MemberAuthor

Thanks @jhamman :)

@jakirkham
jakirkham merged commit 3c0e0f5 into zarr-developers:masterFeb 13, 2019
@jakirkham
jakirkham deleted the drop_binary_type_cast branch February 13, 2019 19:31
@jakirkhamjakirkham added this to the v2.3 milestone Feb 13, 2019
@alimanfoo

Copy link
Copy Markdown
Member

Thanks @jakirkham for this, nice to know exactly what's going on 👍

@jakirkhamjakirkham mentioned this pull request Feb 21, 2019
8 tasks
@jakirkham

Copy link
Copy Markdown
MemberAuthor

Of course. 😄

FWIW I think we can get a better handle on this behavior by adding a flag to the ensure_* functions to handle subclasses of the expected type (e.g. bytes in this case). Opened PR ( zarr-developers/numcodecs#173 ) along these lines.

@jakirkhamjakirkham mentioned this pull request Apr 15, 2019
7 tasks
@jakirkhamjakirkham mentioned this pull request Dec 3, 2020
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jakirkham@pep8speaks@jhamman@alimanfoo