reactor_sdk 0.1.0

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 (78) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +19 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +281 -0
  5. data/lib/reactor_sdk/authentication.rb +137 -0
  6. data/lib/reactor_sdk/client.rb +186 -0
  7. data/lib/reactor_sdk/configuration.rb +102 -0
  8. data/lib/reactor_sdk/connection.rb +342 -0
  9. data/lib/reactor_sdk/endpoints/app_configurations.rb +42 -0
  10. data/lib/reactor_sdk/endpoints/audit_events.rb +64 -0
  11. data/lib/reactor_sdk/endpoints/base_endpoint.rb +207 -0
  12. data/lib/reactor_sdk/endpoints/builds.rb +62 -0
  13. data/lib/reactor_sdk/endpoints/callbacks.rb +38 -0
  14. data/lib/reactor_sdk/endpoints/companies.rb +42 -0
  15. data/lib/reactor_sdk/endpoints/data_elements.rb +251 -0
  16. data/lib/reactor_sdk/endpoints/environments.rb +174 -0
  17. data/lib/reactor_sdk/endpoints/extension_package_usage_authorizations.rb +51 -0
  18. data/lib/reactor_sdk/endpoints/extension_packages.rb +63 -0
  19. data/lib/reactor_sdk/endpoints/extensions.rb +181 -0
  20. data/lib/reactor_sdk/endpoints/hosts.rb +101 -0
  21. data/lib/reactor_sdk/endpoints/libraries.rb +872 -0
  22. data/lib/reactor_sdk/endpoints/notes.rb +11 -0
  23. data/lib/reactor_sdk/endpoints/profiles.rb +14 -0
  24. data/lib/reactor_sdk/endpoints/properties.rb +123 -0
  25. data/lib/reactor_sdk/endpoints/revisions.rb +102 -0
  26. data/lib/reactor_sdk/endpoints/rule_components.rb +218 -0
  27. data/lib/reactor_sdk/endpoints/rules.rb +240 -0
  28. data/lib/reactor_sdk/endpoints/search.rb +23 -0
  29. data/lib/reactor_sdk/endpoints/secrets.rb +76 -0
  30. data/lib/reactor_sdk/error.rb +115 -0
  31. data/lib/reactor_sdk/library_comparison_builder.rb +74 -0
  32. data/lib/reactor_sdk/library_snapshot_builder.rb +66 -0
  33. data/lib/reactor_sdk/paginator.rb +92 -0
  34. data/lib/reactor_sdk/rate_limiter.rb +96 -0
  35. data/lib/reactor_sdk/reference_extractor.rb +34 -0
  36. data/lib/reactor_sdk/resource_metadata.rb +73 -0
  37. data/lib/reactor_sdk/resource_normalizer.rb +90 -0
  38. data/lib/reactor_sdk/resources/app_configuration.rb +20 -0
  39. data/lib/reactor_sdk/resources/audit_event.rb +45 -0
  40. data/lib/reactor_sdk/resources/base_resource.rb +181 -0
  41. data/lib/reactor_sdk/resources/build.rb +64 -0
  42. data/lib/reactor_sdk/resources/callback.rb +16 -0
  43. data/lib/reactor_sdk/resources/company.rb +38 -0
  44. data/lib/reactor_sdk/resources/comprehensive_data_element.rb +28 -0
  45. data/lib/reactor_sdk/resources/comprehensive_extension.rb +30 -0
  46. data/lib/reactor_sdk/resources/comprehensive_resource.rb +31 -0
  47. data/lib/reactor_sdk/resources/comprehensive_rule.rb +26 -0
  48. data/lib/reactor_sdk/resources/comprehensive_upstream_chain.rb +50 -0
  49. data/lib/reactor_sdk/resources/comprehensive_upstream_chain_entry.rb +34 -0
  50. data/lib/reactor_sdk/resources/data_element.rb +108 -0
  51. data/lib/reactor_sdk/resources/environment.rb +45 -0
  52. data/lib/reactor_sdk/resources/extension.rb +66 -0
  53. data/lib/reactor_sdk/resources/extension_package.rb +49 -0
  54. data/lib/reactor_sdk/resources/extension_package_usage_authorization.rb +26 -0
  55. data/lib/reactor_sdk/resources/host.rb +68 -0
  56. data/lib/reactor_sdk/resources/library.rb +67 -0
  57. data/lib/reactor_sdk/resources/library_comparison.rb +72 -0
  58. data/lib/reactor_sdk/resources/library_comparison_entry.rb +144 -0
  59. data/lib/reactor_sdk/resources/library_snapshot.rb +118 -0
  60. data/lib/reactor_sdk/resources/library_snapshot_extension_index.rb +70 -0
  61. data/lib/reactor_sdk/resources/library_snapshot_index.rb +169 -0
  62. data/lib/reactor_sdk/resources/library_with_resources.rb +194 -0
  63. data/lib/reactor_sdk/resources/note.rb +37 -0
  64. data/lib/reactor_sdk/resources/profile.rb +22 -0
  65. data/lib/reactor_sdk/resources/property.rb +44 -0
  66. data/lib/reactor_sdk/resources/revision.rb +156 -0
  67. data/lib/reactor_sdk/resources/rule.rb +44 -0
  68. data/lib/reactor_sdk/resources/rule_component.rb +101 -0
  69. data/lib/reactor_sdk/resources/search_results.rb +28 -0
  70. data/lib/reactor_sdk/resources/secret.rb +17 -0
  71. data/lib/reactor_sdk/resources/upstream_chain.rb +80 -0
  72. data/lib/reactor_sdk/resources/upstream_chain_entry.rb +55 -0
  73. data/lib/reactor_sdk/response_parser.rb +160 -0
  74. data/lib/reactor_sdk/version.rb +5 -0
  75. data/lib/reactor_sdk.rb +79 -0
  76. data/reactor_sdk.gemspec +70 -0
  77. data/sig/reactor_sdk.rbs +346 -0
  78. metadata +293 -0
@@ -0,0 +1,160 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # @file response_parser.rb
5
+ # @description Transforms raw JSON:API response hashes into typed Ruby objects.
6
+ #
7
+ # The Reactor API returns JSON:API format where every resource has:
8
+ # id — the Adobe resource ID string
9
+ # type — the resource type (e.g. "rules", "properties")
10
+ # attributes — a hash of the resource's field values
11
+ # meta — optional metadata hash
12
+ #
13
+ # For Revision resources, the response also includes:
14
+ # relationships — identifies the entity this revision belongs to
15
+ # included — full snapshot of the revisioned resource at this point
16
+ #
17
+ # This parser handles both standard resources and the richer Revision
18
+ # response without the caller needing to know the difference.
19
+ #
20
+ # @domain Infrastructure
21
+ #
22
+
23
+ module ReactorSDK
24
+ class ResponseParser
25
+ TYPE_REGISTRY = {
26
+ 'app_configurations' => Resources::AppConfiguration,
27
+ 'audit_events' => Resources::AuditEvent,
28
+ 'builds' => Resources::Build,
29
+ 'callbacks' => Resources::Callback,
30
+ 'companies' => Resources::Company,
31
+ 'data_elements' => Resources::DataElement,
32
+ 'environments' => Resources::Environment,
33
+ 'extension_package_usage_authorizations' => Resources::ExtensionPackageUsageAuthorization,
34
+ 'extension_packages' => Resources::ExtensionPackage,
35
+ 'extensions' => Resources::Extension,
36
+ 'hosts' => Resources::Host,
37
+ 'libraries' => Resources::Library,
38
+ 'notes' => Resources::Note,
39
+ 'profiles' => Resources::Profile,
40
+ 'properties' => Resources::Property,
41
+ 'revisions' => Resources::Revision,
42
+ 'rule_components' => Resources::RuleComponent,
43
+ 'rules' => Resources::Rule,
44
+ 'secrets' => Resources::Secret
45
+ }.freeze
46
+
47
+ ##
48
+ # Parses a single JSON:API resource hash into a typed resource object.
49
+ #
50
+ # For Revision resources, also extracts the included entity snapshot
51
+ # and relationships from the full response envelope if provided.
52
+ #
53
+ # @param data [Hash] Raw JSON:API data hash
54
+ # @param resource_class [Class] Resource class to instantiate
55
+ # @param response [Hash, nil] Full response envelope — used to extract
56
+ # included array for Revision resources
57
+ # @return [Object] An instance of resource_class populated with parsed data
58
+ # @raise [ArgumentError] if data is nil
59
+ # @raise [KeyError] if required JSON:API fields are missing
60
+ #
61
+ def parse(data, resource_class, response: nil)
62
+ raise ArgumentError, 'data cannot be nil' if data.nil?
63
+
64
+ base_args = {
65
+ id: data.fetch('id'),
66
+ type: data.fetch('type'),
67
+ attributes: data.fetch('attributes', {}),
68
+ meta: data.fetch('meta', {}),
69
+ relationships: data.fetch('relationships', {})
70
+ }
71
+
72
+ base_args.merge!(extract_revision_extras(data, response)) if resource_class == Resources::Revision
73
+
74
+ resource_class.new(**base_args)
75
+ end
76
+
77
+ ##
78
+ # Parses an array of JSON:API resource hashes into typed resource objects.
79
+ # Returns an empty array if data_array is nil or empty.
80
+ #
81
+ # @param data_array [Array<Hash>] Array of raw JSON:API data hashes
82
+ # @param resource_class [Class] Resource class to instantiate for each item
83
+ # @param response [Hash, nil] Full response envelope (passed through to parse)
84
+ # @return [Array<Object>] Array of resource_class instances
85
+ #
86
+ def parse_many(data_array, resource_class, response: nil)
87
+ Array(data_array).map { |data| parse(data, resource_class, response: response) }
88
+ end
89
+
90
+ ##
91
+ # Parses a single resource into the best matching SDK class
92
+ # using its JSON:API type.
93
+ #
94
+ # @param data [Hash]
95
+ # @param response [Hash, nil]
96
+ # @return [ReactorSDK::Resources::BaseResource]
97
+ #
98
+ def parse_auto(data, response: nil)
99
+ resource_class = TYPE_REGISTRY.fetch(data.fetch('type'), Resources::BaseResource)
100
+ parse(data, resource_class, response: response)
101
+ end
102
+
103
+ ##
104
+ # Parses a heterogeneous collection into typed SDK resources.
105
+ #
106
+ # @param data_array [Array<Hash>]
107
+ # @param response [Hash, nil]
108
+ # @return [Array<ReactorSDK::Resources::BaseResource>]
109
+ #
110
+ def parse_many_auto(data_array, response: nil)
111
+ Array(data_array).map { |data| parse_auto(data, response: response) }
112
+ end
113
+
114
+ private
115
+
116
+ ##
117
+ # Extracts the included entity snapshot and relationships from a Revision response.
118
+ #
119
+ # When fetching GET /revisions/:id, Adobe returns the full revisioned resource
120
+ # in the `included` array. This method finds the matching included resource
121
+ # and returns it alongside the relationships hash for entity identity extraction.
122
+ #
123
+ # @param data [Hash] The revision data object
124
+ # @param response [Hash, nil] Full response envelope containing included array
125
+ # @return [Hash] Extra keyword args for Revision.new
126
+ #
127
+ def extract_revision_extras(data, response)
128
+ relationships = data.fetch('relationships', nil)
129
+ included_entity = find_included_entity(data, response)
130
+
131
+ {
132
+ revision_relationships: relationships,
133
+ included_entity: included_entity
134
+ }
135
+ end
136
+
137
+ ##
138
+ # Finds the included entity resource matching this revision's entity relationship.
139
+ # Returns nil if no included array is present (e.g. list responses).
140
+ #
141
+ # @param data [Hash] The revision data object
142
+ # @param response [Hash, nil] Full response envelope
143
+ # @return [Hash, nil] The matching included resource hash or nil
144
+ #
145
+ def find_included_entity(data, response)
146
+ return nil unless response.is_a?(Hash)
147
+
148
+ included = Array(response['included'])
149
+ return nil if included.empty?
150
+
151
+ entity_data = data.dig('relationships', 'entity', 'data')
152
+ return nil unless entity_data.is_a?(Hash)
153
+
154
+ included.find do |item|
155
+ item['id'] == entity_data['id'] &&
156
+ item['type'] == entity_data['type']
157
+ end
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ReactorSDK
4
+ VERSION = '0.1.0'
5
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'faraday'
4
+ require 'faraday/multipart'
5
+ require 'faraday/net_http'
6
+ require 'faraday/retry'
7
+ require 'json'
8
+ require 'uri'
9
+
10
+ require_relative 'reactor_sdk/version'
11
+ require_relative 'reactor_sdk/error'
12
+ require_relative 'reactor_sdk/configuration'
13
+ require_relative 'reactor_sdk/authentication'
14
+ require_relative 'reactor_sdk/rate_limiter'
15
+ require_relative 'reactor_sdk/connection'
16
+ require_relative 'reactor_sdk/paginator'
17
+ require_relative 'reactor_sdk/resources/base_resource'
18
+ require_relative 'reactor_sdk/resources/company'
19
+ require_relative 'reactor_sdk/resources/property'
20
+ require_relative 'reactor_sdk/resources/environment'
21
+ require_relative 'reactor_sdk/resources/host'
22
+ require_relative 'reactor_sdk/resources/rule'
23
+ require_relative 'reactor_sdk/resources/rule_component'
24
+ require_relative 'reactor_sdk/resources/data_element'
25
+ require_relative 'reactor_sdk/resources/extension'
26
+ require_relative 'reactor_sdk/resources/app_configuration'
27
+ require_relative 'reactor_sdk/resources/callback'
28
+ require_relative 'reactor_sdk/resources/extension_package'
29
+ require_relative 'reactor_sdk/resources/extension_package_usage_authorization'
30
+ require_relative 'reactor_sdk/resources/library'
31
+ require_relative 'reactor_sdk/resources/library_with_resources'
32
+ require_relative 'reactor_sdk/resources/upstream_chain_entry'
33
+ require_relative 'reactor_sdk/resources/upstream_chain'
34
+ require_relative 'reactor_sdk/resources/build'
35
+ require_relative 'reactor_sdk/resources/revision'
36
+ require_relative 'reactor_sdk/resources/audit_event'
37
+ require_relative 'reactor_sdk/resources/note'
38
+ require_relative 'reactor_sdk/resources/profile'
39
+ require_relative 'reactor_sdk/resources/search_results'
40
+ require_relative 'reactor_sdk/resources/secret'
41
+ require_relative 'reactor_sdk/response_parser'
42
+ require_relative 'reactor_sdk/reference_extractor'
43
+ require_relative 'reactor_sdk/resource_metadata'
44
+ require_relative 'reactor_sdk/resource_normalizer'
45
+ require_relative 'reactor_sdk/library_snapshot_builder'
46
+ require_relative 'reactor_sdk/library_comparison_builder'
47
+ require_relative 'reactor_sdk/resources/comprehensive_resource'
48
+ require_relative 'reactor_sdk/resources/comprehensive_rule'
49
+ require_relative 'reactor_sdk/resources/comprehensive_data_element'
50
+ require_relative 'reactor_sdk/resources/comprehensive_extension'
51
+ require_relative 'reactor_sdk/resources/library_snapshot_extension_index'
52
+ require_relative 'reactor_sdk/resources/library_snapshot_index'
53
+ require_relative 'reactor_sdk/resources/library_snapshot'
54
+ require_relative 'reactor_sdk/resources/library_comparison_entry'
55
+ require_relative 'reactor_sdk/resources/library_comparison'
56
+ require_relative 'reactor_sdk/resources/comprehensive_upstream_chain_entry'
57
+ require_relative 'reactor_sdk/resources/comprehensive_upstream_chain'
58
+ require_relative 'reactor_sdk/endpoints/base_endpoint'
59
+ require_relative 'reactor_sdk/endpoints/companies'
60
+ require_relative 'reactor_sdk/endpoints/app_configurations'
61
+ require_relative 'reactor_sdk/endpoints/callbacks'
62
+ require_relative 'reactor_sdk/endpoints/secrets'
63
+ require_relative 'reactor_sdk/endpoints/properties'
64
+ require_relative 'reactor_sdk/endpoints/environments'
65
+ require_relative 'reactor_sdk/endpoints/hosts'
66
+ require_relative 'reactor_sdk/endpoints/rules'
67
+ require_relative 'reactor_sdk/endpoints/rule_components'
68
+ require_relative 'reactor_sdk/endpoints/data_elements'
69
+ require_relative 'reactor_sdk/endpoints/extensions'
70
+ require_relative 'reactor_sdk/endpoints/extension_packages'
71
+ require_relative 'reactor_sdk/endpoints/extension_package_usage_authorizations'
72
+ require_relative 'reactor_sdk/endpoints/libraries'
73
+ require_relative 'reactor_sdk/endpoints/builds'
74
+ require_relative 'reactor_sdk/endpoints/revisions'
75
+ require_relative 'reactor_sdk/endpoints/audit_events'
76
+ require_relative 'reactor_sdk/endpoints/profiles'
77
+ require_relative 'reactor_sdk/endpoints/search'
78
+ require_relative 'reactor_sdk/endpoints/notes'
79
+ require_relative 'reactor_sdk/client'
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/reactor_sdk/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'reactor_sdk'
7
+ spec.version = ReactorSDK::VERSION
8
+ spec.authors = ['Dhairya Gabhawala']
9
+ spec.email = ['gabhawaladhairya@gmail.com']
10
+
11
+ spec.summary = 'Ruby SDK for the Adobe Launch Reactor API'
12
+ spec.description = <<~DESC
13
+ A production-ready Ruby SDK for the Adobe Launch (Data Collection)
14
+ Reactor API v1. Handles OAuth Server-to-Server authentication,
15
+ JSON:API response parsing, cursor-based pagination, per-org rate
16
+ limiting, retry logic, and a typed error hierarchy.
17
+ DESC
18
+ spec.homepage = 'https://github.com/dhairyagabha/reactor_sdk'
19
+ spec.license = 'MIT'
20
+ spec.required_ruby_version = '>= 3.2.0'
21
+
22
+ spec.metadata = {
23
+ 'source_code_uri' => spec.homepage,
24
+ 'documentation_uri' => 'https://reactor-sdk.dhairyagabhawala.com',
25
+ 'bug_tracker_uri' => "#{spec.homepage}/issues",
26
+ 'changelog_uri' => "#{spec.homepage}/blob/main/CHANGELOG.md",
27
+ 'rubygems_mfa_required' => 'true'
28
+ }
29
+
30
+ # Only include what belongs in the published gem
31
+ spec.files = Dir.chdir(__dir__) do
32
+ Dir.glob(%w[
33
+ lib/**/*.rb
34
+ sig/**/*.rbs
35
+ LICENSE.txt
36
+ README.md
37
+ CHANGELOG.md
38
+ reactor_sdk.gemspec
39
+ ])
40
+ end
41
+
42
+ spec.require_paths = ['lib']
43
+
44
+ # ── Runtime dependencies ─────────────────────────────────────────
45
+ # HTTP client with middleware support
46
+ spec.add_dependency 'faraday', '~> 2.9'
47
+ # Automatic retry on 429 and 5xx responses
48
+ spec.add_dependency 'faraday-retry', '~> 2.2'
49
+ # Net::HTTP adapter for Faraday
50
+ spec.add_dependency 'faraday-net_http', '~> 3.3'
51
+ # Multipart upload support for extension package archive endpoints
52
+ spec.add_dependency 'faraday-multipart', '~> 1.1'
53
+
54
+ # ── Development dependencies ─────────────────────────────────────
55
+ # Interactive console for local development
56
+ spec.add_development_dependency 'irb', '~> 1.17'
57
+ # Test framework
58
+ spec.add_development_dependency 'rspec', '~> 3.13'
59
+ # Record and replay real HTTP interactions in tests
60
+ spec.add_development_dependency 'vcr', '~> 6.3'
61
+ # Block real HTTP in tests
62
+ spec.add_development_dependency 'webmock', '~> 3.23'
63
+ # Code style enforcement
64
+ spec.add_development_dependency 'rubocop', '~> 1.65'
65
+ spec.add_development_dependency 'rubocop-rspec', '~> 3.0'
66
+ # Documentation generation
67
+ spec.add_development_dependency 'yard', '~> 0.9'
68
+ # Rake task runner
69
+ spec.add_development_dependency 'rake', '~> 13.0'
70
+ end
@@ -0,0 +1,346 @@
1
+ module ReactorSDK
2
+ VERSION: String
3
+
4
+ class Configuration
5
+ end
6
+
7
+ class Client
8
+ attr_reader companies: Endpoints::Companies
9
+ attr_reader properties: Endpoints::Properties
10
+ attr_reader app_configurations: Endpoints::AppConfigurations
11
+ attr_reader callbacks: Endpoints::Callbacks
12
+ attr_reader secrets: Endpoints::Secrets
13
+ attr_reader environments: Endpoints::Environments
14
+ attr_reader hosts: Endpoints::Hosts
15
+ attr_reader rules: Endpoints::Rules
16
+ attr_reader rule_components: Endpoints::RuleComponents
17
+ attr_reader data_elements: Endpoints::DataElements
18
+ attr_reader extensions: Endpoints::Extensions
19
+ attr_reader extension_packages: Endpoints::ExtensionPackages
20
+ attr_reader extension_package_usage_authorizations: Endpoints::ExtensionPackageUsageAuthorizations
21
+ attr_reader libraries: Endpoints::Libraries
22
+ attr_reader builds: Endpoints::Builds
23
+ attr_reader audit_events: Endpoints::AuditEvents
24
+ attr_reader revisions: Endpoints::Revisions
25
+ attr_reader profiles: Endpoints::Profiles
26
+ attr_reader search: Endpoints::Search
27
+ attr_reader notes: Endpoints::Notes
28
+ attr_reader config: Configuration
29
+
30
+ def initialize: (
31
+ client_id: String,
32
+ client_secret: String,
33
+ org_id: String,
34
+ ?base_url: String,
35
+ ?ims_token_url: String,
36
+ ?timeout: Integer,
37
+ ?logger: untyped,
38
+ ?auto_refresh_token: bool
39
+ ) -> void
40
+ end
41
+
42
+ module Endpoints
43
+ class BaseEndpoint
44
+ end
45
+
46
+ class Companies < BaseEndpoint
47
+ end
48
+
49
+ class Properties < BaseEndpoint
50
+ end
51
+
52
+ class AppConfigurations < BaseEndpoint
53
+ end
54
+
55
+ class Callbacks < BaseEndpoint
56
+ end
57
+
58
+ class Secrets < BaseEndpoint
59
+ end
60
+
61
+ class Environments < BaseEndpoint
62
+ end
63
+
64
+ class Hosts < BaseEndpoint
65
+ end
66
+
67
+ class Rules < BaseEndpoint
68
+ def upstream_chain: (String | Resources::Rule rule_or_id, library_id: String, property_id: String) -> Resources::UpstreamChain
69
+ def find_comprehensive: (String rule_id, library_id: String, property_id: String) -> Resources::ComprehensiveRule
70
+ def comprehensive_upstream_chain: (
71
+ String | Resources::Rule rule_or_id,
72
+ library_id: String,
73
+ property_id: String
74
+ ) -> Resources::ComprehensiveUpstreamChain
75
+ end
76
+
77
+ class RuleComponents < BaseEndpoint
78
+ end
79
+
80
+ class DataElements < BaseEndpoint
81
+ def upstream_chain: (String | Resources::DataElement data_element_or_id, library_id: String, property_id: String) -> Resources::UpstreamChain
82
+ def find_comprehensive: (
83
+ String data_element_id,
84
+ library_id: String,
85
+ property_id: String
86
+ ) -> Resources::ComprehensiveDataElement
87
+ def comprehensive_upstream_chain: (
88
+ String | Resources::DataElement data_element_or_id,
89
+ library_id: String,
90
+ property_id: String
91
+ ) -> Resources::ComprehensiveUpstreamChain
92
+ end
93
+
94
+ class Extensions < BaseEndpoint
95
+ def upstream_chain: (String | Resources::Extension extension_or_id, library_id: String, property_id: String) -> Resources::UpstreamChain
96
+ def find_comprehensive: (
97
+ String extension_id,
98
+ library_id: String,
99
+ property_id: String
100
+ ) -> Resources::ComprehensiveExtension
101
+ def comprehensive_upstream_chain: (
102
+ String | Resources::Extension extension_or_id,
103
+ library_id: String,
104
+ property_id: String
105
+ ) -> Resources::ComprehensiveUpstreamChain
106
+ end
107
+
108
+ class ExtensionPackages < BaseEndpoint
109
+ end
110
+
111
+ class ExtensionPackageUsageAuthorizations < BaseEndpoint
112
+ end
113
+
114
+ class Libraries < BaseEndpoint
115
+ def find_snapshot: (String library_id, property_id: String) -> Resources::LibrarySnapshot
116
+ def compare: (
117
+ String current_library_id,
118
+ baseline_library_id: String,
119
+ property_id: String
120
+ ) -> Resources::LibraryComparison
121
+ def upstream_chain_for_resource: (
122
+ String | Resources::BaseResource resource_or_id,
123
+ library_id: String,
124
+ property_id: String,
125
+ ?resource_type: String
126
+ ) -> Resources::UpstreamChain
127
+ def comprehensive_upstream_chain_for_resource: (
128
+ String | Resources::BaseResource resource_or_id,
129
+ library_id: String,
130
+ property_id: String,
131
+ ?resource_type: String
132
+ ) -> Resources::ComprehensiveUpstreamChain
133
+ end
134
+
135
+ class Builds < BaseEndpoint
136
+ end
137
+
138
+ class AuditEvents < BaseEndpoint
139
+ end
140
+
141
+ class Revisions < BaseEndpoint
142
+ end
143
+
144
+ class Profiles < BaseEndpoint
145
+ end
146
+
147
+ class Search < BaseEndpoint
148
+ end
149
+
150
+ class Notes < BaseEndpoint
151
+ end
152
+ end
153
+
154
+ module Resources
155
+ class BaseResource
156
+ attr_reader id: String
157
+ attr_reader type: String
158
+ attr_reader attributes: Hash[untyped, untyped]
159
+ attr_reader meta: Hash[untyped, untyped]
160
+ attr_reader relationships: Hash[untyped, untyped]
161
+
162
+ def initialize: (
163
+ id: String,
164
+ type: String,
165
+ ?attributes: Hash[untyped, untyped],
166
+ ?meta: Hash[untyped, untyped],
167
+ ?relationships: Hash[untyped, untyped]
168
+ ) -> void
169
+ def []: (String | Symbol key) -> untyped
170
+ def relationship_data: (String | Symbol name) -> Hash[untyped, untyped]?
171
+ def relationship_id: (String | Symbol name) -> String?
172
+ def relationship_ids: (String | Symbol name) -> Array[String]
173
+ def ==: (untyped other) -> bool
174
+ def to_h: -> Hash[Symbol, untyped]
175
+ end
176
+
177
+ class SearchResults
178
+ attr_reader results: Array[BaseResource]
179
+ attr_reader meta: Hash[untyped, untyped]
180
+
181
+ def initialize: (
182
+ results: Array[BaseResource],
183
+ ?meta: Hash[untyped, untyped]
184
+ ) -> void
185
+ def each: { (BaseResource) -> untyped } -> Array[BaseResource]
186
+ def total_hits: -> Integer
187
+ end
188
+
189
+ class UpstreamChainEntry
190
+ attr_reader library: BaseResource
191
+ attr_reader stage: String?
192
+ attr_reader resource: BaseResource?
193
+ attr_reader revision_id: String?
194
+ attr_reader revision: Revision?
195
+
196
+ def initialize: (
197
+ library: BaseResource,
198
+ stage: String?,
199
+ resource: BaseResource?,
200
+ revision_id: String?,
201
+ revision: Revision?
202
+ ) -> void
203
+ def present?: -> bool
204
+ def entity_snapshot: -> Hash[untyped, untyped]?
205
+ end
206
+
207
+ class UpstreamChain
208
+ attr_reader resource_id: String
209
+ attr_reader resource_type: String?
210
+ attr_reader property_id: String
211
+ attr_reader target_library_id: String
212
+ attr_reader target_resource: BaseResource?
213
+ attr_reader target_revision_id: String?
214
+ attr_reader entries: Array[UpstreamChainEntry]
215
+
216
+ def initialize: (
217
+ resource_id: String,
218
+ resource_type: String?,
219
+ property_id: String,
220
+ target_library_id: String,
221
+ target_resource: BaseResource?,
222
+ target_revision_id: String?,
223
+ entries: Array[UpstreamChainEntry]
224
+ ) -> void
225
+ def each: { (UpstreamChainEntry) -> untyped } -> Array[UpstreamChainEntry]
226
+ def nearest_match: -> UpstreamChainEntry?
227
+ def found?: -> bool
228
+ end
229
+
230
+ class ComprehensiveResource
231
+ attr_reader resource: BaseResource
232
+ def associated_records: -> Array[BaseResource]
233
+ def normalized_payload: -> Hash[untyped, untyped]
234
+ def normalized_json: -> String
235
+ end
236
+
237
+ class ComprehensiveRule < ComprehensiveResource
238
+ attr_reader rule_components: Array[RuleComponent]
239
+ end
240
+
241
+ class ComprehensiveDataElement < ComprehensiveResource
242
+ attr_reader referenced_data_elements: Array[DataElement]
243
+ attr_reader impacted_rules: Array[Rule]
244
+ end
245
+
246
+ class ComprehensiveExtension < ComprehensiveResource
247
+ attr_reader data_elements: Array[DataElement]
248
+ attr_reader rule_components: Array[RuleComponent]
249
+ attr_reader rules: Array[Rule]
250
+ end
251
+
252
+ class LibrarySnapshot
253
+ attr_reader property_id: String
254
+ attr_reader library: LibraryWithResources
255
+ attr_reader rules: Array[Rule]
256
+ attr_reader data_elements: Array[DataElement]
257
+ attr_reader extensions: Array[Extension]
258
+ attr_reader rule_components: Array[RuleComponent]
259
+ attr_reader rule_components_by_rule_id: Hash[String, Array[RuleComponent]]
260
+ def top_level_resources: -> Array[BaseResource]
261
+ def all_resources: -> Array[BaseResource]
262
+ def resource_by_id: -> Hash[String, BaseResource]
263
+ def find_resource: (String resource_id) -> BaseResource?
264
+ def rule_components_for_rule: (String | Rule rule_or_id) -> Array[RuleComponent]
265
+ def referenced_data_elements_for: (String | DataElement data_element_or_id) -> Array[DataElement]
266
+ def impacted_rules_for: (String | DataElement data_element_or_id) -> Array[Rule]
267
+ def data_elements_for_extension: (String | Extension extension_or_id) -> Array[DataElement]
268
+ def rule_components_for_extension: (String | Extension extension_or_id) -> Array[RuleComponent]
269
+ def rules_for_extension: (String | Extension extension_or_id) -> Array[Rule]
270
+ def resource_revision_id: (String | BaseResource resource_or_id) -> String?
271
+ def comprehensive_resource: (String resource_id, ?resource_type: String) -> (ComprehensiveRule | ComprehensiveDataElement | ComprehensiveExtension)?
272
+ end
273
+
274
+ class ComprehensiveUpstreamChainEntry
275
+ attr_reader library: BaseResource
276
+ attr_reader stage: String?
277
+ attr_reader resource: BaseResource?
278
+ attr_reader revision_id: String?
279
+ attr_reader revision: Revision?
280
+ attr_reader comprehensive_resource: ComprehensiveResource?
281
+ def present?: -> bool
282
+ def entity_snapshot: -> Hash[untyped, untyped]?
283
+ def normalized_payload: -> Hash[untyped, untyped]?
284
+ def normalized_json: -> String?
285
+ end
286
+
287
+ class ComprehensiveUpstreamChain
288
+ attr_reader resource_id: String
289
+ attr_reader resource_type: String?
290
+ attr_reader property_id: String
291
+ attr_reader target_library_id: String
292
+ attr_reader target_resource: BaseResource?
293
+ attr_reader target_revision_id: String?
294
+ attr_reader target_comprehensive_resource: ComprehensiveResource?
295
+ attr_reader entries: Array[ComprehensiveUpstreamChainEntry]
296
+ def each: { (ComprehensiveUpstreamChainEntry) -> untyped } -> Array[ComprehensiveUpstreamChainEntry]
297
+ def nearest_match: -> ComprehensiveUpstreamChainEntry?
298
+ def found?: -> bool
299
+ end
300
+
301
+ class LibraryComparisonEntry
302
+ attr_reader resource_id: String
303
+ attr_reader resource_type: String
304
+ attr_reader current_library_id: String
305
+ attr_reader baseline_library_id: String
306
+ attr_reader current_resource: BaseResource?
307
+ attr_reader baseline_resource: BaseResource?
308
+ attr_reader current_revision_id: String?
309
+ attr_reader baseline_revision_id: String?
310
+ attr_reader current_comprehensive_resource: ComprehensiveResource?
311
+ attr_reader baseline_comprehensive_resource: ComprehensiveResource?
312
+ def resource_name: -> String?
313
+ def status: -> String
314
+ def added?: -> bool
315
+ def removed?: -> bool
316
+ def modified?: -> bool
317
+ def unchanged?: -> bool
318
+ def changed?: -> bool
319
+ def present_in_current?: -> bool
320
+ def present_in_baseline?: -> bool
321
+ def current_normalized_payload: -> Hash[untyped, untyped]?
322
+ def baseline_normalized_payload: -> Hash[untyped, untyped]?
323
+ def current_normalized_json: -> String
324
+ def baseline_normalized_json: -> String
325
+ def changeset_document: (?position: Integer) -> Hash[Symbol, untyped]
326
+ end
327
+
328
+ class LibraryComparison
329
+ attr_reader current_library_id: String
330
+ attr_reader baseline_library_id: String
331
+ attr_reader property_id: String
332
+ attr_reader current_snapshot: LibrarySnapshot
333
+ attr_reader baseline_snapshot: LibrarySnapshot
334
+ attr_reader entries: Array[LibraryComparisonEntry]
335
+ def current_library: -> LibraryWithResources
336
+ def baseline_library: -> LibraryWithResources
337
+ def each: { (LibraryComparisonEntry) -> untyped } -> Array[LibraryComparisonEntry]
338
+ def added_entries: -> Array[LibraryComparisonEntry]
339
+ def removed_entries: -> Array[LibraryComparisonEntry]
340
+ def modified_entries: -> Array[LibraryComparisonEntry]
341
+ def unchanged_entries: -> Array[LibraryComparisonEntry]
342
+ def changed_entries: -> Array[LibraryComparisonEntry]
343
+ def changeset_documents: (?include_unchanged: bool) -> Array[Hash[Symbol, untyped]]
344
+ end
345
+ end
346
+ end