ecoportal-api-oozes 0.5.5 → 0.5.6

Sign up to get free protection for your applications and to get access to all the features.
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