oshpark 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,9 @@
1
+ module Oshpark
2
+ class OrderOption
3
+ def self.attrs
4
+ %w| id name description price |
5
+ end
6
+
7
+ include Model
8
+ end
9
+ end
@@ -0,0 +1,28 @@
1
+ module Oshpark
2
+ class Panel
3
+ def self.attrs
4
+ %w| pcb_layers scheduled_order_time expected_receive_time
5
+ id ordered_at received_at state service total_orders
6
+ total_boards board_area_in_square_mils |
7
+ end
8
+
9
+ include Model
10
+
11
+ def scheduled_order_time
12
+ time_from @scheduled_order_time if @scheduled_order_time
13
+ end
14
+
15
+ def expected_receive_time
16
+ time_from @expected_receive_time if @expected_receive_time
17
+ end
18
+
19
+ def ordered_at
20
+ time_from @ordered_at if @ordered_at
21
+ end
22
+
23
+ def received_at
24
+ time_from @received_at if @received_at
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,50 @@
1
+ module Oshpark
2
+ class Project
3
+ def self.attrs
4
+ %w| id design_file_url name description top_image bottom_image width_in_mils height_in_mils pcb_layers state layers order_options is_shared |
5
+ end
6
+
7
+ def self.write_attrs
8
+ %w| name description |
9
+ end
10
+
11
+ include Model
12
+ include Dimensionable
13
+
14
+ alias shared? is_shared
15
+
16
+ def top_image
17
+ Image.from_json @top_image
18
+ end
19
+
20
+ def bottom_image
21
+ Image.from_json @bottom_image
22
+ end
23
+
24
+ def layers
25
+ @layers.map do |json|
26
+ Layer.from_json json
27
+ end
28
+ end
29
+
30
+ def order_options
31
+ @order_options.map do |json|
32
+ OrderOption.from_json json
33
+ end
34
+ end
35
+
36
+ def width_in_mils
37
+ @width_in_mils || 0
38
+ end
39
+
40
+ def height_in_mils
41
+ @height_in_mils || 0
42
+ end
43
+
44
+ def approve!
45
+ json = Oshpark::client.approve_project id
46
+ reload_with(json)
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,9 @@
1
+ unless defined?(Motion::Project::Config)
2
+ raise "The oshpark gem must be required within a RubyMotion project Rakefile."
3
+ end
4
+
5
+
6
+ Motion::Project::App.setup do |app|
7
+ lib = File.expand_path(__FILE__, "../../")
8
+ app.files = Dir.glob("#{lib}/**/*.rb") + app.files
9
+ end
@@ -0,0 +1,11 @@
1
+ module Oshpark
2
+ class ShippingRate
3
+
4
+ def self.attrs
5
+ %w| carrier_name service_name price |
6
+ end
7
+
8
+ include Model
9
+
10
+ end
11
+ end
@@ -0,0 +1,24 @@
1
+ module Oshpark
2
+ class Token
3
+
4
+ attr_accessor :expires_at
5
+
6
+ def ttl
7
+ expires_at - Time.now
8
+ end
9
+
10
+ def user
11
+ User.from_json 'id' => user_id
12
+ end
13
+
14
+ def ttl= i
15
+ sel.expires_at = Time.now + i
16
+ end
17
+
18
+ def self.attrs
19
+ %w| token ttl user_id |
20
+ end
21
+
22
+ include Model
23
+ end
24
+ end
@@ -0,0 +1,37 @@
1
+ module Oshpark
2
+ class Upload
3
+ def self.attrs
4
+ %w| id state original_filename error_message queued_at started_at completed_at errored_at failed_at project_id |
5
+ end
6
+
7
+ include Model
8
+
9
+ def self.create file
10
+ self.from_json(Oshpark::client.create_upload(file))
11
+ end
12
+
13
+ def project
14
+ Project.find project_id
15
+ end
16
+
17
+ def queued_at
18
+ time_from @queued_at
19
+ end
20
+
21
+ def started_at
22
+ time_from @started_at
23
+ end
24
+
25
+ def completed_at
26
+ time_from @completed_at
27
+ end
28
+
29
+ def errored_at
30
+ time_from @errored_at
31
+ end
32
+
33
+ def failed_at
34
+ time_from @failed_at
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,9 @@
1
+ module Oshpark
2
+ class User
3
+ def self.attrs
4
+ %w| id |
5
+ end
6
+
7
+ include Model
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ module Oshpark
2
+ VERSION = "0.0.3"
3
+ end
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'oshpark/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "oshpark"
8
+ spec.version = Oshpark::VERSION
9
+ spec.authors = ["James Harton", "Henry Maddocks"]
10
+ spec.email = ["james@resistor.io", "henry@resistor.io"]
11
+ spec.summary = %q{API and command line client for oshpark.com}
12
+ spec.description = %q{API and command line client for PCB fabrication via oshpark.com}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.6"
22
+
23
+ %w| cucumber rspec-core rspec-mocks rspec-its guard-rspec guard-cucumber guard-bundler pry rake byebug|.each do |gem|
24
+ spec.add_development_dependency gem
25
+ end
26
+
27
+ spec.add_dependency 'micro_token'
28
+ spec.add_dependency 'thor'
29
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Oshpark::Address do
4
+ describe ".initialize" do
5
+ let(:args) { {name: "Bob", address_line_1: "8 Nelson Street", address_line_2: "Petone", city: "Lower Hutt", country: "New Zealand"} }
6
+
7
+ subject { Oshpark::Address.new args }
8
+ it "creates an address" do
9
+ expect(subject.address_line_1).to eq "8 Nelson Street"
10
+ end
11
+ end
12
+
13
+ end
@@ -0,0 +1,139 @@
1
+ require 'spec_helper'
2
+
3
+ describe Oshpark::Client do
4
+ let(:connection) { FakeClient.new "foo"}
5
+ subject { Oshpark::Client.new connection: connection }
6
+
7
+ describe '#initialize' do
8
+ it 'attempts to retrieve an API token immediately' do
9
+ subject
10
+ expect(connection.requests.last).to eq([:post, 'sessions', {}])
11
+ end
12
+ end
13
+
14
+ describe '#authenticate' do
15
+ it 'attempts to authenticate an API token with a password' do
16
+ subject.authenticate 'email', with_password: 'pass'
17
+ expect(connection.requests.last).to eq([:post, 'sessions', {email: 'email', password: 'pass'}])
18
+ end
19
+
20
+ it 'attempts to authenticate an API token with an API secret' do
21
+ subject.authenticate 'email', with_api_secret: 'secret'
22
+ expect(connection.requests.last).to eq([:post, 'sessions', {email: 'email', api_key: 'add39dedbfe932ce383881dac4870bf417ebb79e1ec743e5c1e3bec574a2e821'}])
23
+ end
24
+ end
25
+
26
+ describe '#projects' do
27
+ it 'retrieves a list of projects from the API' do
28
+ subject.projects
29
+ expect(connection.requests.last).to eq([:get, 'projects', {}])
30
+ end
31
+ end
32
+
33
+ describe '#project' do
34
+ let(:token) { 'abcd1234' }
35
+ it 'retrieves a project from the API' do
36
+ subject.project token
37
+ expect(connection.requests.last).to eq([:get, "projects/#{token}", {}])
38
+ end
39
+ end
40
+
41
+ describe '#approve_project' do
42
+ let(:token) { 'abcd1234' }
43
+ it 'approve a project via the API' do
44
+ subject.approve_project(token)
45
+ expect(connection.requests.last).to eq([:get, "projects/#{token}/approve", {}])
46
+ end
47
+ end
48
+
49
+ describe '#destroy_project' do
50
+ let(:token) { 'abcd1234' }
51
+ it 'destroy a project via the API' do
52
+ expect(subject.destroy_project(token)).to eq true
53
+ expect(connection.requests.last).to eq([:delete, "projects/#{token}", {}])
54
+ end
55
+ end
56
+
57
+ describe '#orders' do
58
+ it 'retrieves a list of orders from the API' do
59
+ subject.orders
60
+ expect(connection.requests.last).to eq([:get, 'orders', {}])
61
+ end
62
+ end
63
+
64
+ describe '#order' do
65
+ let(:token) { 'abcd1234' }
66
+ it 'retrieves a order from the API' do
67
+ subject.order token
68
+ expect(connection.requests.last).to eq([:get, "orders/#{token}", {}])
69
+ end
70
+ end
71
+
72
+ describe '#create_order' do
73
+ it "creates an order" do
74
+ subject.create_order
75
+ expect(connection.requests.last).to eq([:post, "orders", {}])
76
+ end
77
+ end
78
+
79
+ describe '#add_order_item' do
80
+ let(:token) { 'abcd1234' }
81
+ let(:project_id) { '1234abcd' }
82
+ let(:quantity) { 6 }
83
+ it "add an order item to an order" do
84
+ subject.add_order_item token, project_id, quantity
85
+ expect(connection.requests.last).to eq([:put, "orders/#{token}/add_item", {:project_id=>"1234abcd", :quantity=>6}])
86
+ end
87
+ end
88
+
89
+ describe '#set_order_address' do
90
+ let(:token) { 'abcd1234' }
91
+ let(:address) { Oshpark::Address.new name: "Bob", address_line_1: "8 Nelson Street", address_line_2: "Petone", city: "Lower Hutt", country: "New Zealand" }
92
+ it "set the delivery address for an order" do
93
+ subject.set_order_address token, address
94
+ expect(connection.requests.last).to eq([:put, "orders/#{token}/set_address", {"name" => "Bob", "company_name" => nil, "address_line_1" => "8 Nelson Street", "address_line_2" => "Petone", "city" => "Lower Hutt", "state" => nil, "zip_or_postal_code" => nil, "country" => "New Zealand", "phone_number" => nil, "is_business" => nil}])
95
+ end
96
+ end
97
+
98
+ describe '#set_order_shipping_rate' do
99
+ let(:token) { 'abcd1234' }
100
+ let(:service_provider) { 'Bobs Mail'}
101
+ let(:service_name) { 'Overnight Delivery' }
102
+ it "sets the shipping rate for an order" do
103
+ subject.set_order_shipping_rate token, service_provider, service_name
104
+ expect(connection.requests.last).to eq([:put, "orders/#{token}/set_shipping_rate", {carrier_name: "Bobs Mail", service_name: "Overnight Delivery"}])
105
+ end
106
+ end
107
+
108
+ describe '#checkout_order' do
109
+ let(:token) { 'abcd1234' }
110
+ it "checks out an order" do
111
+ subject.checkout_order token
112
+ expect(connection.requests.last).to eq([:put, "orders/#{token}/checkout", {}])
113
+ end
114
+ end
115
+
116
+ describe '#cancel_order' do
117
+ let(:token) { 'abcd1234' }
118
+ it 'retrieves a order from the API' do
119
+ expect(subject.cancel_order(token)).to eq true
120
+ expect(connection.requests.last).to eq([:delete, "orders/#{token}", {}])
121
+ end
122
+ end
123
+
124
+ describe '#panels' do
125
+ it 'retrieves a list of panels from the API' do
126
+ subject.panels
127
+ expect(connection.requests.last).to eq([:get, 'panels', {}])
128
+ end
129
+ end
130
+
131
+ describe '#panel' do
132
+ let(:token) { 'abcd1234' }
133
+ it 'retrieves a panel from the API' do
134
+ subject.panel token
135
+ expect(connection.requests.last).to eq([:get, "panels/#{token}", {}])
136
+ end
137
+ end
138
+
139
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Oshpark::Image do
4
+ subject { Oshpark::Image.new({}) }
5
+ it { should be_an Oshpark::Model }
6
+ it { should respond_to :thumb_url }
7
+ it { should respond_to :large_url }
8
+ it { should respond_to :original_url }
9
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Oshpark::Import do
4
+ subject { Oshpark::Import.new({}) }
5
+ it { should be_an Oshpark::Model }
6
+
7
+ %w| id state original_url original_filename error_message queued_at started_at completed_at errored_at failed_at project_id |.each do |attr|
8
+ it { should respond_to attr }
9
+ end
10
+
11
+ describe '#project' do
12
+ it 'retrieves a project' do
13
+ allow(subject).to receive(:project_id).and_return('abcd1234')
14
+ expect(Oshpark::Project).to receive(:find).with('abcd1234')
15
+ subject.project
16
+ end
17
+ end
18
+ end
19
+
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe Oshpark::Layer do
4
+ subject { Oshpark::Layer.new({}) }
5
+ it { should be_an Oshpark::Model }
6
+ it { should respond_to :id }
7
+ it { should respond_to :name }
8
+ it { should respond_to :gerber_file_url }
9
+ it { should respond_to :image }
10
+ it { should respond_to :imported_from }
11
+ it { should respond_to :width_in_mils }
12
+ it { should respond_to :height_in_mils }
13
+ it { should respond_to :image }
14
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe Oshpark::Model do
4
+ let(:klass) do
5
+ Class.new do
6
+ def self.attrs
7
+ [ 'hello', 'goodbye' ]
8
+ end
9
+ def self.write_attrs
10
+ [ 'bob' ]
11
+ end
12
+
13
+ end
14
+ end
15
+
16
+ describe "included" do
17
+ before { klass.send :include, Oshpark::Model }
18
+ subject { klass.new({}) }
19
+
20
+ it "class ancestors should include Oshpark::Model::ClassMethods" do
21
+ expect(subject.class.ancestors).to include Oshpark::Model::ClassMethods
22
+ end
23
+
24
+ it { should respond_to :hello }
25
+ it { should respond_to :goodbye }
26
+ it { should respond_to :bob= }
27
+
28
+ describe '.from_json' do
29
+ let(:json) do
30
+ {
31
+ 'hello' => 'world',
32
+ 'goodbye' => 'cruel world'
33
+ }
34
+ end
35
+ subject { klass.from_json json }
36
+
37
+ its(:hello) { should eq 'world' }
38
+ its(:goodbye) { should eq 'cruel world' }
39
+ end
40
+ end
41
+ end