springcm-sdk 0.6.1 → 1.0.0

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: 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: []