pipeline_dealers 0.0.1

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 (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
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pipelinedealers.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,5 @@
1
+ guard "rspec" do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch("spec/helper.rb") { "spec" }
5
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Maarten Hoogendoorn
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,64 @@
1
+ # Pipelinedealers
2
+
3
+ API client for pipelinedeals.com
4
+
5
+ ## Installation
6
+
7
+ Add it to your application's Gemfile:
8
+
9
+ ```gem 'pipeline_dealers'```
10
+
11
+ ## Usage
12
+
13
+ The client's API is modelled after ActiveRecord.
14
+
15
+ ```ruby
16
+ require 'pipeline_dealers'
17
+
18
+ client = Pipelinedealers::Client.new(api_key: "z3kr3tp@zzw0rd")
19
+
20
+ # Get all companies
21
+ client.companies.all.each do |company|
22
+ puts company.name
23
+ end
24
+
25
+ # Find company by ID
26
+ my_company = client.companies.find(id)
27
+
28
+ my_company.name = "foobar"
29
+ my_company.save
30
+ ```
31
+
32
+ For more details and how to use people and notes, see [the examples](examples/)
33
+
34
+ ## Test your application's usage of pipeline\_dealers.
35
+
36
+ ```ruby
37
+ require 'pipeline_dealers'
38
+ require 'pipeline_dealers/test'
39
+
40
+ describe "MyClass" do
41
+ let(:client) { Pipelinedealers::TestClient.new }
42
+
43
+ it "should create a company" do
44
+ expect do
45
+ client.companies.create(name: "AwesomeCompany")
46
+ end.to change(client.companies, :length).from(0).to(1)
47
+ end
48
+ end
49
+ ```
50
+ *Note:* Be sure to stub the client in your code. This only works if you use the same client reference in both the specs and your application.
51
+
52
+ ## Contributing
53
+
54
+ 1. Fork it
55
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
56
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
57
+ 4. Push to the branch (`git push origin my-new-feature`)
58
+ 5. Create new Pull Request
59
+
60
+ ## Thanks to
61
+
62
+ The awesome people at
63
+
64
+ [![Springest](http://static-1.cdnhub.nl/images/logo-springest.jpg "Logo springest.com")](http://www.springest.com/about-springest)
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative "config"
3
+
4
+ client = PipelineDealers::Client.new(api_key: YOUR_API_KEY)
5
+ company = client.companies.create(name: "Awesome Company")
6
+ company.destroy
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative "config"
3
+
4
+ client = PipelineDealers::Client.new(api_key: YOUR_API_KEY)
5
+
6
+ client.companies.each do |company|
7
+ p company
8
+ puts
9
+ end
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative "config"
3
+
4
+ client = PipelineDealers::Client.new(api_key: YOUR_API_KEY)
5
+
6
+ id = ask_id("Enter the ID of the company")
7
+
8
+ company = client.companies.find(id)
9
+
10
+ attributes = PipelineDealers::Model::Company.attributes.collect do |attribute, options|
11
+ [attribute, options, company.attributes[attribute]]
12
+ end
13
+
14
+ print_table ["Name", "Options", "Value"], attributes
15
+
16
+ puts
17
+
18
+ puts "Custom fields of this company:"
19
+ print_table ["Name", "Value"], company.custom_fields.collect { |k,v| [k,v] }
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative "config"
3
+
4
+ client = PipelineDealers::Client.new(api_key: YOUR_API_KEY)
5
+
6
+ client.companies.each do |company|
7
+ puts "Company: " + company.name
8
+ puts "Notes:"
9
+
10
+ company.notes.each do |note|
11
+ puts "Title : #{note.title}"
12
+ puts " - Person : #{note.person.full_name}" if note.person_id != nil
13
+ puts " - Content: #{note.content.gsub("\n","\n ")}"
14
+ end
15
+
16
+ puts
17
+ end
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative "config"
3
+
4
+ client = PipelineDealers::Client.new(api_key: YOUR_API_KEY)
5
+
6
+ client.companies.each do |company|
7
+ puts "Company: " + company.name
8
+ puts "People:"
9
+
10
+ company.people.each do |person|
11
+ puts " - " + person.full_name
12
+ end
13
+
14
+ puts
15
+ end
@@ -0,0 +1,54 @@
1
+ require "rubygems"
2
+ require "bundler"
3
+
4
+ Bundler.setup
5
+
6
+ require "pipeline_dealers"
7
+
8
+ YOUR_API_KEY = ENV["API_KEY"]
9
+
10
+ if YOUR_API_KEY.nil?
11
+ puts "Run these examples like: "
12
+ puts " $ API_KEY=<YOUR_API_KEY> bundle exec ./<EXAMPLE>.rb"
13
+ exit
14
+ end
15
+
16
+ def ask_id question
17
+ puts question
18
+ while true
19
+ id = gets.chomp.strip.to_i
20
+ if id < 1
21
+ puts "Invalid id!"
22
+ puts question
23
+ else
24
+ return id
25
+ end
26
+ end
27
+ end
28
+
29
+ def print_table header, rows
30
+ rows = [header] +rows.map { |row| row.map { |item| item.inspect} }
31
+ maximums = {}
32
+ rows.each do |row|
33
+ row.each_with_index do |val, idx|
34
+ maximums[idx] = 0 if maximums[idx].nil?
35
+
36
+ length = val.length
37
+ maximums[idx] = length if maximums[idx] < length
38
+ end
39
+ end
40
+
41
+ format = "|"
42
+ separator="+"
43
+ maximums.keys.sort.each do |idx|
44
+ format += " %-#{maximums[idx]}s |"
45
+ separator += "-#{'-'*maximums[idx] }-+"
46
+ end
47
+
48
+ header = rows.shift
49
+ puts separator
50
+ puts(format % header)
51
+ puts separator
52
+ rows.each { |row| puts(format % row) }
53
+ puts separator
54
+ end
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative "config"
3
+
4
+ client = PipelineDealers::Client.new(api_key: YOUR_API_KEY)
5
+
6
+ id = ask_id("Enter the ID of the person you want to find")
7
+
8
+ person = client.people.find(id)
9
+ p person
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative "config"
3
+
4
+ client = PipelineDealers::Client.new(api_key: YOUR_API_KEY)
5
+
6
+ puts "Custom fields for companies:"
7
+ custom_fields = client.companies.custom_fields.all.collect do |field|
8
+ [field.name, field.is_required, field.field_type]
9
+ end
10
+ print_table ["Name", "Required?", "Field type"], custom_fields
11
+
12
+ puts
13
+
14
+ puts "Custom fields for people:"
15
+ custom_fields = client.people.custom_fields.all.collect do |field|
16
+ [field.name, field.is_required, field.field_type]
17
+ end
18
+ print_table ["Name", "Required?", "Field type"], custom_fields
19
+
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative "config"
3
+
4
+ client = PipelineDealers::Client.new(api_key: YOUR_API_KEY)
5
+ person = client.people.create(first_name: "Maarten", last_name: "Hoogendoorn")
6
+ person.destroy
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative "config"
3
+
4
+ client = PipelineDealers::Client.new(api_key: YOUR_API_KEY)
5
+
6
+ client.people.each do |person|
7
+ p person
8
+ puts
9
+ end
@@ -0,0 +1,13 @@
1
+ module PipelineDealers
2
+ module Backend
3
+ class Base
4
+ def cache(key, &block)
5
+ if not @cache.has_key?(key)
6
+ @cache[key] = block.call
7
+ end
8
+
9
+ @cache[key]
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,111 @@
1
+ module PipelineDealers
2
+ module Backend
3
+ class Base
4
+ class Collection
5
+ extend Delegator
6
+
7
+ Identity = lambda { |x| x }
8
+
9
+ delegate :connection, to: :backend
10
+ delegate :collection_url, to: :model_klass
11
+
12
+ attr_reader :model_klass, :backend, :client
13
+
14
+ def initialize(backend, options)
15
+ @options = options
16
+ @backend = backend
17
+ @client = options[:client] || raise("No client given")
18
+ @model_klass = options[:model_klass] || raise("No :model_klass given")
19
+ end
20
+
21
+ def custom_fields
22
+ if @options[:custom_fields]
23
+ @custom_fields ||= @backend.collection(@options[:custom_fields].merge(client: @client))
24
+ else
25
+ raise "Collection of #{@model_klass} doesn not have any custom fields"
26
+ end
27
+ end
28
+
29
+ def all
30
+ if use_cache?
31
+ @backend.cache(@options[:cache_key]) { self.to_a }
32
+ else
33
+ self
34
+ end
35
+ end
36
+
37
+ def select &block
38
+ results = []
39
+
40
+ self.each do |result|
41
+ results << result if block.call(result)
42
+ end
43
+
44
+ results
45
+ end
46
+
47
+ def collect &operation
48
+ results = []
49
+
50
+ self.each do
51
+ end
52
+
53
+ results
54
+ end
55
+
56
+ def where(condition)
57
+ refine(where: condition)
58
+ end
59
+
60
+ def limit(to)
61
+ refine(limit: to)
62
+ end
63
+
64
+ def first
65
+ limit(1).collect { |x| return x }
66
+ end
67
+
68
+ def to_a
69
+ collect &Identity
70
+ end
71
+
72
+ def count
73
+ @backend.count(self)
74
+ end
75
+
76
+ def new(attributes = {})
77
+ if @options[:new_defaults]
78
+ attributes = @options[:new_defaults].merge(attributes)
79
+ end
80
+
81
+ model_klass.new(collection: self, record_new: true, attributes: attributes)
82
+ end
83
+
84
+ def create(attributes = {})
85
+ save(new(attributes))
86
+ end
87
+
88
+ def save(model)
89
+ @backend.save(self, model)
90
+ model
91
+ end
92
+
93
+ def destroy(model)
94
+ @backend.destroy(self, model)
95
+ model
96
+ end
97
+
98
+ protected
99
+
100
+ # Refine the criterea
101
+ def refine(refinements)
102
+ self.class.new(@backend, @options.merge(refinements))
103
+ end
104
+
105
+ def use_cache?
106
+ @options[:cached] == true
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,2 @@
1
+ require "pipeline_dealers/backend/base/backend"
2
+ require "pipeline_dealers/backend/base/collection"
@@ -0,0 +1,64 @@
1
+ module PipelineDealers
2
+ module Backend
3
+ class Http < Base
4
+ attr_reader :connection
5
+
6
+ def initialize(options)
7
+ @cache = {}
8
+ @options = options
9
+ @connection = Connection.new(@options)
10
+ end
11
+
12
+ def collection(options)
13
+ Collection.new(self, options)
14
+ end
15
+
16
+ def save(collection, model)
17
+ model_attr_name = model.class.attribute_name
18
+
19
+ if model_attr_name.nil?
20
+ raise "Model #{model.class} doesn't have a attribute_name field"
21
+ end
22
+
23
+ # Use :post for new records, :put for existing ones
24
+ method = model.new_record? ? :post : :put
25
+
26
+ status, response = @connection.send(method, model_url(collection, model), model_attr_name => model.save_attrs)
27
+
28
+ case status
29
+ when 200 then
30
+ model.send(:import_attributes!, response) # Update with server side copy
31
+ model.send(:instance_variable_set, :@persisted, true) # Mark as persisted
32
+ when 422 then handle_errors_during_save(response)
33
+ else; raise "Unexepcted response status #{status.inspect}"
34
+ end
35
+
36
+ self
37
+ end
38
+
39
+ def destroy(collection, model)
40
+ state, response = @connection.delete(model_url(collection, model), {})
41
+ if (state == 200)
42
+ model.send(:instance_variable_set, :@persisted, false) # Mark as persisted
43
+ model
44
+ else
45
+ raise "Could not remove"
46
+ end
47
+ end
48
+
49
+ def model_url(collection, model)
50
+ if model.persisted?
51
+ collection.send(:collection_url) + "/" + model.id.to_s + ".json"
52
+ else
53
+ collection.send(:collection_url) + ".json"
54
+ end
55
+ end
56
+
57
+ protected
58
+
59
+ def handle_errors_during_save(response)
60
+ raise response.collect { |error| "field '#{error["field"]}' #{error["msg"]}" }.join(" and ").capitalize
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,32 @@
1
+ module PipelineDealers
2
+ module Backend
3
+ class Http
4
+ class Collection < Backend::Base::Collection
5
+ def find id
6
+ status, result = @backend.connection.get(collection_url + "/#{id}.json", {})
7
+ if status == 200
8
+ model_klass.new(collection: self, persisted: true, attributes: result)
9
+ else
10
+ raise Error::NotFound
11
+ end
12
+ end
13
+
14
+ def each &operation
15
+ Fetcher.new(@backend.connection, self, model_klass, @options).each do |result|
16
+ operation.call(result)
17
+ end
18
+ end
19
+
20
+ def collect &operation
21
+ results = []
22
+
23
+ Fetcher.new(@backend.connection, self, model_klass, @options).each do |result|
24
+ results << operation.call(result)
25
+ end
26
+
27
+ results
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,69 @@
1
+ require "faraday"
2
+
3
+ module PipelineDealers
4
+ module Backend
5
+ class Http
6
+ class Connection
7
+ ENDPOINT = "https://api.pipelinedeals.com/api/v3/"
8
+
9
+ def initialize(options)
10
+ @key = options.delete(:api_key)
11
+ @options = options
12
+ @http = build_connection
13
+ end
14
+
15
+ def build_connection
16
+ Faraday.new(url: ENDPOINT) do |faraday|
17
+ faraday.request :url_encoded
18
+ faraday.response :logger if @options[:http_debug]
19
+ faraday.adapter Faraday.default_adapter
20
+ end
21
+ end
22
+
23
+ # HTTP methods
24
+ {get: :get_style, post: :post_style, put: :post_style, delete: :get_style}.each do |name, style|
25
+ class_eval <<-RUBY
26
+ def #{name} url, params = {}
27
+ request_#{style}(:#{name}, url, params)
28
+ end
29
+ RUBY
30
+ end
31
+
32
+ protected
33
+
34
+ # get / delete
35
+ def request_get_style method, request_url, params
36
+ request_params = params.merge(api_key: @key)
37
+ query = Faraday::Utils.build_nested_query(request_params)
38
+ server_response = @http.send(method, request_url + "?" + query)
39
+
40
+ # Bwelch. Only a delete doesn't return valid json :(
41
+ raw = (method == :delete)
42
+
43
+ build_response_from server_response, raw: raw
44
+ end
45
+
46
+ # post / put
47
+ def request_post_style method, request_url, params
48
+ request_url += "?api_key=#{@key}"
49
+ request_body = Faraday::Utils.build_nested_query(params)
50
+ build_response_from @http.send(method, request_url, request_body)
51
+ end
52
+
53
+ DEFAULT_REQUEST_OPTIONS = { raw: false }
54
+
55
+ def build_response_from response, options = DEFAULT_REQUEST_OPTIONS
56
+ if options[:raw]
57
+ return [response.status, JSON.parse('{ "msg": "' + response.body + '" }')]
58
+ else
59
+ return [response.status, JSON.parse(response.body)]
60
+ end
61
+ end
62
+
63
+ def debug?
64
+ ENV['DEBUG'] == "true"
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,78 @@
1
+ module PipelineDealers
2
+ module Backend
3
+ class Http
4
+ class Fetcher
5
+ attr_reader :options
6
+
7
+ # This struct captures the state we need to implement an transparent API
8
+ Cursor = Struct.new(:params, :results_yielded, :done)
9
+
10
+ def initialize(connection, collection, model_klass, options)
11
+ @connection = connection
12
+ @collection = collection
13
+ @model_klass = model_klass
14
+ @options = options
15
+ end
16
+
17
+ def each(&block)
18
+ cursor = Cursor.new(build_params, 0, false)
19
+ if @collection.collection_url.nil?
20
+ raise "Model #{@model_klass.to_s} doesn't have 'collection_url' value"
21
+ end
22
+
23
+ while not cursor.done
24
+ status, result = @connection.get(@collection.collection_url + ".json", cursor.params)
25
+
26
+ if status == 200
27
+ yield_results(cursor, result, &block)
28
+ else
29
+ raise "Unexpected status! #{status.inspect}. Expected 200"
30
+ end
31
+ end
32
+ end
33
+
34
+ def build_params
35
+ params = { page: 1, per_page: Limits::MAX_RESULTS_PER_PAGE }
36
+
37
+ # Improve efficiency by only fetching as much as we need.
38
+ if requesting_to_many_results?
39
+ params[:per_page] = @options[:limit]
40
+ end
41
+
42
+ # Additional condition for filtering
43
+ if @options.has_key?(:where)
44
+ params.merge!(@options[:where])
45
+ end
46
+
47
+ params
48
+ end
49
+
50
+ def requesting_to_many_results?
51
+ @options[:limit] && @options[:limit] < Limits::MAX_RESULTS_PER_PAGE
52
+ end
53
+
54
+ def yield_results cursor, result, &block
55
+ result["entries"].each do |entry|
56
+ block.call(@model_klass.new(client: @collection.client, collection: @collection, persisted: true, attributes: entry))
57
+ cursor.results_yielded += 1
58
+
59
+ # Have we reached the limit?
60
+ if options[:limit] && cursor.results_yielded >= options[:limit]
61
+ cursor.done = true
62
+ return
63
+ end
64
+ end
65
+
66
+ # Are we on the last page?
67
+ if result["pagination"]["page"] < result["pagination"]["pages"]
68
+ # No, go to next page
69
+ cursor.params[:page] += 1
70
+ else
71
+ # Yes, we're done
72
+ cursor.done = true
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,5 @@
1
+ require "pipeline_dealers/backend/base"
2
+ require "pipeline_dealers/backend/http/backend"
3
+ require "pipeline_dealers/backend/http/connection"
4
+ require "pipeline_dealers/backend/http/collection"
5
+ require "pipeline_dealers/backend/http/fetcher"