omextra 0.0.0.dev513__tar.gz → 0.0.0.dev515__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {omextra-0.0.0.dev513/omextra.egg-info → omextra-0.0.0.dev515}/PKG-INFO +2 -2
- omextra-0.0.0.dev515/omextra/asyncs/all.py +18 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/asyncs/bridge.py +1 -1
- omextra-0.0.0.dev515/omextra/asyncs/flavors.py +229 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/io/trampoline.py +1 -1
- omextra-0.0.0.dev515/omextra/sql/alchemy/__init__.py +9 -0
- omextra-0.0.0.dev515/omextra/sql/alchemy/asyncs.py +154 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515/omextra.egg-info}/PKG-INFO +2 -2
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra.egg-info/SOURCES.txt +4 -12
- omextra-0.0.0.dev515/omextra.egg-info/requires.txt +1 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/pyproject.toml +3 -3
- omextra-0.0.0.dev513/omextra/io/buffers/DESIGN.md +0 -253
- omextra-0.0.0.dev513/omextra/io/buffers/adapters.py +0 -294
- omextra-0.0.0.dev513/omextra/io/buffers/all.py +0 -63
- omextra-0.0.0.dev513/omextra/io/buffers/errors.py +0 -54
- omextra-0.0.0.dev513/omextra/io/buffers/framing.py +0 -187
- omextra-0.0.0.dev513/omextra/io/buffers/linear.py +0 -202
- omextra-0.0.0.dev513/omextra/io/buffers/reading.py +0 -149
- omextra-0.0.0.dev513/omextra/io/buffers/scanning.py +0 -110
- omextra-0.0.0.dev513/omextra/io/buffers/segmented.py +0 -637
- omextra-0.0.0.dev513/omextra/io/buffers/types.py +0 -263
- omextra-0.0.0.dev513/omextra/io/buffers/utils.py +0 -76
- omextra-0.0.0.dev513/omextra/text/antlr/cli/__init__.py +0 -0
- omextra-0.0.0.dev513/omextra.egg-info/requires.txt +0 -1
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/LICENSE +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/MANIFEST.in +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/README.md +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/.omlish-manifests.json +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/README.md +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/__about__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/asyncs/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/asyncs/bluelet/LICENSE +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/asyncs/bluelet/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/asyncs/bluelet/all.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/asyncs/bluelet/api.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/asyncs/bluelet/core.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/asyncs/bluelet/events.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/asyncs/bluelet/files.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/asyncs/bluelet/runner.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/asyncs/bluelet/sockets.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/defs.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/dynamic.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/goyaml/LICENSE +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/goyaml/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/goyaml/ast.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/goyaml/errors.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/goyaml/parsing.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/goyaml/scanning.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/goyaml/tokens.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/json/Json.g4 +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/json/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/json/_antlr/JsonLexer.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/json/_antlr/JsonListener.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/json/_antlr/JsonParser.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/json/_antlr/JsonVisitor.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/json/_antlr/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/json5/Json5.g4 +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/json5/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/json5/_antlr/Json5Lexer.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/json5/_antlr/Json5Listener.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/json5/_antlr/Json5Parser.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/json5/_antlr/Json5Visitor.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/json5/_antlr/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/formats/json5/parsing.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/io/__init__.py +0 -0
- {omextra-0.0.0.dev513/omextra/io/buffers → omextra-0.0.0.dev515/omextra/specs}/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/specs/proto/Protobuf3.g4 +0 -0
- {omextra-0.0.0.dev513/omextra/specs → omextra-0.0.0.dev515/omextra/specs/proto}/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/specs/proto/_antlr/Protobuf3Lexer.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/specs/proto/_antlr/Protobuf3Listener.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/specs/proto/_antlr/Protobuf3Parser.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/specs/proto/_antlr/Protobuf3Visitor.py +0 -0
- {omextra-0.0.0.dev513/omextra/specs/proto → omextra-0.0.0.dev515/omextra/specs/proto/_antlr}/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/specs/proto/nodes.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/specs/proto/parsing.py +0 -0
- {omextra-0.0.0.dev513/omextra/specs/proto/_antlr → omextra-0.0.0.dev515/omextra/sql}/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/sql/parsing/Minisql.g4 +0 -0
- {omextra-0.0.0.dev513/omextra/sql → omextra-0.0.0.dev515/omextra/sql/parsing}/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/sql/parsing/_antlr/MinisqlLexer.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/sql/parsing/_antlr/MinisqlListener.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/sql/parsing/_antlr/MinisqlParser.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/sql/parsing/_antlr/MinisqlVisitor.py +0 -0
- {omextra-0.0.0.dev513/omextra/sql/parsing → omextra-0.0.0.dev515/omextra/sql/parsing/_antlr}/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/sql/parsing/parsing.py +0 -0
- {omextra-0.0.0.dev513/omextra/sql/parsing/_antlr → omextra-0.0.0.dev515/omextra/text}/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/abnf/LICENSE +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/abnf/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/abnf/_dataclasses.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/abnf/base.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/abnf/core.py +0 -0
- {omextra-0.0.0.dev513/omextra/text → omextra-0.0.0.dev515/omextra/text/abnf/docs}/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/abnf/docs/rfc5234.txt +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/abnf/docs/rfc7405.txt +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/abnf/errors.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/abnf/grammars.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/abnf/internal.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/abnf/matches.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/abnf/meta.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/abnf/ops.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/abnf/opto.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/abnf/parsing.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/abnf/utils.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/abnf/visitors.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/BufferedTokenStream.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/CommonTokenFactory.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/CommonTokenStream.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/FileStream.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/InputStream.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/IntervalSet.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/LICENSE.txt +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/LL1Analyzer.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/Lexer.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/ListTokenSource.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/Parser.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/ParserInterpreter.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/ParserRuleContext.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/PredictionContext.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/Recognizer.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/RuleContext.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/StdinStream.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/Token.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/TokenStreamRewriter.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/Utils.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/_all.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/_pygrun.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/atn/ATN.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/atn/ATNConfig.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/atn/ATNConfigSet.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/atn/ATNDeserializationOptions.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/atn/ATNDeserializer.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/atn/ATNSimulator.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/atn/ATNState.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/atn/ATNType.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/atn/LexerATNSimulator.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/atn/LexerAction.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/atn/LexerActionExecutor.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/atn/ParserATNSimulator.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/atn/PredictionMode.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/atn/SemanticContext.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/atn/Transition.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/atn/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/dfa/DFA.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/dfa/DFASerializer.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/dfa/DFAState.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/dfa/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/error/DiagnosticErrorListener.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/error/ErrorListener.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/error/ErrorStrategy.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/error/Errors.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/error/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/tree/Chunk.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/tree/ParseTreeMatch.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/tree/ParseTreePattern.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/tree/ParseTreePatternMatcher.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/tree/RuleTagToken.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/tree/TokenTagToken.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/tree/Tree.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/tree/Trees.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/tree/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/xpath/XPath.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/xpath/XPathLexer.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/_runtime/xpath/__init__.py +0 -0
- {omextra-0.0.0.dev513/omextra/text/abnf/docs → omextra-0.0.0.dev515/omextra/text/antlr/cli}/__init__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/cli/__main__.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/cli/cli.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/cli/consts.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/cli/gen.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/delimit.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/dot.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/errors.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/input.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/parsing.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/runtime.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra/text/antlr/utils.py +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra.egg-info/dependency_links.txt +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra.egg-info/entry_points.txt +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/omextra.egg-info/top_level.txt +0 -0
- {omextra-0.0.0.dev513 → omextra-0.0.0.dev515}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: omextra
|
|
3
|
-
Version: 0.0.0.
|
|
3
|
+
Version: 0.0.0.dev515
|
|
4
4
|
Summary: omextra
|
|
5
5
|
Author: wrmsr
|
|
6
6
|
License-Expression: BSD-3-Clause
|
|
@@ -14,7 +14,7 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
14
14
|
Requires-Python: >=3.13
|
|
15
15
|
Description-Content-Type: text/markdown
|
|
16
16
|
License-File: LICENSE
|
|
17
|
-
Requires-Dist: omlish==0.0.0.
|
|
17
|
+
Requires-Dist: omlish==0.0.0.dev515
|
|
18
18
|
Dynamic: license-file
|
|
19
19
|
|
|
20
20
|
# Overview
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from .flavors import ( # noqa
|
|
2
|
+
ContextManagerAdapter,
|
|
3
|
+
Flavor,
|
|
4
|
+
adapt,
|
|
5
|
+
adapt_context,
|
|
6
|
+
from_anyio,
|
|
7
|
+
from_anyio_context,
|
|
8
|
+
from_asyncio,
|
|
9
|
+
from_asyncio_context,
|
|
10
|
+
from_trio,
|
|
11
|
+
from_trio_context,
|
|
12
|
+
get_flavor,
|
|
13
|
+
mark_anyio,
|
|
14
|
+
mark_asyncio,
|
|
15
|
+
mark_flavor,
|
|
16
|
+
mark_trio,
|
|
17
|
+
with_adapter_loop,
|
|
18
|
+
)
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Tools for working with the different async loop implementations - currently anyio, asyncio, trio.
|
|
3
|
+
|
|
4
|
+
TODO:
|
|
5
|
+
- mark whole class / module?
|
|
6
|
+
"""
|
|
7
|
+
import abc
|
|
8
|
+
import dataclasses as dc
|
|
9
|
+
import enum
|
|
10
|
+
import functools
|
|
11
|
+
import typing as ta
|
|
12
|
+
|
|
13
|
+
from omlish import lang
|
|
14
|
+
from omlish.asyncs.trio_asyncio import check_trio_asyncio
|
|
15
|
+
from omlish.asyncs.trio_asyncio import with_trio_asyncio_loop
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
if ta.TYPE_CHECKING:
|
|
19
|
+
import sniffio
|
|
20
|
+
import trio_asyncio
|
|
21
|
+
else:
|
|
22
|
+
sniffio = lang.proxy_import('sniffio')
|
|
23
|
+
trio_asyncio = lang.proxy_import('trio_asyncio')
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
T = ta.TypeVar('T')
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
##
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
_FLAVOR_ATTR = '__async_flavor__'
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class _MISSING(lang.Marker):
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class Flavor(enum.Enum):
|
|
40
|
+
ASYNCIO = enum.auto()
|
|
41
|
+
TRIO = enum.auto()
|
|
42
|
+
ANYIO = enum.auto()
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def mark_flavor(f: Flavor):
|
|
46
|
+
if not isinstance(f, Flavor):
|
|
47
|
+
raise TypeError(f)
|
|
48
|
+
|
|
49
|
+
def inner(fn):
|
|
50
|
+
setattr(fn, _FLAVOR_ATTR, f)
|
|
51
|
+
return fn
|
|
52
|
+
|
|
53
|
+
return inner
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
mark_asyncio = mark_flavor(Flavor.ASYNCIO)
|
|
57
|
+
mark_anyio = mark_flavor(Flavor.ANYIO)
|
|
58
|
+
mark_trio = mark_flavor(Flavor.TRIO)
|
|
59
|
+
|
|
60
|
+
PACKAGE_FLAVORS: ta.MutableMapping[str, Flavor] = {
|
|
61
|
+
'anyio': Flavor.ANYIO,
|
|
62
|
+
'asyncio': Flavor.ASYNCIO,
|
|
63
|
+
'trio': Flavor.TRIO,
|
|
64
|
+
|
|
65
|
+
'sqlalchemy.ext.asyncio': Flavor.ASYNCIO,
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
_MODULE_FLAVOR_CACHE: dict[str, Flavor | None] = {}
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _get_module_flavor(p: str) -> Flavor | None:
|
|
72
|
+
try:
|
|
73
|
+
return _MODULE_FLAVOR_CACHE[p]
|
|
74
|
+
except KeyError:
|
|
75
|
+
pass
|
|
76
|
+
|
|
77
|
+
pf: Flavor | None = None
|
|
78
|
+
for cp, cf in PACKAGE_FLAVORS.items():
|
|
79
|
+
if p.startswith(cp) and (len(cp) == len(p) or p[len(cp)] == '.'):
|
|
80
|
+
pf = cf
|
|
81
|
+
break
|
|
82
|
+
|
|
83
|
+
_MODULE_FLAVOR_CACHE[p] = pf
|
|
84
|
+
return pf
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def get_flavor(obj: ta.Any, default: Flavor | type[_MISSING] | None = _MISSING) -> Flavor:
|
|
88
|
+
u = lang.unwrap_func(obj)
|
|
89
|
+
|
|
90
|
+
try:
|
|
91
|
+
return getattr(u, _FLAVOR_ATTR)
|
|
92
|
+
except AttributeError:
|
|
93
|
+
pass
|
|
94
|
+
|
|
95
|
+
if (mn := getattr(u, '__module__', None)) is not None:
|
|
96
|
+
if (pf := _get_module_flavor(mn)):
|
|
97
|
+
return pf
|
|
98
|
+
|
|
99
|
+
if default is not _MISSING:
|
|
100
|
+
return default # type: ignore
|
|
101
|
+
|
|
102
|
+
raise TypeError(f'not marked with flavor: {obj}')
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
##
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def with_adapter_loop(*, wait=False):
|
|
109
|
+
def outer(fn):
|
|
110
|
+
@functools.wraps(fn)
|
|
111
|
+
async def inner(*args, **kwargs):
|
|
112
|
+
cur_lib = sniffio.current_async_library()
|
|
113
|
+
|
|
114
|
+
if cur_lib == 'asyncio':
|
|
115
|
+
await fn(*args, **kwargs)
|
|
116
|
+
|
|
117
|
+
elif cur_lib == 'trio':
|
|
118
|
+
await with_trio_asyncio_loop(wait=wait)(fn)(*args, **kwargs)
|
|
119
|
+
|
|
120
|
+
else:
|
|
121
|
+
raise RuntimeError(f'Unknown async library: {cur_lib}')
|
|
122
|
+
|
|
123
|
+
return inner
|
|
124
|
+
|
|
125
|
+
return outer
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
##
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
class Adapter(lang.Abstract):
|
|
132
|
+
_FROM_METHODS_BY_FLAVOR: ta.ClassVar[ta.Mapping[Flavor, str]] = {
|
|
133
|
+
Flavor.ANYIO: 'from_anyio',
|
|
134
|
+
Flavor.ASYNCIO: 'from_asyncio',
|
|
135
|
+
Flavor.TRIO: 'from_trio',
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
def adapt(self, fn, fl=None):
|
|
139
|
+
if fl is None:
|
|
140
|
+
fl = get_flavor(fn)
|
|
141
|
+
return getattr(self, self._FROM_METHODS_BY_FLAVOR[fl])(fn)
|
|
142
|
+
|
|
143
|
+
#
|
|
144
|
+
|
|
145
|
+
def from_anyio(self, fn):
|
|
146
|
+
return fn
|
|
147
|
+
|
|
148
|
+
@abc.abstractmethod
|
|
149
|
+
def from_asyncio(self, fn):
|
|
150
|
+
raise NotImplementedError
|
|
151
|
+
|
|
152
|
+
@abc.abstractmethod
|
|
153
|
+
def from_trio(self, fn):
|
|
154
|
+
raise NotImplementedError
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
class AsyncioAdapter(Adapter):
|
|
158
|
+
def from_asyncio(self, fn):
|
|
159
|
+
return fn
|
|
160
|
+
|
|
161
|
+
def from_trio(self, fn):
|
|
162
|
+
check_trio_asyncio()
|
|
163
|
+
return trio_asyncio.trio_as_aio(fn)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
class TrioAdapter(Adapter):
|
|
167
|
+
def from_asyncio(self, fn):
|
|
168
|
+
check_trio_asyncio()
|
|
169
|
+
return trio_asyncio.aio_as_trio(fn)
|
|
170
|
+
|
|
171
|
+
def from_trio(self, fn):
|
|
172
|
+
return fn
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
_ADAPTERS_BY_BACKEND: ta.Mapping[str, Adapter] = {
|
|
176
|
+
'asyncio': AsyncioAdapter(),
|
|
177
|
+
'trio': TrioAdapter(),
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def get_adapter() -> Adapter:
|
|
182
|
+
return _ADAPTERS_BY_BACKEND[sniffio.current_async_library()]
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def adapt(fn, fl=None):
|
|
186
|
+
return get_adapter().adapt(fn, fl)
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def from_anyio(fn):
|
|
190
|
+
return get_adapter().from_anyio(fn)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def from_asyncio(fn):
|
|
194
|
+
return get_adapter().from_asyncio(fn)
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def from_trio(fn):
|
|
198
|
+
return get_adapter().from_trio(fn)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
##
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
@dc.dataclass(frozen=True)
|
|
205
|
+
class ContextManagerAdapter(ta.Generic[T]):
|
|
206
|
+
obj: ta.AsyncContextManager[T]
|
|
207
|
+
adapt: ta.Callable[[ta.Callable], ta.Callable]
|
|
208
|
+
|
|
209
|
+
async def __aenter__(self, *args: ta.Any, **kwargs: ta.Any) -> T:
|
|
210
|
+
return await self.adapt(self.obj.__aenter__)(*args, **kwargs)
|
|
211
|
+
|
|
212
|
+
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
|
213
|
+
return await self.adapt(self.obj.__aexit__)(exc_type, exc_val, exc_tb)
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def adapt_context(obj):
|
|
217
|
+
return ContextManagerAdapter(obj, get_adapter().adapt)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def from_anyio_context(obj):
|
|
221
|
+
return ContextManagerAdapter(obj, get_adapter().from_anyio)
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def from_asyncio_context(obj):
|
|
225
|
+
return ContextManagerAdapter(obj, get_adapter().from_asyncio)
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def from_trio_context(obj):
|
|
229
|
+
return ContextManagerAdapter(obj, get_adapter().from_trio)
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"""
|
|
2
|
+
TODO:
|
|
3
|
+
- Maysync impls?
|
|
4
|
+
- base Protocol so adapters and real sa impls can be used interchangeably (if in asyncio ctx)?
|
|
5
|
+
"""
|
|
6
|
+
import contextlib
|
|
7
|
+
import typing as ta
|
|
8
|
+
|
|
9
|
+
import sqlalchemy as sa
|
|
10
|
+
import sqlalchemy.ext.asyncio as saa
|
|
11
|
+
|
|
12
|
+
from ...asyncs import all as au
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
T = ta.TypeVar('T')
|
|
16
|
+
P = ta.ParamSpec('P')
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
AsyncEngineLike: ta.TypeAlias = ta.Union[saa.AsyncEngine, 'AsyncEngine']
|
|
20
|
+
AsyncConnectionLike: ta.TypeAlias = ta.Union[saa.AsyncConnection, 'AsyncConnection']
|
|
21
|
+
AsyncTransactionLike: ta.TypeAlias = ta.Union[saa.AsyncTransaction, 'AsyncTransaction']
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
##
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class AsyncTransaction:
|
|
28
|
+
def __init__(self, underlying: saa.AsyncTransaction) -> None:
|
|
29
|
+
super().__init__()
|
|
30
|
+
|
|
31
|
+
self._underlying = underlying
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def underlying(self) -> saa.AsyncTransaction:
|
|
35
|
+
return self._underlying
|
|
36
|
+
|
|
37
|
+
##
|
|
38
|
+
|
|
39
|
+
@au.mark_asyncio
|
|
40
|
+
async def close(self) -> None:
|
|
41
|
+
await au.from_asyncio(self._underlying.close)()
|
|
42
|
+
|
|
43
|
+
@au.mark_asyncio
|
|
44
|
+
async def rollback(self) -> None:
|
|
45
|
+
await au.from_asyncio(self._underlying.rollback)()
|
|
46
|
+
|
|
47
|
+
@au.mark_asyncio
|
|
48
|
+
async def commit(self) -> None:
|
|
49
|
+
await au.from_asyncio(self._underlying.commit)()
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class AsyncConnection:
|
|
53
|
+
def __init__(self, underlying: saa.AsyncConnection) -> None:
|
|
54
|
+
super().__init__()
|
|
55
|
+
|
|
56
|
+
self._underlying = underlying
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def underlying(self) -> saa.AsyncConnection:
|
|
60
|
+
return self._underlying
|
|
61
|
+
|
|
62
|
+
##
|
|
63
|
+
|
|
64
|
+
@contextlib.asynccontextmanager
|
|
65
|
+
@au.mark_asyncio
|
|
66
|
+
async def begin(self) -> ta.AsyncIterator[AsyncTransaction]:
|
|
67
|
+
async with au.from_asyncio_context(self._underlying.begin()) as u:
|
|
68
|
+
yield AsyncTransaction(u)
|
|
69
|
+
|
|
70
|
+
@au.mark_asyncio
|
|
71
|
+
async def execute(
|
|
72
|
+
self,
|
|
73
|
+
statement: ta.Any,
|
|
74
|
+
*args: ta.Any,
|
|
75
|
+
**kwargs: ta.Any,
|
|
76
|
+
) -> sa.CursorResult[ta.Any]:
|
|
77
|
+
return await au.from_asyncio(self._underlying.execute)(statement, *args, **kwargs)
|
|
78
|
+
|
|
79
|
+
@au.mark_asyncio
|
|
80
|
+
async def run_sync(
|
|
81
|
+
self,
|
|
82
|
+
fn: ta.Callable[ta.Concatenate[sa.Connection, P], T],
|
|
83
|
+
*args: P.args,
|
|
84
|
+
**kwargs: P.kwargs,
|
|
85
|
+
) -> T:
|
|
86
|
+
return await au.from_asyncio(self._underlying.run_sync)(fn, *args, **kwargs)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class AsyncEngine:
|
|
90
|
+
def __init__(self, underlying: saa.AsyncEngine) -> None:
|
|
91
|
+
super().__init__()
|
|
92
|
+
|
|
93
|
+
self._underlying = underlying
|
|
94
|
+
|
|
95
|
+
@property
|
|
96
|
+
def underlying(self) -> saa.AsyncEngine:
|
|
97
|
+
return self._underlying
|
|
98
|
+
|
|
99
|
+
##
|
|
100
|
+
|
|
101
|
+
@contextlib.asynccontextmanager
|
|
102
|
+
@au.mark_asyncio
|
|
103
|
+
async def connect(self) -> ta.AsyncIterator[AsyncConnection]:
|
|
104
|
+
async with au.from_asyncio_context(self._underlying.connect()) as u:
|
|
105
|
+
yield AsyncConnection(u)
|
|
106
|
+
|
|
107
|
+
@au.mark_asyncio
|
|
108
|
+
async def dispose(self, close: bool = True) -> None:
|
|
109
|
+
await au.from_asyncio(self._underlying.dispose)(close)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
##
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
@ta.overload
|
|
116
|
+
def async_adapt(obj: AsyncEngine) -> AsyncEngine:
|
|
117
|
+
...
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@ta.overload
|
|
121
|
+
def async_adapt(obj: AsyncConnection) -> AsyncConnection:
|
|
122
|
+
...
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
@ta.overload
|
|
126
|
+
def async_adapt(obj: AsyncTransaction) -> AsyncTransaction:
|
|
127
|
+
...
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
@ta.overload
|
|
131
|
+
def async_adapt(obj: saa.AsyncEngine) -> AsyncEngine:
|
|
132
|
+
...
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
@ta.overload
|
|
136
|
+
def async_adapt(obj: saa.AsyncConnection) -> AsyncConnection:
|
|
137
|
+
...
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
@ta.overload
|
|
141
|
+
def async_adapt(obj: saa.AsyncTransaction) -> AsyncTransaction:
|
|
142
|
+
...
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def async_adapt(obj: ta.Any) -> ta.Any:
|
|
146
|
+
if isinstance(obj, (AsyncEngine, AsyncConnection, AsyncTransaction)):
|
|
147
|
+
return obj
|
|
148
|
+
if isinstance(obj, saa.AsyncTransaction):
|
|
149
|
+
return AsyncTransaction(obj)
|
|
150
|
+
if isinstance(obj, saa.AsyncConnection):
|
|
151
|
+
return AsyncConnection(obj)
|
|
152
|
+
if isinstance(obj, saa.AsyncEngine):
|
|
153
|
+
return AsyncEngine(obj)
|
|
154
|
+
raise TypeError(obj)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: omextra
|
|
3
|
-
Version: 0.0.0.
|
|
3
|
+
Version: 0.0.0.dev515
|
|
4
4
|
Summary: omextra
|
|
5
5
|
Author: wrmsr
|
|
6
6
|
License-Expression: BSD-3-Clause
|
|
@@ -14,7 +14,7 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
14
14
|
Requires-Python: >=3.13
|
|
15
15
|
Description-Content-Type: text/markdown
|
|
16
16
|
License-File: LICENSE
|
|
17
|
-
Requires-Dist: omlish==0.0.0.
|
|
17
|
+
Requires-Dist: omlish==0.0.0.dev515
|
|
18
18
|
Dynamic: license-file
|
|
19
19
|
|
|
20
20
|
# Overview
|
|
@@ -15,7 +15,9 @@ omextra.egg-info/entry_points.txt
|
|
|
15
15
|
omextra.egg-info/requires.txt
|
|
16
16
|
omextra.egg-info/top_level.txt
|
|
17
17
|
omextra/asyncs/__init__.py
|
|
18
|
+
omextra/asyncs/all.py
|
|
18
19
|
omextra/asyncs/bridge.py
|
|
20
|
+
omextra/asyncs/flavors.py
|
|
19
21
|
omextra/asyncs/bluelet/LICENSE
|
|
20
22
|
omextra/asyncs/bluelet/__init__.py
|
|
21
23
|
omextra/asyncs/bluelet/all.py
|
|
@@ -50,18 +52,6 @@ omextra/formats/json5/_antlr/Json5Visitor.py
|
|
|
50
52
|
omextra/formats/json5/_antlr/__init__.py
|
|
51
53
|
omextra/io/__init__.py
|
|
52
54
|
omextra/io/trampoline.py
|
|
53
|
-
omextra/io/buffers/DESIGN.md
|
|
54
|
-
omextra/io/buffers/__init__.py
|
|
55
|
-
omextra/io/buffers/adapters.py
|
|
56
|
-
omextra/io/buffers/all.py
|
|
57
|
-
omextra/io/buffers/errors.py
|
|
58
|
-
omextra/io/buffers/framing.py
|
|
59
|
-
omextra/io/buffers/linear.py
|
|
60
|
-
omextra/io/buffers/reading.py
|
|
61
|
-
omextra/io/buffers/scanning.py
|
|
62
|
-
omextra/io/buffers/segmented.py
|
|
63
|
-
omextra/io/buffers/types.py
|
|
64
|
-
omextra/io/buffers/utils.py
|
|
65
55
|
omextra/specs/__init__.py
|
|
66
56
|
omextra/specs/proto/Protobuf3.g4
|
|
67
57
|
omextra/specs/proto/__init__.py
|
|
@@ -73,6 +63,8 @@ omextra/specs/proto/_antlr/Protobuf3Parser.py
|
|
|
73
63
|
omextra/specs/proto/_antlr/Protobuf3Visitor.py
|
|
74
64
|
omextra/specs/proto/_antlr/__init__.py
|
|
75
65
|
omextra/sql/__init__.py
|
|
66
|
+
omextra/sql/alchemy/__init__.py
|
|
67
|
+
omextra/sql/alchemy/asyncs.py
|
|
76
68
|
omextra/sql/parsing/Minisql.g4
|
|
77
69
|
omextra/sql/parsing/__init__.py
|
|
78
70
|
omextra/sql/parsing/parsing.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
omlish==0.0.0.dev515
|
|
@@ -13,7 +13,7 @@ urls = {source = 'https://github.com/wrmsr/omlish'}
|
|
|
13
13
|
license = 'BSD-3-Clause'
|
|
14
14
|
readme = 'README.md'
|
|
15
15
|
requires-python = '>=3.13'
|
|
16
|
-
version = '0.0.0.
|
|
16
|
+
version = '0.0.0.dev515'
|
|
17
17
|
classifiers = [
|
|
18
18
|
'Development Status :: 2 - Pre-Alpha',
|
|
19
19
|
'Intended Audience :: Developers',
|
|
@@ -24,7 +24,7 @@ classifiers = [
|
|
|
24
24
|
]
|
|
25
25
|
description = 'omextra'
|
|
26
26
|
dependencies = [
|
|
27
|
-
'omlish == 0.0.0.
|
|
27
|
+
'omlish == 0.0.0.dev515',
|
|
28
28
|
]
|
|
29
29
|
|
|
30
30
|
[project.optional-dependencies]
|
|
@@ -58,6 +58,6 @@ exclude = [
|
|
|
58
58
|
'LICENSE',
|
|
59
59
|
'LICENSE.txt',
|
|
60
60
|
'AUTHORS',
|
|
61
|
-
'
|
|
61
|
+
'DESIGN.md',
|
|
62
62
|
'text/abnf/docs/*.txt',
|
|
63
63
|
]
|