microsoft_graph 0.1.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.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE +10 -0
  7. data/README.md +97 -0
  8. data/Rakefile +7 -0
  9. data/data/metadata_v1.0.xml +1687 -0
  10. data/integration_spec/integration_spec_helper.rb +18 -0
  11. data/integration_spec/live_spec.rb +180 -0
  12. data/lib/microsoft_graph.rb +35 -0
  13. data/lib/microsoft_graph/base.rb +110 -0
  14. data/lib/microsoft_graph/base_entity.rb +152 -0
  15. data/lib/microsoft_graph/cached_metadata_directory.rb +3 -0
  16. data/lib/microsoft_graph/class_builder.rb +217 -0
  17. data/lib/microsoft_graph/collection.rb +95 -0
  18. data/lib/microsoft_graph/collection_association.rb +230 -0
  19. data/lib/microsoft_graph/errors.rb +6 -0
  20. data/lib/microsoft_graph/version.rb +3 -0
  21. data/lib/odata.rb +49 -0
  22. data/lib/odata/entity_set.rb +20 -0
  23. data/lib/odata/errors.rb +18 -0
  24. data/lib/odata/navigation_property.rb +30 -0
  25. data/lib/odata/operation.rb +17 -0
  26. data/lib/odata/property.rb +38 -0
  27. data/lib/odata/request.rb +48 -0
  28. data/lib/odata/service.rb +280 -0
  29. data/lib/odata/singleton.rb +20 -0
  30. data/lib/odata/type.rb +25 -0
  31. data/lib/odata/types/collection_type.rb +30 -0
  32. data/lib/odata/types/complex_type.rb +19 -0
  33. data/lib/odata/types/entity_type.rb +33 -0
  34. data/lib/odata/types/enum_type.rb +37 -0
  35. data/lib/odata/types/primitive_type.rb +12 -0
  36. data/lib/odata/types/primitive_types/binary_type.rb +15 -0
  37. data/lib/odata/types/primitive_types/boolean_type.rb +15 -0
  38. data/lib/odata/types/primitive_types/date_time_offset_type.rb +15 -0
  39. data/lib/odata/types/primitive_types/date_type.rb +23 -0
  40. data/lib/odata/types/primitive_types/double_type.rb +16 -0
  41. data/lib/odata/types/primitive_types/guid_type.rb +24 -0
  42. data/lib/odata/types/primitive_types/int_16_type.rb +19 -0
  43. data/lib/odata/types/primitive_types/int_32_type.rb +15 -0
  44. data/lib/odata/types/primitive_types/int_64_type.rb +15 -0
  45. data/lib/odata/types/primitive_types/stream_type.rb +15 -0
  46. data/lib/odata/types/primitive_types/string_type.rb +15 -0
  47. data/microsoft_graph.gemspec +31 -0
  48. data/tasks/update_metadata.rb +17 -0
  49. metadata +232 -0
@@ -0,0 +1,20 @@
1
+ module OData
2
+ class Singleton
3
+ attr_reader :name
4
+ attr_reader :type_name
5
+
6
+ def initialize(options = {})
7
+ @name = options[:name]
8
+ @type_name = options[:type]
9
+ @service = options[:service]
10
+ end
11
+
12
+ def collection?
13
+ false
14
+ end
15
+
16
+ def type
17
+ @service.get_type_by_name(type_name)
18
+ end
19
+ end
20
+ end
data/lib/odata/type.rb ADDED
@@ -0,0 +1,25 @@
1
+ module OData
2
+ class Type
3
+ attr_reader :name
4
+
5
+ def initialize(options = {})
6
+ @name = options[:name]
7
+ end
8
+
9
+ def coerce(value)
10
+ value
11
+ end
12
+
13
+ def collection?
14
+ false
15
+ end
16
+ end
17
+ end
18
+
19
+ Dir[
20
+ File.join(
21
+ File.dirname(__FILE__),
22
+ 'types',
23
+ '*.rb'
24
+ )
25
+ ].each { |f| require f }
@@ -0,0 +1,30 @@
1
+ module OData
2
+ class CollectionType < Type
3
+ attr_reader :member_type
4
+
5
+ def initialize(options = {})
6
+ super
7
+ @member_type = options[:member_type]
8
+ end
9
+
10
+ def valid_value?(value)
11
+ member_type.valid_value?(value)
12
+ end
13
+
14
+ def primitive_type?
15
+ OData::PrimitiveType === member_type
16
+ end
17
+
18
+ def enum_type?
19
+ OData::EnumType === member_type
20
+ end
21
+
22
+ def collection?
23
+ true
24
+ end
25
+
26
+ def properties
27
+ member_type.properties
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,19 @@
1
+ module OData
2
+ class ComplexType < Type
3
+ attr_reader :base_type
4
+
5
+ def initialize(options = {})
6
+ super
7
+ @base_type = options[:base_type]
8
+ @service = options[:service]
9
+ end
10
+
11
+ def properties
12
+ @properties ||= @service.properties_for_type(name)
13
+ end
14
+
15
+ def valid_value?(value)
16
+ value.respond_to?(:odata_type) && self.name == value.odata_type
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,33 @@
1
+ module OData
2
+ class EntityType < Type
3
+ attr_reader :base_type
4
+ attr_reader :abstract
5
+
6
+ def initialize(options = {})
7
+ super
8
+ @abstract = options[:abstract]
9
+ @base_type = options[:base_type]
10
+ @open_type = options[:open_type]
11
+ @has_stream = options[:has_stream]
12
+ @service = options[:service]
13
+ end
14
+
15
+ def properties
16
+ @properties ||= @service.properties_for_type(name)
17
+ end
18
+
19
+ def navigation_properties
20
+ @navigation_properties ||= @service.navigation_properties_for_type(name)
21
+ end
22
+
23
+ def navigation_property_by_name(name)
24
+ navigation_properties.find do |navigation_property|
25
+ navigation_property.name == name
26
+ end
27
+ end
28
+
29
+ def valid_value?(value)
30
+ value.respond_to?(:odata_type) && (name == value.odata_type || name == value.class.superclass.odata_type.name)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,37 @@
1
+ module OData
2
+ class EnumType < Type
3
+ attr_reader :members
4
+
5
+ def initialize(options={})
6
+ super
7
+ @members = options[:members]
8
+ end
9
+
10
+ def valid_value?(value)
11
+ member_names.include?(value) || member_values.include?(value)
12
+ end
13
+
14
+ def type
15
+ name
16
+ end
17
+
18
+ def coerce(value)
19
+ if value && value.is_a?(Integer)
20
+ member = @members.find { |m| m[:value] == value }
21
+ member && member[:name]
22
+ else
23
+ super
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def member_names
30
+ members.map { |m| m[:name] }
31
+ end
32
+
33
+ def member_values
34
+ members.map { |m| m[:value] }
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,12 @@
1
+ module OData
2
+ class PrimitiveType < Type
3
+ end
4
+ end
5
+
6
+ Dir[
7
+ File.join(
8
+ File.dirname(__FILE__),
9
+ 'primitive_types',
10
+ '*.rb'
11
+ )
12
+ ].each { |f| require f }
@@ -0,0 +1,15 @@
1
+ module OData
2
+ class BinaryType < PrimitiveType
3
+ def valid_value?(value)
4
+ String === value
5
+ end
6
+
7
+ def coerce(value)
8
+ raise RuntimeError
9
+ end
10
+
11
+ def name
12
+ "Edm.Binary"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module OData
2
+ class BooleanType < PrimitiveType
3
+ def valid_value?(value)
4
+ TrueClass === value || FalseClass === value
5
+ end
6
+
7
+ def coerce(value)
8
+ value
9
+ end
10
+
11
+ def name
12
+ "Edm.Boolean"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module OData
2
+ class DateTimeOffsetType < PrimitiveType
3
+ def valid_value?(value)
4
+ DateTime === value || Time === value
5
+ end
6
+
7
+ def coerce(value)
8
+ DateTime.parse(value)
9
+ end
10
+
11
+ def name
12
+ "Edm.DateTimeOffset"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ module OData
2
+ class DateType < PrimitiveType
3
+ def valid_value?(value)
4
+ Date === value
5
+ end
6
+
7
+ def coerce(value)
8
+ begin
9
+ if Date === value
10
+ value
11
+ else
12
+ Date.parse(value.to_s)
13
+ end
14
+ rescue ArgumentError
15
+ raise TypeError.new("Cannot convert #{value.inspect} into a date")
16
+ end
17
+ end
18
+
19
+ def name
20
+ "Edm.Date"
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,16 @@
1
+ module OData
2
+ class DoubleType < PrimitiveType
3
+ def valid_value?(value)
4
+ Numeric === value
5
+ end
6
+
7
+ def coerce(value)
8
+ raise TypeError.new("Cannot convert #{value.inspect} into a float") unless value.respond_to? :to_f
9
+ value.to_f
10
+ end
11
+
12
+ def name
13
+ "Edm.Double"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,24 @@
1
+ module OData
2
+ class GuidType < PrimitiveType
3
+ def valid_value?(value)
4
+ String === value
5
+ end
6
+
7
+ def coerce(value)
8
+ case value
9
+ when Symbol
10
+ value.to_s
11
+ when Numeric
12
+ value.to_s
13
+ when String
14
+ value
15
+ else
16
+ raise TypeError, "Cannot convert #{value.inspect} into a Guid"
17
+ end
18
+ end
19
+
20
+ def name
21
+ "Edm.Guid"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,19 @@
1
+ module OData
2
+ class Int16Type < PrimitiveType
3
+ def valid_value?(value)
4
+ Integer === value &&
5
+ value <= 2**15 &&
6
+ value > -(2**15)
7
+ end
8
+
9
+ def coerce(value)
10
+ val = value.respond_to?(:to_i) ? value.to_i : value
11
+ raise TypeError, "Cannot convert #{value.inspect} into an Int16" unless valid_value?(val)
12
+ val
13
+ end
14
+
15
+ def name
16
+ "Edm.Int16"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ module OData
2
+ class Int32Type < PrimitiveType
3
+ def valid_value?(value)
4
+ Integer === value
5
+ end
6
+
7
+ def coerce(value)
8
+ value.to_i
9
+ end
10
+
11
+ def name
12
+ "Edm.Int32"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module OData
2
+ class Int64Type < PrimitiveType
3
+ def valid_value?(value)
4
+ Integer === value
5
+ end
6
+
7
+ def coerce(value)
8
+ value.to_i
9
+ end
10
+
11
+ def name
12
+ "Edm.Int64"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module OData
2
+ class StreamType < PrimitiveType
3
+ def valid_value?(value)
4
+ true
5
+ end
6
+
7
+ def coerce(value)
8
+ raise RuntimeError
9
+ end
10
+
11
+ def name
12
+ "Edm.Stream"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module OData
2
+ class StringType < PrimitiveType
3
+ def valid_value?(value)
4
+ String === value
5
+ end
6
+
7
+ def coerce(value)
8
+ value.to_s
9
+ end
10
+
11
+ def name
12
+ "Edm.String"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'microsoft_graph/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "microsoft_graph"
8
+ spec.version = MicrosoftGraph::VERSION
9
+ spec.authors = ["Katie Miller", "Neal Lindsay"]
10
+ spec.email = ["katie@testdouble.com", "neal@testdouble.com"]
11
+
12
+ spec.summary = "Ruby SDK for Microsoft Graph"
13
+ spec.homepage = "https://graph.microsoft.io"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
+ spec.bindir = "exe"
17
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.11"
21
+ spec.add_development_dependency "rake", "~> 10.0"
22
+ spec.add_development_dependency "rspec", "~> 3.0"
23
+ spec.add_development_dependency "rspec-given", "~> 3.5.0"
24
+ spec.add_development_dependency "adal", "~> 1.0"
25
+ spec.add_development_dependency "dotenv", "~> 2.0.2"
26
+ spec.add_development_dependency "pry", "~> 0.10.3"
27
+ spec.add_development_dependency "simplecov", "~> 0.11.1"
28
+ spec.add_development_dependency "webmock", "~> 1.22.6"
29
+
30
+ spec.add_dependency "nokogiri", "~> 1.6.7.1"
31
+ end
@@ -0,0 +1,17 @@
1
+ require 'rexml/document'
2
+
3
+ desc "Update Graph API description file (optionally specify VERSION environment variable - defaults to \"v1.0\")"
4
+ task :update_metadata do
5
+ version = ENV['VERSION'] || "v1.0"
6
+ file_name = File.absolute_path File.join(__FILE__, "../../data/metadata_#{version}.xml")
7
+ uri = URI("https://graph.microsoft.com/#{version}/$metadata?detailed=true")
8
+ xml = Net::HTTP
9
+ .new(uri.hostname, uri.port)
10
+ .tap { |h| h.use_ssl = uri.scheme == "https" }
11
+ .get(uri).body
12
+ doc = REXML::Document.new(xml)
13
+ File.open(file_name, 'w') do |f|
14
+ puts "writing to #{file_name}"
15
+ doc.write f, 2
16
+ end
17
+ end