spree_api 6.0.1 → 6.0.3

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -2
  3. data/app/controllers/concerns/spree/api/v3/admin/embed_permissions.rb +11 -3
  4. data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +10 -0
  5. data/app/controllers/spree/api/v3/admin/products_controller.rb +56 -0
  6. data/app/serializers/spree/api/v3/admin/admin_user_serializer.rb +21 -3
  7. data/app/serializers/spree/api/v3/admin/delivery_profile_serializer.rb +2 -1
  8. data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +1 -1
  9. data/app/serializers/spree/api/v3/admin/import_serializer.rb +1 -1
  10. data/app/serializers/spree/api/v3/admin/invitation_serializer.rb +2 -2
  11. data/app/serializers/spree/api/v3/admin/payment_serializer.rb +5 -1
  12. data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +3 -1
  13. data/app/serializers/spree/api/v3/admin/product_serializer.rb +8 -0
  14. data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +2 -2
  15. data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +4 -1
  16. data/app/serializers/spree/api/v3/admin/promotion_serializer.rb +13 -0
  17. data/app/serializers/spree/api/v3/admin/return_serializer.rb +1 -1
  18. data/app/serializers/spree/api/v3/admin/seller_requirement_status_serializer.rb +3 -2
  19. data/app/serializers/spree/api/v3/admin/seller_serializer.rb +2 -2
  20. data/app/serializers/spree/api/v3/admin/session_serializer.rb +17 -0
  21. data/app/serializers/spree/api/v3/fulfillment_serializer.rb +1 -1
  22. data/app/serializers/spree/api/v3/seller/import_serializer.rb +1 -1
  23. data/app/serializers/spree/api/v3/seller/invitation_serializer.rb +2 -2
  24. data/app/serializers/spree/api/v3/seller/product_serializer.rb +8 -0
  25. data/app/serializers/spree/api/v3/seller/requirement_status_serializer.rb +3 -2
  26. data/config/initializers/typelizer.rb +8 -19
  27. data/config/routes.rb +5 -0
  28. data/lib/spree/api/admin_document.rb +284 -0
  29. data/lib/spree/api/agent_operations.rb +300 -0
  30. data/lib/spree/api/agent_resource_map.rb +32 -7
  31. data/lib/spree/api/agent_write_schemas.rb +15 -51
  32. data/lib/spree/api/dependencies.rb +1 -1
  33. data/lib/spree/api/engine.rb +14 -1
  34. data/lib/spree/api/enum_types.rb +4 -1
  35. data/lib/spree/api/oauth.rb +40 -20
  36. data/lib/spree/api/openapi/schema_helper.rb +3 -3
  37. data/lib/spree/api/sdk_types.rb +190 -0
  38. data/lib/spree/api/sdk_types_task.rb +68 -0
  39. data/lib/spree/api/testing_support/agent_tools.rb +35 -0
  40. data/lib/spree/api/testing_support/agent_tools_contract.rb +110 -0
  41. data/lib/spree/api/testing_support/deterministic_openapi.rb +147 -0
  42. data/lib/spree/api/testing_support/filter_parameters.rb +99 -0
  43. data/lib/spree/api/testing_support/openapi.rb +232 -0
  44. data/lib/spree/api/testing_support/openapi_tasks.rb +21 -0
  45. data/lib/spree/api/typelizer_generation.rb +39 -11
  46. data/lib/tasks/openapi.rake +5 -0
  47. data/lib/tasks/sdk_types.rake +6 -0
  48. data/lib/typelizer/open_enums.rb +14 -2
  49. data/openapi/admin.yaml +89138 -0
  50. data/openapi/store.yaml +25412 -0
  51. metadata +24 -10
  52. data/lib/spree/api/agent_workflow_endpoints.rb +0 -113
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.1
4
+ version: 6.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vendo Connect Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-10-29 00:00:00.000000000 Z
11
+ date: 2026-11-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rswag-specs
@@ -30,28 +30,28 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.11.0
33
+ version: 0.14.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.11.0
40
+ version: 0.14.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: spree_core
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - '='
46
46
  - !ruby/object:Gem::Version
47
- version: 6.0.1
47
+ version: 6.0.3
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - '='
53
53
  - !ruby/object:Gem::Version
54
- version: 6.0.1
54
+ version: 6.0.3
55
55
  description: Spree Commerce Store / Admin API and HTTP webhooks
56
56
  email:
57
57
  - hello@spreecommerce.org
@@ -569,6 +569,7 @@ files:
569
569
  - app/serializers/spree/api/v3/admin/seller_serializer.rb
570
570
  - app/serializers/spree/api/v3/admin/seller_team_member_serializer.rb
571
571
  - app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb
572
+ - app/serializers/spree/api/v3/admin/session_serializer.rb
572
573
  - app/serializers/spree/api/v3/admin/setup_task_serializer.rb
573
574
  - app/serializers/spree/api/v3/admin/shipping_label_serializer.rb
574
575
  - app/serializers/spree/api/v3/admin/state_serializer.rb
@@ -805,9 +806,10 @@ files:
805
806
  - config/locales/zh-TW.yml
806
807
  - config/routes.rb
807
808
  - lib/spree/api.rb
809
+ - lib/spree/api/admin_document.rb
808
810
  - lib/spree/api/agent_membership_map.rb
811
+ - lib/spree/api/agent_operations.rb
809
812
  - lib/spree/api/agent_resource_map.rb
810
- - lib/spree/api/agent_workflow_endpoints.rb
811
813
  - lib/spree/api/agent_write_schemas.rb
812
814
  - lib/spree/api/configuration.rb
813
815
  - lib/spree/api/dependencies.rb
@@ -822,25 +824,37 @@ files:
822
824
  - lib/spree/api/openapi/schema_helper.rb
823
825
  - lib/spree/api/preference_families.rb
824
826
  - lib/spree/api/preference_types.rb
827
+ - lib/spree/api/sdk_types.rb
828
+ - lib/spree/api/sdk_types_task.rb
829
+ - lib/spree/api/testing_support/agent_tools.rb
830
+ - lib/spree/api/testing_support/agent_tools_contract.rb
825
831
  - lib/spree/api/testing_support/always_register_type_hints.rb
832
+ - lib/spree/api/testing_support/deterministic_openapi.rb
826
833
  - lib/spree/api/testing_support/factories.rb
834
+ - lib/spree/api/testing_support/filter_parameters.rb
827
835
  - lib/spree/api/testing_support/matchers/webhooks.rb
836
+ - lib/spree/api/testing_support/openapi.rb
837
+ - lib/spree/api/testing_support/openapi_tasks.rb
828
838
  - lib/spree/api/testing_support/spree_webhooks.rb
829
839
  - lib/spree/api/testing_support/v3/base.rb
830
840
  - lib/spree/api/typelizer_generation.rb
831
841
  - lib/spree/api/webhook_event_types.rb
832
842
  - lib/spree_api.rb
833
843
  - lib/tasks/filters.rake
844
+ - lib/tasks/openapi.rake
845
+ - lib/tasks/sdk_types.rake
834
846
  - lib/typelizer/open_enums.rb
835
847
  - lib/typelizer/proc_resource_resolution.rb
848
+ - openapi/admin.yaml
849
+ - openapi/store.yaml
836
850
  homepage: https://spreecommerce.org
837
851
  licenses:
838
852
  - BSD-3-Clause
839
853
  metadata:
840
854
  bug_tracker_uri: https://github.com/spree/spree/issues
841
- changelog_uri: https://github.com/spree/spree/releases/tag/v6.0.1
842
- documentation_uri: https://docs.spreecommerce.org/
843
- source_code_uri: https://github.com/spree/spree/tree/v6.0.1
855
+ changelog_uri: https://github.com/spree/spree/releases/tag/v6.0.3
856
+ documentation_uri: https://spreecommerce.org/docs/
857
+ source_code_uri: https://github.com/spree/spree/tree/v6.0.3
844
858
  post_install_message:
845
859
  rdoc_options: []
846
860
  require_paths:
@@ -1,113 +0,0 @@
1
- module Spree
2
- module Api
3
- # Which Admin API operation runs each workflow, derived rather than listed.
4
- #
5
- # Walk the admin routes; for each one, read the controller source and ask
6
- # whether the action behind it calls that workflow. The verb and path come
7
- # from the route, and the body keys from the generated OpenAPI document —
8
- # which is the only place that records a rename (a cancellation's
9
- # `reason:` keyword travels as `cancel_reason_id`).
10
- #
11
- # Read off the controllers for the same reason {AgentResourceMap} is: a
12
- # workflow that gains an endpoint is dispatched without anyone editing a
13
- # file, and one whose endpoint goes away stops being dispatched.
14
- module AgentWorkflowEndpoints
15
- # Where a controller declares a workflow for the base class to run,
16
- # rather than calling it inside an action of its own.
17
- DECLARED_IN = { 'create_workflow' => 'create', 'update_workflow' => 'update' }.freeze
18
-
19
- class << self
20
- # @param map [Module]
21
- # @return [Integer] how many workflows were mapped
22
- def install(map: Spree::AgentTools::WorkflowEndpoints)
23
- map.reset!
24
- keys = Spree::AgentTools::DefaultCatalog::WORKFLOWS.keys
25
- document = openapi_document
26
-
27
- admin_routes.each do |route|
28
- source = controller_source(route[:controller])
29
- next if source.nil?
30
-
31
- keys.each do |key|
32
- # `find` would derive, and deriving is what this is — read the
33
- # entries already registered instead.
34
- next if map.registered.key?(key)
35
- next unless action_calling(source, key) == route[:action]
36
-
37
- map.register(key: key, verb: route[:verb], path: route[:path],
38
- body_keys: body_keys_for(document, route))
39
- end
40
- end
41
-
42
- map.registered.size
43
- end
44
-
45
- private
46
-
47
- def admin_routes
48
- Spree::Core::Engine.routes.routes.filter_map do |route|
49
- controller = route.defaults[:controller].to_s
50
- next unless controller.start_with?('spree/api/v3/admin')
51
-
52
- { controller: controller, action: route.defaults[:action].to_s,
53
- verb: route.verb.to_s, path: route.path.spec.to_s.sub('(.:format)', '') }
54
- end
55
- end
56
-
57
- # Which action calls this workflow: the `def` nearest above the call.
58
- # A declaration consumed by the base class names the action it serves
59
- # instead.
60
- def action_calling(source, key)
61
- index = source.index("Spree.#{key}")
62
- return if index.nil?
63
-
64
- enclosing = source[0...index].scan(/^\s+def ([a-z_]+)/).flatten.last
65
- DECLARED_IN.fetch(enclosing, enclosing)
66
- end
67
-
68
- def controller_source(controller_path)
69
- @sources ||= {}
70
- return @sources[controller_path] if @sources.key?(controller_path)
71
-
72
- @sources[controller_path] = begin
73
- klass = "#{controller_path.camelize}Controller".safe_constantize
74
- file = klass && Object.const_source_location(klass.name)&.first
75
- file && File.exist?(file) ? File.read(file) : nil
76
- rescue StandardError
77
- nil
78
- end
79
- end
80
-
81
- # What the operation's request body accepts, in the names the wire
82
- # uses. A workflow keyword and its body key often differ, and the
83
- # document is where that difference is recorded.
84
- def body_keys_for(document, route)
85
- operation = document.dig('paths', openapi_path(route[:path]), route[:verb].downcase)
86
- schema = operation&.dig('requestBody', 'content', 'application/json', 'schema')
87
- # Bodies are declared once and published as components, so the
88
- # operation points at one rather than carrying its properties.
89
- schema = Spree::Api::AgentWriteSchemas.resolve_schema(schema)
90
-
91
- (schema&.dig('properties') || {}).keys
92
- end
93
-
94
- def openapi_path(path)
95
- path.gsub(/:([a-z_]+)/) { "{#{Regexp.last_match(1)}}" }
96
- end
97
-
98
- # A packaged installation has no docs/ directory, and a body the
99
- # document does not describe is simply passed through unchecked.
100
- #
101
- # `AgentWriteSchemas` already holds this file parsed, so it is read
102
- # through there rather than a second time: the document is nearly a
103
- # megabyte, and parsing it twice at boot is a second of nothing.
104
- def openapi_document
105
- Spree::Api::AgentWriteSchemas.document
106
- rescue StandardError => e
107
- Rails.logger.warn("[Spree] could not read the admin API document: #{e.class}: #{e.message}")
108
- {}
109
- end
110
- end
111
- end
112
- end
113
- end