ecoportal-api-oozes 0.5.5 → 0.5.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f6ecefc83d30f273a4ededb781765cde494d5e6e0facad8a501fc6ef023e73ee
4
- data.tar.gz: b1e0b4dab879d237580bb4d599ea500fe7a5154f6f7f874e418360bfefc9700d
3
+ metadata.gz: 3b995a0d1c80408bc83f797ffe14f0bf8457d1e1be99eac780f3924c19d6efbe
4
+ data.tar.gz: f06fae1cf1aaf5fbcc7fdc102a3f78f55da137d3ab9c5f12a5852c6d74d99af3
5
5
  SHA512:
6
- metadata.gz: 98694b883b97f35fc71c0633717d92ec9da2704bd6d63c824a38c43eca512645ab6f3ecd77924d41ae527d112ffc36fcc4190f82e06b4b6453d21ccca44de22d
7
- data.tar.gz: 9ef14de17795590c48d3b3cb0a6e2ba96be3b1d1ff76cee959a1860cbf1689d17b0551842352b7326094d1c8071a8569cf58c6b8feb5dd8933da8cd6a69521fc
6
+ metadata.gz: a2cf8d4e48892f6f31e6b852f8aeff840af65729d5d811596561f4841d77a2063a23d2dd0b111a67a1e8feafee12cf892c02fa4acab46e1b3a55af39554ab54e
7
+ data.tar.gz: 3fe6beb0b48d961544e227328eeb43676470feab25a0713987cab4d4a44d0ec52a52f8f512a27be183efdbd1de4ac8cdddccd929ddbe859f8e1169ee3107bb95
@@ -5,7 +5,7 @@ require "ecoportal/api/v2/version"
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "ecoportal-api-oozes"
8
- spec.version = Ecoportal::API::V2::VERSION
8
+ spec.version = Ecoportal::API::V2::GEM_VERSION
9
9
  spec.authors = ["Oscar Segura"]
10
10
  spec.email = ["rien@ecoportal.co.nz", "oscar@ecoportal.co.nz", "bozydar@ecoportal.co.nz"]
11
11
 
@@ -6,5 +6,5 @@ module Ecoportal
6
6
  end
7
7
  end
8
8
 
9
- require "ecoportal/api/common"
10
- require "ecoportal/api/v2"
9
+ require_relative "api/common"
10
+ require_relative "api/v2"
@@ -30,6 +30,13 @@ module Ecoportal
30
30
  (a.order_matters? == b.order_matters?) && (a.uniq? == b.uniq?)
31
31
  end
32
32
 
33
+ # Creates a new object with `doc` where `original_doc` is `[]`
34
+ def create(doc)
35
+ self.new([]).tap do |page|
36
+ page.replace_doc(doc)
37
+ end
38
+ end
39
+
33
40
  end
34
41
 
35
42
  def initialize(doc = {}, parent: self, key: nil)
@@ -80,6 +80,13 @@ module Ecoportal
80
80
  end
81
81
  end
82
82
 
83
+ # Creates a new object with `doc` where `original_doc` is `[]`
84
+ def create(doc)
85
+ self.new([]).tap do |page|
86
+ page.replace_doc(doc)
87
+ end
88
+ end
89
+
83
90
  end
84
91
 
85
92
  include Enumerable
@@ -153,6 +153,14 @@ module Ecoportal
153
153
 
154
154
  embeds_one(method, key: key, multiple: true, klass: dim_class)
155
155
  end
156
+
157
+ # Creates a new object with `doc` where `original_doc` is `{}`
158
+ def create(doc)
159
+ self.new({}).tap do |page|
160
+ page.replace_doc(doc)
161
+ end
162
+ end
163
+
156
164
  end
157
165
 
158
166
  attr_reader :_parent, :_key
@@ -250,16 +258,6 @@ module Ecoportal
250
258
  # self
251
259
  #end
252
260
 
253
- protected
254
-
255
- def is_root?
256
- _parent == self && !!defined?(@doc)
257
- end
258
-
259
- def linked?
260
- is_root? || !!_parent.doc
261
- end
262
-
263
261
  def replace_doc(new_doc)
264
262
  raise UnlinkedModel.new(from: "#{self.class}#replace_doc", key: _key) unless linked?
265
263
  if is_root?
@@ -271,6 +269,16 @@ module Ecoportal
271
269
  end
272
270
  end
273
271
 
272
+ protected
273
+
274
+ def is_root?
275
+ _parent == self && !!defined?(@doc)
276
+ end
277
+
278
+ def linked?
279
+ is_root? || !!_parent.doc
280
+ end
281
+
274
282
  def replace_original_doc(new_doc)
275
283
  raise UnlinkedModel.new(from: "#{self.class}#replace_original_doc", key: _key) unless linked?
276
284
  if is_root?
@@ -31,6 +31,8 @@ module Ecoportal
31
31
  # 3. the `data` property holds the specific changes of the object
32
32
  # - the `patch_ver` (compulsory) is **incremental** (for data integrity)
33
33
  # - the properties that have changed
34
+ # @note
35
+ # * there should not be difference between `null` and `""` (empty string)
34
36
  # @param a [Hash] current hash model
35
37
  # @param b [Hash] previous hash model
36
38
  # @return [Hash] a `patch data`
@@ -51,12 +53,19 @@ module Ecoportal
51
53
 
52
54
  private
53
55
 
56
+ def equal_values(a, b)
57
+ if a.is_a?(String) || b.is_a?(String)
58
+ return true if a.to_s.strip.empty? && b.to_s.strip.empty?
59
+ end
60
+ a == b
61
+ end
62
+
54
63
  def patch_data(a, b = nil)
55
64
  {}.tap do |data_hash|
56
65
  a.each do |key, a_value|
57
66
  b_value = b[key] if b_has_key = b && b.key?(key)
58
67
  is_meta_key = META_KEYS.include?(key)
59
- skip_equals = b_has_key && a_value == b_value
68
+ skip_equals = b_has_key && equal_values(a_value, b_value)
60
69
  next if is_meta_key || skip_equals
61
70
  data_hash[key] = patch_diff(a_value, b_value)
62
71
  data_hash.delete(key) if data_hash[key] == NO_CHANGES
@@ -106,7 +115,7 @@ module Ecoportal
106
115
  else
107
116
  a
108
117
  end
109
- else
118
+ else # array with nested elements
110
119
  a_ids = array_ids(a)
111
120
  b_ids = array_ids(b)
112
121
 
@@ -116,19 +125,20 @@ module Ecoportal
116
125
 
117
126
  arr_delete = del_ids.map do |id|
118
127
  patch_delete(array_id_item(b, id))
119
- end
128
+ end.compact
120
129
 
121
130
  arr_update = oth_ids.map do |id|
122
131
  patch_update(array_id_item(a, id), array_id_item(b, id))
123
- end
132
+ end.compact
124
133
 
125
134
  arr_new = new_ids.map do |id|
126
135
  patch_new(array_id_item(a, id))
127
- end
136
+ end.compact
128
137
 
129
138
  (arr_delete.concat(arr_update).concat(arr_new)).tap do |patch_array|
130
139
  # remove data with no `id`
131
140
  patch_array.reject! {|item| !item.is_a?(Hash)}
141
+ return NO_CHANGES if patch_array.empty?
132
142
  end
133
143
  end
134
144
  end
@@ -45,4 +45,3 @@ end
45
45
 
46
46
  require 'ecoportal/api/v2/registers'
47
47
  require 'ecoportal/api/v2/pages'
48
- #require 'ecoportal/api/v2/stages'
@@ -2,6 +2,7 @@ module Ecoportal
2
2
  module API
3
3
  class V2
4
4
  class Page < Common::Content::DoubleModel
5
+ ALLOWED_KEYS = %w[id patch_ver name template_id base_tags tags time_zone created_at updated_at can components sections stages]
5
6
  passkey :id
6
7
  passthrough :patch_ver
7
8
  passthrough :name, :template_id
@@ -17,6 +18,17 @@ module Ecoportal
17
18
  embeds_one :components, multiple: true, klass: :components_class
18
19
  embeds_one :sections, multiple: true, klass: :sections_class
19
20
  embeds_one :stages, multiple: true, klass: :stages_class
21
+
22
+ def as_update
23
+ super.tap do |hash|
24
+ unless !hash
25
+ hash["data"].select! do |key, value|
26
+ ALLOWED_KEYS.include?(key)
27
+ end
28
+ end
29
+ end
30
+ end
31
+
20
32
  end
21
33
  end
22
34
  end
@@ -4,8 +4,8 @@ module Ecoportal
4
4
  class Page
5
5
  class Component
6
6
  class ActionField < Page::Component
7
- class_resolver :action_class, "Ecoportal::API::V2::Page::Component::Action"
8
- embeds_multiple :actions, klass: :action_class, order_key: :weight
7
+ #class_resolver :action_class, "Ecoportal::API::V2::Page::Component::Action"
8
+ embeds_multiple :actions, klass: "Ecoportal::API::V2::Page::Component::Action", order_key: :weight
9
9
  end
10
10
  end
11
11
  end
@@ -4,8 +4,8 @@ module Ecoportal
4
4
  class Page
5
5
  class Component
6
6
  class ChecklistField < Page::Component
7
- class_resolver :checklist_item_class, "Ecoportal::API::V2::Page::Component::ChecklistItem"
8
- embeds_multiple :items, klass: :checklist_item_class, order_key: :weight
7
+ #class_resolver :checklist_item_class, "Ecoportal::API::V2::Page::Component::ChecklistItem"
8
+ embeds_multiple :items, klass: "Ecoportal::API::V2::Page::Component::ChecklistItem", order_key: :weight
9
9
  end
10
10
  end
11
11
  end
@@ -4,8 +4,8 @@ module Ecoportal
4
4
  class Page
5
5
  class Component
6
6
  class FilesField < Page::Component
7
- class_resolver :file_class, "Ecoportal::API::V2::Page::File"
8
- embeds_multiple :items, klass: :file_class, order_key: :position
7
+ #class_resolver :file_class, "Ecoportal::API::V2::Page::File"
8
+ embeds_multiple :items, klass: "Ecoportal::API::V2::Page::File", order_key: :position
9
9
  end
10
10
  end
11
11
  end
@@ -4,8 +4,8 @@ module Ecoportal
4
4
  class Page
5
5
  class Component
6
6
  class ImagesField < Page::Component
7
- class_resolver :image_class, "Ecoportal::API::V2::Page::Image"
8
- embeds_multiple :images, klass: :image_class, order_key: :weight
7
+ #class_resolver :image_class, "Ecoportal::API::V2::Page::Image"
8
+ embeds_multiple :images, klass: "Ecoportal::API::V2::Page::Image", order_key: :weight
9
9
  end
10
10
  end
11
11
  end
@@ -5,6 +5,11 @@ module Ecoportal
5
5
  class Component
6
6
  class PeopleField < Page::Component
7
7
  passarray :people_ids
8
+
9
+ def add(id)
10
+ people_ids << id
11
+ end
12
+
8
13
  end
9
14
  end
10
15
  end
@@ -6,8 +6,33 @@ module Ecoportal
6
6
  class SelectionField < Page::Component
7
7
  passthrough :multiple, :other, :other_desc
8
8
 
9
- class_resolver :selection_option_class, "Ecoportal::API::V2::Page::Component::SelectionOption"
10
- embeds_multiple :options, klass: :selection_option_class, order_key: :weight
9
+ #class_resolver :selection_option_class, "Ecoportal::API::V2::Page::Component::SelectionOption"
10
+ embeds_multiple :options, klass: "Ecoportal::API::V2::Page::Component::SelectionOption", order_key: :weight
11
+
12
+ def select(value)
13
+ opt = options.find {|opt| opt.value == value}
14
+ sel = selected
15
+ return true if !multiple && opt == sel
16
+ sel.selected = false if !multiple && sel
17
+ opt.selected = true unless !opt
18
+ end
19
+
20
+ def selected
21
+ if multiple
22
+ options.select {|opt| opt.selected}
23
+ else
24
+ options.find {|opt| opt.selected}
25
+ end
26
+ end
27
+
28
+ def value
29
+ if multiple
30
+ selected.map {|opt| opt.value}
31
+ else
32
+ selected&.value
33
+ end
34
+ end
35
+
11
36
  end
12
37
  end
13
38
  end
@@ -13,6 +13,20 @@ module Ecoportal
13
13
 
14
14
  order_matters = true
15
15
 
16
+ def get_by_type(type)
17
+ self.select do |comp|
18
+ comp.type.downcase == type.to_s.strip.downcase
19
+ end
20
+ end
21
+
22
+ def get_by_name(name, type: nil)
23
+ pool = type ? get_by_type(type) : self
24
+
25
+ pool.select do |comp|
26
+ comp.label.to_s.strip.downcase == name.to_s.strip.downcase
27
+ end.first
28
+ end
29
+
16
30
  end
17
31
  end
18
32
  end
@@ -7,6 +7,18 @@ module Ecoportal
7
7
 
8
8
  self.klass = :stage_class
9
9
 
10
+ def get_by_name(name)
11
+ find do |stage|
12
+ stage.name.strip.downcase == name.to_s.strip.downcase
13
+ end
14
+ end
15
+
16
+ def sections
17
+ section_ids.map do |id|
18
+ root.sections.find {|sec| sec.id == id}
19
+ end
20
+ end
21
+
10
22
  end
11
23
  end
12
24
  end
@@ -3,9 +3,11 @@ module Ecoportal
3
3
  class V2
4
4
  # @attr_reader client [Common::Client] a `Common::Client` object that holds the configuration of the api connection.
5
5
  class Pages
6
+ STAGE_REX = /stages\/(?<sid>.*)/
6
7
  extend Common::BaseClass
7
8
  include Common::Content::DocHelpers
8
9
 
10
+ class_resolver :stages_class, "Ecoportal::API::V2::Pages::Stages"
9
11
  class_resolver :page_class, "Ecoportal::API::V2::Page"
10
12
 
11
13
  attr_reader :client
@@ -16,14 +18,30 @@ module Ecoportal
16
18
  @client = client
17
19
  end
18
20
 
21
+ # Obtain specific object for pages api requests.
22
+ # @return [V2::Pages::Stages] an instance object ready to make pages api requests.
23
+ def stages
24
+ stages_class.new(client)
25
+ end
26
+
19
27
  # Gets a page via api.
20
- # @note if the request has `success?` the returned `object.result` gives an object with that `Page`.
28
+ # @note
29
+ # - if the request has `success?` the returned `object.result` gives an object with that `Page`.
30
+ # - if it failed to obtain the full page, it returns a `PageStage` with the active stage data.
21
31
  # @param doc [String, Hash, Page] data containing an `id` of the target page.
22
- # @return [Ecoportal::API::V2::Page] the target page.
32
+ # @return [Ecoportal::API::V2::Page, Ecoportal::API::V2::Pages::PageStage] the target page.
23
33
  def get(doc)
24
- id = get_id(doc)
25
- response = client.get("/pages/#{CGI.escape(id)}")
26
- Common::Content::WrappedResponse.new(response, page_class).result
34
+ pid = get_id(doc)
35
+ response = client.get("/pages/#{CGI.escape(pid)}")
36
+ wrapped = Common::Content::WrappedResponse.new(response, page_class)
37
+
38
+ return wrapped.result if wrapped.success?
39
+ if (response.status == 302) && (url = response.body["data"])
40
+ if sid = url_to_stage_id(url)
41
+ return stages.get(pid: pid, sid: sid)
42
+ end
43
+ end
44
+ raise "Could not get page #{id} - Error #{response.status}: #{response.body}"
27
45
  end
28
46
 
29
47
  # Gets a `new` non-existing page via api with all the ids initialized.
@@ -32,8 +50,11 @@ module Ecoportal
32
50
  def get_new(from)
33
51
  id = get_id(from)
34
52
  response = client.get("/pages/new", params: {template_id: id})
35
- # TODO: make it so the obtained `doc` can be used as `doc`, yet `source_doc` to be empty {}
36
- #Common::Content::WrappedResponse.new(response, page_class).result
53
+ wrapped = Common::Content::WrappedResponse.new(response, page_class)
54
+
55
+ return wrapped.result if wrapped.success?
56
+ #return page_class.create(response.body["data"]) if response.success?
57
+ raise "Could not get new page from template #{id} - Error #{response.status}: #{response.body}"
37
58
  end
38
59
 
39
60
  # Requests a creation of a page via api.
@@ -55,9 +76,16 @@ module Ecoportal
55
76
  client.patch("/pages/#{CGI.escape(id)}", data: body)
56
77
  end
57
78
 
79
+ private
80
+
81
+ def url_to_stage_id(url)
82
+ (matches = url.match(STAGE_REX)) && matches[:sid]
83
+ end
84
+
58
85
  end
59
86
  end
60
87
  end
61
88
  end
62
89
 
63
90
  require 'ecoportal/api/v2/page'
91
+ require 'ecoportal/api/v2/pages/stages'
@@ -0,0 +1,11 @@
1
+ module Ecoportal
2
+ module API
3
+ class V2
4
+ class Pages
5
+ class PageStage < V2::Page
6
+
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,52 @@
1
+ module Ecoportal
2
+ module API
3
+ class V2
4
+ class Pages
5
+ # This API Integration level has been added due to relative permissions
6
+ # - a **user** with api access may have access to a specific `stage` but not to the full `page`
7
+ #
8
+ # @attr_reader client [Common::Client] a `Common::Client` object that holds the configuration of the api connection.
9
+ class Stages
10
+ extend Common::BaseClass
11
+ include Common::Content::DocHelpers
12
+
13
+ class_resolver :page_stage_class, "Ecoportal::API::V2::Pages::PageStage"
14
+
15
+ attr_reader :client
16
+
17
+ # @param client [Common::Client] a `Common::Client` object that holds the configuration of the api connection.
18
+ # @return [Schemas] an instance object ready to make schema api requests.
19
+ def initialize(client)
20
+ @client = client
21
+ end
22
+
23
+ # Gets a stage via api.
24
+ # @note if the request has `success?` the returned `object.result` gives an object with that `Stage`.
25
+ # @param doc [String, Hash, Stage] data containing an `id` of the target page.
26
+ # @return [Ecoportal::API::V2::Stage, Ecoportal::API::V2::Pages::PageStage] the target stage.
27
+ def get(pid:, sid:)
28
+ pid = get_id(pid)
29
+ response = client.get("/pages/#{CGI.escape(pid)}/stages/#{CGI.escape(sid)}/")
30
+ wrapped = Common::Content::WrappedResponse.new(response, page_stage_class)
31
+
32
+ return wrapped.result if wrapped.success?
33
+ raise "Could not get stage {#{sid}} of page #{pid} - Error #{response.status}: #{response.body}"
34
+ end
35
+
36
+ # Requests to update an existing stage via api.
37
+ # @param doc [Hash, Stage] data that at least contains an `id` (internal or external) of the target stage.
38
+ # @return [Response] an object with the api response.
39
+ def update(doc, pid: nil, sid:)
40
+ body = get_body(doc)
41
+ pid = pid || get_id(doc)
42
+ path = "/pages/#{CGI.escape(pid)}/stages/#{CGI.escape(sid)}/"
43
+ client.patch(path, data: body)
44
+ end
45
+
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ require 'ecoportal/api/v2/pages/page_stage'
@@ -1,7 +1,7 @@
1
1
  module Ecoportal
2
2
  module API
3
3
  class V2
4
- VERSION = "0.5.5"
4
+ GEM_VERSION = "0.5.6"
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ecoportal-api-oozes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.5
4
+ version: 0.5.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oscar Segura
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-03-30 00:00:00.000000000 Z
11
+ date: 2020-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -189,6 +189,8 @@ files:
189
189
  - lib/ecoportal/api/v2/page/stage.rb
190
190
  - lib/ecoportal/api/v2/page/stages.rb
191
191
  - lib/ecoportal/api/v2/pages.rb
192
+ - lib/ecoportal/api/v2/pages/page_stage.rb
193
+ - lib/ecoportal/api/v2/pages/stages.rb
192
194
  - lib/ecoportal/api/v2/register.rb
193
195
  - lib/ecoportal/api/v2/registers.rb
194
196
  - lib/ecoportal/api/v2/template.rb