octopart-ruby 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|