octopart-ruby 0.1.0 → 0.1.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.
- data/Gemfile +5 -11
- data/Gemfile.lock +4 -3
- data/Rakefile +4 -14
- data/VERSION +1 -1
- data/lib/octopart-ruby.rb +6 -3
- data/lib/octopart/client.rb +123 -165
- data/octopart-ruby.gemspec +10 -10
- data/test/test_octopart_ruby.rb +33 -1
- metadata +29 -29
data/Gemfile
CHANGED
@@ -1,18 +1,12 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
|
-
# Add dependencies required to use your gem here.
|
3
|
-
# Example:
|
4
|
-
# gem "activesupport", ">= 2.3.5"
|
5
|
-
|
6
|
-
# Add dependencies to develop your gem here.
|
7
|
-
# Include everything needed to run rake, tests, features, etc.
|
8
2
|
|
9
3
|
gem "httparty", "0.9.0"
|
10
|
-
gem "fakeweb", "1.3.0"
|
11
4
|
|
12
|
-
group :development do
|
5
|
+
group :development, :test do
|
13
6
|
gem "shoulda", ">= 0"
|
14
|
-
gem "
|
7
|
+
gem "yard", "~> 0.8.3"
|
15
8
|
gem "bundler", "~> 1.0"
|
16
9
|
gem "jeweler", "~> 1.8.4"
|
17
|
-
gem "simplecov"
|
18
|
-
|
10
|
+
gem "simplecov", "~> 0.7.1"
|
11
|
+
gem "fakeweb", "~> 1.3.0"
|
12
|
+
end
|
data/Gemfile.lock
CHANGED
@@ -37,15 +37,16 @@ GEM
|
|
37
37
|
multi_json (~> 1.0)
|
38
38
|
simplecov-html (~> 0.7.1)
|
39
39
|
simplecov-html (0.7.1)
|
40
|
+
yard (0.8.3)
|
40
41
|
|
41
42
|
PLATFORMS
|
42
43
|
ruby
|
43
44
|
|
44
45
|
DEPENDENCIES
|
45
46
|
bundler (~> 1.0)
|
46
|
-
fakeweb (
|
47
|
+
fakeweb (~> 1.3.0)
|
47
48
|
httparty (= 0.9.0)
|
48
49
|
jeweler (~> 1.8.4)
|
49
|
-
rdoc (~> 3.12)
|
50
50
|
shoulda
|
51
|
-
simplecov
|
51
|
+
simplecov (~> 0.7.1)
|
52
|
+
yard (~> 0.8.3)
|
data/Rakefile
CHANGED
@@ -13,15 +13,13 @@ require 'rake'
|
|
13
13
|
|
14
14
|
require 'jeweler'
|
15
15
|
Jeweler::Tasks.new do |gem|
|
16
|
-
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
16
|
gem.name = "octopart-ruby"
|
18
17
|
gem.homepage = "http://github.com/parkerboundy/octopart-ruby"
|
19
18
|
gem.license = "MIT"
|
20
19
|
gem.summary = "Ruby wrapper for the Octopart API"
|
21
20
|
gem.description = "Ruby wrapper for the Octopart API"
|
22
21
|
gem.email = "parkerboundy@gmail.com"
|
23
|
-
gem.authors = ["Parker Boundy"]
|
24
|
-
# dependencies defined in Gemfile
|
22
|
+
gem.authors = ["Parker Boundy"]
|
25
23
|
end
|
26
24
|
Jeweler::RubygemsDotOrgTasks.new
|
27
25
|
|
@@ -29,18 +27,10 @@ require 'rake/testtask'
|
|
29
27
|
Rake::TestTask.new(:test) do |test|
|
30
28
|
test.libs << 'lib' << 'test'
|
31
29
|
test.pattern = 'test/**/test_*.rb'
|
32
|
-
test.verbose =
|
30
|
+
test.verbose = false
|
33
31
|
end
|
34
32
|
|
35
|
-
|
36
33
|
task :default => :test
|
37
34
|
|
38
|
-
require '
|
39
|
-
Rake::
|
40
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
41
|
-
|
42
|
-
rdoc.rdoc_dir = 'rdoc'
|
43
|
-
rdoc.title = "octopart-ruby #{version}"
|
44
|
-
rdoc.rdoc_files.include('README*')
|
45
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
46
|
-
end
|
35
|
+
require 'yard'
|
36
|
+
YARD::Rake::YardocTask.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.1
|
data/lib/octopart-ruby.rb
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
require 'httparty'
|
2
2
|
|
3
|
-
#
|
4
|
-
class
|
3
|
+
# APIKeyNotSetError is called when a client is instantiated without an api_key
|
4
|
+
class APIKeyNotSetError < StandardError; end
|
5
|
+
|
6
|
+
# APIResponseError is called when an API request returns with a code other than 200
|
7
|
+
class APIResponseError < StandardError; end
|
5
8
|
|
6
9
|
module Octopart
|
7
10
|
|
8
11
|
# api_key - The API key to use
|
9
12
|
def self.api_key
|
10
|
-
raise
|
13
|
+
raise APIKeyNotSetError if @api_key.nil?
|
11
14
|
@api_key
|
12
15
|
end
|
13
16
|
|
data/lib/octopart/client.rb
CHANGED
@@ -1,272 +1,223 @@
|
|
1
|
-
#
|
1
|
+
# A simple ruby wrapper for the Octopart.com API
|
2
2
|
# All methods are module methods and should be called on the Octopart module.
|
3
3
|
#
|
4
|
-
#
|
5
|
-
#
|
4
|
+
# @example
|
6
5
|
# Octopart::Client.new('apikey')
|
7
|
-
#
|
8
6
|
module Octopart
|
9
7
|
|
10
|
-
#
|
8
|
+
# An Octopart.com API Client
|
11
9
|
#
|
12
|
-
#
|
13
|
-
# Examples
|
14
|
-
#
|
10
|
+
# @example
|
15
11
|
# Octopart::Client.new('apikey')
|
16
|
-
#
|
17
12
|
class Client
|
18
13
|
|
19
14
|
include HTTParty
|
20
15
|
base_uri 'http://octopart.com/api/v2'
|
21
16
|
format :json
|
22
|
-
|
23
|
-
|
24
|
-
# Public: The API key for the client
|
17
|
+
|
18
|
+
# The API key for the client
|
25
19
|
attr_reader :api_key
|
26
20
|
|
27
|
-
#
|
21
|
+
# Initialize an Octopart client
|
28
22
|
#
|
29
|
-
#
|
30
|
-
#
|
23
|
+
# @note You can get an Octopart API key at http://octopart.com/api/register
|
24
|
+
# @param api_key [String] The API key to use
|
31
25
|
def initialize(api_key=nil)
|
32
26
|
@api_key = api_key
|
33
27
|
@api_key ||= Octopart.api_key
|
34
|
-
|
28
|
+
|
35
29
|
end
|
36
|
-
|
37
|
-
|
38
|
-
# Public: Fetch a category object by its id
|
39
|
-
#
|
40
|
-
# id - The id of a category object
|
41
|
-
#
|
42
|
-
# Examples
|
30
|
+
|
31
|
+
# Fetch a category object by its id
|
43
32
|
#
|
33
|
+
# @param id [String] The id of a category object
|
34
|
+
# @return [Hash] A category hash
|
35
|
+
# @example
|
44
36
|
# category(4174)
|
45
|
-
# # =>
|
46
|
-
#
|
47
|
-
# Returns a category hash
|
37
|
+
# # => [Hash]
|
48
38
|
def category(id)
|
49
39
|
if id.is_a? Array
|
50
40
|
categories(id)
|
51
41
|
else
|
52
|
-
self.class.get('/categories/get', :query => {:id => id, :apikey => @api_key})
|
42
|
+
response = self.class.get('/categories/get', :query => {:id => id, :apikey => @api_key})
|
43
|
+
validate_response(response)
|
53
44
|
end
|
54
45
|
end
|
55
46
|
|
56
|
-
|
57
|
-
# Public: Fetch multiple category objects by their ids
|
58
|
-
#
|
59
|
-
# ids - Array of category object ids
|
60
|
-
#
|
61
|
-
# Examples
|
47
|
+
# Fetch multiple category objects by their ids
|
62
48
|
#
|
49
|
+
# @param ids [Array] Array of category object ids
|
50
|
+
# @return [Hash] A category hash
|
51
|
+
# @example
|
63
52
|
# categories([4215,4174,4780])
|
64
|
-
# # =>
|
65
|
-
#
|
66
|
-
# Returns a category hash
|
53
|
+
# # => [Hash]
|
67
54
|
def categories(ids)
|
68
55
|
raise(ArgumentError, 'ids must be an array') unless ids.is_a?Array
|
69
|
-
self.class.get('/categories/get_multi', :query => {:ids => "[#{ids.join(",")}]", :apikey => @api_key})
|
56
|
+
response = self.class.get('/categories/get_multi', :query => {:ids => "[#{ids.join(",")}]", :apikey => @api_key})
|
57
|
+
validate_response(response)
|
70
58
|
end
|
71
59
|
|
72
|
-
#
|
73
|
-
#
|
74
|
-
# q - Query string
|
75
|
-
# start - Ordinal position of first result. First position is 0. Default is 0
|
76
|
-
# limit - Maximum number of results to return. Default is 10
|
77
|
-
#
|
78
|
-
# Examples
|
60
|
+
# Execute search over category objects
|
79
61
|
#
|
62
|
+
# @param query [String] Query string
|
63
|
+
# @param start [Integer] Ordinal position of first result. First position is 0. Default is 0
|
64
|
+
# @param limit [Integer] Maximum number of results to return. Default is 10
|
65
|
+
# @return [Hash] A category hash
|
66
|
+
# @example
|
80
67
|
# search_categories('resistor')
|
81
|
-
# # =>
|
82
|
-
#
|
83
|
-
# Returns a category hash
|
68
|
+
# # => [Hash]
|
84
69
|
def search_categories(query, start=0, limit=10)
|
85
70
|
raise(ArgumentError, 'query must be a string > 2 characters and start/limit must be < 100') unless (query.is_a?(String) && query.length > 2 && start.between?(0, 100) &&limit.between?(0,100))
|
86
|
-
self.class.get('/categories/search', :query => {:q => query, :start => start, :limit => limit, :apikey => @api_key})
|
71
|
+
response = self.class.get('/categories/search', :query => {:q => query, :start => start, :limit => limit, :apikey => @api_key})
|
72
|
+
validate_response(response)
|
87
73
|
end
|
88
74
|
|
89
|
-
#
|
90
|
-
#
|
91
|
-
# uid - the id of a part object
|
92
|
-
#
|
93
|
-
# Examples
|
75
|
+
# Fetch a part object by its id
|
94
76
|
#
|
77
|
+
# @param uid [String] the id of a part object
|
78
|
+
# @return [Hash] A part hash
|
79
|
+
# @example
|
95
80
|
# part(39619421)
|
96
|
-
# # =>
|
97
|
-
#
|
98
|
-
# Returns a part hash
|
81
|
+
# # => [Hash]
|
99
82
|
def part(uid)
|
100
83
|
if uid.is_a? Array
|
101
84
|
parts(uid)
|
102
85
|
else
|
103
|
-
self.class.get('/parts/get', :query => {:uid => uid, :apikey => @api_key})
|
86
|
+
response = self.class.get('/parts/get', :query => {:uid => uid, :apikey => @api_key})
|
87
|
+
validate_response(response)
|
104
88
|
end
|
105
89
|
end
|
106
90
|
|
107
|
-
#
|
108
|
-
#
|
109
|
-
# uids - JSON encoded list of part object ids. Max number of ids is 100.
|
110
|
-
#
|
111
|
-
# Examples
|
91
|
+
# Fetch multiple part objects by their ids
|
112
92
|
#
|
93
|
+
# @param uids [Array] JSON encoded list of part object ids. Max number of ids is 100.
|
94
|
+
# @return [Hash] A part hash
|
95
|
+
# @example
|
113
96
|
# parts([39619421,29035751,31119928])
|
114
|
-
# # =>
|
115
|
-
#
|
116
|
-
# Returns a part hash
|
97
|
+
# # => [Hash]
|
117
98
|
def parts(uids)
|
118
99
|
raise(ArgumentError, 'uids must be an array') unless uids.is_a?Array
|
119
|
-
self.class.get('/parts/get_multi', :query => {:uids => "[#{uids.join(",")}]", :apikey => @api_key})
|
100
|
+
response = self.class.get('/parts/get_multi', :query => {:uids => "[#{uids.join(",")}]", :apikey => @api_key})
|
101
|
+
validate_response(response)
|
120
102
|
end
|
121
103
|
|
122
|
-
#
|
123
|
-
#
|
124
|
-
# query - Query string
|
125
|
-
# start - Ordinal position of first result. First position is 0. Default is 0. Maximum is 1000.
|
126
|
-
# limit - Number of results to return. Default is 10. Maximum is 100.
|
127
|
-
#
|
128
|
-
# Examples
|
104
|
+
# Execute search over part objects
|
129
105
|
#
|
106
|
+
# @param query [String] Query string
|
107
|
+
# @param start [Integer] Ordinal position of first result. First position is 0. Default is 0. Maximum is 1000.
|
108
|
+
# @param limit [Integer] Number of results to return. Default is 10. Maximum is 100.
|
109
|
+
# @return [Hash] A part hash
|
110
|
+
# @example
|
130
111
|
# search_parts('capacitor')
|
131
|
-
# # =>
|
112
|
+
# # => [Hash]
|
132
113
|
#
|
133
114
|
# search_parts('capacitor', 50)
|
134
|
-
# # =>
|
115
|
+
# # => [Hash]
|
135
116
|
#
|
136
117
|
# search_parts('capacitor', 100, 25)
|
137
|
-
# # =>
|
138
|
-
#
|
139
|
-
# Returns a part hash
|
118
|
+
# # => [Hash]
|
140
119
|
def search_parts(query, start=0, limit=10)
|
141
120
|
raise(ArgumentError, 'query must be a string > 2 characters, start < 1000, and limit must be < 100') unless (query.is_a?(String) && query.length > 2 && start.between?(0, 1000) &&limit.between?(0,100))
|
142
|
-
self.class.get('/parts/search', :query => {:q => query, :start => start, :limit => limit, :apikey => @api_key})
|
121
|
+
response = self.class.get('/parts/search', :query => {:q => query, :start => start, :limit => limit, :apikey => @api_key})
|
122
|
+
validate_response(response)
|
143
123
|
end
|
144
124
|
|
145
|
-
#
|
146
|
-
#
|
147
|
-
# q - Query string. Minimum of 2 characters.
|
148
|
-
# limit - Maximum number of results to return. Default is 5. Maximum is 10.
|
149
|
-
#
|
150
|
-
# Examples
|
125
|
+
# Suggest a part search query string
|
151
126
|
#
|
127
|
+
# @param query [String] Query string. Minimum of 2 characters.
|
128
|
+
# @param limit [Integer] Maximum number of results to return. Default is 5. Maximum is 10.
|
129
|
+
# @return [Hash] A part hash
|
130
|
+
# @example
|
152
131
|
# suggest_parts('sn74f')
|
153
|
-
# # =>
|
132
|
+
# # => [Hash]
|
154
133
|
#
|
155
134
|
# suggest_parts('sn74f', 10)
|
156
|
-
# # =>
|
157
|
-
#
|
158
|
-
# Returns a part hash
|
135
|
+
# # => [Hash]
|
159
136
|
def suggest_parts(query, limit=5)
|
160
137
|
raise(ArgumentError, 'query must be a string > 2 characters, and limit must be < 10') unless (query.is_a?(String) && query.length > 2 && limit.between?(0,10))
|
161
|
-
self.class.get('/parts/suggest', :query => {:q => query.split(' ').join('+'), :limit => limit, :apikey => @api_key})
|
138
|
+
response = self.class.get('/parts/suggest', :query => {:q => query.split(' ').join('+'), :limit => limit, :apikey => @api_key})
|
162
139
|
end
|
163
140
|
|
164
|
-
#
|
165
|
-
#
|
166
|
-
# manufacturer_name - Manufacturer name
|
167
|
-
# mpn - Manufacturer part number
|
168
|
-
#
|
169
|
-
# Examples
|
141
|
+
# Match (manufacturer,mpn) to part uids
|
170
142
|
#
|
143
|
+
# @param manufacturer_name [String] Manufacturer name
|
144
|
+
# @param mpn [String] Manufacturer part number
|
145
|
+
# @return [Hash] A part hash
|
146
|
+
# @example
|
171
147
|
# match_part('Texas Instruments', 'SN74LS240N')
|
172
|
-
# # =>
|
173
|
-
#
|
174
|
-
# Returns a part hash
|
148
|
+
# # => [Hash]
|
175
149
|
def match_part(manufacturer_name, mpn)
|
176
|
-
self.class.get('/parts/match', :query => {:manufacturer_name => manufacturer_name, :mpn => mpn, :apikey => @api_key})
|
177
|
-
|
178
|
-
|
179
|
-
# Public: Helper method for match_part(manufacturer,mpn)
|
180
|
-
#
|
181
|
-
# manufacturer_name - Manufacturer name
|
182
|
-
# mpn - Manufacturer part number
|
183
|
-
#
|
184
|
-
# Examples
|
185
|
-
#
|
186
|
-
# match_part('Texas Instruments', 'SN74LS240N')
|
187
|
-
# # => parts hash
|
188
|
-
#
|
189
|
-
# Returns a part hash
|
190
|
-
def match(manufacturer_name, mpn)
|
191
|
-
match_part(manufacturer_name, mpn)
|
150
|
+
response = self.class.get('/parts/match', :query => {:manufacturer_name => manufacturer_name, :mpn => mpn, :apikey => @api_key})
|
151
|
+
validate_response(response)
|
192
152
|
end
|
193
153
|
|
194
|
-
#
|
195
|
-
#
|
196
|
-
# fieldname - The fieldname of a partattribute object
|
197
|
-
#
|
198
|
-
# Examples
|
154
|
+
# Fetch a partattribute object by its id
|
199
155
|
#
|
156
|
+
# @param fieldname [String] The fieldname of a partattribute object
|
157
|
+
# @return [Hash] A part attribute hash
|
158
|
+
# @example
|
200
159
|
# part_attribute('capacitance')
|
201
|
-
# # =>
|
202
|
-
#
|
203
|
-
# Returns a partattribute hash
|
160
|
+
# # => [Hash]
|
204
161
|
def part_attribute(fieldname)
|
205
162
|
if fieldname.is_a? Array
|
206
163
|
part_attributes(fieldname)
|
207
164
|
else
|
208
|
-
self.class.get('/partattributes/get', :query => {:fieldname => fieldname, :apikey => @api_key})
|
165
|
+
response = self.class.get('/partattributes/get', :query => {:fieldname => fieldname, :apikey => @api_key})
|
166
|
+
validate_response(response)
|
209
167
|
end
|
210
168
|
end
|
211
169
|
|
212
|
-
#
|
213
|
-
#
|
214
|
-
# fieldnames - The fieldnames of a partattribute objects
|
215
|
-
#
|
216
|
-
# Examples
|
170
|
+
# Fetch multiple partattribute objects by their ids
|
217
171
|
#
|
172
|
+
# @param fieldnames [Array] The fieldnames of a partattribute objects
|
173
|
+
# @return [Hash] A part attribute hash
|
174
|
+
# @example
|
218
175
|
# part_attributes(['capacitance', 'resistance'])
|
219
176
|
# # => partattribute hash
|
220
|
-
#
|
221
|
-
# Returns a partattribute hash
|
222
177
|
def part_attributes(fieldnames)
|
223
178
|
raise(ArgumentError, 'fieldnames must be an array') unless fieldnames.is_a?Array
|
224
|
-
self.class.get('/partattributes/get_multi', :query => {:fieldnames => "["+fieldnames.map{|v| "\"#{v}\""}.join(',')+"]", :apikey => @api_key})
|
179
|
+
response = self.class.get('/partattributes/get_multi', :query => {:fieldnames => "["+fieldnames.map{|v| "\"#{v}\""}.join(',')+"]", :apikey => @api_key})
|
180
|
+
validate_response(response)
|
225
181
|
end
|
226
182
|
|
227
|
-
#
|
228
|
-
#
|
229
|
-
# lines
|
230
|
-
#
|
231
|
-
#
|
232
|
-
#
|
233
|
-
#
|
234
|
-
#
|
235
|
-
#
|
236
|
-
#
|
237
|
-
#
|
238
|
-
#
|
239
|
-
#
|
240
|
-
#
|
241
|
-
#
|
183
|
+
# Match lines of a BOM to parts
|
184
|
+
#
|
185
|
+
# @param lines [Hash] hash made up of the following optional parameters:
|
186
|
+
# @option lines q [String] Free form query
|
187
|
+
# @option lines mpn [String] MPN string
|
188
|
+
# @option lines manufacturer [String] Manufacturer name
|
189
|
+
# @option lines sku [String] Supplier SKU string
|
190
|
+
# @option lines supplier [String] Supplier name
|
191
|
+
# @option lines mpn_or_sku [String] Match on MPN or SKU
|
192
|
+
# @option lines start [Integer] Ordinal position of first item
|
193
|
+
# @option lines limit [Integer] Maximum number of items to return
|
194
|
+
# @option lines reference [String] Arbitrary reference string to differentiate results
|
195
|
+
# @return [Hash] A match hash
|
196
|
+
# @example
|
242
197
|
# bom_match({"mpn_or_sku"=> "60K6871", "manufacturer" => "Texas Instruments"})
|
243
|
-
# # =>
|
244
|
-
#
|
245
|
-
# Returns a match hash
|
198
|
+
# # => [Hash]
|
246
199
|
def bom_match(lines)
|
247
200
|
raise(ArgumentError, 'lines must be a hash') unless lines.is_a?(::Hash)
|
248
|
-
self.class.get('/bom/match', :query => {:lines => "[{"+lines.map{|k,v| "\"#{k}\":\"#{v}\""}.join(',')+"}]", :apikey => @api_key})
|
201
|
+
response = self.class.get('/bom/match', :query => {:lines => "[{"+lines.map{|k,v| "\"#{k}\":\"#{v}\""}.join(',')+"}]", :apikey => @api_key})
|
202
|
+
validate_response(response)
|
249
203
|
end
|
250
204
|
|
251
|
-
#
|
252
|
-
#
|
253
|
-
# type - String name of the type
|
254
|
-
# query - Query string
|
255
|
-
# start - Ordinal position of first result. First position is 0. Default is 0. Maximum is 1000.
|
256
|
-
# limit - Number of results to return. Default is 10. Maximum is 100.
|
257
|
-
#
|
258
|
-
# Examples
|
205
|
+
# Helper method for searches
|
259
206
|
#
|
207
|
+
# @param type [String] String name of the type
|
208
|
+
# @param query [String] Query string
|
209
|
+
# @param start [Integer] Ordinal position of first result. First position is 0. Default is 0. Maximum is 1000.
|
210
|
+
# @param limit [Integer] Number of results to return. Default is 10. Maximum is 100.
|
211
|
+
# @return [Hash] A part hash
|
212
|
+
# @example
|
260
213
|
# search_parts('parts', 'capacitor')
|
261
|
-
# # =>
|
214
|
+
# # => [Hash]
|
262
215
|
#
|
263
216
|
# search_parts('categories', 'capacitor', 50)
|
264
|
-
# # =>
|
217
|
+
# # => [Hash]
|
265
218
|
#
|
266
219
|
# search_parts('parts', 'capacitor', 100, 25)
|
267
|
-
# # =>
|
268
|
-
#
|
269
|
-
# Returns a part hash
|
220
|
+
# # => [Hash]
|
270
221
|
def search(type, query, start=0, limit=10)
|
271
222
|
raise(ArgumentError, 'query must be a string > 2 characters and start/limit must be < 100') unless (query.is_a?(String) && query.length > 2 && start.between?(0, 100) &&limit.between?(0,100))
|
272
223
|
if type.downcase == 'part' || type.downcase == 'parts'
|
@@ -278,6 +229,13 @@ module Octopart
|
|
278
229
|
end
|
279
230
|
end
|
280
231
|
|
232
|
+
alias_method :match, :match_part
|
233
|
+
|
234
|
+
protected
|
235
|
+
def validate_response(response)
|
236
|
+
response.code == 200 ? response.parsed_response : raise(APIResponseError, response.code)
|
237
|
+
end
|
238
|
+
|
281
239
|
end
|
282
240
|
|
283
|
-
end
|
241
|
+
end
|
data/octopart-ruby.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "octopart-ruby"
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Parker Boundy"]
|
@@ -53,29 +53,29 @@ Gem::Specification.new do |s|
|
|
53
53
|
|
54
54
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
55
55
|
s.add_runtime_dependency(%q<httparty>, ["= 0.9.0"])
|
56
|
-
s.add_runtime_dependency(%q<fakeweb>, ["= 1.3.0"])
|
57
56
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
58
|
-
s.add_development_dependency(%q<
|
57
|
+
s.add_development_dependency(%q<yard>, ["~> 0.8.3"])
|
59
58
|
s.add_development_dependency(%q<bundler>, ["~> 1.0"])
|
60
59
|
s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
|
61
|
-
s.add_development_dependency(%q<simplecov>, ["
|
60
|
+
s.add_development_dependency(%q<simplecov>, ["~> 0.7.1"])
|
61
|
+
s.add_development_dependency(%q<fakeweb>, ["~> 1.3.0"])
|
62
62
|
else
|
63
63
|
s.add_dependency(%q<httparty>, ["= 0.9.0"])
|
64
|
-
s.add_dependency(%q<fakeweb>, ["= 1.3.0"])
|
65
64
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
66
|
-
s.add_dependency(%q<
|
65
|
+
s.add_dependency(%q<yard>, ["~> 0.8.3"])
|
67
66
|
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
68
67
|
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
69
|
-
s.add_dependency(%q<simplecov>, ["
|
68
|
+
s.add_dependency(%q<simplecov>, ["~> 0.7.1"])
|
69
|
+
s.add_dependency(%q<fakeweb>, ["~> 1.3.0"])
|
70
70
|
end
|
71
71
|
else
|
72
72
|
s.add_dependency(%q<httparty>, ["= 0.9.0"])
|
73
|
-
s.add_dependency(%q<fakeweb>, ["= 1.3.0"])
|
74
73
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
75
|
-
s.add_dependency(%q<
|
74
|
+
s.add_dependency(%q<yard>, ["~> 0.8.3"])
|
76
75
|
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
77
76
|
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
78
|
-
s.add_dependency(%q<simplecov>, ["
|
77
|
+
s.add_dependency(%q<simplecov>, ["~> 0.7.1"])
|
78
|
+
s.add_dependency(%q<fakeweb>, ["~> 1.3.0"])
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
data/test/test_octopart_ruby.rb
CHANGED
@@ -7,7 +7,7 @@ class TestOctopartRuby < Test::Unit::TestCase
|
|
7
7
|
should "require an api key" do
|
8
8
|
Octopart.api_key = nil
|
9
9
|
|
10
|
-
assert_raise
|
10
|
+
assert_raise APIKeyNotSetError do
|
11
11
|
Octopart::Client.new()
|
12
12
|
end
|
13
13
|
end
|
@@ -93,6 +93,14 @@ class TestOctopartRuby < Test::Unit::TestCase
|
|
93
93
|
assert_equal 10, search["results"].count
|
94
94
|
end
|
95
95
|
|
96
|
+
should "respond to error codes properly" do
|
97
|
+
FakeWeb.register_uri(:get, "http://octopart.com/api/v2/categories/get?id=4174&apikey=123456789", :body => fixture_file("category.json"), :status => ["404", "Not Found"])
|
98
|
+
|
99
|
+
assert_raise APIResponseError do
|
100
|
+
@client.category(4174)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
96
104
|
end
|
97
105
|
|
98
106
|
context "Part API Methods" do
|
@@ -160,6 +168,14 @@ class TestOctopartRuby < Test::Unit::TestCase
|
|
160
168
|
match = @client.match_part('texas instruments', 'SN74LS240N')
|
161
169
|
|
162
170
|
assert_not_nil match
|
171
|
+
end
|
172
|
+
|
173
|
+
should "respond to error codes properly" do
|
174
|
+
FakeWeb.register_uri(:get, "http://octopart.com/api/v2/parts/get?uid=39619421&apikey=123456789", :body => fixture_file("part.json"), :status => ["404", "Not Found"])
|
175
|
+
|
176
|
+
assert_raise APIResponseError do
|
177
|
+
@client.part(39619421)
|
178
|
+
end
|
163
179
|
end
|
164
180
|
|
165
181
|
end
|
@@ -196,6 +212,14 @@ class TestOctopartRuby < Test::Unit::TestCase
|
|
196
212
|
assert_equal 2, attributes.count
|
197
213
|
assert_equal "number", attributes.last["type"]
|
198
214
|
end
|
215
|
+
|
216
|
+
should "respond to error codes properly" do
|
217
|
+
FakeWeb.register_uri(:get, "http://octopart.com/api/v2/partattributes/get?fieldname=capacitance&apikey=123456789", :body => fixture_file("attribute.json"), :status => ["404", "Not Found"])
|
218
|
+
|
219
|
+
assert_raise APIResponseError do
|
220
|
+
@client.part_attribute('capacitance')
|
221
|
+
end
|
222
|
+
end
|
199
223
|
|
200
224
|
end
|
201
225
|
|
@@ -216,6 +240,14 @@ class TestOctopartRuby < Test::Unit::TestCase
|
|
216
240
|
|
217
241
|
assert_not_nil bom
|
218
242
|
end
|
243
|
+
|
244
|
+
should "respond to error codes properly" do
|
245
|
+
FakeWeb.register_uri(:get, "http://octopart.com/api/v2/bom/match?lines=%5B%7B%22mpn%22%3A%22SN74LS240N%22%2C%22manufacturer%22%3A%22Texas%20Instruments%22%7D%5D&apikey=123456789", :body => fixture_file("bom.json"), :status => ["404", "Not Found"])
|
246
|
+
|
247
|
+
assert_raise APIResponseError do
|
248
|
+
@client.bom_match({"mpn" => "SN74LS240N", "manufacturer" => "Texas Instruments"})
|
249
|
+
end
|
250
|
+
end
|
219
251
|
|
220
252
|
end
|
221
253
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: octopart-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-12-20 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: httparty
|
16
|
-
requirement: &
|
16
|
+
requirement: &70163619218620 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - =
|
@@ -21,21 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.9.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: fakeweb
|
27
|
-
requirement: &70103207636060 !ruby/object:Gem::Requirement
|
28
|
-
none: false
|
29
|
-
requirements:
|
30
|
-
- - =
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: 1.3.0
|
33
|
-
type: :runtime
|
34
|
-
prerelease: false
|
35
|
-
version_requirements: *70103207636060
|
24
|
+
version_requirements: *70163619218620
|
36
25
|
- !ruby/object:Gem::Dependency
|
37
26
|
name: shoulda
|
38
|
-
requirement: &
|
27
|
+
requirement: &70163619217920 !ruby/object:Gem::Requirement
|
39
28
|
none: false
|
40
29
|
requirements:
|
41
30
|
- - ! '>='
|
@@ -43,21 +32,21 @@ dependencies:
|
|
43
32
|
version: '0'
|
44
33
|
type: :development
|
45
34
|
prerelease: false
|
46
|
-
version_requirements: *
|
35
|
+
version_requirements: *70163619217920
|
47
36
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
49
|
-
requirement: &
|
37
|
+
name: yard
|
38
|
+
requirement: &70163619217100 !ruby/object:Gem::Requirement
|
50
39
|
none: false
|
51
40
|
requirements:
|
52
41
|
- - ~>
|
53
42
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
43
|
+
version: 0.8.3
|
55
44
|
type: :development
|
56
45
|
prerelease: false
|
57
|
-
version_requirements: *
|
46
|
+
version_requirements: *70163619217100
|
58
47
|
- !ruby/object:Gem::Dependency
|
59
48
|
name: bundler
|
60
|
-
requirement: &
|
49
|
+
requirement: &70163619216340 !ruby/object:Gem::Requirement
|
61
50
|
none: false
|
62
51
|
requirements:
|
63
52
|
- - ~>
|
@@ -65,10 +54,10 @@ dependencies:
|
|
65
54
|
version: '1.0'
|
66
55
|
type: :development
|
67
56
|
prerelease: false
|
68
|
-
version_requirements: *
|
57
|
+
version_requirements: *70163619216340
|
69
58
|
- !ruby/object:Gem::Dependency
|
70
59
|
name: jeweler
|
71
|
-
requirement: &
|
60
|
+
requirement: &70163619215560 !ruby/object:Gem::Requirement
|
72
61
|
none: false
|
73
62
|
requirements:
|
74
63
|
- - ~>
|
@@ -76,18 +65,29 @@ dependencies:
|
|
76
65
|
version: 1.8.4
|
77
66
|
type: :development
|
78
67
|
prerelease: false
|
79
|
-
version_requirements: *
|
68
|
+
version_requirements: *70163619215560
|
80
69
|
- !ruby/object:Gem::Dependency
|
81
70
|
name: simplecov
|
82
|
-
requirement: &
|
71
|
+
requirement: &70163619214720 !ruby/object:Gem::Requirement
|
83
72
|
none: false
|
84
73
|
requirements:
|
85
|
-
- -
|
74
|
+
- - ~>
|
86
75
|
- !ruby/object:Gem::Version
|
87
|
-
version:
|
76
|
+
version: 0.7.1
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *70163619214720
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: fakeweb
|
82
|
+
requirement: &70163619214080 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ~>
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: 1.3.0
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70163619214080
|
91
91
|
description: Ruby wrapper for the Octopart API
|
92
92
|
email: parkerboundy@gmail.com
|
93
93
|
executables: []
|
@@ -135,7 +135,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
135
135
|
version: '0'
|
136
136
|
segments:
|
137
137
|
- 0
|
138
|
-
hash:
|
138
|
+
hash: 2149321309424623997
|
139
139
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
140
140
|
none: false
|
141
141
|
requirements:
|