wcc-data 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 (52) hide show
  1. checksums.yaml +7 -0
  2. data/.env.example +3 -0
  3. data/.gitignore +18 -0
  4. data/.rspec +2 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +29 -0
  8. data/Rakefile +36 -0
  9. data/circle.yml +6 -0
  10. data/lib/wcc/data.rb +26 -0
  11. data/lib/wcc/data/config.rb +45 -0
  12. data/lib/wcc/data/enumerated_type.rb +63 -0
  13. data/lib/wcc/data/faraday_client_app_token_auth.rb +64 -0
  14. data/lib/wcc/data/mapper.rb +16 -0
  15. data/lib/wcc/data/mapper/attributes.rb +54 -0
  16. data/lib/wcc/data/mapper/json_response.rb +20 -0
  17. data/lib/wcc/data/mapper/rest_configuration.rb +36 -0
  18. data/lib/wcc/data/mapper/rest_query.rb +28 -0
  19. data/lib/wcc/data/model.rb +11 -0
  20. data/lib/wcc/data/nucleus.rb +15 -0
  21. data/lib/wcc/data/nucleus/address.rb +17 -0
  22. data/lib/wcc/data/nucleus/base.rb +6 -0
  23. data/lib/wcc/data/nucleus/campus.rb +47 -0
  24. data/lib/wcc/data/nucleus/client_app_token.rb +30 -0
  25. data/lib/wcc/data/nucleus/contact.rb +33 -0
  26. data/lib/wcc/data/nucleus/gender.rb +26 -0
  27. data/lib/wcc/data/nucleus/group.rb +18 -0
  28. data/lib/wcc/data/nucleus/marital_status.rb +41 -0
  29. data/lib/wcc/data/nucleus/user.rb +49 -0
  30. data/lib/wcc/data/rack_client_app_token_auth.rb +77 -0
  31. data/lib/wcc/data/response.rb +29 -0
  32. data/lib/wcc/data/rest_endpoint.rb +33 -0
  33. data/lib/wcc/data/service.rb +55 -0
  34. data/lib/wcc/data/version.rb +5 -0
  35. data/spec/spec_helper.rb +22 -0
  36. data/spec/support/inheritable_class_attribute_examples.rb +16 -0
  37. data/spec/wcc/data/config_spec.rb +113 -0
  38. data/spec/wcc/data/enumerated_type_spec.rb +176 -0
  39. data/spec/wcc/data/faraday_client_app_token_auth_spec.rb +224 -0
  40. data/spec/wcc/data/mapper/attributes_spec.rb +94 -0
  41. data/spec/wcc/data/mapper/json_response_spec.rb +50 -0
  42. data/spec/wcc/data/mapper/rest_configuration_spec.rb +43 -0
  43. data/spec/wcc/data/mapper/rest_query_spec.rb +50 -0
  44. data/spec/wcc/data/model_spec.rb +33 -0
  45. data/spec/wcc/data/nucleus/campus_spec.rb +29 -0
  46. data/spec/wcc/data/rack_client_app_token_auth_spec.rb +219 -0
  47. data/spec/wcc/data/response_spec.rb +57 -0
  48. data/spec/wcc/data/rest_endpoint_spec.rb +71 -0
  49. data/spec/wcc/data/service_spec.rb +128 -0
  50. data/spec/wcc/data_spec.rb +25 -0
  51. data/wcc-data.gemspec +28 -0
  52. metadata +194 -0
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ describe WCC::Data::Response do
4
+ let(:unit) { WCC::Data::Response }
5
+ let(:raw) { double(:faraday_response) }
6
+ subject { unit.new(raw) }
7
+
8
+ describe "#initialize" do
9
+ it "takes a Faraday response object and sets it to @raw" do
10
+ expect(subject.raw).to eq(raw)
11
+ end
12
+ end
13
+
14
+ describe "method delegation" do
15
+ it "delegates `body` to @raw" do
16
+ expect(raw).to receive(:body).and_return(:value)
17
+ expect(subject.body).to eq(:value)
18
+ expect(subject.respond_to?(:body)).to be_truthy
19
+ end
20
+
21
+ it "delegates `headers` to @raw" do
22
+ expect(raw).to receive(:headers).and_return(:value)
23
+ expect(subject.headers).to eq(:value)
24
+ expect(subject.respond_to?(:headers)).to be_truthy
25
+ end
26
+
27
+ it "delegates `status` to @raw" do
28
+ expect(raw).to receive(:status).and_return(:value)
29
+ expect(subject.status).to eq(:value)
30
+ expect(subject.respond_to?(:status)).to be_truthy
31
+ end
32
+
33
+ it "delegates `success?` to @raw" do
34
+ expect(raw).to receive(:success?).and_return(:value)
35
+ expect(subject.success?).to eq(:value)
36
+ expect(subject.respond_to?(:success?)).to be_truthy
37
+ end
38
+ end
39
+
40
+ describe "#json" do
41
+ it "returns JSON deserialized body" do
42
+ expect(raw).to receive(:body) {
43
+ %[{"name":"Bob","interests":["Fishing","Rowing","Golfing"]}]
44
+ }
45
+ expect(subject.json).to eq({
46
+ "name" => "Bob",
47
+ "interests" => ["Fishing", "Rowing", "Golfing"],
48
+ })
49
+ end
50
+
51
+ it "returns nil if body is not valid JSON" do
52
+ expect(raw).to receive(:body) { "" }
53
+ expect(subject.json).to be_nil
54
+ end
55
+ end
56
+
57
+ end
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ describe WCC::Data::RESTEndpoint do
4
+ let(:service) { WCC::Data::Service.new }
5
+ subject { described_class.new(service: service) }
6
+
7
+ describe "#initialize" do
8
+ subject { described_class }
9
+ it "sets @service from :service option" do
10
+ obj = subject.new(service: service)
11
+ expect(obj.service).to eq(service)
12
+ end
13
+ end
14
+
15
+ shared_examples_for :rest_method_general_options do |method, verb, args|
16
+ let(:test_args) {
17
+ { foo: "bar", baz: "bing" }
18
+ }
19
+ it "takes a hash as last argument and passes to underlying service" do
20
+ args = Array(args)
21
+ expect(service).to receive(verb).with(hash_including(test_args))
22
+ subject.public_send(method, *args, test_args)
23
+ end
24
+ end
25
+
26
+ describe "#index" do
27
+ it_behaves_like :rest_method_general_options, :index, :get
28
+
29
+ it "calls #get directly on service" do
30
+ expect(service).to receive(:get).and_return("hi there")
31
+ expect(subject.index).to eq("hi there")
32
+ end
33
+ end
34
+
35
+ describe "#show" do
36
+ it_behaves_like :rest_method_general_options, :show, :get, 1
37
+
38
+ it "calls #get on service adding the id param to the URI" do
39
+ expect(service).to receive(:get).with(uri: "123").and_return("yo")
40
+ expect(subject.show(123)).to eq("yo")
41
+ end
42
+ end
43
+
44
+ describe "#create" do
45
+ it_behaves_like :rest_method_general_options, :create, :post, { test: 1 }
46
+
47
+ it "calls #post on service with attrs hash as body" do
48
+ expect(service).to receive(:post).with(body: { foo: "bar" }).and_return("hey bra")
49
+ expect(subject.create(foo: "bar")).to eq("hey bra")
50
+ end
51
+ end
52
+
53
+ describe "#update" do
54
+ it_behaves_like :rest_method_general_options, :update, :patch, [1, { test: 1 }]
55
+
56
+ it "calls #patch on service with id as URI and attrs as body" do
57
+ expect(service).to receive(:patch).with(uri: "123", body: {}).and_return("sup")
58
+ expect(subject.update(123, {})).to eq("sup")
59
+ end
60
+ end
61
+
62
+ describe "#destroy" do
63
+ it_behaves_like :rest_method_general_options, :destroy, :delete, 1
64
+
65
+ it "calls #delete on service with id as URI" do
66
+ expect(service).to receive(:delete).with(uri: "123").and_return("oh noes!")
67
+ expect(subject.destroy(123)).to eq("oh noes!")
68
+ end
69
+ end
70
+
71
+ end
@@ -0,0 +1,128 @@
1
+ require 'spec_helper'
2
+
3
+ describe WCC::Data::Service do
4
+ let(:unit) { WCC::Data::Service }
5
+ let(:connection) { double() }
6
+ let(:default_args) {
7
+ {
8
+ uri: "http://test.com/foo/",
9
+ connection: connection,
10
+ }
11
+ }
12
+ subject { unit.new(default_args) }
13
+
14
+ describe "#initialize" do
15
+ it "sets :uri to @uri" do
16
+ expect(subject.uri).to eq(URI(default_args[:uri]))
17
+ end
18
+
19
+ it "sets :connection to @connection" do
20
+ expect(subject.connection).to eq(default_args[:connection])
21
+ end
22
+ end
23
+
24
+ describe "#merge" do
25
+ it "returns a new instance" do
26
+ merged = subject.merge
27
+ expect(merged).to be_a(unit)
28
+ expect(merged.object_id).to_not eq(subject.object_id)
29
+ end
30
+
31
+ it "merges the URI params" do
32
+ merged = subject.merge(uri: "bar/baz?query")
33
+ expect(merged.uri.path).to eq("/foo/bar/baz")
34
+ expect(merged.uri.query).to eq("query")
35
+ end
36
+
37
+ it "sets to the right instance's @connection" do
38
+ connection = :bar
39
+ merged = subject.merge(connection: connection)
40
+ expect(merged.connection).to eq(connection)
41
+ end
42
+
43
+ it "accepts a hash of arguments as well as an instance" do
44
+ right = unit.new(uri: "bar", connection: double())
45
+ merged = subject.merge(right)
46
+ expect(merged.uri).to eq(URI("http://test.com/foo/bar"))
47
+ expect(merged.connection).to eq(right.connection)
48
+ end
49
+
50
+ end
51
+
52
+ shared_examples_for :http_verb_methods do
53
+ it "request verb matches the method name" do
54
+ expect(connection).to receive(:run_request) do |verb, _, _, _|
55
+ expect(verb).to eq(method)
56
+ end
57
+ subject.send(method, {})
58
+ end
59
+
60
+ it "returns a WCC::Data::Response instance" do
61
+ expect(connection).to receive(:run_request) {}
62
+ expect(subject.send(method, {})).to be_a(WCC::Data::Response)
63
+ end
64
+
65
+ it "merges :uri arg onto @uri" do
66
+ expect(connection).to receive(:run_request) do |_, url, _, _|
67
+ expect(url).to eq(URI("http://test.com/foo/bar"))
68
+ end
69
+ subject.send(method, uri: "bar")
70
+ end
71
+
72
+ it "sets the request body with :body arg" do
73
+ expect(connection).to receive(:run_request) do |_, _, body, _|
74
+ expect(body).to eq("a string")
75
+ end
76
+ subject.send(method, body: "a string")
77
+ end
78
+
79
+ it "provides request headers with :headers arg" do
80
+ expect(connection).to receive(:run_request) do |_, _, _, headers|
81
+ expect(headers).to eq(:foo)
82
+ end
83
+ subject.send(method, headers: :foo)
84
+ end
85
+
86
+ it "updates the params on the request if :params argument provided" do
87
+ params = { foo: "bar" }
88
+ request = double(params: double(:params))
89
+ expect(connection).to receive(:run_request).and_yield(request)
90
+
91
+ expect(request.params).to receive(:update).with(params)
92
+ subject.send(method, params: params)
93
+ end
94
+
95
+ it "does not update the params on the request if :params is nil" do
96
+ request = double(params: double(:params))
97
+ expect(connection).to receive(:run_request).and_yield(request)
98
+ expect(request.params).to_not receive(:update)
99
+ subject.send(method, {})
100
+ end
101
+ end
102
+
103
+ describe "#get" do
104
+ let(:method) { :get }
105
+ it_behaves_like :http_verb_methods
106
+ end
107
+
108
+ describe "#post" do
109
+ let(:method) { :post }
110
+ it_behaves_like :http_verb_methods
111
+ end
112
+
113
+ describe "#put" do
114
+ let(:method) { :put }
115
+ it_behaves_like :http_verb_methods
116
+ end
117
+
118
+ describe "#patch" do
119
+ let(:method) { :patch }
120
+ it_behaves_like :http_verb_methods
121
+ end
122
+
123
+ describe "#delete" do
124
+ let(:method) { :delete }
125
+ it_behaves_like :http_verb_methods
126
+ end
127
+
128
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe WCC::Data do
4
+
5
+ describe "::config" do
6
+ it "returns a cached instance of Config" do
7
+ config = WCC::Data.config
8
+ expect(config).to be_a(WCC::Data::Config)
9
+ expect(WCC::Data.config).to eq(config)
10
+ end
11
+ end
12
+
13
+ describe "::setup" do
14
+ it "yields to the provided block with config" do
15
+ config = WCC::Data.config
16
+ called = false
17
+ WCC::Data.setup do |passed_config|
18
+ called = true
19
+ expect(passed_config).to eq(config)
20
+ end
21
+ expect(called).to be_truthy
22
+ end
23
+ end
24
+
25
+ end
data/wcc-data.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'wcc/data/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "wcc-data"
8
+ spec.version = WCC::Data::VERSION
9
+ spec.authors = ["Travis Petticrew"]
10
+ spec.email = ["travis@petticrew.net"]
11
+ spec.description = %q{Watermark's library for interapp communication via APIs}
12
+ spec.summary = %q{Watermark's library for interapp communication via APIs}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "faraday", "~> 0.8"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.3"
24
+ spec.add_development_dependency "dotenv", "~> 0.10.0"
25
+ spec.add_development_dependency "rake"
26
+ spec.add_development_dependency "rspec", "~>3.3"
27
+ spec.add_development_dependency "sidekiq"
28
+ end
metadata ADDED
@@ -0,0 +1,194 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: wcc-data
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Travis Petticrew
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-05-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.8'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: dotenv
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.10.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.10.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.3'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.3'
83
+ - !ruby/object:Gem::Dependency
84
+ name: sidekiq
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Watermark's library for interapp communication via APIs
98
+ email:
99
+ - travis@petticrew.net
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".env.example"
105
+ - ".gitignore"
106
+ - ".rspec"
107
+ - Gemfile
108
+ - LICENSE.txt
109
+ - README.md
110
+ - Rakefile
111
+ - circle.yml
112
+ - lib/wcc/data.rb
113
+ - lib/wcc/data/config.rb
114
+ - lib/wcc/data/enumerated_type.rb
115
+ - lib/wcc/data/faraday_client_app_token_auth.rb
116
+ - lib/wcc/data/mapper.rb
117
+ - lib/wcc/data/mapper/attributes.rb
118
+ - lib/wcc/data/mapper/json_response.rb
119
+ - lib/wcc/data/mapper/rest_configuration.rb
120
+ - lib/wcc/data/mapper/rest_query.rb
121
+ - lib/wcc/data/model.rb
122
+ - lib/wcc/data/nucleus.rb
123
+ - lib/wcc/data/nucleus/address.rb
124
+ - lib/wcc/data/nucleus/base.rb
125
+ - lib/wcc/data/nucleus/campus.rb
126
+ - lib/wcc/data/nucleus/client_app_token.rb
127
+ - lib/wcc/data/nucleus/contact.rb
128
+ - lib/wcc/data/nucleus/gender.rb
129
+ - lib/wcc/data/nucleus/group.rb
130
+ - lib/wcc/data/nucleus/marital_status.rb
131
+ - lib/wcc/data/nucleus/user.rb
132
+ - lib/wcc/data/rack_client_app_token_auth.rb
133
+ - lib/wcc/data/response.rb
134
+ - lib/wcc/data/rest_endpoint.rb
135
+ - lib/wcc/data/service.rb
136
+ - lib/wcc/data/version.rb
137
+ - spec/spec_helper.rb
138
+ - spec/support/inheritable_class_attribute_examples.rb
139
+ - spec/wcc/data/config_spec.rb
140
+ - spec/wcc/data/enumerated_type_spec.rb
141
+ - spec/wcc/data/faraday_client_app_token_auth_spec.rb
142
+ - spec/wcc/data/mapper/attributes_spec.rb
143
+ - spec/wcc/data/mapper/json_response_spec.rb
144
+ - spec/wcc/data/mapper/rest_configuration_spec.rb
145
+ - spec/wcc/data/mapper/rest_query_spec.rb
146
+ - spec/wcc/data/model_spec.rb
147
+ - spec/wcc/data/nucleus/campus_spec.rb
148
+ - spec/wcc/data/rack_client_app_token_auth_spec.rb
149
+ - spec/wcc/data/response_spec.rb
150
+ - spec/wcc/data/rest_endpoint_spec.rb
151
+ - spec/wcc/data/service_spec.rb
152
+ - spec/wcc/data_spec.rb
153
+ - wcc-data.gemspec
154
+ homepage: ''
155
+ licenses:
156
+ - MIT
157
+ metadata: {}
158
+ post_install_message:
159
+ rdoc_options: []
160
+ require_paths:
161
+ - lib
162
+ required_ruby_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ required_rubygems_version: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ requirements: []
173
+ rubyforge_project:
174
+ rubygems_version: 2.4.2
175
+ signing_key:
176
+ specification_version: 4
177
+ summary: Watermark's library for interapp communication via APIs
178
+ test_files:
179
+ - spec/spec_helper.rb
180
+ - spec/support/inheritable_class_attribute_examples.rb
181
+ - spec/wcc/data/config_spec.rb
182
+ - spec/wcc/data/enumerated_type_spec.rb
183
+ - spec/wcc/data/faraday_client_app_token_auth_spec.rb
184
+ - spec/wcc/data/mapper/attributes_spec.rb
185
+ - spec/wcc/data/mapper/json_response_spec.rb
186
+ - spec/wcc/data/mapper/rest_configuration_spec.rb
187
+ - spec/wcc/data/mapper/rest_query_spec.rb
188
+ - spec/wcc/data/model_spec.rb
189
+ - spec/wcc/data/nucleus/campus_spec.rb
190
+ - spec/wcc/data/rack_client_app_token_auth_spec.rb
191
+ - spec/wcc/data/response_spec.rb
192
+ - spec/wcc/data/rest_endpoint_spec.rb
193
+ - spec/wcc/data/service_spec.rb
194
+ - spec/wcc/data_spec.rb