pipekit 0.2.0 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a0ff8c19ce8cb4d0ec668801e0f97bc981a627cc
4
- data.tar.gz: 4b6c505ab661d40acbb16b7c1cd48e082e02e1d8
3
+ metadata.gz: a97ca3462a69b58e56337a81273147db6d6b81ca
4
+ data.tar.gz: a58a9d65ecd33575e907d124a69670692843e8e1
5
5
  SHA512:
6
- metadata.gz: 3a49869edcdfc81a14fd578778040276cbacf1a7d3e5c6286f05f6623b34f00f7cb9d794dad8e7d89ea550e17af5ef507613ce385330bb23d547ed95e57e6e18
7
- data.tar.gz: 195663112064866b3027928bccf9ebacc8a6bed8e7e7017cfa59a24f0fcf37306ecc2c6d0a65d2d08c1fb1771c3d93895d9ad69be38d31c5862c553e6acf76ee
6
+ metadata.gz: 09e9a02a4d5021799ca0cf39a96b55d7c0b5a136c8f0427428037f395034ce203c575421fbacc36559198676fce62f3c3f24ed6b07b99cb8594ad4173d3b8f0b
7
+ data.tar.gz: 649b62d3e62ae41873880705282876663943b8e0ce38659482814fde8db3140ba8617bdf54a9905b2888679e0be71cdeb6cf7d05d0fc9862b361a32994f3b70b
@@ -0,0 +1,105 @@
1
+ module Pipekit
2
+ class Config
3
+ class << self
4
+
5
+ attr_writer :file_path
6
+
7
+ # Finds the field name in the config from the Pipedrive ID
8
+ #
9
+ # Example
10
+ #
11
+ # Config.field_name(:person, "asbasdfasc2343443")
12
+ # # => "middle_name"
13
+ #
14
+ # Config.field_name(:person, "name")
15
+ # # => "name"
16
+ def field_name(resource, key)
17
+ custom_fields(resource)
18
+ .invert
19
+ .fetch(key.to_s, key.to_s)
20
+ end
21
+
22
+ # Finds the Pipedrive field ID from the config
23
+ #
24
+ # Example
25
+ #
26
+ # Config.field_id(:person, "middle_name")
27
+ # # => "asbasdfasc2343443"
28
+ #
29
+ # Config.field_id(:person, "name")
30
+ # # => "name"
31
+ def field_id(resource, key)
32
+ custom_fields(resource)
33
+ .fetch(key.to_s, key.to_s)
34
+ end
35
+
36
+ # Finds the Pipedrive field value from the config
37
+ # translating from a Pipedrive ID in the config if one exists for that
38
+ # field/value
39
+ #
40
+ # Example
41
+ #
42
+ # Config.field_value(:person, "inteview_quality", 66)
43
+ # # => "Amazing"
44
+ #
45
+ # Config.field_value(:person, "inteview_quality", "value_not_there")
46
+ # # => "value_not_there"
47
+ def field_value(resource, field, value)
48
+ custom_field_values(resource, field)
49
+ .fetch(value, value)
50
+ end
51
+
52
+ # Finds the Pipedrive field value ID from the config if one exists for that
53
+ # field/value
54
+ #
55
+ # Example
56
+ #
57
+ # Config.field_value_id(:person, "inteview_quality", "Amazing")
58
+ # # => 66
59
+ #
60
+ # Config.field_value_id(:person, "inteview_quality", "value_not_there")
61
+ # # => "value_not_there"
62
+ def field_value_id(resource, field, value)
63
+ custom_field_values(resource, field)
64
+ .invert
65
+ .fetch(value, value)
66
+ end
67
+
68
+ def fetch(key, default = nil)
69
+ config.fetch(key.to_s, default)
70
+ end
71
+
72
+ def custom_fields(resource)
73
+ fetch("fields", {})
74
+ .fetch(resource.to_s, {})
75
+ end
76
+
77
+ def custom_field_values(resource, field)
78
+ fetch("field_values", {})
79
+ .fetch(resource.to_s, {})
80
+ .fetch(field.to_s, {})
81
+ end
82
+
83
+ def file_path
84
+ @file_path || raise_config_error
85
+ end
86
+
87
+ private
88
+
89
+ def config
90
+ @config ||= load_config
91
+ end
92
+
93
+ def raise_config_error
94
+ raise NotSetError, "You need to create a yaml file with your Pipedrive config and set the path to the file using `Pipekit.config_file_path = 'path/to/file.yml'`"
95
+ end
96
+
97
+ def load_config
98
+ yaml = ERB.new(File.read(file_path)).result
99
+ YAML.load(yaml)
100
+ end
101
+ end
102
+
103
+ NotSetError = Class.new(Exception)
104
+ end
105
+ end
data/lib/pipekit/deal.rb CHANGED
@@ -2,8 +2,19 @@ module Pipekit
2
2
  class Deal
3
3
  include Repository
4
4
 
5
- def get_by_person_id(person_id)
6
- request.get("/#{Pipekit::Person.uri}/#{person_id}/#{self.class.uri}")
5
+ def get_by_person_id(person_id, person_repo: Person.new)
6
+ raise UnknownPersonError, "No person ID supplied when getting deals by person ID" unless person_id
7
+ person_repo.find_deals(person_id)
8
+ end
9
+
10
+ # Finds a person by their email, then finds the first deal related to that
11
+ # person and updates it with the params provided
12
+ def update_by_person(email, params, person_repo: Person.new)
13
+ person = person_repo.find_by(email: email)
14
+ deal = get_by_person_id(person[:id], person_repo: person_repo).first
15
+ update(deal[:id], params)
7
16
  end
8
17
  end
18
+
19
+ UnknownPersonError = Class.new(StandardError)
9
20
  end
@@ -0,0 +1,6 @@
1
+ module Pipekit
2
+ class DealField
3
+ include Repository
4
+ include FieldRepository
5
+ end
6
+ end
@@ -0,0 +1,25 @@
1
+ module Pipekit
2
+ module FieldRepository
3
+ def get_by_key(key)
4
+ key = Config.field_id(parent_resource, key)
5
+ search_fields("key", key)
6
+ end
7
+
8
+ def get_by_name(name)
9
+ search_fields("name", name)
10
+ end
11
+
12
+ private
13
+
14
+ def search_fields(field_element, value)
15
+ result = request.get.select { |element| element[field_element] == value }
16
+
17
+ raise ResourceNotFoundError.new("#{parent_resource}Field searching by element #{field_element} for #{value} could not be found") if result.empty?
18
+ result
19
+ end
20
+
21
+ def parent_resource
22
+ resource.chomp("Field")
23
+ end
24
+ end
25
+ end
@@ -3,11 +3,22 @@ module Pipekit
3
3
  include Repository
4
4
 
5
5
  def get_by_email(email)
6
- request.get("/#{uri}/find", term: email, search_by_email: 1)
6
+ request.get("find", term: email, search_by_email: 1)
7
7
  end
8
8
 
9
9
  def get_by_name(name)
10
- request.get("/#{uri}/find", term: name)
10
+ request.get("find", term: name)
11
+ end
12
+
13
+ def create_or_update(fields)
14
+ person = find_by(email: fields[:email])
15
+ update(person["id"], fields)
16
+ rescue ResourceNotFoundError
17
+ create(fields)
18
+ end
19
+
20
+ def find_deals(id)
21
+ request.get("#{id}/deals")
11
22
  end
12
23
  end
13
24
  end
@@ -1,15 +1,6 @@
1
1
  module Pipekit
2
2
  class PersonField
3
3
  include Repository
4
-
5
- def get_by_id(id)
6
- request.get("/#{uri}").select { |element| element["id"] == id }
7
- end
8
-
9
- def get_by_key(key)
10
- custom_field_key = request.config["people_fields"][key] rescue nil
11
- key = custom_field_key || key
12
- request.get("/#{uri}").select { |element| element["key"] == key }
13
- end
4
+ include FieldRepository
14
5
  end
15
6
  end
@@ -1,13 +1,12 @@
1
- class ConfigNotSetError < Exception; end
2
1
  module Pipekit
3
2
  module Repository
4
3
 
5
- def initialize(request = Pipekit::Request.new)
6
- @request = request
4
+ def initialize(request = nil)
5
+ @request = request || Request.new(resource)
7
6
  end
8
7
 
9
8
  def all
10
- request.get("/#{uri}")
9
+ get
11
10
  end
12
11
 
13
12
  # Public: Get all records from Pipedrive by **one** of the record's fields.
@@ -21,8 +20,11 @@ module Pipekit
21
20
  # where(id: 123)
22
21
  #
23
22
  # Returns array of Hashes.
24
- def where(options)
23
+ def where(options, raise_error = false)
25
24
  send("get_by_#{options.keys.first}", options.values.first)
25
+ rescue ResourceNotFoundError => error
26
+ raise error if raise_error
27
+ []
26
28
  end
27
29
 
28
30
  # Public: Get the first record by **one** field from Pipedrive.
@@ -37,7 +39,7 @@ module Pipekit
37
39
  #
38
40
  # Returns a Hash or nil if none found.
39
41
  def find_by(options)
40
- where(options).first
42
+ where(options, true).first
41
43
  end
42
44
 
43
45
  # Public: Create a record on Pipedrive.
@@ -50,7 +52,7 @@ module Pipekit
50
52
  #
51
53
  # Returns nothing.
52
54
  def create(fields)
53
- request.post("/#{uri}", fields)
55
+ request.post(fields)
54
56
  end
55
57
 
56
58
  # Public: Updates a record on Pipedrive.
@@ -63,15 +65,17 @@ module Pipekit
63
65
  #
64
66
  # Returns nothing.
65
67
  def update(id, fields)
66
- request.put("/#{uri}/#{id}", fields)
68
+ request.put(id, fields)
67
69
  end
68
70
 
69
71
  def self.included(base)
70
- base.send :extend, ClassMethods
72
+ base.extend(ClassMethods)
71
73
  end
72
74
 
73
75
  module ClassMethods
74
- attr_accessor :uri
76
+ def resource
77
+ to_s.split("::").last.tap { |name| name[0] = name[0].downcase }
78
+ end
75
79
  end
76
80
 
77
81
  private
@@ -85,18 +89,21 @@ module Pipekit
85
89
  get_by_field(field: field, value: args[0])
86
90
  end
87
91
 
92
+ def get(id = nil)
93
+ request.get(id)
94
+ end
95
+
88
96
  def get_by_id(id)
89
- [request.get("/#{uri}/#{id}")]
97
+ [get(id)]
90
98
  end
91
99
 
92
100
  def get_by_field(field:, value:)
93
- result = request.search_by_field(type: uri, field: field, value: value)
101
+ result = request.search_by_field(field: field, value: value)
94
102
  result.map { |item| get_by_id(item["id"]) }.flatten
95
103
  end
96
104
 
97
- def uri
98
- class_name = self.class.to_s.split("::").last
99
- "#{class_name.downcase}s"
105
+ def resource
106
+ self.class.resource
100
107
  end
101
108
  end
102
109
  end
@@ -5,10 +5,16 @@ module Pipekit
5
5
  include HTTParty
6
6
 
7
7
  PIPEDRIVE_URL = "https://api.pipedrive.com/v1"
8
+ DEFAULT_PAGINATION_LIMIT = 500
8
9
 
9
10
  base_uri PIPEDRIVE_URL
10
11
  format :json
11
12
 
13
+ def initialize(resource)
14
+ @resource = resource
15
+ self.class.debug_output $stdout if Config.fetch("debug_requests")
16
+ end
17
+
12
18
  # Public: Pipedrive /searchField API call.
13
19
  #
14
20
  # type - Type of the field:
@@ -20,50 +26,97 @@ module Pipekit
20
26
  #
21
27
  # Examples
22
28
  #
23
- # search_by_field(type: :person, field: :cohort, value: 119)
24
- # search_by_field(type: :person, field: :github_username, value: "octocat")
29
+ # search_by_field(field: :cohort, value: 119)
30
+ # search_by_field(field: :github_username, value: "octocat")
25
31
  #
26
- # Returns an array of Hashes or nil.
27
- def search_by_field(type:, field:, value:)
28
- options = {field_type: "#{type}Field",
29
- field_key: config["#{type.to_s.pluralize}_fields"][field],
30
- return_item_ids: true}
32
+ # Returns an array of Response objects or throws a ResourceNotFoundError if
33
+ # it couldn't find anything.
34
+ def search_by_field(field:, value:)
35
+ query = {field_type: "#{resource}Field",
36
+ field_key: Config.field_id(resource, field),
37
+ return_item_ids: true,
38
+ term: value
39
+ }
31
40
 
32
- get("/searchResults/field", options.merge(term: value))
41
+ response_from self.class.get("/searchResults/field", options(query: query))
33
42
  end
34
43
 
35
- def get(uri, query = {})
36
- result_from self.class.get(uri, options(query: query))
44
+ # Public: Pipedrive GET API call - does a GET request to the Pipedrive API
45
+ # based on the resource passed in the initialiser
46
+ #
47
+ # id - If the resource being searched for has an id
48
+ # query - An optional query string
49
+ # start - The offset with which to start the query
50
+ #
51
+ # As long as "request_all_pages" is not set to false in the config this will
52
+ # recursively call `#get` until all the pages of the request have been
53
+ # fetched from pipedrive
54
+ # Pipedrive until everything available has been received
55
+ def get(id = nil, query = {})
56
+ _get(id, query, get_request(id, query))
37
57
  end
38
58
 
39
- def put(uri, body)
40
- result_from self.class.put(uri, options(body: body))
59
+ def put(id, data)
60
+ response_from self.class.put(uri(id), options(body: data))
41
61
  end
42
62
 
43
- def post(uri, body)
44
- result_from self.class.post(uri, options(body: body))
63
+ def post(data)
64
+ response_from self.class.post(uri, options(body: data))
45
65
  end
46
66
 
47
67
  private
48
68
 
49
- def config
50
- Pipekit.config
69
+ attr_reader :resource
70
+
71
+ def _get(id, query, result)
72
+ return result.response(resource) unless result.fetch_next_request?
73
+ _get(id, query, result + get_request(id, query, result.next_start))
74
+ end
75
+
76
+ def get_request(id, query, start = 0)
77
+ response = self.class.get(uri(id), options(query: {limit: pagination_limit, start: start}.merge(query)))
78
+ Result.new(response)
51
79
  end
52
80
 
53
- def result_from(response)
54
- return nil unless success?(response)
55
- response.parsed_response["data"]
81
+ def response_from(response_data)
82
+ Result.response(resource, response_data)
56
83
  end
57
84
 
58
- def success?(response)
59
- response.parsed_response["success"]
85
+ def uri(id = nil)
86
+ "/#{resource}s/#{id}".chomp("/")
60
87
  end
61
88
 
62
89
  def options(query: {}, body: {})
63
90
  {
64
- query: {api_token: config[:api_token] }.merge(query),
65
- body: body
91
+ query: query.merge(api_token: Config.fetch("api_token")),
92
+ body: parse_body(body)
66
93
  }
67
94
  end
95
+
96
+ # Replaces custom fields with their Pipedrive ID
97
+ # if the ID is defined in the configuration
98
+ #
99
+ # So if the body looked like this with a custom field
100
+ # called middle_name:
101
+ #
102
+ # { middle_name: "Dave" }
103
+ #
104
+ # And it has a Pipedrive ID ("123abc"), this will put in this custom ID
105
+ #
106
+ # { "123abc": "Dave" }
107
+ #
108
+ # meaning you don't have to worry about the custom IDs
109
+ def parse_body(body)
110
+ body.reduce({}) do |result, (field, value)|
111
+ field = Config.field_id(resource, field)
112
+ value = Config.field_value_id(resource, field, value)
113
+ result.tap { |result| result[field] = value }
114
+ end
115
+ end
116
+
117
+ def pagination_limit
118
+ Config.fetch("pagination_limit", DEFAULT_PAGINATION_LIMIT)
119
+ end
120
+
68
121
  end
69
122
  end
@@ -0,0 +1,122 @@
1
+ module Pipekit
2
+ class Response
3
+
4
+ def initialize(resource, data)
5
+ @resource = resource
6
+ @data = data || {}
7
+ end
8
+
9
+ def ==(other)
10
+ return false unless other.respond_to?(:to_h)
11
+ to_h == other.to_h
12
+ end
13
+
14
+ def [](key)
15
+ fetch(key)
16
+ end
17
+
18
+ def to_h
19
+ data.inject({}) do |result, (field, value)|
20
+ field_name = Config.field_name(resource, field)
21
+ result[field_name.to_sym] = Config.field_value(resource, field, value)
22
+ result
23
+ end
24
+ end
25
+
26
+ alias_method :to_hash, :to_h
27
+
28
+ # This is more complicated than it first seems as Pipedrive returns any
29
+ # custom field you might create (such as a new cohort in the Cohort field)
30
+ # as a meaningless Pipedrive ID so it returns something semantically
31
+ # meaningnless such as "8" when it means "April 2016"
32
+ #
33
+ # There are two ways this method gets around this to bring back the
34
+ # semantically meaningful result you're looking for here, if you put in the
35
+ # config under "field_values" the IDs that Pipedrive assigns to your custom
36
+ # values (you'll have to search the API to work out what these are) it will
37
+ # look them up there.
38
+ #
39
+ # Otherwise you can plass the "find_value_on_pipedrive" flag and it will do
40
+ # a call to the Pipedrive API to look it up. This is off by default as it is
41
+ # obviously quite slow to call an API each time you want to fetch some data
42
+ #
43
+ # Options:
44
+ #
45
+ # find_value_on_pipedrive (default: false) - if set to true will look up using the Pipedrive
46
+ # API the actual value of field (rather than the Pipedrive ID)
47
+ #
48
+ # choose_first_value (default: true) - if Pipedrive returns an array of values this will
49
+ # choose the first one rather than return the array
50
+ #
51
+ # Examples:
52
+ #
53
+ # Normally you can just use the square brackets alias to fetch responses as
54
+ # though this was a hash:
55
+ #
56
+ # response[:resource] # returns: "Dave"
57
+ #
58
+ # However if you find when doing this Pipedrive returns its meaningless ID
59
+ #
60
+ # response[:cohort] # returns: 1234
61
+ #
62
+ # then you can tell Pipedrive to fetch it manually
63
+ #
64
+ # response.fetch(:cohort, find_value_on_pipedrive: true) # returns: "April
65
+ # 2016"
66
+ #
67
+ def fetch(key, default = nil, opts = {})
68
+ opts = {
69
+ find_value_on_pipedrive: false,
70
+ choose_first_value: true
71
+ }.merge(opts)
72
+
73
+ value = fetch_value(key, default)
74
+
75
+ return value_from_pipedrive(key.to_s, value) if opts[:find_value_on_pipedrive]
76
+ convert_value(key, value, opts)
77
+ end
78
+
79
+ def has_key?(key)
80
+ data.has_key? convert_key(key)
81
+ end
82
+
83
+ private
84
+
85
+ attr_reader :data, :resource
86
+
87
+ def fetch_value(key, default)
88
+ data.fetch(convert_key(key), default)
89
+ end
90
+
91
+ def value_from_pipedrive(key, value)
92
+ return unless value && !value.empty?
93
+
94
+ option = field_repository
95
+ .find_by(name: key)
96
+ .fetch("options", [], choose_first_value: false)
97
+ .find { |options| options["id"] == value.to_i }
98
+
99
+ raise ResourceNotFoundError.new("Could not find field #{key}'s value '#{value}' on Pipedrive") unless option
100
+ option.fetch("label")
101
+ end
102
+
103
+ def field_repository
104
+ Object.const_get("Pipekit::#{resource.capitalize}Field").new
105
+ end
106
+
107
+ def convert_key(key)
108
+ Config.field_id(resource, key)
109
+ end
110
+
111
+ def convert_value(key, value, opts)
112
+ value = choose_first(value) if opts[:choose_first_value]
113
+ Config.field_value(resource, key, value)
114
+ end
115
+
116
+ def choose_first(result)
117
+ return result unless result.is_a? Array
118
+ return if result.empty?
119
+ result.first["value"]
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,82 @@
1
+ # Understands how to represent the result of a request to the Pipedrive API
2
+ module Pipekit
3
+ class Result
4
+
5
+ def initialize(response_data)
6
+ @response_data = response_data
7
+ raise UnsuccessfulRequestError.new(response_data) unless success?
8
+ end
9
+
10
+ def response(resource)
11
+ raise ResourceNotFoundError.new(response_data) unless resource_found?
12
+ return Response.new(resource, response_body) unless response_body.is_a? Array
13
+ response_body.map { |data| Response.new(resource, data) }
14
+ end
15
+
16
+ def +(other)
17
+ self.class.new(other.merged_response(response_body))
18
+ end
19
+
20
+ def fetch_next_request?
21
+ Config.fetch("request_all_pages", true) && pagination_data["more_items_in_collection"]
22
+ end
23
+
24
+ def next_start
25
+ pagination_data["next_start"]
26
+ end
27
+
28
+ def self.response(resource, response_data)
29
+ new(response_data).response(resource)
30
+ end
31
+
32
+ protected
33
+
34
+ def merged_response(other_body)
35
+ response_data.tap do |response|
36
+ response["data"] = other_body + response_body
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ attr_reader :response_data
43
+
44
+ def pagination_data
45
+ response_data
46
+ .fetch("additional_data", {})
47
+ .fetch("pagination", {})
48
+ end
49
+
50
+ def response_body
51
+ response_data["data"]
52
+ end
53
+
54
+ def success?
55
+ response_data["success"]
56
+ end
57
+
58
+ def resource_found?
59
+ !(response_body.nil? || response_body.empty?)
60
+ end
61
+ end
62
+
63
+ class ResourceNotFoundError < StandardError
64
+ def initialize(response)
65
+ @response = response
66
+ end
67
+
68
+ def message
69
+ "Resource not found: #{@response}"
70
+ end
71
+ end
72
+
73
+ class UnsuccessfulRequestError < StandardError
74
+ def initialize(response)
75
+ @response = response
76
+ end
77
+
78
+ def message
79
+ "Request not successful: #{@response}"
80
+ end
81
+ end
82
+ end
@@ -1,3 +1,3 @@
1
1
  module Pipekit
2
- VERSION = "0.2.0"
2
+ VERSION = "1.0.0"
3
3
  end
data/lib/pipekit.rb CHANGED
@@ -1,33 +1,26 @@
1
- require "pipekit/configurable"
1
+ require "pipekit/config"
2
2
  require "httparty"
3
3
  require "pipekit/version"
4
4
  require "pipekit/request"
5
+ require "pipekit/result"
6
+ require "pipekit/response"
5
7
  require "pipekit/repository"
8
+ require "pipekit/field_repository"
6
9
  require "pipekit/person"
7
10
  require "pipekit/deal"
8
11
  require "pipekit/person_field"
12
+ require "pipekit/deal_field"
9
13
  require "pipekit/note"
10
14
 
11
15
  module Pipekit
12
- include Configurable
13
16
 
14
17
  # Define a path to Pipedrive config file
15
18
  #
16
19
  # Example:
17
20
  #
18
21
  # Pipekit.config_file_path = File.join("config", "pipedrive.yml")
19
- class << self
20
- attr_writer :config_file_path
21
-
22
- def config_file_path
23
- @config_file_path || raise_config_error
24
- end
25
-
26
- def raise_config_error
27
- raise ConfigNotSetError, "You need to create a yaml file with your Pipedrive config and set the path to the file using `Pipedrive.config_file_path = 'path/to/file.yml'`"
28
- end
22
+ def self.config_file_path=(path)
23
+ Config.file_path = path
29
24
  end
30
-
31
- ConfigNotSetError = Class.new(Exception)
32
25
  end
33
26
 
data/pipekit.gemspec CHANGED
@@ -13,6 +13,7 @@ Gem::Specification.new do |spec|
13
13
  spec.description = %q{Pipedrive API client for Ruby.}
14
14
  spec.homepage = "https://github.com/makersacademy/pipekit"
15
15
  spec.license = "MIT"
16
+ spec.required_ruby_version = '>= 1.9.1'
16
17
 
17
18
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
19
  # to allow pushing to a single host or delete this section to allow pushing to any host.
@@ -28,11 +29,10 @@ Gem::Specification.new do |spec|
28
29
  spec.require_paths = ["lib"]
29
30
 
30
31
  spec.add_dependency "httparty"
31
- spec.add_dependency "activesupport"
32
32
 
33
33
  spec.add_development_dependency "bundler", "~> 1.12"
34
34
  spec.add_development_dependency "rake", "~> 10.0"
35
35
  spec.add_development_dependency "rspec", "~> 3.0"
36
- spec.add_development_dependency "webmock"
36
+ spec.add_development_dependency "webmock", "~> 2.1.0"
37
37
  spec.add_development_dependency "pry"
38
38
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pipekit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - jafrog
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2016-07-29 00:00:00.000000000 Z
13
+ date: 2016-08-31 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: httparty
@@ -26,20 +26,6 @@ dependencies:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
28
  version: '0'
29
- - !ruby/object:Gem::Dependency
30
- name: activesupport
31
- requirement: !ruby/object:Gem::Requirement
32
- requirements:
33
- - - ">="
34
- - !ruby/object:Gem::Version
35
- version: '0'
36
- type: :runtime
37
- prerelease: false
38
- version_requirements: !ruby/object:Gem::Requirement
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: '0'
43
29
  - !ruby/object:Gem::Dependency
44
30
  name: bundler
45
31
  requirement: !ruby/object:Gem::Requirement
@@ -86,16 +72,16 @@ dependencies:
86
72
  name: webmock
87
73
  requirement: !ruby/object:Gem::Requirement
88
74
  requirements:
89
- - - ">="
75
+ - - "~>"
90
76
  - !ruby/object:Gem::Version
91
- version: '0'
77
+ version: 2.1.0
92
78
  type: :development
93
79
  prerelease: false
94
80
  version_requirements: !ruby/object:Gem::Requirement
95
81
  requirements:
96
- - - ">="
82
+ - - "~>"
97
83
  - !ruby/object:Gem::Version
98
- version: '0'
84
+ version: 2.1.0
99
85
  - !ruby/object:Gem::Dependency
100
86
  name: pry
101
87
  requirement: !ruby/object:Gem::Requirement
@@ -130,13 +116,17 @@ files:
130
116
  - bin/console
131
117
  - bin/setup
132
118
  - lib/pipekit.rb
133
- - lib/pipekit/configurable.rb
119
+ - lib/pipekit/config.rb
134
120
  - lib/pipekit/deal.rb
121
+ - lib/pipekit/deal_field.rb
122
+ - lib/pipekit/field_repository.rb
135
123
  - lib/pipekit/note.rb
136
124
  - lib/pipekit/person.rb
137
125
  - lib/pipekit/person_field.rb
138
126
  - lib/pipekit/repository.rb
139
127
  - lib/pipekit/request.rb
128
+ - lib/pipekit/response.rb
129
+ - lib/pipekit/result.rb
140
130
  - lib/pipekit/version.rb
141
131
  - pipekit.gemspec
142
132
  homepage: https://github.com/makersacademy/pipekit
@@ -152,7 +142,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
152
142
  requirements:
153
143
  - - ">="
154
144
  - !ruby/object:Gem::Version
155
- version: '0'
145
+ version: 1.9.1
156
146
  required_rubygems_version: !ruby/object:Gem::Requirement
157
147
  requirements:
158
148
  - - ">="
@@ -1,46 +0,0 @@
1
- require "yaml"
2
- require "active_support/inflector"
3
- require "active_support/core_ext/hash/indifferent_access"
4
-
5
- module Configurable
6
- def config
7
- self.class.config
8
- end
9
-
10
- def self.included(base)
11
- base.send :extend, ClassMethods
12
- end
13
-
14
- module ClassMethods
15
- def config_file_path
16
- "./config/#{name.underscore}.yml"
17
- end
18
-
19
- def config
20
- @config ||= load_config.with_indifferent_access
21
- end
22
-
23
- private
24
-
25
- def load_config
26
- config_hash = load_from_yaml
27
-
28
- config_hash.default_proc = proc do |hash, key|
29
- raise Configurable::KeyNotFoundError.new(key)
30
- end
31
-
32
- config_hash
33
- end
34
-
35
- def load_from_yaml
36
- yaml = ERB.new(File.read(config_file_path)).result
37
- YAML.load(yaml)
38
- end
39
- end
40
-
41
- class KeyNotFoundError < StandardError
42
- def initialize(key)
43
- super("The key #{key} was not found in the configuration file")
44
- end
45
- end
46
- end