octopart 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
5
+ script: bundle exec rspec spec
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in octopart.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Eric J. Holmes
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,105 @@
1
+ # Octopart [![travis-ci](https://secure.travis-ci.org/ejholmes/octopart.png)](https://secure.travis-ci.org/ejholmes/octopart)
2
+
3
+ This is a ruby gem that wraps the [Octopart API](http://octopart.com/api/documentation).
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'octopart'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ ```bash
16
+ $ bundle
17
+ ```
18
+
19
+ Or, install it manually:
20
+
21
+ ```bash
22
+ $ gem install octopart
23
+ ```
24
+
25
+ ## Usage
26
+
27
+ ### Configuration
28
+
29
+ In order to make more than 100 requests/hour you need to [register](http://octopart.com/api/signin?continue_to=http%3A//octopart.com/api/register)
30
+ your application with Octopart and obtain your API key. Once you have your API key, you can set it like so.
31
+
32
+ ```ruby
33
+ Octopart.configure do |config|
34
+ config.apikey = 'your api key'
35
+ end
36
+ ```
37
+
38
+ ### Parts
39
+
40
+ * * *
41
+
42
+ **#find**
43
+
44
+ Find a part by it's octopart ID.
45
+
46
+ ```ruby
47
+ part = Octopart::Part.find(39619421)
48
+ # => <Octopart::Part >
49
+
50
+ part.short_description
51
+ # => "Dial; Turns-Counting, Analog; 20 Turns; 100per Turn; Shaft Dia 0.25in"
52
+
53
+ part.mpn
54
+ # => "H-46-6A"
55
+
56
+ parts = Octopart::Part.find(39619421, 29035751, 31119928)
57
+ # => [<Octopart::Part >, ... ]
58
+ ```
59
+
60
+ * * *
61
+
62
+ **#search**
63
+
64
+ Search all parts that match a given query string.
65
+
66
+ ```ruby
67
+ Octopart::Part.search('resistor')
68
+ # => [<Octopart::Part >, ... ]
69
+
70
+ Octopart::Part.search('resistor', limit: 10)
71
+ # => [<Octopart::Part >, ... ]
72
+ ```
73
+
74
+ * * *
75
+
76
+ **#match**
77
+
78
+ Match (manufacturer name, mpn) to part uid.
79
+
80
+ ```ruby
81
+ Octopart::Part.match('texas instruments', 'SN74LS240N')
82
+ # => 42315325996
83
+ ```
84
+
85
+ * * *
86
+
87
+ **#bom**
88
+
89
+ Return an array of parts for each line specified.
90
+
91
+ ```ruby
92
+ Octopart::Part.bom(mpn: 'SN74LS240N')
93
+ # => [[<Octopart::Part >, ... ]]
94
+
95
+ Octopart::Part.bom([{mpn: 'SN74LS240N'}, {mpn: 'ATMEGA328P-PU'}])
96
+ # => [[<Octopart::Part >, ... ], [<Octopart::Part >, ... ]]
97
+ ```
98
+
99
+ ## Contributing
100
+
101
+ 1. Fork it
102
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
103
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
104
+ 4. Push to the branch (`git push origin my-new-feature`)
105
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
data/lib/octopart.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'hashie'
2
+ require 'json'
3
+ require 'rest-client'
4
+
5
+ require 'octopart/version'
6
+ require 'octopart/config'
7
+ require 'octopart/base'
8
+ require 'octopart/part'
@@ -0,0 +1,15 @@
1
+ module Octopart
2
+ class Base < Hashie::Mash
3
+ API_BASE = 'http://octopart.com/api/v2/'
4
+
5
+ class << self
6
+
7
+ def get(path, params = nil)
8
+ params.merge!(apikey: Octopart.configuration.apikey) if Octopart.configuration.apikey
9
+ RestClient.get("#{API_BASE}#{path}", params: params)
10
+ end
11
+
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ module Octopart
2
+ class << self
3
+ def configuration
4
+ @configuration ||= Configuration.new
5
+ end
6
+
7
+ def configure
8
+ yield configuration
9
+ end
10
+ end
11
+
12
+ class Configuration
13
+ # Your octopart API key
14
+ attr_accessor :apikey
15
+ end
16
+ end
@@ -0,0 +1,103 @@
1
+ module Octopart
2
+ class Part < Base
3
+
4
+ class << self
5
+
6
+ # Public: Find's a part for a given uid and returns an Octopart::Part or
7
+ # an Array of Octopart::Part if multipled UIDs are given.
8
+ #
9
+ # args - Either a single Octopart UID, or multiple
10
+ #
11
+ # Examples
12
+ #
13
+ # part = Octopart::Part.find('39619421')
14
+ #
15
+ # parts = Octopart::Part.find(39619421, 29035751, 31119928)
16
+ def find(*args)
17
+ case args.length
18
+ when 0
19
+ raise ArgumentError.new("Please specify atleast 1 uid")
20
+ when 1
21
+ response = JSON.parse(self.get('parts/get', uid: args.first))
22
+ else
23
+ response = JSON.parse(self.get('parts/get_multi', uids: args.to_json))
24
+ end
25
+ self.build(response)
26
+ end
27
+
28
+ # Public: Search for parts that match the given query and returns an Array of
29
+ # Octopart::Part
30
+ #
31
+ # query - A search term
32
+ # options - A set of options (default: {})
33
+ # :start - Ordinal position of first result. First position is 0.
34
+ # Default is 0. Maximum is 1000.
35
+ # :limit - Number of results to return. Default is 10. Maximum is 100.
36
+ # :filters - JSON encoded list of (fieldname,values) pairs
37
+ # :rangedfilters - JSON encoded list of (fieldname, min/max values) pairs,
38
+ # using null as wildcard.
39
+ # :sortby - JSON encoded list of (fieldname,sort-order) pairs. Default is
40
+ # [["score","desc"]]
41
+ #
42
+ # Examples
43
+ #
44
+ # parts = Octopart::Part.search('resistor', limit: 10)
45
+ def search(query, options = {})
46
+ params = options.merge(q: query)
47
+ response = JSON.parse(self.get('parts/search', params))
48
+ parts = response['results'].map { |part| part['item'] }
49
+ self.build(parts)
50
+ end
51
+
52
+ # Public: Matches a manufacturer and manufacturer part number to an Octopart part UID
53
+ #
54
+ # manufacturer - Manufacturer name (eg. Texas Instruments)
55
+ # mpn - Manufacturer part number
56
+ #
57
+ # Examples
58
+ #
59
+ # uid = Octopart::Part.match('texas instruments', 'SN74LS240N')
60
+ #
61
+ # part = Octopart::Part.find(uid)
62
+ def match(manufacturer, mpn)
63
+ params = { manufacturer_name: manufacturer, mpn: mpn }
64
+ response = JSON.parse(self.get('parts/match', params))
65
+ case response.length
66
+ when 1
67
+ response.first.first
68
+ end
69
+ end
70
+
71
+ # Public: Matches a list of part numbers to an Array of Octopart::Part
72
+ #
73
+ # lines - Either a single line or an array of lines
74
+ #
75
+ # Examples
76
+ #
77
+ # Octopart::Part.bom(mpn: 'SN74LS240N')
78
+ #
79
+ # Octopart::Part.bom([{mpn: 'SN74LS240N'}, {mpn: 'ATMEGA328P-PU'}])
80
+ def bom(lines)
81
+ lines = [lines] unless lines.is_a?(Array)
82
+ response = JSON.parse(self.get('bom/match', lines: lines.to_json))
83
+ response['results'].map { |line| self.build(line['items']) }
84
+ end
85
+
86
+ # Internal: Converts a Hash or an Array of Hash into an Octopart::Part or
87
+ # an Array of Octopart::Part
88
+ def build(object)
89
+ if object.is_a?(Array)
90
+ object.map { |obj| self.build(obj) }
91
+ elsif object.is_a?(Hash)
92
+ object.delete('__class__')
93
+ object = Hashie::Mash.new(object)
94
+ self.new.tap { |p| p.replace(object) }
95
+ else
96
+ raise "What is this? I don't even..."
97
+ end
98
+ end
99
+
100
+ end
101
+
102
+ end
103
+ end
@@ -0,0 +1,3 @@
1
+ module Octopart
2
+ VERSION = "0.1.0"
3
+ end
data/octopart.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/octopart/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Eric J. Holmes"]
6
+ gem.email = ["eric@ejholmes.net"]
7
+ gem.description = %q{Ruby gem for the Octopart API}
8
+ gem.summary = gem.description
9
+ gem.homepage = "https://github.com/ejholmes/octopart"
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "octopart"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Octopart::VERSION
17
+
18
+ gem.add_dependency 'hashie'
19
+ gem.add_dependency 'json'
20
+ gem.add_dependency 'rest-client'
21
+
22
+ gem.add_development_dependency 'rspec'
23
+ gem.add_development_dependency 'vcr'
24
+ gem.add_development_dependency 'fakeweb'
25
+ end
@@ -0,0 +1,166 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://octopart.com/api/v2/bom/match?lines=%5B%7B%22mpn%22%3A%22SN74LS240N%22%7D%5D
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ accept:
11
+ - ! '*/*; q=0.5, application/xml'
12
+ accept-encoding:
13
+ - gzip, deflate
14
+ user-agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: !binary |-
20
+ T0s=
21
+ headers:
22
+ !binary "Y2FjaGUtY29udHJvbA==":
23
+ - !binary |-
24
+ bm8tY2FjaGU=
25
+ !binary "Y29udGVudC1lbmNvZGluZw==":
26
+ - !binary |-
27
+ Z3ppcA==
28
+ !binary "Y29udGVudC10eXBl":
29
+ - !binary |-
30
+ dGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOA==
31
+ !binary "ZGF0ZQ==":
32
+ - !binary |-
33
+ VGh1LCAyNiBBcHIgMjAxMiAwOToxNDoxMiBHTVQ=
34
+ !binary "cHJhZ21h":
35
+ - !binary |-
36
+ bm8tY2FjaGU=
37
+ !binary "eC1hcHAtdGltZQ==":
38
+ - !binary |-
39
+ MC4xMzk=
40
+ !binary "dHJhbnNmZXItZW5jb2Rpbmc=":
41
+ - !binary |-
42
+ Y2h1bmtlZA==
43
+ !binary "Y29ubmVjdGlvbg==":
44
+ - !binary |-
45
+ a2VlcC1hbGl2ZQ==
46
+ body:
47
+ encoding: ASCII-8BIT
48
+ string: !binary |-
49
+ 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
162
+ qEioZheNb/8P76xINpeAAAA=
163
+ http_version: !binary |-
164
+ MS4x
165
+ recorded_at: Thu, 26 Apr 2012 09:14:12 GMT
166
+ recorded_with: VCR 2.1.1