springcm-sdk 0.6.1 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d7d75a3305c25f460d0344253f9f38c072a2bfbe654d8d12a9367dfb5d305f8a
4
- data.tar.gz: '048dace2594c405e3738d5d8fc67dc90014a1e601dc2d6e49cb3fa6553188ae2'
3
+ metadata.gz: bda471ab4007cc6a9f27e8be3fa16e9f4081520bcdf456413be1e45b202969b5
4
+ data.tar.gz: 52b63c7b43d2a9f4256f2925d4b028c4c493a255315651b93ade97e2a63d2435
5
5
  SHA512:
6
- metadata.gz: 07fe708519c5427679d0b1e563c78d7bcf7559e4a59944b3e2fe106bebec7819c3988423b9f9ab9b2b937ee771649956014148518034ece12bda8bc228fb2fd7
7
- data.tar.gz: 7bd8f1a6d76a10cf4961f48a0d2c42b92ee4aac63000cb0264f76ae05b76ee3de9c659c6125733600d3f3d44bf4f75f61e206a7b7fe5101eaed7c090719ffc42
6
+ metadata.gz: d7c365620c4b7c556c8f1eabf0c89800331bc47d40fd78650e0733c907d1462013d6d527cfb0fadf02df20acc2c922368ccb16c4c3639255fcd040f276fd5178
7
+ data.tar.gz: 8ebe53f6ea3e116f90bdc6b6d153531ce21edaf55c012ab74e7c772ddbd82f72cfd933cbb951f42e1d2e2a4b1d7bcfaa6b57ba9598ce7e480f4b24516eb67253
data/.gitignore CHANGED
@@ -3,3 +3,4 @@ springcm-sdk-*.gem
3
3
  coverage
4
4
  .yardoc
5
5
  doc
6
+ **/.DS_Store
data/CHANGELOG.md CHANGED
@@ -3,6 +3,16 @@
3
3
  All notable changes to springcm-sdk will be documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
+
7
+ ## [1.0.0] - 2020-02-14 ❤️
8
+ ### Added
9
+ * Setting object JSON properties
10
+ * New API for retrieving and modifying applied attributes on documents and folders
11
+ * Folders now include attribute API.
12
+
13
+ ### Removed
14
+ * Old attribute API
15
+
6
16
  ## [0.6.1] - 2020-01-13
7
17
  ### Changed
8
18
  * Fix bug with set_attribute on repeatable set data when attribute group is not already applied - empty array of items is created.
@@ -145,3 +155,4 @@ All notable changes to springcm-sdk will be documented in this file.
145
155
  [0.5.0]: https://github.com/paulholden2/springcm-sdk/releases/tag/0.5.0
146
156
  [0.6.0]: https://github.com/paulholden2/springcm-sdk/releases/tag/0.6.0
147
157
  [0.6.1]: https://github.com/paulholden2/springcm-sdk/releases/tag/0.6.1
158
+ [1.0.0]: https://github.com/paulholden2/springcm-sdk/releases/tag/1.0.0
@@ -37,6 +37,15 @@ module Springcm
37
37
  end
38
38
  end
39
39
 
40
+ def attribute_group(name: nil, uid: nil)
41
+ if (name.nil? && uid.nil?) || (!name.nil? && !uid.nil?)
42
+ raise ArgumentError.new("Specify exactly one of: name, uid")
43
+ end
44
+ all_attribute_groups.select { |group|
45
+ (!name.nil? && group.name == name) || (!uid.nil? && group.uid == uid)
46
+ }.first
47
+ end
48
+
40
49
  private
41
50
 
42
51
  def load_all_attribute_groups
@@ -0,0 +1,50 @@
1
+ require "springcm-sdk/object"
2
+
3
+ module Springcm
4
+ class AppliedAttributeField < Object
5
+ attr_reader :subject
6
+ attr_reader :group
7
+ attr_reader :set
8
+ attr_reader :name
9
+
10
+ def initialize(data, field_name, subject, group, set, client)
11
+ @subject = subject
12
+ @group = group
13
+ @set = set
14
+ @name = field_name
15
+ super(data, client)
16
+ end
17
+
18
+ def value
19
+ if repeating_attribute == true
20
+ raise RepeatableAttributeFieldUsageError.new(group.name, name)
21
+ else
22
+ Helpers.deserialize_field(raw)
23
+ end
24
+ end
25
+
26
+ def value=(val)
27
+ if repeating_attribute == true
28
+ raise RepeatableAttributeFieldUsageError.new(group.name, name)
29
+ else
30
+ @data["Value"] = Helpers.serialize_value(@data["AttributeType"], val)
31
+ end
32
+ end
33
+
34
+ def [](*args)
35
+ if repeating_attribute == true
36
+ Helpers.deserialize_value(@data["AttributeType"], @data["Value"].send(:[], *args))
37
+ else
38
+ raise NonRepeatableAttributeFieldUsageError.new(group.name, name)
39
+ end
40
+ end
41
+
42
+ def []=(key, val)
43
+ if repeating_attribute == true
44
+ @data["Value"].send(:[]=, key, val)
45
+ else
46
+ raise NonRepeatableAttributeFieldUsageError.new(group.name, name)
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,37 @@
1
+ require "springcm-sdk/object"
2
+ require "springcm-sdk/applied_attribute_set"
3
+
4
+ module Springcm
5
+ class AppliedAttributeGroup < Object
6
+ attr_reader :subject
7
+ attr_reader :name
8
+
9
+ def initialize(data, group_name, subject, client)
10
+ @subject = subject
11
+ @name = group_name
12
+ super(data, client)
13
+ end
14
+
15
+ def set(set_name)
16
+ set_data = raw[set_name]
17
+ if set_data.nil? || set_data["AttributeType"] != "Set"
18
+ raise NoAttributeSetError.new(group.name, name)
19
+ end
20
+ AppliedAttributeSet.new(set_data, set_name, subject, self, @client)
21
+ end
22
+
23
+ def field(field_name)
24
+ group_config = @client.account.attribute_group(name: name)
25
+ set_config = group_config.set_for_field(field_name)
26
+ field_data = nil
27
+ if set_config.nil?
28
+ field_data = raw[field_name]
29
+ elsif set_config.repeating_attribute?
30
+ raise RepeatableAttributeSetUsageError.new(group.name, name)
31
+ else
32
+ field_data = raw[set_config.name]["Attributes"][field_name]
33
+ end
34
+ AppliedAttributeField.new(field_data, field_name, subject, self, nil, @client)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,54 @@
1
+ require "springcm-sdk/object"
2
+ require "springcm-sdk/applied_attribute_set_item"
3
+ require "springcm-sdk/applied_attribute_field"
4
+
5
+ module Springcm
6
+ class AppliedAttributeSet < Object
7
+ attr_reader :subject
8
+ attr_reader :group
9
+ attr_reader :name
10
+
11
+ def initialize(data, set_name, subject, group, client)
12
+ @subject = subject
13
+ @group = group
14
+ @name = set_name
15
+ super(data, client)
16
+ end
17
+
18
+ def field(field_name)
19
+ # Validate name not one of the restricted attribute names:
20
+ # RepeatingAttribute, AttributeType
21
+ field_data = raw[field_name]
22
+ # puts field_data
23
+ if repeating_attribute == true
24
+ raise RepeatableAttributeSetUsageError.new(group.name, name)
25
+ else
26
+ AppliedAttributeField.new(field_data, field_name, subject, group, self, @client)
27
+ end
28
+ end
29
+
30
+ def [](*args)
31
+ if repeating_attribute == true
32
+ item = @data["Items"].send(:[], *args)
33
+ AppliedAttributeSetItem.new(item, subject, group, self, @client)
34
+ else
35
+ raise NonRepeatableAttributeSetUsageError.new(group.name, name)
36
+ end
37
+ end
38
+
39
+ def []=(key, data)
40
+ if repeating_attribute == true
41
+ raise NonRepeatableAttributeSetUsageError.new(group.name, name)
42
+ end
43
+ group_config = @client.account.attribute_group(name: group.name)
44
+ set = group_config.set(name)
45
+ item = @data["Items"][key]
46
+ item.clear
47
+ data.each { |key, value|
48
+ field_config = group_config.field(key)
49
+ item[key] = Helpers.serialize_field(field_config, value)
50
+ }
51
+ item
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,23 @@
1
+ require "springcm-sdk/object"
2
+ require "springcm-sdk/applied_attribute_field"
3
+
4
+ module Springcm
5
+ class AppliedAttributeSetItem < Object
6
+ attr_reader :subject
7
+ attr_reader :group
8
+ attr_reader :name
9
+
10
+ def initialize(data, subject, group, set, client)
11
+ @subject = subject
12
+ @group = group
13
+ super(data, client)
14
+ end
15
+
16
+ def field(field_name)
17
+ # Validate name not one of the restricted attribute names:
18
+ # RepeatingAttribute, AttributeType
19
+ field_data = raw[field_name]
20
+ AppliedAttributeField.new(field_data, field_name, subject, group, set, @client)
21
+ end
22
+ end
23
+ end
@@ -53,6 +53,40 @@ module Springcm
53
53
  }
54
54
  end
55
55
 
56
+ def template
57
+ group = {}
58
+ attributes_config.each { |attribute|
59
+ type = attribute["Type"]
60
+ if type == "DynamicDropDown"
61
+ type = "MagicDropdown" # Not sure why they do this for applied groups, but oh well
62
+ end
63
+ repeating = attribute["RepeatingAttribute"]
64
+ attr = {
65
+ "AttributeType" => type,
66
+ "RepeatingAttribute" => repeating
67
+ }
68
+ if attribute.key?("Attributes") # If it's a set
69
+ attr["AttributeType"] = "Set"
70
+ set = attr
71
+ if repeating
72
+ set = {}
73
+ attr["Items"] = [set]
74
+ end
75
+ attribute["Attributes"].each { |field|
76
+ set[field["Name"]] = {
77
+ "AttributeType" => field["Type"],
78
+ "RepeatingAttribute" => false
79
+ }
80
+ }
81
+ elsif repeating
82
+ # Must have empty array for repeating plain fields
83
+ attr["Value"] = []
84
+ end
85
+ group[attribute["Name"]] = attr
86
+ }
87
+ group
88
+ end
89
+
56
90
  protected
57
91
 
58
92
  def attributes_config
@@ -1,4 +1,5 @@
1
1
  require "springcm-sdk/resource"
2
+ require "springcm-sdk/applied_attribute_group"
2
3
  require "springcm-sdk/mixins/access_level"
3
4
  require "springcm-sdk/mixins/attributes"
4
5
  require "springcm-sdk/mixins/parent_folder"
@@ -13,6 +13,7 @@ module Springcm
13
13
  include Springcm::Mixins::AccessLevel
14
14
  include Springcm::Mixins::ParentFolder
15
15
  include Springcm::Mixins::Documents
16
+ include Springcm::Mixins::Attributes
16
17
 
17
18
  def self.resource_params
18
19
  {
@@ -11,6 +11,15 @@ module Springcm
11
11
  end
12
12
  end
13
13
 
14
+ def self.serialize_value(type, value)
15
+ if type == "Date"
16
+ # Raise if value is not a DateTime
17
+ serialized_value = value.strftime("%m/%d/%Y")
18
+ else
19
+ serialized_value = value.to_s
20
+ end
21
+ end
22
+
14
23
  def self.serialize_field(field_config, value)
15
24
  type = field_config.type
16
25
  name = field_config.name
@@ -19,22 +28,13 @@ module Springcm
19
28
  "AttributeType" => type,
20
29
  "RepeatingAttribute" => repeating
21
30
  }
22
- serialized_value = nil
23
- if type == "Date"
24
- # Raise if value is not a DateTime
25
- serialized_value = value.strftime("%m/%d/%Y")
26
- else
27
- serialized_value = value.to_s
31
+ if !value.nil?
32
+ serialized["Value"] = Helpers.serialize_value(type, value)
28
33
  end
29
- return nil if serialized_value.nil?
30
- serialized["Value"] = serialized_value
31
34
  serialized
32
35
  end
33
36
 
34
- # Deserialize a SpringCM attribute value
35
- def self.deserialize_field(field)
36
- type = field["AttributeType"]
37
- value = field["Value"]
37
+ def self.deserialize_value(type, value)
38
38
  if type == "String"
39
39
  value
40
40
  elsif type == "Number"
@@ -48,6 +48,13 @@ module Springcm
48
48
  end
49
49
  end
50
50
 
51
+ # Deserialize a SpringCM attribute value
52
+ def self.deserialize_field(field)
53
+ type = field["AttributeType"]
54
+ value = field["Value"]
55
+ Helpers.deserialize_value(type, value)
56
+ end
57
+
51
58
  def self.validate_access!(access)
52
59
  access_types = [
53
60
  :inherit_from_parent_folder,
@@ -1,3 +1,7 @@
1
+ require "springcm-sdk/applied_attribute_group"
2
+ require "springcm-sdk/applied_attribute_set"
3
+ require "springcm-sdk/applied_attribute_set_item"
4
+ require "springcm-sdk/applied_attribute_field"
1
5
  require "springcm-sdk/helpers"
2
6
 
3
7
  module Springcm
@@ -8,99 +12,24 @@ module Springcm
8
12
  @data["AttributeGroups"] = value
9
13
  end
10
14
 
11
- # TODO: Clean this whole mess up. This pattern sucks. Better:
12
- # doc = client.document(...)
13
- # group = doc.attribute_group("My Data")
14
- # attr = group.attribute("My Field")
15
- # attr.type
16
- # attr.repeating?
17
- # attr.value
18
- # attr.value = 2
19
- # attr.value = [1, 2, 3]
20
- # attr.value[0] = 3
21
- # attr.insert(at: 0, value: 5)
22
- # doc.patch
23
-
24
- def set_attribute(group:, field:, index: nil, value:, mode: :insert)
25
- if ![:insert, :replace].include?(mode)
26
- raise ArgumentError.new("Set attribute mode must be one of: :insert, :replace")
27
- end
28
- if mode == :replace && (index.nil? || index < 0)
29
- raise ArgumentError.new("When set attribute mode is :replace, index must be a non-negative integer")
30
- end
31
- group_config = @client.account.all_attribute_groups.select { |g|
32
- g.name == group
33
- }.first
34
- # Non-existent group
35
- raise Springcm::NoAttributeGroupError.new(group) if group_config.nil?
36
- field_config = group_config.field(field)
37
- field_set_config = group_config.set_for_field(field)
38
- # Non-existent field
39
- raise Springcm::NoAttributeFieldError.new(group, field) if field_config.nil?
40
- groups = attribute_groups || {}
41
- group_data = groups.fetch(group, {})
42
- # Repeating set
43
- if !field_set_config.nil? && field_set_config["RepeatingAttribute"]
44
- set_name = field_set_config["Name"]
45
- set_data = group_data.fetch(set_name, { "Items"=>[] })
46
- field_data = {
47
- "#{field}" => Springcm::Helpers.serialize_field(field_config, value)
48
- }
49
- if mode == :insert
50
- set_data["Items"].insert(index || -1, field_data)
51
- elsif
52
- set = set_data["Items"][index] || {}
53
- set.merge!(field_data)
54
- end
55
- set_data["Items"][index] = set
56
- set_data["Items"].reject!(&:nil?)
57
- group_data[set_name] = set_data
15
+ def attribute_group(group_name)
16
+ groups = @data["AttributeGroups"] || get.attribute_groups || {}
17
+ group_data = groups[group_name]
18
+ if group_data.nil?
19
+ nil
58
20
  else
59
- serialized = Springcm::Helpers.serialize_field(field_config, value)
60
- if field_config.repeating_attribute?
61
- if mode == :insert
62
- group_data[field]["Value"].insert(index || -1, serialized["Value"])
63
- else
64
- group_data[field]["Value"][index] = serialized["Value"]
65
- end
66
- group_data[field]["Value"].reject!(&:nil?)
67
- else
68
- group_data[field] = serialized
69
- end
21
+ AppliedAttributeGroup.new(group_data, group_name, self, @client)
70
22
  end
71
- groups[group] = group_data
72
- attribute_groups = groups
73
- value
74
23
  end
75
24
 
76
- def get_attribute(group:, field:)
77
- group_config = @client.account.all_attribute_groups.select { |g|
78
- g.name == group
79
- }.first
80
- # Non-existent group
81
- raise Springcm::NoAttributeGroupError.new(group) if group_config.nil?
82
- field_config = group_config.field(field)
83
- field_set_config = group_config.set_for_field(field)
84
- # Non-existent field
85
- raise Springcm::NoAttributeFieldError.new(group, field) if field_config.nil?
86
- groups = attribute_groups
87
- # No attribute groups applied
88
- return nil if groups.nil?
89
- group_data = groups.fetch(group, nil)
90
- # Group is not applied
91
- return nil if group_data.nil?
92
- # Repeating set
93
- if !field_set_config.nil? && field_set_config["RepeatingAttribute"]
94
- set_data = group_data.fetch(field_set_config["Name"], nil)
95
- return nil if set_data.nil?
96
- set_data["Items"].map { |item|
97
- Springcm::Helpers.deserialize_field(item[field])
98
- }
99
- else
100
- field_data = group_data.fetch(field, nil)
101
- return nil if field_data.nil?
102
- Springcm::Helpers.deserialize_field(field_data)
103
- end
25
+ # Apply a skeleton attribute group to the Document object. Calling #patch
26
+ # or #put before actually applying any data will have no effect on the
27
+ # document within SpringCM.
28
+ def apply_attribute_group(group_name)
29
+ return if !attribute_group(group_name).nil?
30
+ group_config = @client.account.attribute_group(name: group_name)
31
+ @data["AttributeGroups"] ||= {}
32
+ @data["AttributeGroups"].merge!({ "#{group_name}" => group_config.template })
104
33
  end
105
34
  end
106
35
  end
@@ -15,9 +15,19 @@ module Springcm
15
15
  # for retrieving data deeper in the JSON document, e.g. documents_href
16
16
  # via Springcm::Mixins::Documents.
17
17
  def method_missing(m, *args, &block)
18
- key = m.to_s.split("_").map(&:capitalize).join
18
+ mode = :get
19
+ method = m.to_s
20
+ if method.end_with?("=")
21
+ mode = :set
22
+ method = method[0...-1]
23
+ end
24
+ key = method.split("_").map(&:capitalize).join
19
25
  if @data.key?(key)
20
- @data.fetch(key)
26
+ if mode == :get
27
+ @data.fetch(key)
28
+ else
29
+ @data[key] = args.first
30
+ end
21
31
  else
22
32
  super
23
33
  end
@@ -1,3 +1,3 @@
1
1
  module Springcm
2
- VERSION = "0.6.1"
2
+ VERSION = "1.0.0"
3
3
  end
data/lib/springcm-sdk.rb CHANGED
@@ -21,6 +21,12 @@ module Springcm
21
21
  end
22
22
  end
23
23
 
24
+ class NoAttributeSetError < Error
25
+ def initialize(group, set)
26
+ super("No such attribute set: #{group}.#{set}")
27
+ end
28
+ end
29
+
24
30
  class NoAttributeFieldError < Error
25
31
  def initialize(group, field)
26
32
  super("No such attribute field: #{group}.#{field}")
@@ -56,4 +62,28 @@ module Springcm
56
62
  super("Timed out while awaiting ChangeSecurityTask to complete.")
57
63
  end
58
64
  end
65
+
66
+ class RepeatableAttributeSetUsageError < Error
67
+ def initialize(group, set)
68
+ super("The attribute set #{group}.#{set} is repeatable. Use #[] to access and modify fields.")
69
+ end
70
+ end
71
+
72
+ class NonRepeatableAttributeSetUsageError < Error
73
+ def initialize(group, set)
74
+ super("The attribute set #{group}.#{set} is not repeatable. Use #field to access and modify fields.")
75
+ end
76
+ end
77
+
78
+ class RepeatableAttributeFieldUsageError < Error
79
+ def initialize(group, field)
80
+ super("The attribute field #{group}.#{field} is repeatable. Use #[] to access and modify values.")
81
+ end
82
+ end
83
+
84
+ class NonRepeatableAttributeFieldUsageError < Error
85
+ def initialize(group, field)
86
+ super("The attribute field #{group}.#{field} is not repeatable. Use #field to access and modify values.")
87
+ end
88
+ end
59
89
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: springcm-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Holden
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-14 00:00:00.000000000 Z
11
+ date: 2020-02-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -158,6 +158,10 @@ files:
158
158
  - bin/setup
159
159
  - lib/springcm-sdk.rb
160
160
  - lib/springcm-sdk/account.rb
161
+ - lib/springcm-sdk/applied_attribute_field.rb
162
+ - lib/springcm-sdk/applied_attribute_group.rb
163
+ - lib/springcm-sdk/applied_attribute_set.rb
164
+ - lib/springcm-sdk/applied_attribute_set_item.rb
161
165
  - lib/springcm-sdk/attribute.rb
162
166
  - lib/springcm-sdk/attribute_group.rb
163
167
  - lib/springcm-sdk/change_security_task.rb
@@ -188,7 +192,7 @@ metadata:
188
192
  allowed_push_host: https://rubygems.org
189
193
  homepage_uri: https://github.com/paulholden2/springcm-sdk
190
194
  source_code_uri: https://github.com/paulholden2/springcm-sdk
191
- documentation_uri: https://rubydoc.info/github/paulholden2/springcm-sdk/0.6.1
195
+ documentation_uri: https://rubydoc.info/github/paulholden2/springcm-sdk/1.0.0
192
196
  changelog_uri: https://github.com/paulholden2/springcm-sdk/blob/master/CHANGELOG.md
193
197
  post_install_message:
194
198
  rdoc_options: []