edq-utils 0.0.5__py3-none-any.whl → 0.0.7__py3-none-any.whl

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.

Potentially problematic release.


This version of edq-utils might be problematic. Click here for more details.

Files changed (62) hide show
  1. edq/__init__.py +1 -1
  2. edq/cli/config/__init__.py +3 -0
  3. edq/cli/config/list.py +69 -0
  4. edq/cli/http/__init__.py +3 -0
  5. edq/cli/http/exchange-server.py +71 -0
  6. edq/cli/http/send-exchange.py +45 -0
  7. edq/cli/http/verify-exchanges.py +38 -0
  8. edq/cli/testing/__init__.py +3 -0
  9. edq/cli/testing/cli-test.py +8 -5
  10. edq/cli/version.py +2 -1
  11. edq/core/argparser.py +28 -3
  12. edq/core/config.py +268 -0
  13. edq/core/config_test.py +1038 -0
  14. edq/procedure/__init__.py +0 -0
  15. edq/procedure/verify_exchanges.py +85 -0
  16. edq/testing/asserts.py +0 -1
  17. edq/testing/cli.py +17 -1
  18. edq/testing/httpserver.py +553 -0
  19. edq/testing/httpserver_test.py +424 -0
  20. edq/testing/run.py +40 -10
  21. edq/testing/testdata/cli/data/configs/empty/edq-config.json +1 -0
  22. edq/testing/testdata/cli/data/configs/simple-1/edq-config.json +4 -0
  23. edq/testing/testdata/cli/data/configs/simple-2/edq-config.json +3 -0
  24. edq/testing/testdata/cli/data/configs/value-number/edq-config.json +3 -0
  25. edq/testing/testdata/cli/tests/config/list/config_list_base.txt +16 -0
  26. edq/testing/testdata/cli/tests/config/list/config_list_config_value_number.txt +10 -0
  27. edq/testing/testdata/cli/tests/config/list/config_list_ignore_config.txt +14 -0
  28. edq/testing/testdata/cli/tests/config/list/config_list_no_config.txt +8 -0
  29. edq/testing/testdata/cli/tests/config/list/config_list_show_origin.txt +13 -0
  30. edq/testing/testdata/cli/tests/config/list/config_list_skip_header.txt +10 -0
  31. edq/testing/testdata/http/exchanges/simple.httpex.json +5 -0
  32. edq/testing/testdata/http/exchanges/simple_anchor.httpex.json +5 -0
  33. edq/testing/testdata/http/exchanges/simple_file.httpex.json +10 -0
  34. edq/testing/testdata/http/exchanges/simple_file_binary.httpex.json +10 -0
  35. edq/testing/testdata/http/exchanges/simple_file_get_params.httpex.json +14 -0
  36. edq/testing/testdata/http/exchanges/simple_file_multiple.httpex.json +13 -0
  37. edq/testing/testdata/http/exchanges/simple_file_name.httpex.json +11 -0
  38. edq/testing/testdata/http/exchanges/simple_file_post_multiple.httpex.json +13 -0
  39. edq/testing/testdata/http/exchanges/simple_file_post_params.httpex.json +14 -0
  40. edq/testing/testdata/http/exchanges/simple_headers.httpex.json +8 -0
  41. edq/testing/testdata/http/exchanges/simple_jsonresponse_dict.httpex.json +7 -0
  42. edq/testing/testdata/http/exchanges/simple_jsonresponse_list.httpex.json +9 -0
  43. edq/testing/testdata/http/exchanges/simple_params.httpex.json +9 -0
  44. edq/testing/testdata/http/exchanges/simple_post.httpex.json +5 -0
  45. edq/testing/testdata/http/exchanges/simple_post_params.httpex.json +9 -0
  46. edq/testing/testdata/http/exchanges/simple_post_urlparams.httpex.json +5 -0
  47. edq/testing/testdata/http/exchanges/simple_urlparams.httpex.json +5 -0
  48. edq/testing/testdata/http/exchanges/specialcase_listparams_explicit.httpex.json +8 -0
  49. edq/testing/testdata/http/exchanges/specialcase_listparams_url.httpex.json +5 -0
  50. edq/testing/testdata/http/files/a.txt +1 -0
  51. edq/testing/testdata/http/files/tiny.png +0 -0
  52. edq/testing/unittest.py +12 -7
  53. edq/util/dirent.py +2 -0
  54. edq/util/json.py +21 -4
  55. edq/util/net.py +895 -0
  56. edq_utils-0.0.7.dist-info/METADATA +156 -0
  57. edq_utils-0.0.7.dist-info/RECORD +78 -0
  58. edq_utils-0.0.5.dist-info/METADATA +0 -63
  59. edq_utils-0.0.5.dist-info/RECORD +0 -34
  60. {edq_utils-0.0.5.dist-info → edq_utils-0.0.7.dist-info}/WHEEL +0 -0
  61. {edq_utils-0.0.5.dist-info → edq_utils-0.0.7.dist-info}/licenses/LICENSE +0 -0
  62. {edq_utils-0.0.5.dist-info → edq_utils-0.0.7.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,156 @@
1
+ Metadata-Version: 2.4
2
+ Name: edq-utils
3
+ Version: 0.0.7
4
+ Summary: Common utilities used by EduLinq Python projects.
5
+ Author-email: Eriq Augustine <eriq@edulinq.org>
6
+ License: MIT License
7
+
8
+ Copyright (c) 2025 EduLinq
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ Project-URL: Homepage, https://github.com/edulinq/python-utils
29
+ Project-URL: Repository, https://github.com/edulinq/python-utils
30
+ Keywords: education,utilities
31
+ Classifier: Intended Audience :: Developers
32
+ Classifier: License :: OSI Approved :: MIT License
33
+ Classifier: Programming Language :: Python :: 3.8
34
+ Requires-Python: >=3.8
35
+ Description-Content-Type: text/markdown
36
+ License-File: LICENSE
37
+ Requires-Dist: json5>=0.9.14
38
+ Provides-Extra: dev
39
+ Requires-Dist: mypy>=1.14.1; extra == "dev"
40
+ Requires-Dist: pdoc>=14.7.0; extra == "dev"
41
+ Requires-Dist: pylint; extra == "dev"
42
+ Requires-Dist: requests-toolbelt; extra == "dev"
43
+ Requires-Dist: twine; extra == "dev"
44
+ Requires-Dist: vermin; extra == "dev"
45
+ Dynamic: license-file
46
+
47
+ # EduLinq Python Utilities
48
+
49
+ Common utilities used by EduLinq Python projects.
50
+
51
+ ## Installation / Requirements
52
+
53
+ This project requires [Python](https://www.python.org/) >= 3.8.
54
+
55
+ The project can be installed from PyPi with:
56
+ ```
57
+ pip3 install edq-utils
58
+ ```
59
+
60
+ Standard Python requirements are listed in `pyproject.toml`.
61
+ The project and Python dependencies can be installed from source with:
62
+ ```
63
+ pip3 install .
64
+ ```
65
+
66
+ ## Configuration System
67
+
68
+ This project provides a configuration system that supplies options (e.g., username, password) to a command-line interface (CLI) tool.
69
+ The configuration system follows a tiered order, allowing options to be specified and overridden from both files and command-line options.
70
+
71
+ ### Configuration Sources
72
+
73
+ In addition to CLI options, the configuration system loads options from [JSON](https://en.wikipedia.org/wiki/JSON) files located across multiple directories.
74
+ By default, configuration files are named `edq-config.json`.
75
+ This value is customizable, but this document will assume the default is used.
76
+
77
+ For example, a configuration file containing the `user` and `pass` options might look like this:
78
+ ```json
79
+ {
80
+ "user": "alice",
81
+ "pass": "password123"
82
+ }
83
+ ```
84
+
85
+ The table below summarizes the configuration sources in the order they are evaluated.
86
+ Values from earlier sources can be overwritten by values from later sources.
87
+
88
+ | Source | Description |
89
+ | :----- | :---------- |
90
+ | Global | Loaded from a file in a user-specific location, which is platform-dependent. |
91
+ | Local | Loaded from a file in the current or nearest ancestor directory. |
92
+ | CLI File | Loaded from one or more explicitly provided configuration files through the CLI. |
93
+ | CLI | Loaded from the command line. |
94
+
95
+ The system produces an error if a global or local configuration file is unreadable (but not missing), or if a CLI-specified file is unreadable or missing.
96
+
97
+ #### Global Configuration
98
+
99
+ Global configuration are options that are user specific and stick with the user between projects, these are well suited for options like login credentials.
100
+ The global configuration file defaults to `<platform-specific user configuration location>/edq-config.json`.
101
+ The configuration location is chosen according to the [XDG standard](https://en.wikipedia.org/wiki/Freedesktop.org#Base_Directory_Specification) (implemented by [platformdirs](https://github.com/tox-dev/platformdirs)).
102
+ Below are examples of user-specific configuration file paths for different operating systems:
103
+ - Linux -- `/home/<user>/.config/edq-config.json`
104
+ - Mac -- `/Users/<user>/Library/Application Support/edq-config.json`
105
+ - Windows -- `C:\Users\<user>\AppData\Local\edq-config.json`
106
+
107
+ The default global configuration location can be changed by passing a path to `--config-global` through the command line.
108
+
109
+ Below is an example command for specifying a global configuration path from the CLI:
110
+ ```sh
111
+ python3 -m edq.cli.config.list --config-global ~/.config/custom-config.json
112
+ ```
113
+
114
+ #### Local Configuration
115
+
116
+ Local configuration are options that are specific to a project or directory, like a project's build directory.
117
+ Local configuration files are searched in multiple locations, the first file found is used.
118
+ The local config search order is:
119
+ 1. `edq-config.json` in the current directory.
120
+ 2. A legacy file in the current directory (only if a legacy file is preconfigured).
121
+ 3. `edq-config.json` in any ancestor directory on the path to root (including root itself).
122
+
123
+ #### CLI-Specified Config Files
124
+
125
+ CLI config files are options specified on the command line via a file.
126
+ These are useful for a common set of options you don’t need every time, such as login credentials for different user.
127
+ Any files passed via `--config-file` will be loaded in the order they appear on the command line.
128
+ Options from later files override options from previous files.
129
+
130
+ Below is an example of a CLI specified configuration paths:
131
+ ```sh
132
+ python3 -m edq.cli.config.list --config-file ./edq-config.json --config-file ~/.secrets/edq-config.json
133
+ ```
134
+
135
+ #### CLI Configuration
136
+
137
+ CLI configurations are options specified directly on the command line, these are useful for quick option overrides without editing config files.
138
+ Configuration options are passed to the command line by the `--config` flag in this format `<key>=<value>`.
139
+ The provided values overrides the values from configuration files.
140
+ Configuration options are structured as key value pairs and keys cannot contain the "=" character.
141
+
142
+ Below is an example of specifying a configuration option directly from the CLI:
143
+ ```sh
144
+ python3 -m edq.cli.config.list --config user=alice --config pass=password123
145
+ ```
146
+
147
+ #### CLI Config Options
148
+
149
+ The table below lists common configuration CLI options available for CLI tools using this library.
150
+
151
+ | CLI Option | Description |
152
+ | :-------------- | :---------- |
153
+ |`--config-global` | Override the global config file location. |
154
+ |`--config-file` | Load configuration options from a CLI specified file. |
155
+ | `--config` | Provide additional options to a CLI command. |
156
+ | `--help` | Display standard help text and the default global configuration file path for the current platform. |
@@ -0,0 +1,78 @@
1
+ edq/__init__.py,sha256=uKkm8m99BET7G4Ki34GmgSaMQ53Ga7rOZnYIjhPWul4,86
2
+ edq/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ edq/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ edq/cli/version.py,sha256=SxarRVD_AVA-nD4pLVMe6ZjSJpMr7h_r3DgYYs42vjE,591
5
+ edq/cli/config/__init__.py,sha256=LtWDhiKpgR-u3jzSPefLofdYUTuFjKa-D8hCuCwSG5s,98
6
+ edq/cli/config/list.py,sha256=7PLW9_6bd_IMif30GVqVO7F5r_8PKBDu8QRldMvh8uI,1702
7
+ edq/cli/http/__init__.py,sha256=Z3i9vDmCMnjunL7ni6phVUagdY6mLyzZZK8JrrnIPo0,72
8
+ edq/cli/http/exchange-server.py,sha256=Sr4SqUlImvHP1mokJQI8QdUwUeFO-MrsmSv3DSJmGWU,1981
9
+ edq/cli/http/send-exchange.py,sha256=kfJoDSAqy3cso3T9I-J7jHsPug1fCqy7GYec8UXIzJY,1025
10
+ edq/cli/http/verify-exchanges.py,sha256=8IzbWBHuBLA0osUv48g17t3hc4BjfD15sNg2PX5bD30,1049
11
+ edq/cli/testing/__init__.py,sha256=er9ctX-P9vgd1ws24MVtLcngwsfIey7T5j7ou0FG9Ec,72
12
+ edq/cli/testing/cli-test.py,sha256=tNMEAWTTCQXWTycxWBfDQtw_Va07wpexLW_q84gxaZY,1323
13
+ edq/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ edq/core/argparser.py,sha256=Z-_SunbVxmu59Zdis6EbDWl1KREK6jh7u2Fb7FyaGhk,5130
15
+ edq/core/argparser_test.py,sha256=YzNft7c1Nk5tQzHEW7nEuJakjvk1IZiYimaQ_6HI6Bo,4046
16
+ edq/core/config.py,sha256=oxFRXdmrsGUyVTlte3iQzkMApB4fpShr51ivGOm-i_k,10606
17
+ edq/core/config_test.py,sha256=I49YVB0iLalZ3yrqfLZTfRpI128htAjdYkFJp5IRDTg,36991
18
+ edq/core/log.py,sha256=Aq5-Tznq5fgCfU0OI4ECy2OnCoiwV4bTFkhXXdLoG7Q,3726
19
+ edq/core/version.py,sha256=cCadcn3M4qoxbQRu4WRHXUu_xl49GTGSDpr6hpr7Vxw,124
20
+ edq/procedure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
+ edq/procedure/verify_exchanges.py,sha256=Bv-wscTaSx5bbQfD6tZutCtG_pyHuFIBhk_RB5ZMJEQ,2765
22
+ edq/testing/__init__.py,sha256=IKd3fPU_8d_jP19HxG-zKwxFwn7nqFGGtXOY5slY41c,32
23
+ edq/testing/asserts.py,sha256=BxWTH9aQFwmzb0tf5hx3V4aeJzmiBOO-QajaMM6zklI,2523
24
+ edq/testing/cli.py,sha256=L3ar6Q6ZQ5ZTH9TFpMIen4tRXjSwYJlBVEL9WQXc_lU,12898
25
+ edq/testing/cli_test.py,sha256=IqzdK1fEit_3HagSU-nNI4EjkoQp6-I88JGZ1_x_uQk,525
26
+ edq/testing/httpserver.py,sha256=r2xSFkHTEzO92vW9XV5g43kC3vOcyQD-RVedXke1IZI,20311
27
+ edq/testing/httpserver_test.py,sha256=tjBgBbKTHeqE1ugHyao4HpW7FNPTkBGpWK3vuqJgNQg,12123
28
+ edq/testing/run.py,sha256=Axv0t6yZRUS39xmf5PWR5b54Rg21Nz0ip8G4UyJm1Ik,4814
29
+ edq/testing/unittest.py,sha256=ynVZSA0y9lYPrUqj38rgH_AvwHDF0nRF2VCe2JUP9_4,2426
30
+ edq/testing/testdata/cli/data/configs/empty/edq-config.json,sha256=yj0WO6sFU4GCciYUBWjzvvfqrBh869doeOC2Pp5EI1Y,3
31
+ edq/testing/testdata/cli/data/configs/simple-1/edq-config.json,sha256=uQdt7o7VNjOSQk8ni6UrqZ95QkJTUgHcwaL2TvY30bs,42
32
+ edq/testing/testdata/cli/data/configs/simple-2/edq-config.json,sha256=F3vP5hF1G7rPp2PPUgHemvgA-2AuxTC6Pah8Yr-fRmw,37
33
+ edq/testing/testdata/cli/data/configs/value-number/edq-config.json,sha256=UrB_6Pa_JRZN3NzuM0OugxQgPizUC5RMqP5xv06cuvg,20
34
+ edq/testing/testdata/cli/tests/platform_skip.txt,sha256=J6n7v3LhfTyjR3Ejo-uR-g6Xdxx34Fu_cmyGSii_elc,103
35
+ edq/testing/testdata/cli/tests/version_base.txt,sha256=5e9oSQaivA-0Th7wXpNRhACluyDwvFTL_1xfAkS2Pko,69
36
+ edq/testing/testdata/cli/tests/config/list/config_list_base.txt,sha256=jtHqRPxM-uJfMkmnZaSDilsxMF7y6UXw-iEtHe8XCuw,495
37
+ edq/testing/testdata/cli/tests/config/list/config_list_config_value_number.txt,sha256=hIC9iVJ60CvMQ98p9rTHhZrvxmjJKdPXPqw-TEC_z2s,242
38
+ edq/testing/testdata/cli/tests/config/list/config_list_ignore_config.txt,sha256=PSd6lHbW0AhL-hcsZiVmGDbKB_xK-dSTMxjVowI4J5I,457
39
+ edq/testing/testdata/cli/tests/config/list/config_list_no_config.txt,sha256=ckmH1xbeN2cOmJAE5Q5OX6rsQiflWIn555K-Ecc77w0,152
40
+ edq/testing/testdata/cli/tests/config/list/config_list_show_origin.txt,sha256=7QiZ55vITJ89kOOH1PUaig2jhz2PGKGYRsK2hAU5FYk,411
41
+ edq/testing/testdata/cli/tests/config/list/config_list_skip_header.txt,sha256=pzxB0_vLjjkDGtP3UdfPyXGTTYd7KIvXhbgiY_0nogU,244
42
+ edq/testing/testdata/http/exchanges/simple.httpex.json,sha256=i2xRx6PK3bdiOOf0CEBr_wHPFP-6I0xNDHDGXj-NHP8,76
43
+ edq/testing/testdata/http/exchanges/simple_anchor.httpex.json,sha256=pv2LQ6ZzoF4DXbqjiXLmIM1J9lLujEhsopW2E4cCduI,85
44
+ edq/testing/testdata/http/exchanges/simple_file.httpex.json,sha256=4M6EnTlKtnX4aF7Df_RiT21Os8kORXznrmm0aEbCZE8,160
45
+ edq/testing/testdata/http/exchanges/simple_file_binary.httpex.json,sha256=Oa6KUA2EmvptbdbfN8z3Fco4XVWqBE9Bn1GH00nd8MY,170
46
+ edq/testing/testdata/http/exchanges/simple_file_get_params.httpex.json,sha256=UuhmmhY3-OGbrSf6nz0UhLxBYCq1_SWm49BzzEdq_Qw,233
47
+ edq/testing/testdata/http/exchanges/simple_file_multiple.httpex.json,sha256=fHVYObBw7RIn0GdoYXh7JIRsRYDZUxwSpY3sTtWCiE8,230
48
+ edq/testing/testdata/http/exchanges/simple_file_name.httpex.json,sha256=uuRzhutq2kBxKICAZm-7heymjJvVDwqqgtHCuiCseaI,196
49
+ edq/testing/testdata/http/exchanges/simple_file_post_multiple.httpex.json,sha256=_3L7Ekjk36slGx52NvK7giBD1PPupiu9QrTT3-5W-Vk,236
50
+ edq/testing/testdata/http/exchanges/simple_file_post_params.httpex.json,sha256=mpuk1YFelKn2p6xBFjigF-dz78NlStarATU7oBOJYUc,235
51
+ edq/testing/testdata/http/exchanges/simple_headers.httpex.json,sha256=ULERGqi6zR_w2nYflTeX-30E2irJqlywo-Gc5yDqu2Q,125
52
+ edq/testing/testdata/http/exchanges/simple_jsonresponse_dict.httpex.json,sha256=YYykwKQzZnHDHzzI94Og746tYjKSqWdl-a46BJmjWLU,108
53
+ edq/testing/testdata/http/exchanges/simple_jsonresponse_list.httpex.json,sha256=201BNAPDD6fAOCKPmVKFc7euw3aBRSMPpztO_m_cLZg,132
54
+ edq/testing/testdata/http/exchanges/simple_params.httpex.json,sha256=VFW57ULUmgeo0K2iAPMZ-M4_AB9x_LbKYlIYX3juCgc,145
55
+ edq/testing/testdata/http/exchanges/simple_post.httpex.json,sha256=7wQWwZn8AICzSJwYYfwzbRU3eTf4r1DO8T1Uo5X5w-M,82
56
+ edq/testing/testdata/http/exchanges/simple_post_params.httpex.json,sha256=DBdq7Djru1doisZ69QXmRsVTmE5z8kwxYOaIqsoZNuw,151
57
+ edq/testing/testdata/http/exchanges/simple_post_urlparams.httpex.json,sha256=APDpctMjrjK-nEFdvKRU5bCRdaO9rCOVTEUO2RsN76Q,100
58
+ edq/testing/testdata/http/exchanges/simple_urlparams.httpex.json,sha256=Ajp9Jc7uD3-apiVbAPzK-4oTeZfb2qIo4f15MouBtL4,94
59
+ edq/testing/testdata/http/exchanges/specialcase_listparams_explicit.httpex.json,sha256=ZcDVKTvqPl_tkMjRmWtmj2vN8UK-25VdBNSxDWKd3wY,152
60
+ edq/testing/testdata/http/exchanges/specialcase_listparams_url.httpex.json,sha256=tPMpqKcg7eH0mSun4gVYDHu7JI4RhLrnyIs8w54CtFU,104
61
+ edq/testing/testdata/http/files/a.txt,sha256=h0KPxSKAPTEGXnvOPPA_5HUJZjHl4Hu9eg_eYMTPJcc,2
62
+ edq/testing/testdata/http/files/tiny.png,sha256=SvzIuI80iLyJ6ZUAkWu_BsqWwO9BgHetVFrh3S32QTA,113
63
+ edq/util/__init__.py,sha256=9EFKQE77S-B6OJJKFaMg8k3WkMMUQYlGjlTv6tQmWVo,29
64
+ edq/util/dirent.py,sha256=gvU7I8TPFIjURAOPalfaOf3GSlAA0mXET_bHKC6_e_A,10369
65
+ edq/util/dirent_test.py,sha256=WUx6Ux-13L9YIg2rDyOROv5Kbvgr4xy693ceG1osAP0,33855
66
+ edq/util/json.py,sha256=nl_cxrlP97RX1BFtys8IT_3IfO0-XvBDQBe6YdrblB4,5936
67
+ edq/util/json_test.py,sha256=utUVRbw3z42ke4fpRVI294RrFHcMKms8khVYRkISNk4,8009
68
+ edq/util/net.py,sha256=2RT9UlO9nZ9jx1UfwKhSAG_sb7WgT6trn6MQm-BIKNo,32864
69
+ edq/util/pyimport.py,sha256=26OIuCXELyqtwlooMqDEs4GJQrkrAgxnXNYTlqqtsBY,2852
70
+ edq/util/pyimport_test.py,sha256=Xno0MIa3yMTfBfoTgjKCIMpr1ZShU6bvo9rBRdecXQU,4202
71
+ edq/util/reflection.py,sha256=jPcW6h0fwSDYh04O5rUxlgoF7HK6fVQ2mq7DD9qPrEg,972
72
+ edq/util/time.py,sha256=anoNM_KniARLombv2BnsoHuCzDqMKiDdIzV7RUe2ZOk,2648
73
+ edq/util/time_test.py,sha256=iQZwzVTVQQ4TdXrLb9MUMCYlKrIe8qyF-hiC9YLTaMo,4610
74
+ edq_utils-0.0.7.dist-info/licenses/LICENSE,sha256=MS4iYEl4rOxMoprZuc86iYVoyk4YgaVoMt7WmGvVF8w,1064
75
+ edq_utils-0.0.7.dist-info/METADATA,sha256=z6FC0Za9Ax6pfz0kJcq6anZSUYib3YsNvujh4gb9nE4,7268
76
+ edq_utils-0.0.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
77
+ edq_utils-0.0.7.dist-info/top_level.txt,sha256=znBHSj6tgXtcMKrUVtovLli5fIEJCb7d-BMxTLRK4zk,4
78
+ edq_utils-0.0.7.dist-info/RECORD,,
@@ -1,63 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: edq-utils
3
- Version: 0.0.5
4
- Summary: Common utilities used by EduLinq Python projects.
5
- Author-email: Eriq Augustine <eriq@edulinq.org>
6
- License: MIT License
7
-
8
- Copyright (c) 2025 EduLinq
9
-
10
- Permission is hereby granted, free of charge, to any person obtaining a copy
11
- of this software and associated documentation files (the "Software"), to deal
12
- in the Software without restriction, including without limitation the rights
13
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
- copies of the Software, and to permit persons to whom the Software is
15
- furnished to do so, subject to the following conditions:
16
-
17
- The above copyright notice and this permission notice shall be included in all
18
- copies or substantial portions of the Software.
19
-
20
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
- SOFTWARE.
27
-
28
- Project-URL: Homepage, https://github.com/edulinq/python-utils
29
- Project-URL: Repository, https://github.com/edulinq/python-utils
30
- Keywords: education,utilities
31
- Classifier: Intended Audience :: Developers
32
- Classifier: License :: OSI Approved :: MIT License
33
- Classifier: Programming Language :: Python :: 3.8
34
- Requires-Python: >=3.8
35
- Description-Content-Type: text/markdown
36
- License-File: LICENSE
37
- Requires-Dist: json5>=0.9.14
38
- Provides-Extra: dev
39
- Requires-Dist: mypy>=1.14.1; extra == "dev"
40
- Requires-Dist: pdoc>=14.7.0; extra == "dev"
41
- Requires-Dist: pylint; extra == "dev"
42
- Requires-Dist: twine; extra == "dev"
43
- Requires-Dist: vermin; extra == "dev"
44
- Dynamic: license-file
45
-
46
- # EduLinq Python Utilities
47
-
48
- Common utilities used by EduLinq Python projects.
49
-
50
- ## Installation / Requirements
51
-
52
- This project requires [Python](https://www.python.org/) >= 3.8.
53
-
54
- The project can be installed from PyPi with:
55
- ```
56
- pip3 install edq-utils
57
- ```
58
-
59
- Standard Python requirements are listed in `pyproject.toml`.
60
- The project and Python dependencies can be installed from source with:
61
- ```
62
- pip3 install .
63
- ```
@@ -1,34 +0,0 @@
1
- edq/__init__.py,sha256=vFC64jsA6hRuFLt0-n4VoH-Khj2zMdd46uFIzH1bZmM,86
2
- edq/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- edq/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- edq/cli/version.py,sha256=hEz8DonP6cmDMiNPpUT4V4hbSQhcC7z6NhJSxqVY6NY,592
5
- edq/cli/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- edq/cli/testing/cli-test.py,sha256=LJJNC_l-7Me2tXKZba0xqmhm08XiPAj5Zt9fsfwAT04,1289
7
- edq/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- edq/core/argparser.py,sha256=LWv4EYlgmqEw0jscpV_-aKSobBEDAZ02Zv3cF2JArx8,4180
9
- edq/core/argparser_test.py,sha256=YzNft7c1Nk5tQzHEW7nEuJakjvk1IZiYimaQ_6HI6Bo,4046
10
- edq/core/log.py,sha256=Aq5-Tznq5fgCfU0OI4ECy2OnCoiwV4bTFkhXXdLoG7Q,3726
11
- edq/core/version.py,sha256=cCadcn3M4qoxbQRu4WRHXUu_xl49GTGSDpr6hpr7Vxw,124
12
- edq/testing/__init__.py,sha256=IKd3fPU_8d_jP19HxG-zKwxFwn7nqFGGtXOY5slY41c,32
13
- edq/testing/asserts.py,sha256=kxNdAC3usbOBQXuagxUNv8IDQ57I3Moe4eWc51xaNIo,2524
14
- edq/testing/cli.py,sha256=gbvPKbPQRUnKzT6AOA72zvwS1tfm4eZoEIWrd6goqYw,12034
15
- edq/testing/cli_test.py,sha256=IqzdK1fEit_3HagSU-nNI4EjkoQp6-I88JGZ1_x_uQk,525
16
- edq/testing/run.py,sha256=qnqGCEwZP-hY87X99EJw2xoMaTF8QeOf7Lx8JI7oM_4,3843
17
- edq/testing/unittest.py,sha256=gATi1nZF14hMJ-n5ClqL3Lue241JCOh0ax9v8ZG3vDE,2196
18
- edq/testing/testdata/cli/tests/platform_skip.txt,sha256=J6n7v3LhfTyjR3Ejo-uR-g6Xdxx34Fu_cmyGSii_elc,103
19
- edq/testing/testdata/cli/tests/version_base.txt,sha256=5e9oSQaivA-0Th7wXpNRhACluyDwvFTL_1xfAkS2Pko,69
20
- edq/util/__init__.py,sha256=9EFKQE77S-B6OJJKFaMg8k3WkMMUQYlGjlTv6tQmWVo,29
21
- edq/util/dirent.py,sha256=YDgHW9xcYzid1rxsk3LowIBXW-JIokdN5SXaVSTFt4U,10334
22
- edq/util/dirent_test.py,sha256=WUx6Ux-13L9YIg2rDyOROv5Kbvgr4xy693ceG1osAP0,33855
23
- edq/util/json.py,sha256=IOTJqZGFYWgng7D1NMd6NDbbmOuw8C4Mpo6-2w1JFNY,5344
24
- edq/util/json_test.py,sha256=utUVRbw3z42ke4fpRVI294RrFHcMKms8khVYRkISNk4,8009
25
- edq/util/pyimport.py,sha256=26OIuCXELyqtwlooMqDEs4GJQrkrAgxnXNYTlqqtsBY,2852
26
- edq/util/pyimport_test.py,sha256=Xno0MIa3yMTfBfoTgjKCIMpr1ZShU6bvo9rBRdecXQU,4202
27
- edq/util/reflection.py,sha256=jPcW6h0fwSDYh04O5rUxlgoF7HK6fVQ2mq7DD9qPrEg,972
28
- edq/util/time.py,sha256=anoNM_KniARLombv2BnsoHuCzDqMKiDdIzV7RUe2ZOk,2648
29
- edq/util/time_test.py,sha256=iQZwzVTVQQ4TdXrLb9MUMCYlKrIe8qyF-hiC9YLTaMo,4610
30
- edq_utils-0.0.5.dist-info/licenses/LICENSE,sha256=MS4iYEl4rOxMoprZuc86iYVoyk4YgaVoMt7WmGvVF8w,1064
31
- edq_utils-0.0.5.dist-info/METADATA,sha256=bbRLMEvtC7oomfF1BEtfXapK2lHfrcXMme1rDTedJL4,2471
32
- edq_utils-0.0.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
33
- edq_utils-0.0.5.dist-info/top_level.txt,sha256=znBHSj6tgXtcMKrUVtovLli5fIEJCb7d-BMxTLRK4zk,4
34
- edq_utils-0.0.5.dist-info/RECORD,,