Change Log
All notable changes to this project will be documented in this file.
[1.3.11] - 2026-07-04
Template automatic build & maintenance engine (backwards-compatible — a self-contained new
Diff module + a build emitter; nothing existing changed). Validated offline (specs + fixtures +
shapes checked against the live schema dump); the live UAT→PROD round trip is pending a sandbox org.
Added
genomeSignaturefetched on every data-field type (added once to thedataFieldInterfacefragment,@skip(if: $only_content)) +passthrough :genomeSignatureonBase::Page::DataField— a strong-but-fallible field-pairing signal.Diff::VersionDiff— two same-object (retained-id) template snapshots → an exact structural changelog: added/removed/changed/moved for stages, sections, fields (label/type/section-move), select options (label/weight), gauge stops (add/remove/threshold/color, matched by stop id), and typedbyTypefield config (conservative, only confirmed read↔input-key matches: Gaugemax; SelectdataType/multiple/flat/other/otherDesc; DateshowTime/pastOnly/todayButton).Diff::Change— command-ready change (op/kind/id/label/path/attribute/before/after/parent_id/by_type) with a human#description;#to_his the stable interchange shape.Diff::CommandSynthesizer— aChangeset → an orderedWorkflowCommandbatch (the replayable "commit"): moves/renames/config, options, gauge stops,editFieldConfiguration(byType:), withplaceholderIdthreading so dependent intra-batch creates reference not-yet-created nodes. Genuinely ambiguous cases (field type change, moves without a target id) are left UNSUPPORTED — never guessed.Diff::Deploy—from_versions(before, after, target_doc:)/from_cross_object(...)produce the ordered batch ready forexecuteWorkflowCommands;#execute!refuses to run while the honestunsupportedlist is non-empty unlessallow_partial: true; inert until an executor is passed.Diff::IdResolver— indexes a target doc's stage names + section headings → ids for move resolution; duplicate keys resolve tonil(never guesses).Diff::Pairing::{Engine,Signals,Candidate,Ledger}— multi-signal equivalence matching for cross-object templates (genome 0.5 + type 0.2 + label 0.2 + options-by-value 0.1, averaged over applicable signals; greedy 1:1; auto-accept ≥0.85, ambiguous 0.5–0.85, unmatched <0.5; genome mismatch scores 0 but does not veto).Ledgerpersists confirmed pairs (consulted first; human corrections supersede).Diff::Strategy— composable diff modalities: pairing (:id/:genome/:type_label/:assisted) × scope (:structural/:config_only/:data_migration) × move-sensitivity × intent (:changelog/:deploy/:sync_readiness)..defaultreproduces exact pre-existing behaviour.Diff::CrossObjectDiff— diffs two templates with no shared ids by building the id-correspondence map viaPairing::Engine(+ optionalLedger), then emitting the sameChangeoutput that feedsCommandSynthesizer/Deploy. Ambiguous/unmatched held in#unresolvedfor a human — never auto-paired.Builder::TemplateBuilder— a declarative template spec (stages→sections→fields→options→ config→gauge-stops) → an orderedWorkflowCommandbatch forBuilder::Template#create/update, using the sameplaceholderIdthreading as the diff synthesizer so build-from-scratch and diff-deploy emit through one layer. Emits only verified inputVALID_KEYS. A field'sdescription(e.g. a CSV/hidden-field identity token) is emitted as a follow-upeditFieldConfiguration( dataFieldId:, description:)— the correct schema seam, sinceWorkflowAddFieldInputhas nodescriptionkey.- Stage/section back-refs on added nodes (
Diff::CommandSynthesizer) — an added field'saddFieldnow carriessectionId(Change#parent_id) +stageId(newChange#owner_id); an added section emits a follow-upaddStageSection(stageId:, sectionId:). All threaded viaref()(parent placeholder when created same-batch, else real id; omitted when unknown → historical behaviour unchanged).VersionDiffrecordsparent_id/owner_idon added field/section changes.
Fixed
- Fragment references migrated to the
spread :Nameregistry convention. The Action and ContractorEntity mutations (create/update/destroy,create/update/archive) still used the dead___Const__Fragmentconvention, which resolves a Ruby constantFragment::<Name>that no longer exists (fragments are a registry now) →uninitialized constant … Fragment::… (NameError)at render time. Nowspread :Action/spread :ContractorEntity, matching the already-migrated queries. (The sibling breakage in eco-helpers' location-command optimizations is fixed in eco-helpers 3.2.17; it crashed the live act-gov locations sync.) - Kickstand workflow mutations — bare
DateTimeselection.Kickstand::{Start,Stop,Fail}WorkflowselectedstartedAt/stoppedAt/failedAtbare → "Field must have selections". Now{ dateTime timeZone }(same class as the 1.3.10 LocationStructure fix). tests/validate_queries.rbnow renders MUTATIONS too (was queries only) and hard-fails on a render error (dead fragment / unresolved constant), not just a soft skip — the offline guard for both classes above. It caught the 3 Kickstand bugs immediately.
Schema realities (verified against the live introspection dump)
requiredcannot be set via the workflow command bus — there is NOrequiredinput key anywhere in the schema (not onWorkflowAddFieldInput, not onWorkflowEditFieldConfigurationInputor any of its 12 byType sub-inputs). Callers must treat field-requiredas read-only / out-of-band (ecoportal-qa:skipsrequired-readiness by design).
Dependencies
- Requires
ecoportal-api-v2 >= 3.3.3(was>= 3.3.2). 3.3.2 has a Ruby-3.xTypeErrorin theDoubleModelcascade (_cascaded_attributes_trace) that crashesas_update/DiffServiceon any model with nested attributes — fixed in v2 3.3.3. Raising the floor stops the broken v2 from resolving on consumers.
Known gaps (tracked, not in this release)
- Live characterization (UAT→PROD replay + verify) is pending a sandbox org + credentials.
[1.3.10] - 2026-07-03
Hotfix (backwards-compatible). Resolves a live failure on the Turners & Growers users sync.
Fixed
- LocationStructure query —
updatedAtbare selection →Field must have selections (field 'updatedAt' returns DateTime but has no selections).LocationStructureType.updatedAtreturns theDateTimeobject ({ dateTime, timeZone }), so it must be selected with sub-fields. Fixed inQuery::LocationStructureandQuery::LocationStructure::Draft(nowupdatedAt { dateTime timeZone }). The pluralQuery::LocationStructuresdoes not select it and was unaffected.- Root cause: the bare selection has existed since 2023 (v0.3.x) but was never exercised — no spec covered these queries, and the tagtree/users-sync path only began fetching the location structure via GraphQL (rather than APIv2) as of the cutover, so it first ran in production.
- Regression guard added:
spec/.../query/location_structure_spec.rbrenders the query blocks offline and assertsupdatedAtcarries{ dateTime timeZone }— this would have failed in CI.
- LocationDraft fragment —
createdAtover-selection (found by the full audit below): selectedcreatedAt { dateTime }, butDraft.createdAtis anISO8601DateTimescalar → would throwSelections can't be made on scalarswhenever the location-structure draft query runs. Now barecreatedAt. Guarded by the same spec.
Added
tests/validate_queries.rb— offline audit: renders every gem query (auth stubbed, no network), assembles its fragments, and validates the full document against a schema introspection JSON. Flags the whole bug class — object fields selected bare ("must have selections") and scalars over-selected ("selections can't be made on scalars"). A full run confirmed these two location fixes are the ONLY such issues across all 17 query classes (contractors, actions, pages, register, templates: clean).
[1.3.9] - 2026-07-02
APIv2→GraphQL cutover hardening (backwards-compatible). Live-validated on the maintained ooze integrations (toocs-coding, cans-upsert).
Fixed
- Faithful dry-run body —
Compat::Pages#get_bodyreturns the SAME input#update/#createwould send (under the'page'key), incl.dataFields.updates(invisible topage.as_updateon phased pages). Create previews render asCreateFromTemplateInput(marker-based#new_draft?) instead of mislabelling as updates. - Stage submit/sign-off carries
stageId—Input::Page::Update.from_modelraises if a submit/task is requested without a stage;Compat::StageViewrecords the viewed stage on the page;compat_stage_idresolves pinned → active(stage-view) → current. People-field permissions are stage-scoped, so a submit must name its stage. CrossReference#dirty?compares the reference-id SET vsoriginal_doc— no phantomreferenceIds: []clears (empty→empty / same→same is not dirty).Number/Gaugeblank → nil, never0.0— an empty CSV cell no longer coerces to a real zero. SharedDataField#numeric_or_nil.Peoplereader falls back to thepeople{id}nodes whenpeopleIdsis blank — an append can't wipe existing people.Compat::Pages#createresolvestemplateIdfrom the get_new marker (_compat_source_template_id), matching the dry-run — fixes a livetemplateId: nullfailure.
Added
- Exact-match register filter —
Compat::FilterTranslatormaps a v2type: 'exact_filter'(alias'is_filter') → GraphQLis_filter(whole-value equality on a field's.exactkeyword subfield), deriving themembranes.<type>path. Fixes exact-id existence checks (partialmatch_filtermissed exact SKUs → duplicate pages). Note: case-insensitive, first-64-chars. Builder::Page#archive(clear_external_id:)— optionally blanksexternalId(a separateupdatePage) before archiving, for cleanup of a failed/duplicate creation; defaultfalsekeeps it. externalId is the per-org, per-model integration pairing key.
[1.3.8] - 2026-06-12
Added
- Template mutations — full lifecycle for creating and updating workflow templates:
Mutation::Template::{Create,Update}—createPageTemplate/updatePageTemplate(both acceptWorkflowCommandInputcommand bus)Mutation::Template::{Publish,Unpublish}—publishTemplate/unpublishTemplateMutation::Template::UpdateInformation— update templatedescription,aiDescription,templateTypeMutation::Template::{CreateRelatedPage,DestroyRelatedPage}— manage template related-pagesBuilder::Templatewired asapi.template
updateVariableBindings—Mutation::Page::UpdateVariableBindingsmaps named force variable slots to data field IDs on a page;Input::VariableBindingvalue object- Kickstand job mutations —
Mutation::Kickstand::{StartJob,FailJob,BulkUpdateJobs};Builder::Kickstandextended withstart_job,fail_job,bulk_update_jobs
[1.3.7] - 2026-06-12
Added
- PagesWorkflow space (W1–W5)
Base::PagesWorkflow+ sub-model tree (pages_workflow/):RegisterField,CallbackType,OperationInterface,TriggerInterface, and supporting types — read model for the page-workflow configuration (autoPageCreationEnabled,fields,stages).Model::PagesWorkflowwith class resolver.- Workflow command bus:
Input::WorkflowCommandInputcovering ~80 command types underinput/workflow_command/.Mutation::Page::ExecuteWorkflowCommands+Payload::ExecuteWorkflowCommands. - Workflow fragments registered for assembly.
- Note: the workflow command surface is volatile upstream — designed to absorb change.
- Force model / ForceCompat
Base::Force(+force/sub-models), Force fragment.Mutation::Page::ExecuteForceCommands,Payload::ForceCommands,Query::PageWithForces.
- DataField type hierarchy (Phase E)
- Full set of typed
Base::Page::DataFieldsubclasses:PlainText,RichText,DateField,Number,Gauge,People,Select,Checklist,TagField,Geo,Signature,ContractorEntities,CrossReference,ImageGallery,FileField,Mailbox,ActionsList,Law,AiSummary,Table,SmartFill, dispatched viaTYPE_MAP/from_doc. DataField::Collection—dirty_inputs,dirty_additions,dirty_deletions,add,mark_for_deletion.
- Full set of typed
- Register builder & models
Builder::Register(+register/preset_view),Model::Register,Mutation::Register(create/update/destroy),Input::Register,Payload::Register.
- Preset views
Model::PresetView,Mutation::PresetView(create/update/destroy/permission),Query::RegisterPresetViews,Input::PresetView,Payload::PresetView.
- AI mutations
Mutation::SmartFill(generate/submit_feedback).Mutation::AiSummary(generate/submit_feedback),Model::AiSummaryVersion,Payload::AiSummaryGenerate.
- Review task & draft lifecycle mutations
- Review tasks:
approve/reject/restart/undo/batch_update(Mutation::Page::*ReviewTask),Payload::Page::ReviewTask. - Drafts:
Mutation::Page::CreateDraft/PublishDraft/DeleteDraft,Payload::Page::Draft. - Templates:
Mutation::Page::BuildFromTemplate/CreateFromTemplate+ payloads.
- Review tasks:
- Queries
Query::PageDelta(+Base::DeltaResult,Input::DeltaInput).Query::RegisterPreviewPages(+Base::PreviewPage).Query::FileUploadSignature+ file-upload helper.
Input::SearchConf— fluent/chainable filter DSL andSearchConf.from_description(AI-assisted filter generation from natural language).- Compat layer for
eco-helpers—Compat::Pages(#eachcursor-paginated full iteration),Compat::Registers,Compat::FilterTranslator,Compat::PageReference,Compat::StageCollection,Compat::StageView,Compat::SearchResults,Compat::Response. - Concerns —
SnakeCamelAccess(camelCase→snake_case delegation),DataFieldAccess,PageCompat,Deprecation. Payload::OkPayloadbase payload.- Page read layer (Phase A)
Fragment::PageFields— named fragment onBasePageInterfacecovering identity, state, lifecycle, and location fields. Includes__typenamefor union dispatch.Interface::BasePage— addedpassboolean :draftandpassthrough :externalId.Base::Page::Basic < Interface::BasePage— concrete basic page class.Base::Page::Phased—passarray :stages(raw array until typed in Phase C).Model::Page::Basic,Model::Page::Phased— concrete model classes with class resolvers.Model::PageUnion— factory module: dispatches.new(doc)toBasicorPhasedbased on__typename. Used asitem_class/node_classthroughout.Connection::Page < Logic::Connection— paginated page connection withPageUnionnodes.Query::Page(single page by ID),Query::Pages(paginated list),Query::Templates.Model::Organization— wiredquery :page,query :pages,query :templates.
- Page write layer (Phase B)
Input::Page— mapsPageInputfields; ownsPAGE_FIELD_KEYSas single source of truth.Input::Page::Update— mapsUpdatePageInput;from_modelbuilds the nestedpage:sub-hash and always injectspatchVer(a currentpatchVermust be fetched before update).Input::Page::Archive,Input::Page::Unarchive.Mutation::Page::Update/Archive/Unarchive,Payload::Page::Update/Archive/Unarchive(all return aPageUnionitem),Builder::Page(update/archive/unarchive),Ecoportal::API::GraphQL#pagetop-level accessor.
- Fragment infrastructure
Fragment::Pagessub-namespace withCommonPageUnion— customer-facing fragment covering stages, sections, all 20 data field types, actions, files, and emails. Parametric via$content,$only_content,$fields.FragmentDefinitions.register_namespace(klass)— cross-namespace fragment discovery without polluting the parentfragmentshash.BaseQuery#assemble_fragments— resolves fragment spreads recursively (cycle-safe).
as_input/ diff pipelineCommon::GraphQL::Model::AsInput#as_input(target_class:)— delegates to a specifiedInputsubclass for field reshaping (e.g.IdDiffInputfor array fields).Logic::Input.from_model— builds mutation input from a model diff; injectspatchVerandclientMutationId.Input::ContractorEntity::Update.from_model— reshapes array fields (associatedPeopleIds,leadContractorIds) intoIdDiffInputformat.
Changed
Gemfile— overridegraphlientwith the fork branch (GraphQL directives support).- DataField dirty detection — removed the per-field
@_dirtyflag in favour of diff-based detection.DataFieldnow uses a leaf-specificDIFF_CLASS(LeafDiffService) so itspassarrayattributes are diffed inline instead of being stripped as cascaded keys. - AI generator — compatibility with the Anthropic Ruby SDK 1.x.
Fixed
- DataField array fields (
Select,People,Checklist,ContractorEntities,CrossReference,FileField,ImageGallery) — were never reported dirty after a setter, soas_inputreturnednil.passarraykeys are cascaded attributes and the flat classic diff strips them, expectingdiff_reduceto re-add them by cascading into nestedGraphQL::Modelchildren — but leaf-field arrays are plain hashes/strings, so they vanished. Fixed withDataField::LeafDiffService(keeps cascaded keys) and by adding the missingarray_ids/array_id_index/array_id_itemhelpers toHashDiffNesting. - Live AI specs — resilient to SSL / auth failures in offline environments (skip instead of error).
HashDiffNesting#dig_path?— corrected to useHash#key?rather thanrespond_to?(:[]), preventing false positives on non-Hash objects.DiffService#classic_diff— now returns a flat changed-prop hash (noapi_operation/change_datawrapper keys).as_input/as_updatereturnnilwhen there are no changes.assemble_fragments— fixed silent bug where a fragment referencing another fragment (e.g.PageFields → ...LocationNode) would omit the referenced fragment from the query, causing a server-sideunknown fragmenterror.Fragment.assemble— fixed silent bug where fragments defined in sub-namespaces (e.g.Fragment::Pages) were never found, always returning empty.
[1.3.6] - 2026-06-05
Added
HttpClient#execute: new HTTP dispatch method — POSTs{ query, variables, operationName }as JSON to/api/:org_id/graphqland returns the parsed response hash.Common::GraphQL::ResponseError: typed exception raised when the GraphQL response body contains anerrorsarray.Fragment.assemble(*syms): class method that returns concatenated named fragment definition strings for the given symbols, ready to append to a query document before dispatch.Graphlient::Query#spread(name)(graphlient fork): DSL helper that emits...FragmentNamein the query string. Replaces the___Constconvention from graphql-client.Client#to_query_string(&block)(graphlient fork): builds a full GraphQL query document from the DSL block and returns aStringwithout touching Faraday or HTTP.
Changed
- upgraded ecoportal upstream gem dependencies:
ecoportal-apiecoportal-api-v2
BaseQuery#graphql_query: wired to the new dispatch path — builds query string viaclient.to_query_string, appends needed named fragment strings, dispatches viaclient.http_client.execute. Removes the graphql-client/Faraday dispatch path.Common::GraphQL::Client: addedattr_accessor :http_clientto carry the HTTP dispatch client alongside the DSL client.Ecoportal::API::GraphQL#initialize: constructs and attaches aCommon::GraphQL::HttpClientinstance to@client.http_client.- Fragment strings: all 7 fragment heredocs updated to use named fragment syntax
(e.g.
fragment Action on Action { ... }), required forFragment.assembleto emit valid named fragment definitions. FragmentDefinitions: stripped ofclient.parseandnamespace.const_set— fragment strings are now stored as plain Ruby strings. No longer depends on graphql-client for fragment loading.- Query/mutation blocks (12 files): replaced
___Ecoportal__API__GraphQL__Fragment__Xspread syntax withspread :Xthroughout alldefault_blockanddefault_payload_blockprocs.
Fixed
HttpClient#base_request: addedrequest ||= HTTPguard for the unmatched@versioncase to prevent nil errors.HttpClient#api_url: useENDPOINT_PATHconstant (external/graphql) consistently instead of an inline hardcoded string.
[1.3.5] - 2026-05-26
Changed
- Moved
graphqlendpoint toexternal/graphql - Missing env var (i.e.
ORG_ID) will raise now an error (instead of just a print)
[1.3.4] - 2025-09-04
Added
- Command execution result: added command doc when there's a
resultserror. - Payload improvements:
- On
LocationsError.validationErrors: fetchpropertyproperty. - On results,
Commandalways fetch__typenameand the other properties.
- On
Changed
- Changed base
error_doc: consistent property name
Fixed
- Correct fetch on
ok(sometimes it isnull: that doesn't mean failed). - Consistent order on
error?anderror_doc. Draft- Overlapping name
ConflictingIds(vsLocationsError.conflictingIds) - Wrong include on
FetchNested
- Overlapping name
[1.3.3] - 2025-08-29
Added
- Better error handling
Fixed
- Unused parameter/variable
$includeArchivedNodes
[1.3.2] - 2025-08-19
Added
Mutation: allow parameters other than input.- Location Structure
Draftmodels Interface::LocationStructure::NodesforLocationStructureandDraft::Structureraw_responseas optional query parameter (for debugging)Logic::Input(out of consistency)- Fragments:
LocationDraftLocationsError
- Query to include
draftlist when fetching an RS. - Location
Draftqueries:Draft#byIdDraft#createDraft#deleteDraft#addCommandsDraft#publishDraft#dropBadCommands
- Error tracking througout the payload models of location mutations
Changed
- Upgrade dependency (
ecoportal-apigem). - Moved rescue on fragment definition to
#defineitself. NodeInterfacemoved toInterface::LocationStructure::Node- Code: Shorten namespace referral.
- Swap to
Logic::BaseModel Mutationto introduce:inputrequired parameter by using parent class.
Fixed
QueryConnection: bad code.conflictingIdsshould be array.
[1.3.1] - 2025-06-11
Changed
- upgraded gem dependencies
- Moded
Ecoportal::API::GraphQL::Base::Modelto- >
Ecoportal::API::GraphQL::BaseModel
- >
- Added
Interface::LocationNode - Added
Interface::BasePage
Fixed
- Fragments
Actionfragment to usePageUnion(upgrade)- Memoize fragments.
- Add what fragment failed in the error.
[1.2.1] - 2025-05-16
Changed
- upgrade
ecoportal-apigem - upgrade
ecoportal-api-v2gem
[1.1.1] - 2025-05-14
Added
MemberChangeshelpers forBase::ContractorEntity- Custom Diff logic that can be used in GraphQL content:
Common::GraphQL::Model::Diffable::HashDiffNesting- Reused from
HashDiffPatch(ecoportal-api-v2):- It does not use
patch_ver, but rather justidproperty alone. - The operation property has been renamed to
api_operation(to ensure no collisions). And the operation types are symbols, and renamed to::delete,:updateand:create. This can show up to be useful when, for instance, reusing the output of#as_updateto generate actual input objects (i.e.#as_input) that feed some GraphQL query. - The data property has been renamed to
change_data. Hashkeys are of typeSymbol.
- It does not use
Common::GraphQL::Model::Diffable::DiffService. In a GraphQL context, this aims to be able to implement a function called#as_input(equivalent to#as_update):- It uses the
HashDiffNestinghelpers. - It has capability to
ignorecertain keys. - It can calculate diff excluding nested models (i.e. those that are
root?and, therefore, not part of the changed target model). This functionality is an optimization tocascaded_callbacksthroughout the nested models.
- It uses the
Changed
Common::GraphQL::Model::Diffableby usingDiffable::DiffService(withcascaded_callbacksimplementation).#as_update#dirty?
- upgraded
ecoportal-apigem - updraded
ecoportal-api-v2gem
[0.4.7] - 2025-04-02
Added
page.idto Action linked resources.
[0.4.6] - 2025-04-02
Added
Ecoportal::API::GraphQL::Logic::QueryConnection- Require
default_connection_blockto child classes - This aims to not having have client code having to define the block for
#each
- Require
Changed
- upgraded
ecoportal-apigem - upgraded
ecoportal-api-v2gem
[0.4.5] - 2025-03-14
Added
- Query
actionCategories - Mutation create
Action
Changed
Actionmodel to havelocations(RS upgrade)
[0.4.4] - 2025-02-23
Changed
- Upgraded
ecoportal-apigem (maintanance) - Upgraded
ecoportal-api-v2gem (to provisionroot!class method) - Defined some models that hand on their own as
root! - Refactored
Base::Modelby moving its loggic toCommon::GraphQL
Fixed
Ecoportal::API::Common::GraphQL::HashHelpers- Truly make the iterator generic
[0.4.3] - 2024-11-21
Changed
- upgrade gems
ecoportal-apiecoportal-api-v2
Ecoportal::API::Common::GraphQL::HttpClient.newceased to defaultversiontov1(now it defaults tonil)
[0.4.2] - 2024-10-01
Changed
- upgrade gems
ecoportal-api-v2
- add explicit dependency onto
ecoportal-apigem (client)
[0.4.1] - 2024-08-09
Added
ContractorEntityadded fieldexternalId
Changed
- gem upgrade
ecoportal-api-v2
[0.4.0] - 2024-08-01
Changed
- require
ruby 3
[0.3.18] - 2024-05-16
Fixed
Ecoportal::API::GraphQL::Payload::LocationStructure::CommandExecutionResult- Error is nullable
[0.3.17] - 2024-05-14
Fixed
field_nameshould add up to the path
[0.3.16] - 2024-04-29
Added
- Exposed
graphqlContractorEntitydestroy
Fixed
- incorrect loading
Changed
- Input for ContractorEntity create moved as
update(as it wasn't correct)
[0.3.15] - 2024-04-13
Added
Ecoportal::API::GraphQL::Logic::BaseQuery::base_pathclass instance var.
- query to retrieve
currentOrganization.classifications
Fixed
- upgraded
ecoportal-api-v2gem
[0.3.14] - 2024-03-13
Added
- some benchmarking on
- core graphql base
query
- core graphql base
#parent_idto location node model
Changed
- upgraded
ecoportal-v2-apigem
Fixed
- Optimized
treeifyand locations structure class
[0.3.13] - 2024-02-03
Changed
- upgrade
ecoportal-api-v2
[0.3.12] - 2024-01-27
Added
- Exposed
graphqlActionupdateand get a singleaction
[0.3.11] - 2023-09-19
Added
- Exposed
graphqlContractorEntitycreateandupdate
[0.3.10] - 2023-08-12
Fixed
Ecopotal::API::GraphQL::Query::LocationStructurequeryin basic_block missed an explicitly declared parameter.
[0.3.9] - 2023-08-03
Added
Ecoportal::API::GraphQL::Logic::BaseQuery- Added support for default values.
[0.3.8] - 2023-07-18
Added
- Integration for archiving actions.
LocationNodeInterface-> support forclassificationsTreeifyto dump more data per node (classifications)
Fixed
- Silenced waning messages when redefining
Fragments
[0.3.7] - 2023-05-23
Fixed
Ecoportal::API::Common::GraphQL::Clientadjustedread_timeoutandwrite_timeoutto90seconds.
[0.3.6] - 2023-04-17
Changed
- Softened max version of gem dependencies
Fixed
Ecoportal::API::GraphQL::Fragment#definewas not removing previous constants- Changed check method to be
::const_defined?
- Changed check method to be
[0.3.5] - 2023-04-03
Fixed
Ecoportal::API::GraphQL::Helpers::LocationsTree#treeify- Make it real id-case-insensitive (parents in lower case were being missed due to this)
[0.3.4] - 2023-04-03
Added
Ecoportal::API::Common::GraphQL::AuthService#session_tokenadded token auto-renew functionality (when token expires in less than 90 minutes)#session_token_renewed
Fixed
- Enabled to specify
host(other thanlive.ecoportal.com) by the user
[0.3.3] - 2023-04-02
Fixed
Ecoportal::API::GraphQL::Base::LocationNodeadded attributearchivedToken
[0.3.2] - 2023-04-02
Changed
Ecoportal::API::GraphQL::Helpers::LocationsTree#treeifyadded support forarchived_token
[0.3.1] - 2023-03-09
Changed
- Upgraded core gem dependency
ecoportal-api-v2
[0.2.3] - 2023-02-27
Fixed
- Typo in tests LocationsStructures... should read
locationStructures
[0.2.2] - 2023-02-24
Fixed
- Build gem correctly
[0.2.1] - 2023-02-24
Changed
- Migrate from TagTrees to reporting structures (breaking change)
Added
- Basics for reporting structure mutations
[0.1.11] - 2022-11-29
Added
Ecoportal::API::GraphQL::Base::Mutation- Added
createContractorEntity
Changed
- upgraded
graphlientgem dependency (support for framents)- removed patch in this gem
- Slight internal refactor of
Ecoportal::API::GraphQL::Base::Query - Upgraded
ecoportal-api-v2gem dependency
[0.1.10] - 2022-09-29
Changed
- upgraded
ecoportal-api-v2gem dependency
Fixed
- Remove debugging message
[0.1.9] - 2022-09-26
Added
Ecoportal::API::GraphQL::Query::TagTree
Changed
- upgraded
ecoportal-api-v2gem dependency - added
Ecoportal::API::Common::GraphQL::QueryIntegration- restructured
Ecoportal::API::GraphQL::Model::Organizationclass
- restructured
- Patch on
Graphlient::Queryfor fragments support (pull request: https://github.com/ashkan18/graphlient/pull/94)
[0.1.8] - 2022-09-23
Added
currentOrganization.tagTreesquery
Changed
- upgraded
ecoportal-api-v2gem dependency - Restructured the
Queryinheritance chain to make things simpler
[0.1.6] - 2022-09-19
Fixed
- Call to private method
remove_constinEcoportal::API::GraphQL::Fragment#define
[0.1.5] - 2022-09-19
Added
- Patch
GraphQL::Query#append_nodeso we can use Fragments in blocks using___as start of the constant, and__for namespace separator- Issue/feature request: https://github.com/ashkan18/graphlient/issues/93
Ecoportal::API::GraphQL::Fragment#defineprovided that client scripts can create their own fragments in their own namespace- Exposed
Ecoportal::API::GraphQL#fragments - It will always (re)define in the
Fragmentroot namespace
- Exposed
[0.1.4] - 2022-09-16
Fixed
- Able to inject connection block to
each - Error handling delegated to parent class (
QueryConnection) - Retrieve
idon elements ofArray
[0.1.3] - 2022-09-15
Fixed
- Fixed circular reference to
org_idinEcoportal::API::Common::GraphQL::Client
[0.1.2] - 2022-09-15
Changed
Ecoportal::API::GraphQLadddedemailandpassparameters on initialization- This allows for integration in some client lib
[0.1.0] - 2022-09-15
Added
- First commit with some basic structure