ecoportal-api-graphql 1.3.14 → 1.3.15
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.
- checksums.yaml +4 -4
- data/.ai-assistance/projects/TODO.md +170 -118
- data/.ai-assistance/skills/ai-instructions/SKILL.md +48 -48
- data/.ai-assistance/skills/code-specs/SKILL.md +69 -69
- data/.ai-assistance/skills/gemini-assist/SKILL.md +63 -63
- data/.ai-assistance/skills/project-cycle/SKILL.md +177 -177
- data/.ai-assistance/skills/refactor/SKILL.md +62 -62
- data/.ai-assistance/skills/spec-generation/SKILL.md +72 -72
- data/.gitlab-ci.yml +64 -12
- data/CHANGELOG.md +60 -0
- data/changelog.d/fixed-mr51-payload-item-mismatches.md +17 -0
- data/lib/ecoportal/api/common/graphql/http_client.rb +6 -0
- data/lib/ecoportal/api/graphql/base/ai_summary_version.rb +17 -17
- data/lib/ecoportal/api/graphql/base/page/task.rb +24 -0
- data/lib/ecoportal/api/graphql/base/page.rb +17 -16
- data/lib/ecoportal/api/graphql/base/template.rb +35 -0
- data/lib/ecoportal/api/graphql/base.rb +2 -0
- data/lib/ecoportal/api/graphql/compat/response.rb +35 -35
- data/lib/ecoportal/api/graphql/file_upload/client.rb +21 -10
- data/lib/ecoportal/api/graphql/fragment/field_configuration.rb +38 -0
- data/lib/ecoportal/api/graphql/fragment/force.rb +14 -10
- data/lib/ecoportal/api/graphql/fragment/page_task.rb +39 -0
- data/lib/ecoportal/api/graphql/fragment/template.rb +51 -0
- data/lib/ecoportal/api/graphql/fragment.rb +3 -0
- data/lib/ecoportal/api/graphql/model/page/task.rb +16 -0
- data/lib/ecoportal/api/graphql/model/page.rb +16 -15
- data/lib/ecoportal/api/graphql/model/template.rb +15 -0
- data/lib/ecoportal/api/graphql/model.rb +2 -0
- data/lib/ecoportal/api/graphql/mutation/ai_summary/generate.rb +45 -45
- data/lib/ecoportal/api/graphql/mutation/ai_summary/submit_feedback.rb +40 -40
- data/lib/ecoportal/api/graphql/mutation/page/approve_review_task.rb +40 -40
- data/lib/ecoportal/api/graphql/mutation/page/batch_update_review_task.rb +38 -40
- data/lib/ecoportal/api/graphql/mutation/page/create_draft.rb +38 -40
- data/lib/ecoportal/api/graphql/mutation/page/delete_draft.rb +38 -40
- data/lib/ecoportal/api/graphql/mutation/page/execute_force_commands.rb +7 -7
- data/lib/ecoportal/api/graphql/mutation/page/execute_workflow_commands.rb +8 -7
- data/lib/ecoportal/api/graphql/mutation/page/publish_draft.rb +38 -40
- data/lib/ecoportal/api/graphql/mutation/page/reject_review_task.rb +40 -40
- data/lib/ecoportal/api/graphql/mutation/page/restart_review_task.rb +40 -40
- data/lib/ecoportal/api/graphql/mutation/page/undo_review_task.rb +40 -40
- data/lib/ecoportal/api/graphql/mutation/preset_view/destroy.rb +34 -35
- data/lib/ecoportal/api/graphql/mutation/register/destroy.rb +35 -35
- data/lib/ecoportal/api/graphql/mutation/smart_fill/generate.rb +36 -36
- data/lib/ecoportal/api/graphql/mutation/smart_fill/submit_feedback.rb +40 -40
- data/lib/ecoportal/api/graphql/mutation/smart_fill.rb +13 -13
- data/lib/ecoportal/api/graphql/mutation/template/create_related_page.rb +46 -46
- data/lib/ecoportal/api/graphql/mutation/template/destroy_related_page.rb +1 -1
- data/lib/ecoportal/api/graphql/mutation/template/update_information.rb +1 -1
- data/lib/ecoportal/api/graphql/mutation.rb +20 -20
- data/lib/ecoportal/api/graphql/payload/ok_payload.rb +36 -21
- data/lib/ecoportal/api/graphql/payload/page/draft.rb +26 -13
- data/lib/ecoportal/api/graphql/payload/page/review_task.rb +13 -13
- data/lib/ecoportal/api/graphql/payload/page/review_task_batch.rb +23 -0
- data/lib/ecoportal/api/graphql/payload/page.rb +20 -19
- data/lib/ecoportal/api/graphql/payload/preset_view.rb +15 -11
- data/lib/ecoportal/api/graphql/payload/register.rb +15 -11
- data/lib/ecoportal/api/graphql/payload/template/create_related_page.rb +1 -1
- data/lib/ecoportal/api/graphql/payload/template/destroy_related_page.rb +1 -1
- data/lib/ecoportal/api/graphql/payload/template/update_information.rb +1 -1
- data/lib/ecoportal/api/graphql/query/page_with_forces.rb +9 -3
- data/lib/ecoportal/api/graphql/query/pages_workflow_commands.rb +9 -3
- data/lib/ecoportal/api/graphql/query/register_preset_views.rb +78 -78
- data/lib/ecoportal/api/graphql.rb +9 -5
- data/lib/ecoportal/api/graphql_version.rb +1 -1
- data/tests/dump_schema.rb +88 -0
- data/tests/validate_queries.rb +34 -12
- metadata +11 -1
|
@@ -1,78 +1,78 @@
|
|
|
1
|
-
module Ecoportal
|
|
2
|
-
module API
|
|
3
|
-
class GraphQL
|
|
4
|
-
module Query
|
|
5
|
-
# Lists preset views for a register.
|
|
6
|
-
# Returns an array of PresetView objects — not paginated (server returns all at once).
|
|
7
|
-
# Use the returned IDs as `presetViewId` in RegisterPreviewPages queries.
|
|
8
|
-
#
|
|
9
|
-
# Usage:
|
|
10
|
-
# views = Query::RegisterPresetViews.new(client).query(registerId: 'REG_ID')
|
|
11
|
-
# views.map { |v| { id: v.id, name: v.name, global: v.global? } }
|
|
12
|
-
class RegisterPresetViews < Logic::Query
|
|
13
|
-
field_name :presetViews
|
|
14
|
-
|
|
15
|
-
accepted_params :registerId, :searchConf
|
|
16
|
-
|
|
17
|
-
class_resolver :item_class, 'Ecoportal::API::GraphQL::Model::PresetView'
|
|
18
|
-
|
|
19
|
-
def path
|
|
20
|
-
%w[currentOrganization register presetViews]
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def response_class
|
|
24
|
-
# presetViews returns an array — wrap in a simple array-like response
|
|
25
|
-
ArrayResponse
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
# Minimal array wrapper so callers can iterate results with .each / .map
|
|
29
|
-
class ArrayResponse
|
|
30
|
-
include Enumerable
|
|
31
|
-
|
|
32
|
-
def initialize(raw)
|
|
33
|
-
klass = Ecoportal::API::GraphQL::Model::PresetView
|
|
34
|
-
@items = Array(raw).map { |d| klass.new(d) }
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def each(&block)
|
|
38
|
-
@items.each(&block)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def nodes
|
|
42
|
-
@items
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
private
|
|
47
|
-
|
|
48
|
-
def basic_block(&block)
|
|
49
|
-
view_block = block || default_block
|
|
50
|
-
proc {
|
|
51
|
-
query(
|
|
52
|
-
registerId: :id!,
|
|
53
|
-
searchConf: :Search
|
|
54
|
-
) {
|
|
55
|
-
currentOrganization {
|
|
56
|
-
register(id: :registerId) {
|
|
57
|
-
presetViews(searchConf: :searchConf, &view_block)
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
def default_block
|
|
65
|
-
proc {
|
|
66
|
-
id
|
|
67
|
-
name
|
|
68
|
-
global
|
|
69
|
-
registerId
|
|
70
|
-
sorter { key direction missing }
|
|
71
|
-
fieldConfigurations {
|
|
72
|
-
}
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
end
|
|
1
|
+
module Ecoportal
|
|
2
|
+
module API
|
|
3
|
+
class GraphQL
|
|
4
|
+
module Query
|
|
5
|
+
# Lists preset views for a register.
|
|
6
|
+
# Returns an array of PresetView objects — not paginated (server returns all at once).
|
|
7
|
+
# Use the returned IDs as `presetViewId` in RegisterPreviewPages queries.
|
|
8
|
+
#
|
|
9
|
+
# Usage:
|
|
10
|
+
# views = Query::RegisterPresetViews.new(client).query(registerId: 'REG_ID')
|
|
11
|
+
# views.map { |v| { id: v.id, name: v.name, global: v.global? } }
|
|
12
|
+
class RegisterPresetViews < Logic::Query
|
|
13
|
+
field_name :presetViews
|
|
14
|
+
|
|
15
|
+
accepted_params :registerId, :searchConf
|
|
16
|
+
|
|
17
|
+
class_resolver :item_class, 'Ecoportal::API::GraphQL::Model::PresetView'
|
|
18
|
+
|
|
19
|
+
def path
|
|
20
|
+
%w[currentOrganization register presetViews]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def response_class
|
|
24
|
+
# presetViews returns an array — wrap in a simple array-like response
|
|
25
|
+
ArrayResponse
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Minimal array wrapper so callers can iterate results with .each / .map
|
|
29
|
+
class ArrayResponse
|
|
30
|
+
include Enumerable
|
|
31
|
+
|
|
32
|
+
def initialize(raw)
|
|
33
|
+
klass = Ecoportal::API::GraphQL::Model::PresetView
|
|
34
|
+
@items = Array(raw).map { |d| klass.new(d) }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def each(&block)
|
|
38
|
+
@items.each(&block)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def nodes
|
|
42
|
+
@items
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
def basic_block(&block)
|
|
49
|
+
view_block = block || default_block
|
|
50
|
+
proc {
|
|
51
|
+
query(
|
|
52
|
+
registerId: :id!,
|
|
53
|
+
searchConf: :Search
|
|
54
|
+
) {
|
|
55
|
+
currentOrganization {
|
|
56
|
+
register(id: :registerId) {
|
|
57
|
+
presetViews(searchConf: :searchConf, &view_block)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def default_block
|
|
65
|
+
proc {
|
|
66
|
+
id
|
|
67
|
+
name
|
|
68
|
+
global
|
|
69
|
+
registerId
|
|
70
|
+
sorter { key direction missing }
|
|
71
|
+
fieldConfigurations { spread :FieldConfiguration }
|
|
72
|
+
}
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -13,7 +13,10 @@ module Ecoportal
|
|
|
13
13
|
# @param org_id [String] the id of the target organization.
|
|
14
14
|
# It defaults to the environmental variable `ORGANIZATION_ID`, if defined
|
|
15
15
|
# @param logger [Logger] an object with `Logger` interface to generate logs.
|
|
16
|
-
|
|
16
|
+
# @param api_key [String] optional `X-ECOPORTAL-API-KEY`, required only for the v2 REST
|
|
17
|
+
# endpoints `FileUpload::Client` calls to register/poll an uploaded file — the GraphQL
|
|
18
|
+
# endpoint itself always authenticates via the email/pass OAuth bearer token.
|
|
19
|
+
def initialize(email: nil, pass: nil, org_id: nil, host: "live.ecoportal.com", api_key: nil)
|
|
17
20
|
kargs = {
|
|
18
21
|
email: email,
|
|
19
22
|
pass: pass,
|
|
@@ -24,10 +27,11 @@ module Ecoportal
|
|
|
24
27
|
|
|
25
28
|
@client = client_class.new(**kargs)
|
|
26
29
|
@client.http_client = Ecoportal::API::Common::GraphQL::HttpClient.new(
|
|
27
|
-
email:
|
|
28
|
-
pass:
|
|
29
|
-
org_id:
|
|
30
|
-
host:
|
|
30
|
+
email: email,
|
|
31
|
+
pass: pass,
|
|
32
|
+
org_id: org_id,
|
|
33
|
+
host: host,
|
|
34
|
+
api_key: api_key
|
|
31
35
|
)
|
|
32
36
|
@fragments = Ecoportal::API::GraphQL::Fragment.new(client)
|
|
33
37
|
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
require 'ecoportal/api-graphql'
|
|
2
|
+
require 'graphql'
|
|
3
|
+
require 'json'
|
|
4
|
+
require 'fileutils'
|
|
5
|
+
|
|
6
|
+
# Dump a FRESH GraphQL introspection schema (JSON) from a live ecoPortal endpoint.
|
|
7
|
+
#
|
|
8
|
+
# Why this exists: `tests/validate_queries.rb` (and the `graphql-schema-diff` skill) need an
|
|
9
|
+
# introspection snapshot, and a COMMITTED dump goes stale — a stale schema turns real findings
|
|
10
|
+
# into noise ("field doesn't exist") and hides new ones. The 6.3MB dump is therefore NOT
|
|
11
|
+
# committed; CI introspects at pipeline time instead (see the `validate-queries` job in
|
|
12
|
+
# `.gitlab-ci.yml`).
|
|
13
|
+
#
|
|
14
|
+
# Equivalent to eco-helpers' `-graphql-schema -format json` usecase (`graphql.client.schema.to_json`),
|
|
15
|
+
# but self-contained in this gem: it POSTs the introspection query through the gem's OWN
|
|
16
|
+
# `HttpClient#execute`, so it inherits the retry / rate-throttle pipeline and the OAuth bearer auth.
|
|
17
|
+
#
|
|
18
|
+
# Usage (run under bundler — the graphlient fork is a git dependency):
|
|
19
|
+
# SERVER=<host> ORGANIZATION_ID=<org> USER_EMAIL=<email> USER_PASS=<pass> \
|
|
20
|
+
# bundle exec ruby tests/dump_schema.rb [OUT_PATH]
|
|
21
|
+
#
|
|
22
|
+
# OUT_PATH defaults to `.ai-assistance/tmp/<stamp>_<enviro>_ep_graphql_schema.graphql.json`
|
|
23
|
+
# (that folder is gitignored — matches the naming the schema-diff skill parses stamps from).
|
|
24
|
+
#
|
|
25
|
+
# `SERVER` is REQUIRED on purpose: the gem's own default host is PRODUCTION, and an implicit
|
|
26
|
+
# prod connection is a footgun even for a read-only query.
|
|
27
|
+
#
|
|
28
|
+
# Exit codes: 0 ok · 2 configuration error (missing env) · 1 introspection failed / unusable dump
|
|
29
|
+
|
|
30
|
+
REQUIRED_ENV = %w[SERVER ORGANIZATION_ID USER_EMAIL USER_PASS].freeze
|
|
31
|
+
|
|
32
|
+
missing = REQUIRED_ENV.reject { |name| ENV[name].to_s.match?(/\S/) }
|
|
33
|
+
unless missing.empty?
|
|
34
|
+
warn "Missing required ENV: #{missing.join(', ')}"
|
|
35
|
+
warn "Usage: #{REQUIRED_ENV.map { |n| "#{n}=..." }.join(' ')} bundle exec ruby #{$PROGRAM_NAME} [OUT_PATH]"
|
|
36
|
+
exit 2
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
host = ENV.fetch('SERVER')
|
|
40
|
+
org_id = ENV.fetch('ORGANIZATION_ID')
|
|
41
|
+
|
|
42
|
+
def out_path(host)
|
|
43
|
+
enviro = host.split('.').first.to_s.gsub('-', '_')
|
|
44
|
+
stamp = Time.now.strftime('%Y%m%dT%H%M%S')
|
|
45
|
+
File.expand_path("../.ai-assistance/tmp/#{stamp}_#{enviro}_ep_graphql_schema.graphql.json", __dir__)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
out = ARGV[0] || out_path(host)
|
|
49
|
+
FileUtils.mkdir_p(File.dirname(out))
|
|
50
|
+
|
|
51
|
+
api = Ecoportal::API::GraphQL.new(
|
|
52
|
+
email: ENV.fetch('USER_EMAIL'),
|
|
53
|
+
pass: ENV.fetch('USER_PASS'),
|
|
54
|
+
org_id: org_id,
|
|
55
|
+
host: host
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
# `GraphQL::Introspection::INTROSPECTION_QUERY` is the CONSERVATIVE query in graphql-ruby 2.6
|
|
59
|
+
# (verified: identical to `GraphQL::Introspection.query` with every `include_*` flag false — it
|
|
60
|
+
# does NOT ask for `isRepeatable` / `specifiedByURL` / `isOneOf` / deprecated-arg flags). That is
|
|
61
|
+
# what we want: no client/server version skew over introspection extras.
|
|
62
|
+
result =
|
|
63
|
+
begin
|
|
64
|
+
puts "Introspecting #{host} (org #{org_id})..."
|
|
65
|
+
api.client.http_client.execute(GraphQL::Introspection::INTROSPECTION_QUERY)
|
|
66
|
+
rescue Ecoportal::API::Common::GraphQL::ResponseError => e
|
|
67
|
+
warn "Introspection rejected by the server: #{e.message}"
|
|
68
|
+
nil
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
unless result&.dig('data', '__schema')
|
|
72
|
+
warn 'Introspection failed — no data.__schema in the response.'
|
|
73
|
+
exit 1
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Fail here rather than downstream: prove the dump is loadable by the same call
|
|
77
|
+
# `validate_queries.rb` and the schema-diff skill make.
|
|
78
|
+
begin
|
|
79
|
+
GraphQL::Schema.from_introspection(result)
|
|
80
|
+
rescue StandardError => e
|
|
81
|
+
warn "Dump is not a usable introspection result: #{e.class}: #{e.message}"
|
|
82
|
+
exit 1
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
File.write(out, JSON.generate(result))
|
|
86
|
+
|
|
87
|
+
types = result.dig('data', '__schema', 'types')&.size
|
|
88
|
+
puts "Wrote #{out} (#{File.size(out) / 1024}KB, #{types} types)"
|
data/tests/validate_queries.rb
CHANGED
|
@@ -3,8 +3,9 @@ require 'json'
|
|
|
3
3
|
require 'graphql'
|
|
4
4
|
|
|
5
5
|
# Validate EVERY gem query against a GraphQL schema, offline — catches the whole class of
|
|
6
|
-
# "field must have selections" (object field selected bare)
|
|
7
|
-
# scalars" (scalar over-selected)
|
|
6
|
+
# "field must have selections" (object field selected bare), "selections can't be made on
|
|
7
|
+
# scalars" (scalar over-selected) and "selections can't be made directly on unions" (union
|
|
8
|
+
# selected without a type condition) bugs before they reach a client runner.
|
|
8
9
|
#
|
|
9
10
|
# This is how the 2026-07-03 LocationStructure `updatedAt` prod failure (and a sibling
|
|
10
11
|
# `createdAt` over-selection in the LocationDraft fragment) were found. Those queries had no
|
|
@@ -16,17 +17,38 @@ require 'graphql'
|
|
|
16
17
|
# Usage (run under bundler so the graphlient fork's #to_query_string is available):
|
|
17
18
|
# bundle exec ruby tests/validate_queries.rb [PATH_TO_SCHEMA_INTROSPECTION_JSON]
|
|
18
19
|
#
|
|
19
|
-
#
|
|
20
|
-
#
|
|
21
|
-
# "field doesn't exist" noise (harmless: this script only *fails* on the two
|
|
20
|
+
# With no argument it picks the NEWEST dump in `.ai-assistance/tmp/` (gitignored — dumps are never
|
|
21
|
+
# committed, they go stale). Get a fresh one with `tests/dump_schema.rb`. Prefer a fresh dump — a
|
|
22
|
+
# stale one yields false "field doesn't exist" noise (harmless: this script only *fails* on the two
|
|
23
|
+
# structural classes and on render failures).
|
|
24
|
+
#
|
|
25
|
+
# Wired into CI as the blocking `validate-queries` job (see `.gitlab-ci.yml`), which dumps a fresh
|
|
26
|
+
# schema first.
|
|
27
|
+
|
|
28
|
+
SCHEMA_GLOB = File.expand_path('../.ai-assistance/tmp/*_ep_graphql_schema*.json', __dir__)
|
|
22
29
|
|
|
23
|
-
|
|
24
|
-
|
|
30
|
+
# Message fragments that are ALWAYS a real client-side bug, never schema staleness — so they can
|
|
31
|
+
# safely fail the build. `directly on unions` was added 2026-07-29: the 3 union findings triaged on
|
|
32
|
+
# 2026-07-03 (PageWithForces / PagesWorkflowCommands / RegisterPresetViews) sat in the advisory
|
|
33
|
+
# "OTHER" bucket and needed a human to spot them, which is exactly what this gate is meant to
|
|
34
|
+
# remove. Selecting on a union without a type condition is invalid GraphQL under any schema.
|
|
35
|
+
# `can't be spread inside` was added 2026-07-30 for the same reason as unions: the 7 invalid
|
|
36
|
+
# `PageFields` spreads (review tasks → TaskInterface, related pages → RelatedPages, template
|
|
37
|
+
# information → Template) sat in the advisory bucket until a human read the first live CI run.
|
|
38
|
+
# A fragment whose type condition cannot overlap its spread location is invalid under any schema.
|
|
39
|
+
STRUCTURAL = [
|
|
40
|
+
'must have selections',
|
|
41
|
+
"can't be made on scalars",
|
|
42
|
+
"can't be made directly on unions",
|
|
43
|
+
"can't be spread inside"
|
|
44
|
+
].freeze
|
|
25
45
|
|
|
26
|
-
schema_path = ARGV[0] ||
|
|
27
|
-
unless File.exist?(schema_path)
|
|
28
|
-
warn "Schema introspection JSON not found
|
|
29
|
-
warn '
|
|
46
|
+
schema_path = ARGV[0] || Dir[SCHEMA_GLOB].max
|
|
47
|
+
unless schema_path && File.exist?(schema_path)
|
|
48
|
+
warn "Schema introspection JSON not found (looked for the newest #{SCHEMA_GLOB})"
|
|
49
|
+
warn 'Get a fresh one: SERVER=... ORGANIZATION_ID=... USER_EMAIL=... USER_PASS=... \\'
|
|
50
|
+
warn ' bundle exec ruby tests/dump_schema.rb'
|
|
51
|
+
warn 'Or pass a path: bundle exec ruby tests/validate_queries.rb <schema.json>'
|
|
30
52
|
exit 2
|
|
31
53
|
end
|
|
32
54
|
|
|
@@ -105,7 +127,7 @@ else
|
|
|
105
127
|
render_failures.each { |name, msgs| puts " #{name}\n - #{msgs.join("\n - ")}" }
|
|
106
128
|
end
|
|
107
129
|
|
|
108
|
-
puts "\n## STRUCTURAL BUGS (fail the build — bare object / over-selected scalar):"
|
|
130
|
+
puts "\n## STRUCTURAL BUGS (fail the build — bare object / over-selected scalar / union without type condition):"
|
|
109
131
|
if structural_bugs.empty?
|
|
110
132
|
puts ' none ✅'
|
|
111
133
|
else
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ecoportal-api-graphql
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.3.
|
|
4
|
+
version: 1.3.15
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Oscar Segura
|
|
@@ -356,6 +356,7 @@ files:
|
|
|
356
356
|
- bin/console
|
|
357
357
|
- bin/setup
|
|
358
358
|
- bin/setup.ps1
|
|
359
|
+
- changelog.d/fixed-mr51-payload-item-mismatches.md
|
|
359
360
|
- docs/self-docs/ARCHITECTURE.md
|
|
360
361
|
- docs/self-docs/CHANGES.jsonl
|
|
361
362
|
- docs/self-docs/COMPLIANCE.md
|
|
@@ -442,6 +443,7 @@ files:
|
|
|
442
443
|
- lib/ecoportal/api/graphql/base/page/phased/stage.rb
|
|
443
444
|
- lib/ecoportal/api/graphql/base/page/section.rb
|
|
444
445
|
- lib/ecoportal/api/graphql/base/page/section_collection.rb
|
|
446
|
+
- lib/ecoportal/api/graphql/base/page/task.rb
|
|
445
447
|
- lib/ecoportal/api/graphql/base/page_info.rb
|
|
446
448
|
- lib/ecoportal/api/graphql/base/pages_workflow.rb
|
|
447
449
|
- lib/ecoportal/api/graphql/base/pages_workflow/action_type_selection.rb
|
|
@@ -471,6 +473,7 @@ files:
|
|
|
471
473
|
- lib/ecoportal/api/graphql/base/preview_page.rb
|
|
472
474
|
- lib/ecoportal/api/graphql/base/register.rb
|
|
473
475
|
- lib/ecoportal/api/graphql/base/resource.rb
|
|
476
|
+
- lib/ecoportal/api/graphql/base/template.rb
|
|
474
477
|
- lib/ecoportal/api/graphql/builder.rb
|
|
475
478
|
- lib/ecoportal/api/graphql/builder/CLAUDE.md
|
|
476
479
|
- lib/ecoportal/api/graphql/builder/action.rb
|
|
@@ -530,15 +533,18 @@ files:
|
|
|
530
533
|
- lib/ecoportal/api/graphql/fragment/action.rb
|
|
531
534
|
- lib/ecoportal/api/graphql/fragment/action_category.rb
|
|
532
535
|
- lib/ecoportal/api/graphql/fragment/contractor_entity.rb
|
|
536
|
+
- lib/ecoportal/api/graphql/fragment/field_configuration.rb
|
|
533
537
|
- lib/ecoportal/api/graphql/fragment/force.rb
|
|
534
538
|
- lib/ecoportal/api/graphql/fragment/location_draft.rb
|
|
535
539
|
- lib/ecoportal/api/graphql/fragment/location_node.rb
|
|
536
540
|
- lib/ecoportal/api/graphql/fragment/locations_error.rb
|
|
537
541
|
- lib/ecoportal/api/graphql/fragment/page.rb
|
|
542
|
+
- lib/ecoportal/api/graphql/fragment/page_task.rb
|
|
538
543
|
- lib/ecoportal/api/graphql/fragment/pages.rb
|
|
539
544
|
- lib/ecoportal/api/graphql/fragment/pages/common_page_union.rb
|
|
540
545
|
- lib/ecoportal/api/graphql/fragment/pages_workflow.rb
|
|
541
546
|
- lib/ecoportal/api/graphql/fragment/pagination.rb
|
|
547
|
+
- lib/ecoportal/api/graphql/fragment/template.rb
|
|
542
548
|
- lib/ecoportal/api/graphql/helpers.rb
|
|
543
549
|
- lib/ecoportal/api/graphql/helpers/locations_tree.rb
|
|
544
550
|
- lib/ecoportal/api/graphql/input.rb
|
|
@@ -728,6 +734,7 @@ files:
|
|
|
728
734
|
- lib/ecoportal/api/graphql/model/page/phased.rb
|
|
729
735
|
- lib/ecoportal/api/graphql/model/page/phased/stage.rb
|
|
730
736
|
- lib/ecoportal/api/graphql/model/page/section.rb
|
|
737
|
+
- lib/ecoportal/api/graphql/model/page/task.rb
|
|
731
738
|
- lib/ecoportal/api/graphql/model/page_union.rb
|
|
732
739
|
- lib/ecoportal/api/graphql/model/pages_workflow.rb
|
|
733
740
|
- lib/ecoportal/api/graphql/model/person_member.rb
|
|
@@ -735,6 +742,7 @@ files:
|
|
|
735
742
|
- lib/ecoportal/api/graphql/model/preview_page.rb
|
|
736
743
|
- lib/ecoportal/api/graphql/model/register.rb
|
|
737
744
|
- lib/ecoportal/api/graphql/model/resource.rb
|
|
745
|
+
- lib/ecoportal/api/graphql/model/template.rb
|
|
738
746
|
- lib/ecoportal/api/graphql/model/user.rb
|
|
739
747
|
- lib/ecoportal/api/graphql/mutation.rb
|
|
740
748
|
- lib/ecoportal/api/graphql/mutation/action.rb
|
|
@@ -834,6 +842,7 @@ files:
|
|
|
834
842
|
- lib/ecoportal/api/graphql/payload/page/create_from_template.rb
|
|
835
843
|
- lib/ecoportal/api/graphql/payload/page/draft.rb
|
|
836
844
|
- lib/ecoportal/api/graphql/payload/page/review_task.rb
|
|
845
|
+
- lib/ecoportal/api/graphql/payload/page/review_task_batch.rb
|
|
837
846
|
- lib/ecoportal/api/graphql/payload/page/unarchive.rb
|
|
838
847
|
- lib/ecoportal/api/graphql/payload/page/update.rb
|
|
839
848
|
- lib/ecoportal/api/graphql/payload/page/update_variable_bindings.rb
|
|
@@ -872,6 +881,7 @@ files:
|
|
|
872
881
|
- tests/contractor_entity_create.rb
|
|
873
882
|
- tests/contractor_entity_udpate.rb
|
|
874
883
|
- tests/dump_page_model.rb
|
|
884
|
+
- tests/dump_schema.rb
|
|
875
885
|
- tests/dump_template_model.rb
|
|
876
886
|
- tests/loc_structure_get.rb
|
|
877
887
|
- tests/loc_structure_update.rb
|