frodo 0.10.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 (153) hide show
  1. checksums.yaml +7 -0
  2. data/.autotest +2 -0
  3. data/.circleci/config.yml +54 -0
  4. data/.gitignore +24 -0
  5. data/.gitlab-ci.yml +9 -0
  6. data/.rspec +2 -0
  7. data/.ruby-gemset +1 -0
  8. data/.ruby-version +1 -0
  9. data/.travis.yml +75 -0
  10. data/CHANGELOG.md +163 -0
  11. data/Gemfile +4 -0
  12. data/LICENSE.txt +23 -0
  13. data/README.md +479 -0
  14. data/Rakefile +7 -0
  15. data/TODO.md +55 -0
  16. data/frodo.gemspec +39 -0
  17. data/images/frodo.jpg +0 -0
  18. data/lib/frodo/abstract_client.rb +11 -0
  19. data/lib/frodo/client.rb +6 -0
  20. data/lib/frodo/concerns/api.rb +292 -0
  21. data/lib/frodo/concerns/authentication.rb +32 -0
  22. data/lib/frodo/concerns/base.rb +84 -0
  23. data/lib/frodo/concerns/caching.rb +26 -0
  24. data/lib/frodo/concerns/connection.rb +79 -0
  25. data/lib/frodo/concerns/verbs.rb +68 -0
  26. data/lib/frodo/config.rb +143 -0
  27. data/lib/frodo/entity.rb +335 -0
  28. data/lib/frodo/entity_container.rb +75 -0
  29. data/lib/frodo/entity_set.rb +131 -0
  30. data/lib/frodo/errors.rb +70 -0
  31. data/lib/frodo/middleware/authentication/token.rb +13 -0
  32. data/lib/frodo/middleware/authentication.rb +87 -0
  33. data/lib/frodo/middleware/authorization.rb +18 -0
  34. data/lib/frodo/middleware/caching.rb +30 -0
  35. data/lib/frodo/middleware/custom_headers.rb +14 -0
  36. data/lib/frodo/middleware/gzip.rb +33 -0
  37. data/lib/frodo/middleware/instance_url.rb +20 -0
  38. data/lib/frodo/middleware/logger.rb +42 -0
  39. data/lib/frodo/middleware/multipart.rb +64 -0
  40. data/lib/frodo/middleware/odata_headers.rb +13 -0
  41. data/lib/frodo/middleware/raise_error.rb +47 -0
  42. data/lib/frodo/middleware.rb +33 -0
  43. data/lib/frodo/navigation_property/proxy.rb +80 -0
  44. data/lib/frodo/navigation_property.rb +29 -0
  45. data/lib/frodo/properties/binary.rb +50 -0
  46. data/lib/frodo/properties/boolean.rb +37 -0
  47. data/lib/frodo/properties/collection.rb +50 -0
  48. data/lib/frodo/properties/complex.rb +114 -0
  49. data/lib/frodo/properties/date.rb +27 -0
  50. data/lib/frodo/properties/date_time.rb +83 -0
  51. data/lib/frodo/properties/date_time_offset.rb +17 -0
  52. data/lib/frodo/properties/decimal.rb +54 -0
  53. data/lib/frodo/properties/enum.rb +62 -0
  54. data/lib/frodo/properties/float.rb +67 -0
  55. data/lib/frodo/properties/geography/base.rb +162 -0
  56. data/lib/frodo/properties/geography/line_string.rb +33 -0
  57. data/lib/frodo/properties/geography/point.rb +31 -0
  58. data/lib/frodo/properties/geography/polygon.rb +38 -0
  59. data/lib/frodo/properties/geography.rb +13 -0
  60. data/lib/frodo/properties/guid.rb +17 -0
  61. data/lib/frodo/properties/integer.rb +107 -0
  62. data/lib/frodo/properties/number.rb +14 -0
  63. data/lib/frodo/properties/string.rb +72 -0
  64. data/lib/frodo/properties/time.rb +40 -0
  65. data/lib/frodo/properties/time_of_day.rb +27 -0
  66. data/lib/frodo/properties.rb +32 -0
  67. data/lib/frodo/property.rb +139 -0
  68. data/lib/frodo/property_registry.rb +41 -0
  69. data/lib/frodo/query/criteria/comparison_operators.rb +49 -0
  70. data/lib/frodo/query/criteria/date_functions.rb +61 -0
  71. data/lib/frodo/query/criteria/geography_functions.rb +21 -0
  72. data/lib/frodo/query/criteria/lambda_operators.rb +27 -0
  73. data/lib/frodo/query/criteria/string_functions.rb +40 -0
  74. data/lib/frodo/query/criteria.rb +92 -0
  75. data/lib/frodo/query/in_batches.rb +58 -0
  76. data/lib/frodo/query.rb +221 -0
  77. data/lib/frodo/railtie.rb +19 -0
  78. data/lib/frodo/schema/complex_type.rb +79 -0
  79. data/lib/frodo/schema/enum_type.rb +95 -0
  80. data/lib/frodo/schema.rb +164 -0
  81. data/lib/frodo/service.rb +199 -0
  82. data/lib/frodo/service_registry.rb +52 -0
  83. data/lib/frodo/version.rb +3 -0
  84. data/lib/frodo.rb +67 -0
  85. data/spec/fixtures/auth_success_response.json +11 -0
  86. data/spec/fixtures/error.json +11 -0
  87. data/spec/fixtures/files/entity_to_xml.xml +18 -0
  88. data/spec/fixtures/files/error.xml +5 -0
  89. data/spec/fixtures/files/metadata.xml +150 -0
  90. data/spec/fixtures/files/metadata_with_error.xml +157 -0
  91. data/spec/fixtures/files/product_0.json +10 -0
  92. data/spec/fixtures/files/product_0.xml +28 -0
  93. data/spec/fixtures/files/products.json +106 -0
  94. data/spec/fixtures/files/products.xml +308 -0
  95. data/spec/fixtures/files/supplier_0.json +26 -0
  96. data/spec/fixtures/files/supplier_0.xml +32 -0
  97. data/spec/fixtures/leads.json +923 -0
  98. data/spec/fixtures/refresh_error_response.json +8 -0
  99. data/spec/frodo/abstract_client_spec.rb +13 -0
  100. data/spec/frodo/client_spec.rb +57 -0
  101. data/spec/frodo/concerns/authentication_spec.rb +79 -0
  102. data/spec/frodo/concerns/base_spec.rb +68 -0
  103. data/spec/frodo/concerns/caching_spec.rb +40 -0
  104. data/spec/frodo/concerns/connection_spec.rb +65 -0
  105. data/spec/frodo/config_spec.rb +127 -0
  106. data/spec/frodo/entity/shared_examples.rb +83 -0
  107. data/spec/frodo/entity_container_spec.rb +38 -0
  108. data/spec/frodo/entity_set_spec.rb +169 -0
  109. data/spec/frodo/entity_spec.rb +153 -0
  110. data/spec/frodo/errors_spec.rb +48 -0
  111. data/spec/frodo/middleware/authentication/token_spec.rb +87 -0
  112. data/spec/frodo/middleware/authentication_spec.rb +83 -0
  113. data/spec/frodo/middleware/authorization_spec.rb +17 -0
  114. data/spec/frodo/middleware/custom_headers_spec.rb +21 -0
  115. data/spec/frodo/middleware/gzip_spec.rb +68 -0
  116. data/spec/frodo/middleware/instance_url_spec.rb +27 -0
  117. data/spec/frodo/middleware/logger_spec.rb +21 -0
  118. data/spec/frodo/middleware/odata_headers_spec.rb +15 -0
  119. data/spec/frodo/middleware/raise_error_spec.rb +66 -0
  120. data/spec/frodo/navigation_property/proxy_spec.rb +46 -0
  121. data/spec/frodo/navigation_property_spec.rb +55 -0
  122. data/spec/frodo/properties/binary_spec.rb +50 -0
  123. data/spec/frodo/properties/boolean_spec.rb +72 -0
  124. data/spec/frodo/properties/collection_spec.rb +44 -0
  125. data/spec/frodo/properties/date_spec.rb +23 -0
  126. data/spec/frodo/properties/date_time_offset_spec.rb +30 -0
  127. data/spec/frodo/properties/date_time_spec.rb +23 -0
  128. data/spec/frodo/properties/decimal_spec.rb +50 -0
  129. data/spec/frodo/properties/float_spec.rb +45 -0
  130. data/spec/frodo/properties/geography/line_string_spec.rb +33 -0
  131. data/spec/frodo/properties/geography/point_spec.rb +29 -0
  132. data/spec/frodo/properties/geography/polygon_spec.rb +55 -0
  133. data/spec/frodo/properties/geography/shared_examples.rb +72 -0
  134. data/spec/frodo/properties/guid_spec.rb +17 -0
  135. data/spec/frodo/properties/integer_spec.rb +58 -0
  136. data/spec/frodo/properties/string_spec.rb +46 -0
  137. data/spec/frodo/properties/time_of_day_spec.rb +23 -0
  138. data/spec/frodo/properties/time_spec.rb +15 -0
  139. data/spec/frodo/property_registry_spec.rb +16 -0
  140. data/spec/frodo/property_spec.rb +71 -0
  141. data/spec/frodo/query/criteria_spec.rb +229 -0
  142. data/spec/frodo/query_spec.rb +156 -0
  143. data/spec/frodo/schema/complex_type_spec.rb +97 -0
  144. data/spec/frodo/schema/enum_type_spec.rb +112 -0
  145. data/spec/frodo/schema_spec.rb +113 -0
  146. data/spec/frodo/service_registry_spec.rb +19 -0
  147. data/spec/frodo/service_spec.rb +153 -0
  148. data/spec/frodo/usage_example_spec.rb +161 -0
  149. data/spec/spec_helper.rb +35 -0
  150. data/spec/support/coverage.rb +2 -0
  151. data/spec/support/fixture_helpers.rb +14 -0
  152. data/spec/support/middleware.rb +19 -0
  153. metadata +479 -0
@@ -0,0 +1,161 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Usage examples', vcr: { cassette_name: 'usage_example_specs' } do
4
+ let(:service_url) { 'http://services.odata.org/V4/OData/OData.svc' }
5
+ let(:service) { Frodo::Service.new(service_url, name: 'ODataDemo', metadata_file: metadata_file) }
6
+ let(:metadata_file) { 'spec/fixtures/files/metadata.xml' }
7
+
8
+ describe 'getting information' do
9
+ it 'returns the service URL' do
10
+ expect(service.service_url).to eq(service_url)
11
+ end
12
+
13
+ it 'returns the service namespace' do
14
+ expect(service.namespace).to eq('ODataDemo')
15
+ end
16
+
17
+ it 'lists entity types' do
18
+ expect(service.entity_types).to eq(%w[
19
+ ODataDemo.Product
20
+ ODataDemo.FeaturedProduct
21
+ ODataDemo.ProductDetail
22
+ ODataDemo.Category
23
+ ODataDemo.Supplier
24
+ ODataDemo.Person
25
+ ODataDemo.Customer
26
+ ODataDemo.Employee
27
+ ODataDemo.PersonDetail
28
+ ODataDemo.Advertisement
29
+ ])
30
+ end
31
+
32
+ it 'lists entity sets' do
33
+ expect(service.entity_sets).to eq({
34
+ "Products" => "ODataDemo.Product",
35
+ "ProductDetails" => "ODataDemo.ProductDetail",
36
+ "Categories" => "ODataDemo.Category",
37
+ "Suppliers" => "ODataDemo.Supplier",
38
+ "Persons" => "ODataDemo.Person",
39
+ "PersonDetails" => "ODataDemo.PersonDetail",
40
+ "Advertisements" => "ODataDemo.Advertisement"
41
+ })
42
+ end
43
+ end
44
+
45
+ describe 'working with entity sets' do
46
+ # it 'accessing entity sets' do
47
+ # service.entity_sets.each do |entity_set_name, entity_name|
48
+ # entity_set = service[entity_set_name]
49
+
50
+ # expect(entity_set).to be_a(Frodo::EntitySet)
51
+ # expect(entity_set.name).to eq(entity_set_name)
52
+ # expect(entity_set.type).to eq(entity_name)
53
+ # expect(entity_set.namespace).to eq(service.namespace)
54
+ # end
55
+ # end
56
+
57
+ # describe 'accessing entities' do
58
+ # let(:products) { service['Products'] }
59
+
60
+ # it 'getting the first entity in a set' do
61
+ # expect(products.first).to be_a(Frodo::Entity)
62
+ # expect(products.first.name).to eq('Product')
63
+ # end
64
+
65
+ # it 'iterating over the entire set' do
66
+ # products.each do |product|
67
+ # expect(product).to be_a(Frodo::Entity)
68
+ # expect(product.name).to eq('Product')
69
+ # end
70
+ # end
71
+
72
+ # it 'counting entities' do
73
+ # expect(products.count).to eq(11)
74
+ # end
75
+
76
+ # it 'creating a new entity' do
77
+ # new_product = products.new_entity
78
+
79
+ # expect(new_product).to be_a(Frodo::Entity)
80
+ # expect(new_product.name).to eq('Product')
81
+ # end
82
+ # end
83
+
84
+ # describe 'querying' do
85
+ # let(:products) { service['Products'] }
86
+ # let(:query) { products.query }
87
+
88
+ # it 'obtain a query object using #query' do
89
+ # expect(products.query).to be_a(Frodo::Query)
90
+ # end
91
+
92
+ # it 'executing query' do
93
+ # results = query.execute
94
+
95
+ # expect(results.map { |p| p['Name']}).to eq([
96
+ # "Bread",
97
+ # "Milk",
98
+ # "Vint soda",
99
+ # "Havina Cola",
100
+ # "Fruit Punch",
101
+ # "Cranberry Juice",
102
+ # "Pink Lemonade",
103
+ # "DVD Player",
104
+ # "LCD HDTV",
105
+ # "Lemonade",
106
+ # "Coffee"
107
+ # ])
108
+ # end
109
+
110
+ # it 'adding criteria' do
111
+ # query.where(query['Name'].eq('Milk'))
112
+ # results = query.execute
113
+
114
+ # expect(query.to_s).to eq("Products?$filter=Name eq 'Milk'")
115
+ # results.each do |product|
116
+ # expect(product).to be_a(Frodo::Entity)
117
+ # expect(product.name).to eq('Product')
118
+ # expect(product['Name']).to eq('Milk')
119
+ # end
120
+ # end
121
+
122
+ # it 'ordering results' do
123
+ # results = query.order_by('Name').execute
124
+
125
+ # expect(results.map { |p| p['Name'] }).to eq([
126
+ # "Bread",
127
+ # "Coffee",
128
+ # "Cranberry Juice",
129
+ # "DVD Player",
130
+ # "Fruit Punch",
131
+ # "Havina Cola",
132
+ # "LCD HDTV",
133
+ # "Lemonade",
134
+ # "Milk",
135
+ # "Pink Lemonade",
136
+ # "Vint soda"
137
+ # ])
138
+ # end
139
+ # end
140
+ end
141
+
142
+ describe 'working with entities' do
143
+ # let(:product) { service['Products'][1] }
144
+
145
+ # it 'getting a list of property names' do
146
+ # expect(product.property_names).to eq([
147
+ # "ID", "Name", "Description", "ReleaseDate", "DiscontinuedDate", "Rating", "Price"
148
+ # ])
149
+ # end
150
+
151
+ # it 'accessing entity properties' do
152
+ # expect(product["ID"]).to eq(1)
153
+ # expect(product["Name"]).to eq("Milk")
154
+ # expect(product["Description"]).to eq("Low fat milk")
155
+ # expect(product["ReleaseDate"]).to eq(DateTime.parse("1995-10-01T00:00:00Z"))
156
+ # expect(product["DiscontinuedDate"]).to be_nil
157
+ # expect(product["Rating"]).to eq(3)
158
+ # expect(product["Price"]).to eq(3.5)
159
+ # end
160
+ end
161
+ end
@@ -0,0 +1,35 @@
1
+ require 'frodo'
2
+ require 'rspec/matchers' # required for 'equivalent-xml'
3
+ require 'equivalent-xml'
4
+ require 'securerandom'
5
+ require 'timecop'
6
+ require 'webmock/rspec'
7
+
8
+ # Load all files from `spec/support`
9
+ Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each {|f| require f }
10
+
11
+ WebMock.disable_net_connect!
12
+
13
+ RSpec.configure do |config|
14
+ if config.files_to_run.one?
15
+ config.default_formatter = 'doc'
16
+ end
17
+
18
+ config.profile_examples = 3
19
+ config.order = :random
20
+
21
+ config.expect_with :rspec do |expectations|
22
+ expectations.syntax = :expect
23
+ end
24
+
25
+ config.mock_with :rspec do |mocks|
26
+ mocks.syntax = :expect
27
+ mocks.verify_partial_doubles = true
28
+ end
29
+
30
+ config.after(:example) do
31
+ # We're calling this as a private method because there should not be any
32
+ # reasons to have to flush the service registry except in testing.
33
+ Frodo::ServiceRegistry.instance.send(:flush)
34
+ end
35
+ end
@@ -0,0 +1,2 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FixtureHelpers
4
+ module InstanceMethods
5
+
6
+ def fixture(f)
7
+ File.read(File.expand_path("../../fixtures/#{f}.json", __FILE__))
8
+ end
9
+ end
10
+ end
11
+
12
+ RSpec.configure do |config|
13
+ config.include FixtureHelpers::InstanceMethods
14
+ end
@@ -0,0 +1,19 @@
1
+ module MiddlewareExampleGroup
2
+ def self.included(base)
3
+ base.class_eval do
4
+ let(:app) { double('@app', call: nil) }
5
+ let(:env) { { request_headers: {}, response_headers: {} } }
6
+ let(:retries) { 3 }
7
+ let(:options) { {} }
8
+ let(:client) { double(Frodo::AbstractClient) }
9
+ let(:auth_callback) { double(Proc) }
10
+
11
+ subject(:middleware) { described_class.new app, client, options }
12
+ end
13
+ end
14
+
15
+ RSpec.configure do |config|
16
+ config.include self,
17
+ example_group: { file_path: %r{spec/frodo/middleware} }
18
+ end
19
+ end