acumatica-cli 0.32.0__tar.gz → 0.33.1__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 (77) hide show
  1. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/PKG-INFO +4 -4
  2. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/README.md +3 -3
  3. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/pyproject.toml +1 -1
  4. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/pyproject.toml.orig +1 -1
  5. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/seed.py +9 -2
  6. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/seed_catalog.yaml +4 -3
  7. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/__init__.py +0 -0
  8. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/bootstrap.py +0 -0
  9. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/bootstrap_plugin.cs +0 -0
  10. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/bootstrap_project.xml +0 -0
  11. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/cli.py +0 -0
  12. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/client.py +0 -0
  13. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/config.py +0 -0
  14. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/extract.py +0 -0
  15. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/firstlogin.py +0 -0
  16. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/inventory.py +0 -0
  17. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/models.py +0 -0
  18. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/output.py +0 -0
  19. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/reconcile.py +0 -0
  20. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/run.py +0 -0
  21. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/snapshot_map.yaml +0 -0
  22. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/state.py +0 -0
  23. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/README.md +0 -0
  24. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/baseline/10-subaccounts.yaml +0 -0
  25. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/baseline/20-accounts.yaml +0 -0
  26. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/baseline/40-ledger.yaml +0 -0
  27. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/baseline/50-gl-preferences.yaml +0 -0
  28. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/baseline/60-ledger-company.yaml +0 -0
  29. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/baseline/90-uoms.yaml +0 -0
  30. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/baseline/91-company-packaging.yaml +0 -0
  31. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/bootstrap/company.yaml +0 -0
  32. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/bootstrap/credit-terms.yaml +0 -0
  33. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/bootstrap/features.yaml +0 -0
  34. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/bootstrap/segmented-key.yaml +0 -0
  35. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/05-numbering-sequences.yaml +0 -0
  36. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/10-reason-codes.yaml +0 -0
  37. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/20-in-preferences.yaml +0 -0
  38. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/30-availability-rules.yaml +0 -0
  39. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/40-posting-classes.yaml +0 -0
  40. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/50-warehouse.yaml +0 -0
  41. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/51-warehouse-locations.yaml +0 -0
  42. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/52-warehouse-defaults.yaml +0 -0
  43. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/53-tax-categories.yaml +0 -0
  44. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/54-item-classes.yaml +0 -0
  45. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/56-so-preferences.yaml +0 -0
  46. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/57-po-preferences.yaml +0 -0
  47. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/58-order-types.yaml +0 -0
  48. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/60-ar-preferences.yaml +0 -0
  49. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/61-ap-preferences.yaml +0 -0
  50. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/62-ca-preferences.yaml +0 -0
  51. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/63-cash-account.yaml +0 -0
  52. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/64-payment-methods.yaml +0 -0
  53. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/65-statement-cycles.yaml +0 -0
  54. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/70-vendor-classes.yaml +0 -0
  55. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/71-customer-classes.yaml +0 -0
  56. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/75-vendors.yaml +0 -0
  57. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/76-customers.yaml +0 -0
  58. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/80-stock-items-parts.yaml +0 -0
  59. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/82-stock-items-kits.yaml +0 -0
  60. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/85-kit-specifications.yaml +0 -0
  61. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/90-roles.yaml +0 -0
  62. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/91-users.yaml +0 -0
  63. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/master/92-role-users.yaml +0 -0
  64. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/setup/10-financial-year.yaml +0 -0
  65. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/setup/20-master-calendar.yaml +0 -0
  66. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/setup/30-open-periods.yaml +0 -0
  67. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/config/views/10-trial-balance.yaml +0 -0
  68. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/env +0 -0
  69. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/gitignore +0 -0
  70. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/overlays/README.md +0 -0
  71. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/overlays/default-24.200.001/README.md +0 -0
  72. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/overlays/default-24.200.001/scenario/30-build.yaml +0 -0
  73. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/scenario/10-seed-capital.yaml +0 -0
  74. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/scenario/20-buy.yaml +0 -0
  75. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/scenario/30-build.yaml +0 -0
  76. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/templates/scenario/40-sell.yaml +0 -0
  77. {acumatica_cli-0.32.0 → acumatica_cli-0.33.1}/src/acumatica_cli/tenant.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: acumatica-cli
3
- Version: 0.32.0
3
+ Version: 0.33.1
4
4
  Summary: Acumatica ERP Config-as-Code: tenant provisioning, baseline config, and reference data
5
5
  Author: Konstantin Borovik
6
6
  Author-email: Konstantin Borovik <kb@lab5.ca>
@@ -257,10 +257,10 @@ Or clone and install editable for development:
257
257
  ```sh
258
258
  git clone https://github.com/kborovik/acumatica-cli.git
259
259
  cd acumatica-cli
260
- gmake install # editable install as a global uv tool
260
+ gmake install # uv sync; does not replace the PyPI tool
261
261
  ```
262
262
 
263
- Verify with `acu --version`.
263
+ Verify with `uv run acu --version` (`+dev`).
264
264
 
265
265
  ## Configuration
266
266
 
@@ -351,7 +351,7 @@ Elsewhere plain `make` is fine when it is GNU Make.
351
351
  ```sh
352
352
  git clone https://github.com/kborovik/acumatica-cli.git
353
353
  cd acumatica-cli
354
- gmake install # editable install as a global uv tool
354
+ gmake install # uv sync; does not replace the PyPI tool
355
355
  gmake check # offline gate: ruff, basedpyright strict, pytest
356
356
  ```
357
357
 
@@ -239,10 +239,10 @@ Or clone and install editable for development:
239
239
  ```sh
240
240
  git clone https://github.com/kborovik/acumatica-cli.git
241
241
  cd acumatica-cli
242
- gmake install # editable install as a global uv tool
242
+ gmake install # uv sync; does not replace the PyPI tool
243
243
  ```
244
244
 
245
- Verify with `acu --version`.
245
+ Verify with `uv run acu --version` (`+dev`).
246
246
 
247
247
  ## Configuration
248
248
 
@@ -333,7 +333,7 @@ Elsewhere plain `make` is fine when it is GNU Make.
333
333
  ```sh
334
334
  git clone https://github.com/kborovik/acumatica-cli.git
335
335
  cd acumatica-cli
336
- gmake install # editable install as a global uv tool
336
+ gmake install # uv sync; does not replace the PyPI tool
337
337
  gmake check # offline gate: ruff, basedpyright strict, pytest
338
338
  ```
339
339
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "acumatica-cli"
3
- version = "0.32.0"
3
+ version = "0.33.1"
4
4
  description = "Acumatica ERP Config-as-Code: tenant provisioning, baseline config, and reference data"
5
5
  license = "PolyForm-Noncommercial-1.0.0"
6
6
  readme = "README.md"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "acumatica-cli"
3
- version = "0.32.0"
3
+ version = "0.33.1"
4
4
  description = "Acumatica ERP Config-as-Code: tenant provisioning, baseline config, and reference data"
5
5
  authors = [{ name = "Konstantin Borovik", email = "kb@lab5.ca" }]
6
6
  license = "PolyForm-Noncommercial-1.0.0"
@@ -95,12 +95,18 @@ _DIFF_IGNORE_FIELDS = PASSWORD_FIELDS | NUMBERING_RUNTIME_FIELDS
95
95
  # Path-qualified write-only GET-omit (V56): (entity, detail, field).
96
96
  # Diff ignores; extract strips; apply still PUTs when present in YAML.
97
97
  _DIFF_IGNORE_PATHS = frozenset({("LotSerialClass", "Segments", "Value")})
98
+ # Whole-detail skip (V57/B37): mapped GET Role.Users / User.Roles may be
99
+ # empty while UsersInRoles has session-company rows. Extra live members
100
+ # are not drift (AssignUser is additive-only).
101
+ _DIFF_SKIP_DETAILS = frozenset({("Role", "Users"), ("User", "Roles")})
98
102
 
99
103
 
100
104
  def _diff_ignored(entity: str, *path: str) -> bool:
101
- """True when source↔live compare skips this field (V39/V40/V56)."""
105
+ """True when source↔live compare skips this field (V39/V40/V56/V57)."""
102
106
  if path and path[-1] in _DIFF_IGNORE_FIELDS:
103
107
  return True
108
+ if len(path) == 1 and (entity, path[0]) in _DIFF_SKIP_DETAILS:
109
+ return True
104
110
  return (entity, *path) in _DIFF_IGNORE_PATHS
105
111
 
106
112
 
@@ -679,7 +685,8 @@ def diff(client: AcumaticaClient, baseline: BaselineFile | ActionFile) -> list[s
679
685
  drifts.append(f"{label}: missing on tenant")
680
686
  continue
681
687
  actual = unwrap(live)
682
- # V39/V40/V56: never compare write-only, runtime, or GET-omit paths
688
+ # V39/V40/V56/V57: never compare write-only, runtime, GET-omit,
689
+ # or membership details whose mapped GET may stay empty.
683
690
  fields = {
684
691
  k: v for k, v in record.items() if not _diff_ignored(baseline.entity, k)
685
692
  }
@@ -535,9 +535,10 @@ entities:
535
535
  # config/master/ Role then User then Role.Users (V22 prefixes 90/91/92;
536
536
  # T145/T146/T148/T228). Bootstrap only — Default has no Role/User surface.
537
537
  # Persist = Role action AssignUser (PXDatabase UsersInRoles; T228/B33).
538
- # User detail Roles is GET/diff shape (PUT never writes UsersInRoles —
539
- # B31/B32/B33). Package 90-roles = full pre-build CompanyID=1
540
- # Roles dump; 91-users demo soadmin identity; 92-role-users membership.
538
+ # User detail Roles = GET/extract; diff skips Users/Roles (V57).
539
+ # PUT never writes UsersInRoles (B31/B32/B33).
540
+ # Package 90-roles = full pre-build CompanyID=1 Roles dump;
541
+ # 91-users demo soadmin identity; 92-role-users membership.
541
542
  # Password is write-only on apply (V39/T147): include omits Password so
542
543
  # extract never emits hashes (b64__Password also out of include).
543
544