pipeline_dealers 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/.gitignore +17 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +4 -0
  4. data/Guardfile +5 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +64 -0
  7. data/Rakefile +1 -0
  8. data/examples/companies_create_and_destroy.rb +6 -0
  9. data/examples/companies_list_all.rb +9 -0
  10. data/examples/company_details.rb +19 -0
  11. data/examples/company_notes.rb +17 -0
  12. data/examples/company_people.rb +15 -0
  13. data/examples/config.rb +54 -0
  14. data/examples/find_person.rb +9 -0
  15. data/examples/list_custom_fields.rb +19 -0
  16. data/examples/people_create_and_destroy.rb +6 -0
  17. data/examples/people_list_all.rb +9 -0
  18. data/lib/pipeline_dealers/backend/base/backend.rb +13 -0
  19. data/lib/pipeline_dealers/backend/base/collection.rb +111 -0
  20. data/lib/pipeline_dealers/backend/base.rb +2 -0
  21. data/lib/pipeline_dealers/backend/http/backend.rb +64 -0
  22. data/lib/pipeline_dealers/backend/http/collection.rb +32 -0
  23. data/lib/pipeline_dealers/backend/http/connection.rb +69 -0
  24. data/lib/pipeline_dealers/backend/http/fetcher.rb +78 -0
  25. data/lib/pipeline_dealers/backend/http.rb +5 -0
  26. data/lib/pipeline_dealers/backend/test/backend.rb +34 -0
  27. data/lib/pipeline_dealers/backend/test/collection.rb +34 -0
  28. data/lib/pipeline_dealers/backend/test.rb +3 -0
  29. data/lib/pipeline_dealers/client.rb +23 -0
  30. data/lib/pipeline_dealers/delegator.rb +61 -0
  31. data/lib/pipeline_dealers/error/connection.rb +17 -0
  32. data/lib/pipeline_dealers/error/custom_field.rb +12 -0
  33. data/lib/pipeline_dealers/error/invalid_attribute.rb +29 -0
  34. data/lib/pipeline_dealers/error.rb +12 -0
  35. data/lib/pipeline_dealers/limits.rb +7 -0
  36. data/lib/pipeline_dealers/model/company/custom_field.rb +9 -0
  37. data/lib/pipeline_dealers/model/company.rb +46 -0
  38. data/lib/pipeline_dealers/model/custom_field.rb +94 -0
  39. data/lib/pipeline_dealers/model/has_custom_fields.rb +62 -0
  40. data/lib/pipeline_dealers/model/note.rb +37 -0
  41. data/lib/pipeline_dealers/model/person/custom_field.rb +9 -0
  42. data/lib/pipeline_dealers/model/person.rb +63 -0
  43. data/lib/pipeline_dealers/model.rb +158 -0
  44. data/lib/pipeline_dealers/test.rb +10 -0
  45. data/lib/pipeline_dealers/version.rb +3 -0
  46. data/lib/pipeline_dealers.rb +24 -0
  47. data/pipeline_dealers.gemspec +39 -0
  48. data/spec/acceptance/companies/creation_spec.rb +30 -0
  49. data/spec/acceptance/companies/custom_fields_spec.rb +8 -0
  50. data/spec/acceptance/companies/updating_spec.rb +36 -0
  51. data/spec/acceptance/people/creation_spec.rb +20 -0
  52. data/spec/pipeline_dealers/backend/http/backend_spec.rb +48 -0
  53. data/spec/pipeline_dealers/backend/http/collection_spec.rb +158 -0
  54. data/spec/pipeline_dealers/model/custom_field_spec.rb +129 -0
  55. data/spec/pipeline_dealers/model/has_custom_fields_spec.rb +115 -0
  56. data/spec/pipeline_dealers/model_spec.rb +33 -0
  57. data/spec/pipeline_dealers/test_client_spec.rb +80 -0
  58. data/spec/support/test_model.rb +6 -0
  59. data/todo.md +13 -0
  60. metadata +291 -0
@@ -0,0 +1,115 @@
1
+ require "pipeline_dealers"
2
+
3
+ describe PipelineDealers::Model::HasCustomFields do
4
+ class ModelWithCustomFields < PipelineDealers::Model
5
+ include HasCustomFields
6
+ self.collection_url = "models"
7
+ self.attribute_name = "model"
8
+ attrs :name
9
+ end
10
+
11
+ class CustomModelField < PipelineDealers::Model::CustomField
12
+ self.collection_url = "admin/model_custom_field_labels"
13
+ end
14
+
15
+ let(:client) { PipelineDealers::Client.new }
16
+ let(:backend) { client.backend }
17
+ let(:connection) { backend.connection }
18
+
19
+ let(:collection) do
20
+ PipelineDealers::Backend::Http::Collection.new(backend, client: double("Client"), model_klass: ModelWithCustomFields, custom_fields: { model_klass: CustomModelField, cached: true, cache_key: :custom_field_cache_key })
21
+ end
22
+
23
+ let(:custom_attributes) { {
24
+
25
+ "custom_label_90" => 42,
26
+ "custom_label_91" => "Yeah"
27
+ } }
28
+
29
+ let(:custom_field_label_entries) {
30
+ [
31
+ {
32
+ "id"=>90,
33
+ "name"=>"TheAnswerForEverything",
34
+ "is_required"=>false,
35
+ "field_type"=>"numeric"
36
+ },
37
+ {
38
+ "id"=>91,
39
+ "name"=>"Really?",
40
+ "is_required"=>false,
41
+ "field_type"=>"text"
42
+ }
43
+ ]
44
+ }
45
+
46
+ let(:custom_field_labels) { {
47
+ "entries"=> custom_field_label_entries,
48
+ "pagination" => {"page" => 1, "pages" => 1, "per_page" => 2, "total" => 2}
49
+ }
50
+ }
51
+
52
+ subject { ModelWithCustomFields.new(collection: collection, persisted: true, attributes: { "id" => 123, name: "Springest", custom_fields: custom_attributes} ) }
53
+
54
+ context "reading custom fields" do
55
+ before { client.stub(:custom_fields).and_return { PLD::CustomField::Collection.new(backend, klass: CustomModelField, cached: true, cache_key: :custom_field_cache_key) } }
56
+
57
+ let(:custom_field_models) do
58
+ custom_field_labels.collect { |label| CustomModelField.new(collection: model_custom_fields, persisted: true, attributes: label["entries"]) }
59
+ end
60
+
61
+ it "fetcheing the translation map is cache" do
62
+ connection.should_receive(:get).once.with("admin/model_custom_field_labels.json", anything()).and_return([200, custom_field_labels])
63
+ subject.custom_fields
64
+ subject.custom_fields
65
+ end
66
+
67
+ it "translates the custom fields to recognizable labels" do
68
+ connection.should_receive(:get).once.with("admin/model_custom_field_labels.json", anything()).and_return([200, custom_field_labels])
69
+
70
+ subject.custom_fields.should == {
71
+ "TheAnswerForEverything" => 42,
72
+ "Really?" => "Yeah"
73
+ }
74
+ end
75
+ end
76
+
77
+ context "storing" do
78
+ before { client.stub(:model_custom_fields).and_return { PLD::CustomField::Collection.new(backend, klass: CustomModelField) } }
79
+
80
+ it "reposts the correct attributes" do
81
+ expected_attributes = {
82
+ "model" => {
83
+ "name" => "Springest",
84
+ "custom_fields" => custom_attributes
85
+ }
86
+ }
87
+
88
+ connection.should_receive(:get).once.with("admin/model_custom_field_labels.json", anything()).and_return([200, custom_field_labels])
89
+ connection.should_receive(:put).once.with("models/123.json", expected_attributes).and_return([200, expected_attributes[:model]])
90
+
91
+ subject.save
92
+ end
93
+
94
+ let(:updated_custom_attributes) { {
95
+ "custom_label_90" => 43,
96
+ "custom_label_91" => "Whoo"
97
+ } }
98
+
99
+ it "posts the correct change" do
100
+ expected_attributes = {
101
+ "model" => {
102
+ "name" => "Springest",
103
+ "custom_fields" => updated_custom_attributes
104
+ }
105
+ }
106
+
107
+ connection.should_receive(:get).once.with("admin/model_custom_field_labels.json", anything()).and_return([200, custom_field_labels])
108
+ connection.should_receive(:put).once.with("models/123.json", expected_attributes).and_return([200, expected_attributes[:model]])
109
+
110
+ subject.custom_fields["TheAnswerForEverything"] = 43
111
+ subject.custom_fields["Really?"] = "Whoo"
112
+ subject.save
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,33 @@
1
+ require "pipeline_dealers"
2
+ require "support/test_model"
3
+
4
+ describe PipelineDealers::Model do
5
+ subject { TestModel }
6
+
7
+ context "initialization" do
8
+ let(:model) { subject.new(attributes: {name: "Springest"}) }
9
+
10
+ it "can access the name by the name method" do
11
+ model.name.should == "Springest"
12
+ end
13
+
14
+ it "can access the name by via attributes['name']" do
15
+ model.attributes['name'].should == "Springest"
16
+ end
17
+
18
+ it "can access the name by via attributes[:name]" do
19
+ model.attributes[:name].should == "Springest"
20
+ end
21
+ end
22
+
23
+ context "setting attributes" do
24
+ let(:model) { subject.new({}) }
25
+ context "name is set using accessor" do
26
+ before { model.name = "Springest" }
27
+
28
+ it "is readable via the accessor" do
29
+ model.name.should == "Springest"
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,80 @@
1
+ require "pipeline_dealers"
2
+ require "pipeline_dealers/test"
3
+
4
+ module PipelineDealers
5
+ describe "Client with TestBackend" do
6
+ subject { TestClient.new }
7
+
8
+ describe "storing a model" do
9
+ describe "#create" do
10
+ it "stores the model" do
11
+ expect do
12
+ subject.companies.create(name: "My Company")
13
+ end.to change { subject.companies.count }.from(0).to(1)
14
+ end
15
+ end
16
+
17
+ describe "#save" do
18
+ let(:model) { subject.companies.new(name: "Some Company") }
19
+
20
+ it "stores the model data" do
21
+ expect { model.save }.to change(model, :id).from(nil).to(Integer)
22
+ end
23
+ end
24
+
25
+ let(:other_client) { TestClient.new }
26
+
27
+ it "is accessable from all instances" do
28
+ other_client.companies.first.should == subject.companies.first
29
+ end
30
+ end
31
+
32
+ describe "destroying a model" do
33
+ let!(:model) { subject.companies.create(name: "My Company") }
34
+
35
+ describe "#destroy" do
36
+ it "decreases the count" do
37
+ expect { model.destroy }.to change { subject.companies.count }.from(1).to(0)
38
+ end
39
+
40
+ it "empties the collection" do
41
+ expect { model.destroy }.to change {
42
+ subject.companies.all.to_a == []
43
+ }.from(false).to(true)
44
+ end
45
+ end
46
+ end
47
+
48
+ describe "Custom fields" do
49
+ context "not defined" do
50
+ let(:model) { subject.companies.new }
51
+
52
+ describe "assignment" do
53
+ it "does not throw an exception" do
54
+ expect { model.custom_fields[:field] = :value }.not_to raise_error
55
+ end
56
+
57
+ it "stores the custom field" do
58
+ model.custom_fields[:field] = :value
59
+ model.custom_fields[:field].should == :value
60
+ end
61
+ end
62
+
63
+ describe "retrieval" do
64
+ let(:model) { subject.companies.new }
65
+
66
+ before do
67
+ model.custom_fields[:field] = :value
68
+ model.save
69
+ end
70
+
71
+ describe "via the collection" do
72
+ it "return the correct value" do
73
+ subject.companies.first.custom_fields[:field].should == :value
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,6 @@
1
+ class TestModel < PipelineDealers::Model
2
+ self.collection_url = "test_models"
3
+ self.attribute_name = "moeha"
4
+
5
+ attrs :name
6
+ end
data/todo.md ADDED
@@ -0,0 +1,13 @@
1
+ # Things that need to be done
2
+
3
+ - Basic models:
4
+ 1. Deals
5
+ 2. Documents
6
+ - The other admin resources
7
+ 1. Deal stages
8
+ 2. Note categories
9
+ 3. Lead sources
10
+ 4. Deal custom fields
11
+ 5. Lead statuses
12
+ 6. Predefined contacts tags
13
+ 7. Event categories
metadata ADDED
@@ -0,0 +1,291 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pipeline_dealers
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Maarten Hoogendoorn
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-03-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: faraday
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.8.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 0.8.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: faraday_middleware
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 0.9.0
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 0.9.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: multi_json
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '1.0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>'
68
+ - !ruby/object:Gem::Version
69
+ version: '2'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>'
76
+ - !ruby/object:Gem::Version
77
+ version: '2'
78
+ - !ruby/object:Gem::Dependency
79
+ name: guard-rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: reek
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: activesupport
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>'
116
+ - !ruby/object:Gem::Version
117
+ version: 3.0.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>'
124
+ - !ruby/object:Gem::Version
125
+ version: 3.0.0
126
+ - !ruby/object:Gem::Dependency
127
+ name: simplecov
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: debugger
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: rake
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ - !ruby/object:Gem::Dependency
175
+ name: rb-inotify
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ~>
180
+ - !ruby/object:Gem::Version
181
+ version: 0.8.8
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ~>
188
+ - !ruby/object:Gem::Version
189
+ version: 0.8.8
190
+ description: API client for PipelineDeals
191
+ email:
192
+ - maarten@springest.com
193
+ executables: []
194
+ extensions: []
195
+ extra_rdoc_files: []
196
+ files:
197
+ - .gitignore
198
+ - .rspec
199
+ - Gemfile
200
+ - Guardfile
201
+ - LICENSE.txt
202
+ - README.md
203
+ - Rakefile
204
+ - examples/companies_create_and_destroy.rb
205
+ - examples/companies_list_all.rb
206
+ - examples/company_details.rb
207
+ - examples/company_notes.rb
208
+ - examples/company_people.rb
209
+ - examples/config.rb
210
+ - examples/find_person.rb
211
+ - examples/list_custom_fields.rb
212
+ - examples/people_create_and_destroy.rb
213
+ - examples/people_list_all.rb
214
+ - lib/pipeline_dealers.rb
215
+ - lib/pipeline_dealers/backend/base.rb
216
+ - lib/pipeline_dealers/backend/base/backend.rb
217
+ - lib/pipeline_dealers/backend/base/collection.rb
218
+ - lib/pipeline_dealers/backend/http.rb
219
+ - lib/pipeline_dealers/backend/http/backend.rb
220
+ - lib/pipeline_dealers/backend/http/collection.rb
221
+ - lib/pipeline_dealers/backend/http/connection.rb
222
+ - lib/pipeline_dealers/backend/http/fetcher.rb
223
+ - lib/pipeline_dealers/backend/test.rb
224
+ - lib/pipeline_dealers/backend/test/backend.rb
225
+ - lib/pipeline_dealers/backend/test/collection.rb
226
+ - lib/pipeline_dealers/client.rb
227
+ - lib/pipeline_dealers/delegator.rb
228
+ - lib/pipeline_dealers/error.rb
229
+ - lib/pipeline_dealers/error/connection.rb
230
+ - lib/pipeline_dealers/error/custom_field.rb
231
+ - lib/pipeline_dealers/error/invalid_attribute.rb
232
+ - lib/pipeline_dealers/limits.rb
233
+ - lib/pipeline_dealers/model.rb
234
+ - lib/pipeline_dealers/model/company.rb
235
+ - lib/pipeline_dealers/model/company/custom_field.rb
236
+ - lib/pipeline_dealers/model/custom_field.rb
237
+ - lib/pipeline_dealers/model/has_custom_fields.rb
238
+ - lib/pipeline_dealers/model/note.rb
239
+ - lib/pipeline_dealers/model/person.rb
240
+ - lib/pipeline_dealers/model/person/custom_field.rb
241
+ - lib/pipeline_dealers/test.rb
242
+ - lib/pipeline_dealers/version.rb
243
+ - pipeline_dealers.gemspec
244
+ - spec/acceptance/companies/creation_spec.rb
245
+ - spec/acceptance/companies/custom_fields_spec.rb
246
+ - spec/acceptance/companies/updating_spec.rb
247
+ - spec/acceptance/people/creation_spec.rb
248
+ - spec/pipeline_dealers/backend/http/backend_spec.rb
249
+ - spec/pipeline_dealers/backend/http/collection_spec.rb
250
+ - spec/pipeline_dealers/model/custom_field_spec.rb
251
+ - spec/pipeline_dealers/model/has_custom_fields_spec.rb
252
+ - spec/pipeline_dealers/model_spec.rb
253
+ - spec/pipeline_dealers/test_client_spec.rb
254
+ - spec/support/test_model.rb
255
+ - todo.md
256
+ homepage: https://github.com/Springest/pipeline_dealers
257
+ licenses: []
258
+ post_install_message:
259
+ rdoc_options: []
260
+ require_paths:
261
+ - lib
262
+ required_ruby_version: !ruby/object:Gem::Requirement
263
+ none: false
264
+ requirements:
265
+ - - ! '>='
266
+ - !ruby/object:Gem::Version
267
+ version: '0'
268
+ required_rubygems_version: !ruby/object:Gem::Requirement
269
+ none: false
270
+ requirements:
271
+ - - ! '>='
272
+ - !ruby/object:Gem::Version
273
+ version: '0'
274
+ requirements: []
275
+ rubyforge_project:
276
+ rubygems_version: 1.8.23
277
+ signing_key:
278
+ specification_version: 3
279
+ summary: API client for PipelineDeals
280
+ test_files:
281
+ - spec/acceptance/companies/creation_spec.rb
282
+ - spec/acceptance/companies/custom_fields_spec.rb
283
+ - spec/acceptance/companies/updating_spec.rb
284
+ - spec/acceptance/people/creation_spec.rb
285
+ - spec/pipeline_dealers/backend/http/backend_spec.rb
286
+ - spec/pipeline_dealers/backend/http/collection_spec.rb
287
+ - spec/pipeline_dealers/model/custom_field_spec.rb
288
+ - spec/pipeline_dealers/model/has_custom_fields_spec.rb
289
+ - spec/pipeline_dealers/model_spec.rb
290
+ - spec/pipeline_dealers/test_client_spec.rb
291
+ - spec/support/test_model.rb