lib-shopify-graphql 2.0.2__tar.gz → 2.0.4__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.
Files changed (142) hide show
  1. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/.github/workflows/default_cicd_public.yml +40 -5
  2. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/.github/workflows/default_release_public.yml +2 -2
  3. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/.github/workflows/integrationtest.yml +2 -2
  4. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/CHANGELOG.md +36 -0
  5. lib_shopify_graphql-2.0.4/Makefile +260 -0
  6. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/PKG-INFO +11 -11
  7. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/README.md +1 -1
  8. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/pyproject.toml +14 -12
  9. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/reset_git_history.sh +16 -15
  10. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/__init__conf__.py +1 -1
  11. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/adapters/constants.py +2 -0
  12. lib_shopify_graphql-2.0.4/src/lib_shopify_graphql/adapters/parsers/__init__.py +82 -0
  13. lib_shopify_graphql-2.0.4/src/lib_shopify_graphql/adapters/parsers/_errors.py +100 -0
  14. lib_shopify_graphql-2.0.4/src/lib_shopify_graphql/adapters/parsers/_input_builders.py +245 -0
  15. lib_shopify_graphql-2.0.4/src/lib_shopify_graphql/adapters/parsers/_mutations.py +165 -0
  16. lib_shopify_graphql-2.0.4/src/lib_shopify_graphql/adapters/parsers/_products.py +335 -0
  17. lib_shopify_graphql-2.0.4/src/lib_shopify_graphql/adapters/parsers/_truncation.py +324 -0
  18. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/cli/_cache.py +33 -42
  19. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/cli/_common.py +34 -0
  20. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/cli/_images.py +39 -57
  21. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/cli/_products.py +28 -54
  22. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/cli/_test_limits.py +24 -31
  23. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/shopify_client/_common.py +24 -2
  24. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/shopify_client/_images.py +4 -28
  25. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/shopify_client/_inventory.py +3 -19
  26. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/shopify_client/_metafields.py +2 -19
  27. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/shopify_client/_products.py +4 -34
  28. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/shopify_client/_variants_bulk.py +2 -16
  29. lib_shopify_graphql-2.0.2/.data_arch_violations.json +0 -131
  30. lib_shopify_graphql-2.0.2/Makefile +0 -63
  31. lib_shopify_graphql-2.0.2/scripts/__init__.py +0 -9
  32. lib_shopify_graphql-2.0.2/scripts/__main__.py +0 -8
  33. lib_shopify_graphql-2.0.2/scripts/_utils.py +0 -768
  34. lib_shopify_graphql-2.0.2/scripts/build.py +0 -53
  35. lib_shopify_graphql-2.0.2/scripts/bump.py +0 -33
  36. lib_shopify_graphql-2.0.2/scripts/bump_major.py +0 -21
  37. lib_shopify_graphql-2.0.2/scripts/bump_minor.py +0 -21
  38. lib_shopify_graphql-2.0.2/scripts/bump_patch.py +0 -21
  39. lib_shopify_graphql-2.0.2/scripts/bump_version.py +0 -85
  40. lib_shopify_graphql-2.0.2/scripts/clean.py +0 -71
  41. lib_shopify_graphql-2.0.2/scripts/cli.py +0 -236
  42. lib_shopify_graphql-2.0.2/scripts/dependencies.py +0 -586
  43. lib_shopify_graphql-2.0.2/scripts/dev.py +0 -20
  44. lib_shopify_graphql-2.0.2/scripts/help.py +0 -38
  45. lib_shopify_graphql-2.0.2/scripts/install.py +0 -20
  46. lib_shopify_graphql-2.0.2/scripts/menu.py +0 -608
  47. lib_shopify_graphql-2.0.2/scripts/push.py +0 -310
  48. lib_shopify_graphql-2.0.2/scripts/release.py +0 -95
  49. lib_shopify_graphql-2.0.2/scripts/run_cli.py +0 -147
  50. lib_shopify_graphql-2.0.2/scripts/target_metadata.py +0 -206
  51. lib_shopify_graphql-2.0.2/scripts/test.py +0 -1147
  52. lib_shopify_graphql-2.0.2/scripts/toml_config.py +0 -433
  53. lib_shopify_graphql-2.0.2/scripts/version_current.py +0 -21
  54. lib_shopify_graphql-2.0.2/src/lib_shopify_graphql/adapters/parsers.py +0 -1112
  55. lib_shopify_graphql-2.0.2/tests/test_scripts.py +0 -266
  56. lib_shopify_graphql-2.0.2/tests/zpool_list_ok_sample.json +0 -81
  57. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/.devcontainer/devcontainer.json +0 -0
  58. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/.devcontainer/settings.json +0 -0
  59. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/.env.example +0 -0
  60. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/.github/actions/extract-metadata/action.yml +0 -0
  61. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/.github/dependabot.yml +0 -0
  62. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/.github/workflows/codeql.yml +0 -0
  63. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/.gitignore +0 -0
  64. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/.qlty/qlty.toml +0 -0
  65. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/.snyk +0 -0
  66. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/CONTRIBUTING.md +0 -0
  67. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/DEVELOPMENT.md +0 -0
  68. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/INSTALL.md +0 -0
  69. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/LICENSE +0 -0
  70. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/codecov.yml +0 -0
  71. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/docs/api_reference.md +0 -0
  72. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/docs/caching.md +0 -0
  73. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/docs/cli.md +0 -0
  74. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/docs/shopify_setup.md +0 -0
  75. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/docs/sync_implementation.md +0 -0
  76. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/docs/systemdesign/module_reference.md +0 -0
  77. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/notebooks/Quickstart.ipynb +0 -0
  78. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/__init__.py +0 -0
  79. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/__main__.py +0 -0
  80. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/_compat.py +0 -0
  81. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/adapters/__init__.py +0 -0
  82. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/adapters/cache_json.py +0 -0
  83. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/adapters/cache_mysql.py +0 -0
  84. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/adapters/location_resolver.py +0 -0
  85. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/adapters/mutations.py +0 -0
  86. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/adapters/queries.py +0 -0
  87. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/adapters/shopify_sdk.py +0 -0
  88. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/adapters/sku_resolver.py +0 -0
  89. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/adapters/token_cache.py +0 -0
  90. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/application/__init__.py +0 -0
  91. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/application/ports.py +0 -0
  92. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/cli/__init__.py +0 -0
  93. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/cli/_config.py +0 -0
  94. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/cli/_health.py +0 -0
  95. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/composition.py +0 -0
  96. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/config.py +0 -0
  97. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/config_deploy.py +0 -0
  98. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/config_show.py +0 -0
  99. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/defaultconfig.d/10-logging.toml +0 -0
  100. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/defaultconfig.d/20-shopify.toml +0 -0
  101. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/defaultconfig.d/30-mysql.toml +0 -0
  102. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/defaultconfig.d/40-token-cache.toml +0 -0
  103. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/defaultconfig.d/50-sku-cache.toml +0 -0
  104. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/defaultconfig.d/60-graphql.toml +0 -0
  105. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/defaultconfig.toml +0 -0
  106. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/domain/__init__.py +0 -0
  107. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/enums.py +0 -0
  108. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/exceptions.py +0 -0
  109. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/logging_setup.py +0 -0
  110. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/models/__init__.py +0 -0
  111. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/models/_entities.py +0 -0
  112. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/models/_enums.py +0 -0
  113. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/models/_images.py +0 -0
  114. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/models/_internal.py +0 -0
  115. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/models/_mutations.py +0 -0
  116. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/models/_operations.py +0 -0
  117. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/py.typed +0 -0
  118. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/shopify_client/__init__.py +0 -0
  119. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/shopify_client/_cache.py +0 -0
  120. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/shopify_client/_session.py +0 -0
  121. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/src/lib_shopify_graphql/shopify_client/_variants.py +0 -0
  122. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/conftest.py +0 -0
  123. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_cache.py +0 -0
  124. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_cli.py +0 -0
  125. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_composition.py +0 -0
  126. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_config.py +0 -0
  127. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_config_deploy.py +0 -0
  128. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_config_show.py +0 -0
  129. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_constants.py +0 -0
  130. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_enums.py +0 -0
  131. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_images.py +0 -0
  132. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_integration.py +0 -0
  133. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_integration_mysql.py +0 -0
  134. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_location_resolver.py +0 -0
  135. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_metadata.py +0 -0
  136. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_models.py +0 -0
  137. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_module_entry.py +0 -0
  138. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_parsers.py +0 -0
  139. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_shopify_client.py +0 -0
  140. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_sku_resolver.py +0 -0
  141. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_token_cache.py +0 -0
  142. {lib_shopify_graphql-2.0.2 → lib_shopify_graphql-2.0.4}/tests/test_update_models.py +0 -0
@@ -10,15 +10,47 @@ on:
10
10
  - cron: '17 3 * * *'
11
11
 
12
12
  jobs:
13
+ setup:
14
+ name: Extract Python versions from pyproject.toml
15
+ runs-on: ubuntu-latest
16
+ outputs:
17
+ python-versions: ${{ steps.versions.outputs.python-versions }}
18
+ python-latest: ${{ steps.versions.outputs.python-latest }}
19
+ steps:
20
+ - uses: actions/checkout@v6
21
+ - uses: actions/setup-python@v6
22
+ with:
23
+ python-version: "3.x"
24
+ - name: Parse classifiers for Python versions
25
+ id: versions
26
+ shell: python
27
+ run: |
28
+ import json, os, tomllib
29
+
30
+ with open("pyproject.toml", "rb") as f:
31
+ data = tomllib.load(f)
32
+ classifiers = data.get("project", {}).get("classifiers", [])
33
+ prefix = "Programming Language :: Python :: "
34
+ versions = [
35
+ c[len(prefix):]
36
+ for c in classifiers
37
+ if c.startswith(prefix) and "." in c[len(prefix):]
38
+ ]
39
+ if not versions:
40
+ raise SystemExit("No Python X.Y versions found in classifiers")
41
+ with open(os.environ["GITHUB_OUTPUT"], "a") as fh:
42
+ fh.write(f"python-versions={json.dumps(versions)}\n")
43
+ fh.write(f"python-latest={versions[-1]}\n")
44
+
13
45
  test:
14
46
  name: Tests (Python ${{ matrix.python }}, ${{ matrix.os }})
47
+ needs: setup
15
48
  runs-on: ${{ matrix.os }}
16
49
  strategy:
17
50
  fail-fast: false
18
51
  matrix:
19
52
  os: [ubuntu-latest, macos-latest, windows-latest]
20
- # Test against all supported Python versions (3.10+)
21
- python: ["3.10", "3.11", "3.12", "3.13", "3.14"]
53
+ python: ${{ fromJSON(needs.setup.outputs.python-versions) }}
22
54
  env:
23
55
  PYO3_USE_ABI3_FORWARD_COMPATIBILITY: "1"
24
56
  PYTHONIOENCODING: "utf-8"
@@ -63,7 +95,10 @@ jobs:
63
95
  run: |
64
96
  uv pip install pywin32 --system
65
97
 
98
+ # Self-hosted runners persist ruff cache via RUFF_CACHE_DIR volume mount,
99
+ # so actions/cache is only needed on GitHub-hosted runners.
66
100
  - name: Restore ruff cache
101
+ if: runner.environment == 'github-hosted'
67
102
  id: ruff-cache
68
103
  uses: actions/cache/restore@v5
69
104
  with:
@@ -109,7 +144,7 @@ jobs:
109
144
  always()
110
145
  && steps.pytest.outcome == 'success'
111
146
  && matrix.os == 'ubuntu-latest'
112
- && matrix.python == '3.13'
147
+ && matrix.python == needs.setup.outputs.python-latest
113
148
  uses: codecov/codecov-action@v5
114
149
  with:
115
150
  files: ${{ env.COV_REPORT_FILE }}
@@ -125,7 +160,7 @@ jobs:
125
160
  id: bandit
126
161
  continue-on-error: true
127
162
  shell: bash
128
- run: bandit -q -r ${{ env.SRC_PATH }}/${{ env.PACKAGE_MODULE }} ${{ env.BANDIT_SKIP_FLAG }}
163
+ run: bandit -q -c pyproject.toml -r ${{ env.SRC_PATH }}/${{ env.PACKAGE_MODULE }} ${{ env.BANDIT_SKIP_FLAG }}
129
164
 
130
165
  - name: Run pip-audit (vulnerability scan)
131
166
  id: pipaudit
@@ -189,7 +224,7 @@ jobs:
189
224
  run: uv cache prune --ci
190
225
 
191
226
  - name: Save ruff cache
192
- if: always() && steps.ruff-cache.outputs.cache-hit != 'true'
227
+ if: always() && runner.environment == 'github-hosted' && steps.ruff-cache.outputs.cache-hit != 'true'
193
228
  uses: actions/cache/save@v5
194
229
  with:
195
230
  path: .ruff_cache
@@ -31,7 +31,7 @@ jobs:
31
31
  run: uv build
32
32
 
33
33
  - name: Upload artifacts
34
- uses: actions/upload-artifact@v6
34
+ uses: actions/upload-artifact@v7
35
35
  with:
36
36
  name: dist
37
37
  path: dist/*
@@ -56,7 +56,7 @@ jobs:
56
56
  fi
57
57
 
58
58
  - name: Download artifacts
59
- uses: actions/download-artifact@v7
59
+ uses: actions/download-artifact@v8
60
60
  with:
61
61
  name: dist
62
62
  path: dist/
@@ -54,6 +54,6 @@ jobs:
54
54
  fi
55
55
  echo "Shopify credentials configured for: $LIB_SHOPIFY_GRAPHQL___SHOPIFY__SHOP_URL"
56
56
 
57
- - name: Run integration tests (test-slow)
57
+ - name: Run integration tests
58
58
  shell: bash
59
- run: make test-slow
59
+ run: make testintegration
@@ -4,6 +4,38 @@ All notable changes to this project will be documented in this file following
4
4
  the [Keep a Changelog](https://keepachangelog.com/) format.
5
5
 
6
6
 
7
+ ## [2.0.4] - 2026-03-09
8
+
9
+ ### Changed
10
+ - Extracted `_check_graphql_errors()` helper to `shopify_client/_common.py`, replacing duplicate error-checking across 6 modules
11
+ - Inlined 6 trivial wrapper functions that only delegated to `_check_graphql_errors()`
12
+ - Added `shopify_session()` context manager to `cli/_common.py`, consolidating login/logout boilerplate across 4 CLI modules
13
+ - Split `adapters/parsers.py` (1112 lines) into 5 focused submodules: `_errors`, `_truncation`, `_products`, `_input_builders`, `_mutations`
14
+ - Added `@lru_cache` to `get_default_cache_dir()` to avoid redundant platform detection
15
+ - Updated CLAUDE.md: removed stale `scripts/` references, updated CLI package structure, replaced `test-slow` with `testintegration`
16
+
17
+ ### Removed
18
+ - Removed stale `tests/zpool_list_ok_sample.json` fixture from unrelated project
19
+
20
+ ### Fixed
21
+ - README CI badge now points to correct workflow (`default_cicd_public.yml`)
22
+
23
+ ## [2.0.3] - 2026-03-09
24
+
25
+ ### Changed
26
+ - Migrated build tooling from `scripts/` to `bmk` (persistent uv tool)
27
+ - Updated CI integration test workflow to use `make testintegration`
28
+ - Bumped dependency minimum versions (filelock, orjson, ruff, bandit, textual, import-linter, hatchling)
29
+ - Fixed shell script formatting in `reset_git_history.sh` (4-space indent, shellcheck compliance)
30
+
31
+ ### Removed
32
+ - Removed legacy `scripts/` directory (replaced by bmk)
33
+ - Removed obsolete `test_scripts.py`
34
+
35
+ ### Fixed
36
+ - Registered `local_only` pytest marker in `pyproject.toml` to suppress warnings
37
+ - Updated CI/CD runner and action versions
38
+
7
39
  ## [2.0.2] - 2026-02-13
8
40
 
9
41
  ### Changed
@@ -48,6 +80,10 @@ the [Keep a Changelog](https://keepachangelog.com/) format.
48
80
 
49
81
  ## [Unreleased]
50
82
 
83
+ ## [2.0.4] 2026-03-09 13:03:28
84
+
85
+ ## [2.0.3] 2026-03-09 11:52:50
86
+
51
87
  ### Added
52
88
  - `test-slow` target added to interactive TUI menu for running integration tests
53
89
 
@@ -0,0 +1,260 @@
1
+ # BMK MAKEFILE 2.9.0
2
+ # do not alter this file - it might be overwritten on new versions of BMK
3
+ # if You want to alter it, remove the first line # BMK MAKEFILE 1.0 - then it is a custom makefile and will not be overwritten
4
+ # bmk Makefile — thin wrapper using `uv tool install` for persistent bmk
5
+ #
6
+ # Usage:
7
+ # make test # run test suite
8
+ # make test --verbose # forward extra flags
9
+ # make bump-patch # bump patch version
10
+ # make push fix login bug # push with commit message
11
+ # make custom deploy # run custom command
12
+ # make custom deploy --dry-run
13
+ #
14
+ # On every invocation, bmk is (re-)installed as a persistent uv tool
15
+ # together with the current project's dependencies (read from ./pyproject.toml).
16
+ # This ensures pyright, pytest, pip-audit etc. can resolve the full
17
+ # dependency tree without PYTHONPATH hacks or a local .venv.
18
+ #
19
+ # Arguments after the target name are forwarded automatically.
20
+ # You can also use ARGS="..." explicitly if preferred.
21
+
22
+ SHELL := /bin/bash
23
+ .DEFAULT_GOAL := help
24
+
25
+ # Use absolute path to the uv tool binary so active virtualenvs cannot shadow it.
26
+ BMK := $(HOME)/.local/bin/bmk
27
+ ARGS ?=
28
+
29
+ # ──────────────────────────────────────────────────────────────
30
+ # Ensure bmk + project deps are installed as a persistent uv tool
31
+ # ──────────────────────────────────────────────────────────────
32
+ # --reinstall re-resolves deps on every call (fast when cached).
33
+ # Fallback handles first-time install where --reinstall would fail.
34
+ .PHONY: _ensure_bmk
35
+ _ensure_bmk:
36
+ @uv tool install --reinstall bmk --with . 2>/dev/null || uv tool install bmk --with .
37
+
38
+ # ──────────────────────────────────────────────────────────────
39
+ # Argument forwarding via MAKECMDGOALS
40
+ # ──────────────────────────────────────────────────────────────
41
+ # Allows natural argument passing: make push fix login bug
42
+ # instead of: make push ARGS="fix login bug"
43
+
44
+ # All targets that accept trailing arguments
45
+ _BMK_TARGETS := test t test-human th testintegration testi ti testintegration-human tih \
46
+ codecov coverage cov \
47
+ build bld clean cln cl run \
48
+ bump-major bump-minor bump-patch bump \
49
+ commit c push psh p release rel r \
50
+ dependencies deps d dependencies-update \
51
+ config config-deploy config-generate-examples \
52
+ send-email send-notification custom \
53
+ info logdemo
54
+
55
+ ifneq (,$(filter $(_BMK_TARGETS),$(firstword $(MAKECMDGOALS))))
56
+ # Capture everything after the first word as extra arguments
57
+ _EXTRA := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
58
+ # Append to ARGS (so explicit ARGS="..." still works alongside)
59
+ override ARGS += $(_EXTRA)
60
+ endif
61
+
62
+ # ──────────────────────────────────────────────────────────────
63
+ # Test & Quality
64
+ # ──────────────────────────────────────────────────────────────
65
+
66
+ .PHONY: test t
67
+ test: _ensure_bmk ## Run test suite [alias: t]
68
+ $(BMK) test $(ARGS)
69
+ t: _ensure_bmk
70
+ $(BMK) test $(ARGS)
71
+
72
+ .PHONY: test-human th
73
+ test-human: _ensure_bmk ## Run test suite with human-readable output [alias: th]
74
+ $(BMK) test --human $(ARGS)
75
+ th: _ensure_bmk
76
+ $(BMK) test --human $(ARGS)
77
+
78
+ .PHONY: testintegration testi ti
79
+ testintegration: _ensure_bmk ## Run integration tests only [aliases: testi, ti]
80
+ $(BMK) testintegration $(ARGS)
81
+ testi ti: _ensure_bmk
82
+ $(BMK) testintegration $(ARGS)
83
+
84
+ .PHONY: testintegration-human tih
85
+ testintegration-human: _ensure_bmk ## Run integration tests with human-readable output [alias: tih]
86
+ $(BMK) testintegration --human $(ARGS)
87
+ tih: _ensure_bmk
88
+ $(BMK) testintegration --human $(ARGS)
89
+
90
+ .PHONY: codecov coverage cov
91
+ codecov: _ensure_bmk ## Upload coverage report to Codecov [aliases: coverage, cov]
92
+ $(BMK) codecov $(ARGS)
93
+ coverage cov: _ensure_bmk
94
+ $(BMK) codecov $(ARGS)
95
+
96
+ # ──────────────────────────────────────────────────────────────
97
+ # Build & Clean
98
+ # ──────────────────────────────────────────────────────────────
99
+
100
+ .PHONY: build bld
101
+ build: _ensure_bmk ## Build wheel and sdist artifacts [alias: bld]
102
+ $(BMK) build $(ARGS)
103
+ bld: _ensure_bmk
104
+ $(BMK) build $(ARGS)
105
+
106
+ .PHONY: clean cln cl
107
+ clean: _ensure_bmk ## Remove build artifacts and caches [aliases: cln, cl]
108
+ $(BMK) clean $(ARGS)
109
+ cln cl: _ensure_bmk
110
+ $(BMK) clean $(ARGS)
111
+
112
+ # ──────────────────────────────────────────────────────────────
113
+ # Run
114
+ # ──────────────────────────────────────────────────────────────
115
+
116
+ .PHONY: run
117
+ run: _ensure_bmk ## Run the project CLI
118
+ $(BMK) run $(ARGS)
119
+
120
+ # ──────────────────────────────────────────────────────────────
121
+ # Version Bumping
122
+ # ──────────────────────────────────────────────────────────────
123
+
124
+ .PHONY: bump-major
125
+ bump-major: _ensure_bmk ## Bump major version (X+1).0.0
126
+ $(BMK) bump major $(ARGS)
127
+
128
+ .PHONY: bump-minor
129
+ bump-minor: _ensure_bmk ## Bump minor version X.(Y+1).0
130
+ $(BMK) bump minor $(ARGS)
131
+
132
+ .PHONY: bump-patch
133
+ bump-patch: _ensure_bmk ## Bump patch version X.Y.(Z+1)
134
+ $(BMK) bump patch $(ARGS)
135
+
136
+ .PHONY: bump
137
+ bump: bump-patch ## Bump patch version (default for bump)
138
+
139
+ # ──────────────────────────────────────────────────────────────
140
+ # Git Operations
141
+ # ──────────────────────────────────────────────────────────────
142
+
143
+ .PHONY: commit c
144
+ commit: _ensure_bmk ## Create a git commit with timestamped message [alias: c]
145
+ $(BMK) commit $(ARGS)
146
+ c: _ensure_bmk
147
+ $(BMK) commit $(ARGS)
148
+
149
+ .PHONY: push psh p
150
+ push: _ensure_bmk ## Run tests, commit, and push to remote [aliases: psh, p]
151
+ $(BMK) push $(ARGS)
152
+ psh p: _ensure_bmk
153
+ $(BMK) push $(ARGS)
154
+
155
+ .PHONY: release rel r
156
+ release: _ensure_bmk ## Create a versioned release (tag + GitHub release) [aliases: rel, r]
157
+ $(BMK) release $(ARGS)
158
+ rel r: _ensure_bmk
159
+ $(BMK) release $(ARGS)
160
+
161
+ # ──────────────────────────────────────────────────────────────
162
+ # Dependencies
163
+ # ──────────────────────────────────────────────────────────────
164
+
165
+ .PHONY: dependencies deps d
166
+ dependencies: _ensure_bmk ## Check and list project dependencies [aliases: deps, d]
167
+ $(BMK) dependencies $(ARGS)
168
+ deps d: _ensure_bmk
169
+ $(BMK) dependencies $(ARGS)
170
+
171
+ .PHONY: dependencies-update
172
+ dependencies-update: _ensure_bmk ## Update dependencies to latest versions
173
+ $(BMK) dependencies update $(ARGS)
174
+
175
+ # ──────────────────────────────────────────────────────────────
176
+ # Configuration
177
+ # ──────────────────────────────────────────────────────────────
178
+
179
+ .PHONY: config
180
+ config: _ensure_bmk ## Show current merged configuration
181
+ $(BMK) config $(ARGS)
182
+
183
+ .PHONY: config-deploy
184
+ config-deploy: _ensure_bmk ## Deploy configuration to system/user directories
185
+ $(BMK) config-deploy $(ARGS)
186
+
187
+ .PHONY: config-generate-examples
188
+ config-generate-examples: _ensure_bmk ## Generate example configuration files
189
+ $(BMK) config-generate-examples $(ARGS)
190
+
191
+ # ──────────────────────────────────────────────────────────────
192
+ # Email
193
+ # ──────────────────────────────────────────────────────────────
194
+
195
+ .PHONY: send-email
196
+ send-email: _ensure_bmk ## Send an email via configured SMTP
197
+ $(BMK) send-email $(ARGS)
198
+
199
+ .PHONY: send-notification
200
+ send-notification: _ensure_bmk ## Send a plain-text notification email
201
+ $(BMK) send-notification $(ARGS)
202
+
203
+ # ──────────────────────────────────────────────────────────────
204
+ # Custom Commands
205
+ # ──────────────────────────────────────────────────────────────
206
+
207
+ .PHONY: custom
208
+ custom: _ensure_bmk ## Run a custom command (make custom <name> [args...])
209
+ $(BMK) custom $(ARGS)
210
+
211
+ # ──────────────────────────────────────────────────────────────
212
+ # Info & Demos
213
+ # ──────────────────────────────────────────────────────────────
214
+
215
+ .PHONY: info
216
+ info: _ensure_bmk ## Print resolved package metadata
217
+ $(BMK) info $(ARGS)
218
+
219
+ .PHONY: logdemo
220
+ logdemo: _ensure_bmk ## Run logging demonstration
221
+ $(BMK) logdemo $(ARGS)
222
+
223
+ .PHONY: version-current
224
+ version-current: _ensure_bmk ## Print current version
225
+ $(BMK) --version
226
+
227
+ # ──────────────────────────────────────────────────────────────
228
+ # Development
229
+ # ──────────────────────────────────────────────────────────────
230
+
231
+ .PHONY: dev
232
+ dev: ## Install package with dev extras (editable)
233
+ uv pip install -e ".[dev]"
234
+
235
+
236
+ .PHONY: install
237
+ install: ## Editable install (no dev extras)
238
+ uv pip install -e .
239
+
240
+ # ──────────────────────────────────────────────────────────────
241
+ # Help
242
+ # ──────────────────────────────────────────────────────────────
243
+
244
+ .PHONY: help
245
+ help: ## Show this help
246
+ @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
247
+ awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-26s\033[0m %s\n", $$1, $$2}' | \
248
+ sort
249
+
250
+ # ──────────────────────────────────────────────────────────────
251
+ # No-op overrides for trailing argument words (MUST be last)
252
+ # ──────────────────────────────────────────────────────────────
253
+ # Placed after all real target definitions so the no-op recipes
254
+ # override them. This prevents "make push codecov fix" from
255
+ # executing the real codecov target — "codecov" is an argument
256
+ # to push, not a separate command.
257
+ ifneq (,$(_EXTRA))
258
+ $(_EXTRA):
259
+ @:
260
+ endif
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lib_shopify_graphql
3
- Version: 2.0.2
3
+ Version: 2.0.4
4
4
  Summary: Python library for Shopify GraphQL API interactions
5
5
  Project-URL: Homepage, https://github.com/bitranox/lib_shopify_graphql
6
6
  Project-URL: Repository, https://github.com/bitranox/lib_shopify_graphql.git
@@ -20,26 +20,26 @@ Classifier: Programming Language :: Python :: 3.12
20
20
  Classifier: Programming Language :: Python :: 3.13
21
21
  Classifier: Typing :: Typed
22
22
  Requires-Python: >=3.10
23
- Requires-Dist: filelock>=3.20.3
23
+ Requires-Dist: filelock>=3.25.0
24
24
  Requires-Dist: httpx>=0.28.1
25
- Requires-Dist: lib-cli-exit-tools>=2.2.4
26
- Requires-Dist: lib-layered-config>=5.4.0
27
- Requires-Dist: lib-log-rich>=6.3.1
28
- Requires-Dist: orjson>=3.11.6
25
+ Requires-Dist: lib-cli-exit-tools>=2.3.0
26
+ Requires-Dist: lib-layered-config>=5.5.0
27
+ Requires-Dist: lib-log-rich>=6.3.3
28
+ Requires-Dist: orjson>=3.11.7
29
29
  Requires-Dist: pydantic>=2.12.5
30
30
  Requires-Dist: rich-click>=1.9.7
31
31
  Provides-Extra: dev
32
- Requires-Dist: bandit>=1.9.3; extra == 'dev'
32
+ Requires-Dist: bandit>=1.9.4; extra == 'dev'
33
33
  Requires-Dist: build>=1.4.0; extra == 'dev'
34
34
  Requires-Dist: codecov-cli>=11.2.6; extra == 'dev'
35
- Requires-Dist: import-linter>=2.9; extra == 'dev'
35
+ Requires-Dist: import-linter>=2.11; extra == 'dev'
36
36
  Requires-Dist: pip-audit>=2.10.0; extra == 'dev'
37
37
  Requires-Dist: pyright[nodejs]>=1.1.408; extra == 'dev'
38
38
  Requires-Dist: pytest-cov>=7.0.0; extra == 'dev'
39
39
  Requires-Dist: pytest>=9.0.2; extra == 'dev'
40
40
  Requires-Dist: rtoml>=0.13.0; extra == 'dev'
41
- Requires-Dist: ruff>=0.14.14; extra == 'dev'
42
- Requires-Dist: textual>=7.5.0; extra == 'dev'
41
+ Requires-Dist: ruff>=0.15.5; extra == 'dev'
42
+ Requires-Dist: textual>=8.0.2; extra == 'dev'
43
43
  Requires-Dist: twine>=6.2.0; extra == 'dev'
44
44
  Provides-Extra: mysql
45
45
  Requires-Dist: pymysql>=1.1.2; extra == 'mysql'
@@ -48,7 +48,7 @@ Description-Content-Type: text/markdown
48
48
  # lib_shopify_graphql
49
49
 
50
50
  <!-- Badges -->
51
- [![CI](https://github.com/bitranox/lib_shopify_graphql/actions/workflows/ci.yml/badge.svg)](https://github.com/bitranox/lib_shopify_graphql/actions/workflows/ci.yml)
51
+ [![CI](https://github.com/bitranox/lib_shopify_graphql/actions/workflows/default_cicd_public.yml/badge.svg)](https://github.com/bitranox/lib_shopify_graphql/actions/workflows/default_cicd_public.yml)
52
52
  [![CodeQL](https://github.com/bitranox/lib_shopify_graphql/actions/workflows/codeql.yml/badge.svg)](https://github.com/bitranox/lib_shopify_graphql/actions/workflows/codeql.yml)
53
53
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
54
54
  [![Open in Codespaces](https://img.shields.io/badge/Codespaces-Open-blue?logo=github&logoColor=white&style=flat-square)](https://codespaces.new/bitranox/lib_shopify_graphql?quickstart=1)
@@ -1,7 +1,7 @@
1
1
  # lib_shopify_graphql
2
2
 
3
3
  <!-- Badges -->
4
- [![CI](https://github.com/bitranox/lib_shopify_graphql/actions/workflows/ci.yml/badge.svg)](https://github.com/bitranox/lib_shopify_graphql/actions/workflows/ci.yml)
4
+ [![CI](https://github.com/bitranox/lib_shopify_graphql/actions/workflows/default_cicd_public.yml/badge.svg)](https://github.com/bitranox/lib_shopify_graphql/actions/workflows/default_cicd_public.yml)
5
5
  [![CodeQL](https://github.com/bitranox/lib_shopify_graphql/actions/workflows/codeql.yml/badge.svg)](https://github.com/bitranox/lib_shopify_graphql/actions/workflows/codeql.yml)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
7
7
  [![Open in Codespaces](https://img.shields.io/badge/Codespaces-Open-blue?logo=github&logoColor=white&style=flat-square)](https://codespaces.new/bitranox/lib_shopify_graphql?quickstart=1)
@@ -1,16 +1,16 @@
1
1
  [project]
2
2
  name = "lib_shopify_graphql"
3
- version = "2.0.2"
3
+ version = "2.0.4"
4
4
  description = "Python library for Shopify GraphQL API interactions"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
7
7
  dependencies = [
8
8
  "rich-click>=1.9.7",
9
- "lib_cli_exit_tools>=2.2.4",
10
- "lib_log_rich>=6.3.1",
11
- "lib_layered_config>=5.4.0",
12
- "filelock>=3.20.3",
13
- "orjson>=3.11.6",
9
+ "lib_cli_exit_tools>=2.3.0",
10
+ "lib_log_rich>=6.3.3",
11
+ "lib_layered_config>=5.5.0",
12
+ "filelock>=3.25.0",
13
+ "orjson>=3.11.7",
14
14
  "httpx>=0.28.1",
15
15
  "pydantic>=2.12.5",
16
16
  ]
@@ -39,15 +39,15 @@ Issues = "https://github.com/bitranox/lib_shopify_graphql/issues"
39
39
  dev = [
40
40
  "pytest>=9.0.2",
41
41
  "pytest-cov>=7.0.0",
42
- "ruff>=0.14.14",
42
+ "ruff>=0.15.5",
43
43
  "pyright[nodejs]>=1.1.408",
44
- "bandit>=1.9.3",
44
+ "bandit>=1.9.4",
45
45
  "build>=1.4.0",
46
46
  "twine>=6.2.0",
47
47
  "codecov-cli>=11.2.6",
48
48
  "pip-audit>=2.10.0",
49
- "textual>=7.5.0",
50
- "import-linter>=2.9",
49
+ "textual>=8.0.2",
50
+ "import-linter>=2.11",
51
51
  "rtoml>=0.13.0",
52
52
  ]
53
53
  mysql = [
@@ -59,7 +59,7 @@ lib_shopify_graphql = "lib_shopify_graphql.cli:main"
59
59
  lib-shopify-graphql = "lib_shopify_graphql.cli:main"
60
60
 
61
61
  [build-system]
62
- requires = ["hatchling>=1.28.0"]
62
+ requires = ["hatchling>=1.29.0"]
63
63
  build-backend = "hatchling.build"
64
64
 
65
65
 
@@ -120,6 +120,7 @@ markers = [
120
120
  "os_posix: test exercises behavior requiring POSIX semantics",
121
121
  "os_linux: test exercises Linux-only behavior",
122
122
  "integration: integration tests requiring real Shopify API connection (slow)",
123
+ "local_only: tests that only run locally, not in CI",
123
124
  "mysql_integration: MySQL backend integration tests (skipped in CI)",
124
125
  ]
125
126
 
@@ -147,8 +148,9 @@ output = "coverage.json"
147
148
  pretty_print = true
148
149
 
149
150
  [tool.clean]
150
- # Patterns to remove when running `make clean` or `python -m scripts clean`
151
+ # Patterns to remove when running `make clean`
151
152
  patterns = [
153
+ "**/__pycache__",
152
154
  ".hypothesis",
153
155
  ".import_linter_cache",
154
156
  ".pytest_cache",
@@ -5,14 +5,14 @@ set -euo pipefail
5
5
  echo "Preparing to squash repository history..."
6
6
 
7
7
  if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
8
- echo "Error: run this script inside a Git repository." >&2
9
- exit 1
8
+ echo "Error: run this script inside a Git repository." >&2
9
+ exit 1
10
10
  fi
11
11
 
12
12
  current_branch="$(git symbolic-ref --short HEAD 2>/dev/null || true)"
13
13
  if [[ -z "$current_branch" ]]; then
14
- echo "Error: could not determine current branch. Check out a branch and retry." >&2
15
- exit 1
14
+ echo "Error: could not determine current branch. Check out a branch and retry." >&2
15
+ exit 1
16
16
  fi
17
17
 
18
18
  # Snapshot tracked changes, keeping untracked files untouched.
@@ -20,17 +20,18 @@ fi
20
20
  git rm -r --cached .idea >/dev/null 2>&1 || true
21
21
 
22
22
  if git status --porcelain | grep -v '^??' >/dev/null 2>&1; then
23
- echo "Committing tracked changes..."
24
- git add -u
25
- git commit -m "chore: checkpoint before history reset"
23
+ echo "Committing tracked changes..."
24
+ git add -u
25
+ git commit -m "chore: checkpoint before history reset"
26
26
  fi
27
27
 
28
28
  # Ensure the working tree is clean before rewriting history.
29
29
  if ! git diff --quiet || ! git diff --cached --quiet; then
30
- echo "Error: working tree is not clean after checkpoint commit. Aborting." >&2
31
- exit 1
30
+ echo "Error: working tree is not clean after checkpoint commit. Aborting." >&2
31
+ exit 1
32
32
  fi
33
33
 
34
+ # shellcheck disable=SC1083
34
35
  tree_sha="$(git rev-parse HEAD^{tree})"
35
36
  reset_message="chore: reset history"
36
37
  new_commit="$(git commit-tree "$tree_sha" -m "$reset_message")"
@@ -38,17 +39,17 @@ git reset --hard "$new_commit"
38
39
 
39
40
  remote="${1:-}"
40
41
  if [[ -z "$remote" ]]; then
41
- remote="$(git remote | head -n1 || true)"
42
+ remote="$(git remote | head -n1 || true)"
42
43
  fi
43
44
 
44
45
  if [[ -n "$remote" ]]; then
45
- # Ensure any reintroduced IntelliJ files are untracked before the force push.
46
- git rm -r --cached .idea >/dev/null 2>&1 || true
46
+ # Ensure any reintroduced IntelliJ files are untracked before the force push.
47
+ git rm -r --cached .idea >/dev/null 2>&1 || true
47
48
 
48
- echo "Force pushing rewritten history to remote '$remote'..."
49
- git push --force "$remote" "$current_branch"
49
+ echo "Force pushing rewritten history to remote '$remote'..."
50
+ git push --force "$remote" "$current_branch"
50
51
  else
51
- echo "No remote configured. Local history rewritten only."
52
+ echo "No remote configured. Local history rewritten only."
52
53
  fi
53
54
 
54
55
  echo "History reset complete. Untracked files were left untouched."
@@ -24,7 +24,7 @@ name = "lib_shopify_graphql"
24
24
  #: Human-readable summary shown in CLI help output.
25
25
  title = "Python library for Shopify GraphQL API interactions"
26
26
  #: Current release version pulled from ``pyproject.toml`` by automation.
27
- version = "2.0.2"
27
+ version = "2.0.4"
28
28
  #: Repository homepage presented to users.
29
29
  homepage = "https://github.com/bitranox/lib_shopify_graphql"
30
30
  #: Author attribution surfaced in CLI output.
@@ -8,6 +8,7 @@ All values can be overridden via configuration (see defaultconfig.toml).
8
8
 
9
9
  from __future__ import annotations
10
10
 
11
+ from functools import lru_cache
11
12
  from typing import TYPE_CHECKING
12
13
 
13
14
  if TYPE_CHECKING:
@@ -82,6 +83,7 @@ DEFAULT_CURRENCY_CODE: str = "USD"
82
83
  CACHE_APP_NAME: str = "lib-shopify-graphql"
83
84
 
84
85
 
86
+ @lru_cache(maxsize=1)
85
87
  def get_default_cache_dir() -> Path:
86
88
  """Get the default cache directory for the current platform.
87
89