microsoft_graph 0.1.1 → 0.1.2

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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +11 -11
  3. data/.rspec +2 -2
  4. data/.travis.yml +4 -4
  5. data/Gemfile +4 -4
  6. data/LICENSE +10 -10
  7. data/README.md +98 -98
  8. data/Rakefile +7 -7
  9. data/data/metadata_v1.0.xml +1686 -1686
  10. data/integration_spec/integration_spec_helper.rb +18 -18
  11. data/integration_spec/live_spec.rb +180 -180
  12. data/lib/microsoft_graph.rb +35 -35
  13. data/lib/microsoft_graph/base.rb +110 -110
  14. data/lib/microsoft_graph/base_entity.rb +152 -152
  15. data/lib/microsoft_graph/cached_metadata_directory.rb +3 -3
  16. data/lib/microsoft_graph/class_builder.rb +217 -217
  17. data/lib/microsoft_graph/collection.rb +95 -95
  18. data/lib/microsoft_graph/collection_association.rb +232 -230
  19. data/lib/microsoft_graph/errors.rb +6 -6
  20. data/lib/microsoft_graph/version.rb +3 -3
  21. data/lib/odata.rb +49 -49
  22. data/lib/odata/entity_set.rb +20 -20
  23. data/lib/odata/errors.rb +18 -18
  24. data/lib/odata/navigation_property.rb +30 -30
  25. data/lib/odata/operation.rb +17 -17
  26. data/lib/odata/property.rb +38 -38
  27. data/lib/odata/request.rb +49 -49
  28. data/lib/odata/service.rb +279 -279
  29. data/lib/odata/singleton.rb +20 -20
  30. data/lib/odata/type.rb +25 -25
  31. data/lib/odata/types/collection_type.rb +30 -30
  32. data/lib/odata/types/complex_type.rb +19 -19
  33. data/lib/odata/types/entity_type.rb +33 -33
  34. data/lib/odata/types/enum_type.rb +37 -37
  35. data/lib/odata/types/primitive_type.rb +12 -12
  36. data/lib/odata/types/primitive_types/binary_type.rb +15 -15
  37. data/lib/odata/types/primitive_types/boolean_type.rb +15 -15
  38. data/lib/odata/types/primitive_types/date_time_offset_type.rb +15 -15
  39. data/lib/odata/types/primitive_types/date_type.rb +23 -23
  40. data/lib/odata/types/primitive_types/double_type.rb +16 -16
  41. data/lib/odata/types/primitive_types/guid_type.rb +24 -24
  42. data/lib/odata/types/primitive_types/int_16_type.rb +19 -19
  43. data/lib/odata/types/primitive_types/int_32_type.rb +15 -15
  44. data/lib/odata/types/primitive_types/int_64_type.rb +15 -15
  45. data/lib/odata/types/primitive_types/stream_type.rb +15 -15
  46. data/lib/odata/types/primitive_types/string_type.rb +15 -15
  47. data/microsoft_graph.gemspec +31 -31
  48. data/tasks/update_metadata.rb +17 -17
  49. metadata +5 -5
@@ -1,110 +1,110 @@
1
- class MicrosoftGraph
2
- class Base
3
-
4
- def initialize(options = {})
5
- @cached_navigation_property_values = {}
6
- @cached_property_values = {}
7
- if options[:attributes]
8
- initialize_serialized_properties(options[:attributes], options[:persisted])
9
- end
10
- @dirty = ! options[:persisted]
11
- @dirty_properties = if @dirty
12
- @cached_property_values.keys.inject({}) do |result, key|
13
- result[key] = true
14
- result
15
- end
16
- else
17
- {}
18
- end
19
- end
20
-
21
- def properties
22
- {}
23
- end
24
-
25
- def odata_type
26
- self.class.const_get("ODATA_TYPE").name
27
- end
28
-
29
- def as_json(options = {})
30
- (if options[:only]
31
- @cached_property_values.select { |key,v| options[:only].include? key }
32
- elsif options[:except]
33
- @cached_property_values.reject { |key,v| options[:except].include? key }
34
- else
35
- @cached_property_values
36
- end).inject({}) do |result, (k,v)|
37
- k = OData.convert_to_camel_case(k) if options[:convert_to_camel_case]
38
- result[k.to_s] = v.respond_to?(:as_json) ? v.as_json(options) : v
39
- result
40
- end
41
- end
42
-
43
- def to_json(options = {})
44
- as_json(options).to_json
45
- end
46
-
47
- def dirty?
48
- @dirty || @cached_property_values.any? { |key, value|
49
- value.respond_to?(:dirty?) && value.dirty?
50
- }
51
- end
52
-
53
- def mark_clean
54
- @dirty = false
55
- @dirty_properties = {}
56
- @cached_property_values.each { |key, value|
57
- value.respond_to?(:mark_clean) && value.mark_clean
58
- }
59
- end
60
-
61
- private
62
-
63
- def get(property_name)
64
- if properties[property_name].collection?
65
- @cached_property_values[property_name] ||= Collection.new(properties[property_name].type)
66
- else
67
- @cached_property_values[property_name]
68
- end
69
- end
70
-
71
- def set(property_name, value)
72
- property = properties[property_name]
73
-
74
- raise NonNullableError unless property.nullable_match?(value)
75
- if property.collection?
76
- raise TypeError unless value.all? { |v| property.collection_type_match?(v) }
77
- @cached_property_values[property_name] = Collection.new(property.type, value)
78
- else
79
- raise TypeError unless property.type_match?(value)
80
- @cached_property_values[property_name] = property.coerce_to_type(value)
81
- end
82
- @dirty = true
83
- @dirty_properties[property_name] = true
84
- end
85
-
86
- def initialize_serialized_properties(raw_attributes, from_server = false)
87
- unless raw_attributes.respond_to? :keys
88
- raise TypeError.new("Cannot initialize #{self.class} with attributes: #{raw_attributes.inspect}")
89
- end
90
- attributes = OData.convert_keys_to_snake_case(raw_attributes)
91
- properties.each do |property_key, property|
92
- if attributes.keys.include?(property_key.to_s)
93
- value = attributes[property_key.to_s]
94
- @cached_property_values[property_key] =
95
- if property.collection?
96
- Collection.new(property.type, value)
97
- elsif klass = MicrosoftGraph::ClassBuilder.get_namespaced_class(property.type.name)
98
- klass.new(attributes: value)
99
- else
100
- if from_server && ! property.type_match?(value) && OData::EnumType === property.type
101
- value.to_s
102
- else
103
- property.coerce_to_type(value)
104
- end
105
- end
106
- end
107
- end
108
- end
109
- end
110
- end
1
+ class MicrosoftGraph
2
+ class Base
3
+
4
+ def initialize(options = {})
5
+ @cached_navigation_property_values = {}
6
+ @cached_property_values = {}
7
+ if options[:attributes]
8
+ initialize_serialized_properties(options[:attributes], options[:persisted])
9
+ end
10
+ @dirty = ! options[:persisted]
11
+ @dirty_properties = if @dirty
12
+ @cached_property_values.keys.inject({}) do |result, key|
13
+ result[key] = true
14
+ result
15
+ end
16
+ else
17
+ {}
18
+ end
19
+ end
20
+
21
+ def properties
22
+ {}
23
+ end
24
+
25
+ def odata_type
26
+ self.class.const_get("ODATA_TYPE").name
27
+ end
28
+
29
+ def as_json(options = {})
30
+ (if options[:only]
31
+ @cached_property_values.select { |key,v| options[:only].include? key }
32
+ elsif options[:except]
33
+ @cached_property_values.reject { |key,v| options[:except].include? key }
34
+ else
35
+ @cached_property_values
36
+ end).inject({}) do |result, (k,v)|
37
+ k = OData.convert_to_camel_case(k) if options[:convert_to_camel_case]
38
+ result[k.to_s] = v.respond_to?(:as_json) ? v.as_json(options) : v
39
+ result
40
+ end
41
+ end
42
+
43
+ def to_json(options = {})
44
+ as_json(options).to_json
45
+ end
46
+
47
+ def dirty?
48
+ @dirty || @cached_property_values.any? { |key, value|
49
+ value.respond_to?(:dirty?) && value.dirty?
50
+ }
51
+ end
52
+
53
+ def mark_clean
54
+ @dirty = false
55
+ @dirty_properties = {}
56
+ @cached_property_values.each { |key, value|
57
+ value.respond_to?(:mark_clean) && value.mark_clean
58
+ }
59
+ end
60
+
61
+ private
62
+
63
+ def get(property_name)
64
+ if properties[property_name].collection?
65
+ @cached_property_values[property_name] ||= Collection.new(properties[property_name].type)
66
+ else
67
+ @cached_property_values[property_name]
68
+ end
69
+ end
70
+
71
+ def set(property_name, value)
72
+ property = properties[property_name]
73
+
74
+ raise NonNullableError unless property.nullable_match?(value)
75
+ if property.collection?
76
+ raise TypeError unless value.all? { |v| property.collection_type_match?(v) }
77
+ @cached_property_values[property_name] = Collection.new(property.type, value)
78
+ else
79
+ raise TypeError unless property.type_match?(value)
80
+ @cached_property_values[property_name] = property.coerce_to_type(value)
81
+ end
82
+ @dirty = true
83
+ @dirty_properties[property_name] = true
84
+ end
85
+
86
+ def initialize_serialized_properties(raw_attributes, from_server = false)
87
+ unless raw_attributes.respond_to? :keys
88
+ raise TypeError.new("Cannot initialize #{self.class} with attributes: #{raw_attributes.inspect}")
89
+ end
90
+ attributes = OData.convert_keys_to_snake_case(raw_attributes)
91
+ properties.each do |property_key, property|
92
+ if attributes.keys.include?(property_key.to_s)
93
+ value = attributes[property_key.to_s]
94
+ @cached_property_values[property_key] =
95
+ if property.collection?
96
+ Collection.new(property.type, value)
97
+ elsif klass = MicrosoftGraph::ClassBuilder.get_namespaced_class(property.type.name)
98
+ klass.new(attributes: value)
99
+ else
100
+ if from_server && ! property.type_match?(value) && OData::EnumType === property.type
101
+ value.to_s
102
+ else
103
+ property.coerce_to_type(value)
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -1,152 +1,152 @@
1
- class MicrosoftGraph
2
- class BaseEntity < Base
3
-
4
- attr_accessor :graph
5
- attr_accessor :parent
6
-
7
- def initialize(options = {})
8
- @resource_name = options[:resource_name]
9
- @parent = options[:parent] || options[:graph]
10
- @graph = options[:graph] || parent && parent.graph
11
- @navigation_property_name = options[:navigation_property_name]
12
- @persisted = options[:persisted] || false
13
- super
14
- end
15
-
16
- def parental_chain
17
- if parent && parent.respond_to?(:parental_chain)
18
- parent.parental_chain.concat([parent])
19
- else
20
- [parent]
21
- end
22
- end
23
-
24
- def containing_navigation_property(type_name)
25
- candidate_navigation_properties = navigation_properties.values.select do |navigation_property|
26
- navigation_property.collection? && navigation_property.type.name == "Collection(#{type_name})"
27
- end
28
- candidate_navigation_properties.sort { |a, b|
29
- a_index = type_name.downcase.index(a.name[0..-2].downcase) || 0
30
- b_index = type_name.downcase.index(b.name[0..-2].downcase) || 0
31
- a_index <=> b_index
32
- }.last
33
- end
34
-
35
- def path
36
- containing_navigation_property_name = nil
37
- owning_ancestor = parental_chain.find do |ancestor|
38
- unless MicrosoftGraph::CollectionAssociation === ancestor
39
- containing_navigation_property = ancestor.containing_navigation_property(odata_type)
40
- containing_navigation_property && containing_navigation_property_name = containing_navigation_property.name
41
- end
42
- end
43
-
44
- if owning_ancestor && @cached_property_values[:id]
45
- [owning_ancestor.path, containing_navigation_property_name, @cached_property_values[:id]].compact.join("/")
46
- else
47
- @resource_name
48
- end
49
- end
50
-
51
- def fetch
52
- @persisted = true
53
- initialize_serialized_properties(graph.service.get(path)[:attributes])
54
- end
55
-
56
- def persisted?
57
- @persisted
58
- end
59
-
60
- def delete!
61
- if persisted?
62
- @persisted = false
63
- graph.service.delete(path)
64
- end
65
- end
66
-
67
- def reload!
68
- @dirty_properties.keys.each do |dirty_property|
69
- @cached_property_values[dirty_property] = nil
70
- end
71
- mark_clean
72
- fetch if persisted?
73
- end
74
-
75
- def save!
76
- raise NoAssociationError unless parent
77
- raise_no_graph_error! unless graph
78
- if persisted?
79
- graph.service.patch(path, to_json(only: @dirty_properties.keys, convert_to_camel_case: true))
80
- else
81
- initialize_serialized_properties(
82
- graph.service.post(parent.path, to_json(convert_to_camel_case: true))
83
- )
84
- @persisted = true
85
- end
86
- mark_clean
87
- true
88
- end
89
-
90
- def save
91
- save!
92
- rescue OData::HTTPError
93
- false
94
- end
95
-
96
- private
97
-
98
- def raise_no_graph_error!
99
- raise NoGraphError.new("#{self.class}#graph must be a MicrosoftGraph instance to make network requests.")
100
- end
101
-
102
- def get(property_name)
103
- if uncached_property?(property_name) && graph
104
- initialize_serialized_properties(graph.service.get(path, property_name.to_s)[:attributes], true)
105
- super
106
- else
107
- super
108
- end
109
- end
110
-
111
- def get_navigation_property(navigation_property_name)
112
- raise_no_graph_error! unless graph
113
- navigation_property = navigation_properties[navigation_property_name]
114
- if navigation_property.collection?
115
- @cached_navigation_property_values[navigation_property_name] ||=
116
- CollectionAssociation.new(
117
- graph: graph,
118
- type: navigation_properties[navigation_property_name].type,
119
- resource_name: OData.convert_to_camel_case(navigation_property_name.to_s),
120
- parent: self
121
- )
122
- else
123
- @cached_navigation_property_values[navigation_property_name] ||=
124
- if response = graph.service.get("#{path}/#{OData.convert_to_camel_case(navigation_property_name.to_s)}")
125
- type = graph.service.get_type_for_odata_response(response[:attributes]) || navigation_property.type
126
- klass = ClassBuilder.get_namespaced_class(type.name)
127
- klass.new(
128
- graph: graph,
129
- parent: self,
130
- attributes: response[:attributes],
131
- persisted: true,
132
- navigation_property_name: navigation_property_name.to_s
133
- )
134
- else
135
- nil
136
- end
137
- end
138
- end
139
-
140
- def set_navigation_property(navigation_property_name, value)
141
- navigation_property = navigation_properties[navigation_property_name]
142
- raise TypeError unless navigation_property.type_match?(value)
143
- value.parent = self
144
- @cached_navigation_property_values[navigation_property_name] = value
145
- end
146
-
147
- def uncached_property?(property)
148
- properties.keys.include?(property) && ! @cached_property_values.keys.include?(property)
149
- end
150
-
151
- end
152
- end
1
+ class MicrosoftGraph
2
+ class BaseEntity < Base
3
+
4
+ attr_accessor :graph
5
+ attr_accessor :parent
6
+
7
+ def initialize(options = {})
8
+ @resource_name = options[:resource_name]
9
+ @parent = options[:parent] || options[:graph]
10
+ @graph = options[:graph] || parent && parent.graph
11
+ @navigation_property_name = options[:navigation_property_name]
12
+ @persisted = options[:persisted] || false
13
+ super
14
+ end
15
+
16
+ def parental_chain
17
+ if parent && parent.respond_to?(:parental_chain)
18
+ parent.parental_chain.concat([parent])
19
+ else
20
+ [parent]
21
+ end
22
+ end
23
+
24
+ def containing_navigation_property(type_name)
25
+ candidate_navigation_properties = navigation_properties.values.select do |navigation_property|
26
+ navigation_property.collection? && navigation_property.type.name == "Collection(#{type_name})"
27
+ end
28
+ candidate_navigation_properties.sort { |a, b|
29
+ a_index = type_name.downcase.index(a.name[0..-2].downcase) || 0
30
+ b_index = type_name.downcase.index(b.name[0..-2].downcase) || 0
31
+ a_index <=> b_index
32
+ }.last
33
+ end
34
+
35
+ def path
36
+ containing_navigation_property_name = nil
37
+ owning_ancestor = parental_chain.find do |ancestor|
38
+ unless MicrosoftGraph::CollectionAssociation === ancestor
39
+ containing_navigation_property = ancestor.containing_navigation_property(odata_type)
40
+ containing_navigation_property && containing_navigation_property_name = containing_navigation_property.name
41
+ end
42
+ end
43
+
44
+ if owning_ancestor && @cached_property_values[:id]
45
+ [owning_ancestor.path, containing_navigation_property_name, @cached_property_values[:id]].compact.join("/")
46
+ else
47
+ @resource_name
48
+ end
49
+ end
50
+
51
+ def fetch
52
+ @persisted = true
53
+ initialize_serialized_properties(graph.service.get(path)[:attributes])
54
+ end
55
+
56
+ def persisted?
57
+ @persisted
58
+ end
59
+
60
+ def delete!
61
+ if persisted?
62
+ @persisted = false
63
+ graph.service.delete(path)
64
+ end
65
+ end
66
+
67
+ def reload!
68
+ @dirty_properties.keys.each do |dirty_property|
69
+ @cached_property_values[dirty_property] = nil
70
+ end
71
+ mark_clean
72
+ fetch if persisted?
73
+ end
74
+
75
+ def save!
76
+ raise NoAssociationError unless parent
77
+ raise_no_graph_error! unless graph
78
+ if persisted?
79
+ graph.service.patch(path, to_json(only: @dirty_properties.keys, convert_to_camel_case: true))
80
+ else
81
+ initialize_serialized_properties(
82
+ graph.service.post(parent.path, to_json(convert_to_camel_case: true))
83
+ )
84
+ @persisted = true
85
+ end
86
+ mark_clean
87
+ true
88
+ end
89
+
90
+ def save
91
+ save!
92
+ rescue OData::HTTPError
93
+ false
94
+ end
95
+
96
+ private
97
+
98
+ def raise_no_graph_error!
99
+ raise NoGraphError.new("#{self.class}#graph must be a MicrosoftGraph instance to make network requests.")
100
+ end
101
+
102
+ def get(property_name)
103
+ if uncached_property?(property_name) && graph
104
+ initialize_serialized_properties(graph.service.get(path, property_name.to_s)[:attributes], true)
105
+ super
106
+ else
107
+ super
108
+ end
109
+ end
110
+
111
+ def get_navigation_property(navigation_property_name)
112
+ raise_no_graph_error! unless graph
113
+ navigation_property = navigation_properties[navigation_property_name]
114
+ if navigation_property.collection?
115
+ @cached_navigation_property_values[navigation_property_name] ||=
116
+ CollectionAssociation.new(
117
+ graph: graph,
118
+ type: navigation_properties[navigation_property_name].type,
119
+ resource_name: OData.convert_to_camel_case(navigation_property_name.to_s),
120
+ parent: self
121
+ )
122
+ else
123
+ @cached_navigation_property_values[navigation_property_name] ||=
124
+ if response = graph.service.get("#{path}/#{OData.convert_to_camel_case(navigation_property_name.to_s)}")
125
+ type = graph.service.get_type_for_odata_response(response[:attributes]) || navigation_property.type
126
+ klass = ClassBuilder.get_namespaced_class(type.name)
127
+ klass.new(
128
+ graph: graph,
129
+ parent: self,
130
+ attributes: response[:attributes],
131
+ persisted: true,
132
+ navigation_property_name: navigation_property_name.to_s
133
+ )
134
+ else
135
+ nil
136
+ end
137
+ end
138
+ end
139
+
140
+ def set_navigation_property(navigation_property_name, value)
141
+ navigation_property = navigation_properties[navigation_property_name]
142
+ raise TypeError unless navigation_property.type_match?(value)
143
+ value.parent = self
144
+ @cached_navigation_property_values[navigation_property_name] = value
145
+ end
146
+
147
+ def uncached_property?(property)
148
+ properties.keys.include?(property) && ! @cached_property_values.keys.include?(property)
149
+ end
150
+
151
+ end
152
+ end