octopart 0.1.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.
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