lob 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/lib/lob.rb ADDED
@@ -0,0 +1,68 @@
1
+ require "rest-client"
2
+ require "json"
3
+
4
+ require "lob/lob_error"
5
+ require "lob/v1/resource"
6
+ require "lob/v1/address"
7
+ require "lob/v1/job"
8
+ require "lob/v1/object"
9
+ require "lob/v1/packaging"
10
+ require "lob/v1/postcard"
11
+ require "lob/v1/service"
12
+ require "lob/v1/setting"
13
+
14
+
15
+ module Lob
16
+
17
+ class << self
18
+ attr_accessor :api_key,
19
+ :api_version,
20
+ :protocol,
21
+ :api_host
22
+
23
+ def configure
24
+ yield self
25
+ true
26
+ end
27
+
28
+ alias :config :configure
29
+ end
30
+
31
+
32
+ def self.require_options(options, *keys)
33
+ keys.each do |key|
34
+ raise ArgumentError.new(":#{key} is required") unless options.key?(key)
35
+ end
36
+ end
37
+
38
+
39
+ def self.submit(method, url, parameters={})
40
+ parameters = {:params => parameters} if method == :get
41
+ JSON(RestClient.send(method, url, parameters))
42
+ rescue => e
43
+ error_message = nil
44
+ raise e unless e.respond_to? :http_body
45
+ begin
46
+ error_message = JSON(e.http_body)["errors"].first.values.first
47
+ rescue
48
+ raise e
49
+ end
50
+ raise Lob::Error.new(error_message)
51
+ end
52
+
53
+ end
54
+
55
+
56
+ def Lob(options={})
57
+ options[:api_host] ||= Lob.api_host || "api.lob.com"
58
+ options[:protocol] ||= Lob.protocol || "https"
59
+ options[:api_version] ||= Lob.api_version || "v1"
60
+ options[:api_key] ||= Lob.api_key
61
+
62
+ unless options[:api_key]
63
+ raise ArgumentError.new(":api_key is a required argument to initialize Lob")
64
+ end
65
+
66
+ #TODO check if the version exists first
67
+ Lob.const_get("#{options[:api_version].capitalize}::Resource").new(options)
68
+ end
data/lob.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "lob"
8
+ spec.version = "1.0.2"
9
+ spec.authors = ["Akash Manohar J"]
10
+ spec.email = ["akash@akash.im"]
11
+ spec.description = %q{Lob API Ruby wrapper}
12
+ spec.summary = %q{Ruby wrapper for Lob.com API with ActiveRecord-style syntax}
13
+ spec.homepage = "https://github.com/lob/lob-ruby"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
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_dependency "rest-client", ">= 0"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.3"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "vcr"
26
+ spec.add_development_dependency "webmock"
27
+ end
@@ -0,0 +1,79 @@
1
+ require "spec_helper"
2
+
3
+ describe Lob::V1::Address do
4
+
5
+ before :all do
6
+ @sample_params = {
7
+ name: "Test",
8
+ email: "test@test.com",
9
+ address_line1: "220 WILLIAM T MORRISSEY BLVD",
10
+ city: "Boston",
11
+ state: "MA",
12
+ country: "USA",
13
+ zip: 02125
14
+ }
15
+ end
16
+
17
+ subject { Lob(api_key: ENV["LOB_API_KEY"], api_version: "v1") }
18
+
19
+ describe "verify" do
20
+ it "should verify an address" do
21
+ VCR.use_cassette('verify_address') do
22
+ result = subject.addresses.verify(
23
+ address_line1: @sample_params[:address_line1],
24
+ city: @sample_params[:city],
25
+ state: @sample_params[:state],
26
+ zip: @sample_params[:zip]
27
+ )
28
+
29
+ result["address"]["address_country"].must_equal("USA")
30
+ end
31
+ end
32
+ end
33
+
34
+
35
+ describe "list" do
36
+ it "should list addresses" do
37
+ VCR.use_cassette('list_addresses') do
38
+ new_address = subject.addresses.create @sample_params
39
+
40
+ list_result = subject.addresses.list
41
+ assert /#{new_address["name"]}/ =~ list_result.to_s
42
+ end
43
+ end
44
+ end
45
+
46
+
47
+ describe "create" do
48
+ it "should create an address" do
49
+ VCR.use_cassette('create_address') do
50
+ result = subject.addresses.create @sample_params
51
+ result["name"].must_equal(@sample_params[:name])
52
+ end
53
+ end
54
+ end
55
+
56
+
57
+ describe "find" do
58
+ it "should find an address" do
59
+ VCR.use_cassette('find_address') do
60
+ new_address = subject.addresses.create @sample_params
61
+
62
+ find_result = subject.addresses.find(new_address["id"])
63
+ find_result["name"].must_equal(@sample_params[:name])
64
+ end
65
+ end
66
+ end
67
+
68
+
69
+ describe "destroy" do
70
+ it "should delete an address" do
71
+ VCR.use_cassette('delete_address') do
72
+ new_address = subject.addresses.create @sample_params
73
+
74
+ delete_result = subject.addresses.destroy(new_address["id"])
75
+ assert /has been deleted/ =~ delete_result["message"]
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,117 @@
1
+ require "spec_helper"
2
+
3
+ describe Lob::V1::Job do
4
+
5
+ before :all do
6
+ @sample_address_params = {
7
+ name: "TestAddress",
8
+ email: "test@test.com",
9
+ address_line1: "123 Test Street",
10
+ address_line2: "Unit 199",
11
+ city: "Mountain View",
12
+ state: "CA",
13
+ country: "USA",
14
+ zip: 94085
15
+ }
16
+
17
+ @sample_job_params = { name: "TestJob" }
18
+ @sample_object_params = { name: "TestObject" }
19
+ end
20
+
21
+ subject { Lob(api_key: ENV["LOB_API_KEY"], api_version: "v1") }
22
+
23
+
24
+ describe "list" do
25
+ it "should list jobs" do
26
+ VCR.use_cassette('list_jobs') do
27
+ new_address = subject.addresses.create @sample_address_params
28
+ settings_list = subject.settings.list
29
+ new_object = subject.objects.create(
30
+ @sample_object_params[:name],
31
+ "https://www.lob.com/goblue.pdf",
32
+ settings_list.first["id"]
33
+ )
34
+
35
+ new_job = subject.jobs.create(
36
+ @sample_job_params[:name],
37
+ new_address["id"],
38
+ new_object["id"]
39
+ )
40
+
41
+ list_result = subject.jobs.list
42
+ assert /#{new_job["name"]}/ =~ list_result.to_s
43
+ end
44
+ end
45
+ end
46
+
47
+
48
+ describe "create" do
49
+ it "should create a job with address_id" do
50
+ VCR.use_cassette('create_job_with_address_id') do
51
+ new_address = subject.addresses.create @sample_address_params
52
+
53
+ settings_list = subject.settings.list
54
+ new_object = subject.objects.create(
55
+ @sample_object_params[:name],
56
+ "https://www.lob.com/goblue.pdf",
57
+ settings_list.first["id"]
58
+ )
59
+
60
+ result = subject.jobs.create(@sample_job_params[:name], new_address["id"], new_object["id"])
61
+ result["name"].must_equal(@sample_job_params[:name])
62
+ end
63
+ end
64
+
65
+ it "should create a job with address params" do
66
+ VCR.use_cassette('create_job_with_address_params') do
67
+ settings_list = subject.settings.list
68
+ new_object = subject.objects.create(
69
+ @sample_object_params[:name],
70
+ "https://www.lob.com/goblue.pdf",
71
+ settings_list.first["id"]
72
+ )
73
+
74
+ result = subject.jobs.create(@sample_job_params[:name], @sample_address_params, new_object["id"])
75
+ result["name"].must_equal(@sample_job_params[:name])
76
+ end
77
+ end
78
+
79
+
80
+ it "should create a job with object params" do
81
+ VCR.use_cassette('create_job_with_object_params') do
82
+ new_address = subject.addresses.create @sample_address_params
83
+ settings_list = subject.settings.list
84
+ new_object_params = {
85
+ name: @sample_object_params[:name],
86
+ file: "https://www.lob.com/goblue.pdf",
87
+ setting_id: settings_list.first["id"]
88
+ }
89
+
90
+ result = subject.jobs.create(@sample_job_params[:name], new_address["id"], new_object_params)
91
+ result["name"].must_equal(@sample_job_params[:name])
92
+ end
93
+ end
94
+ end
95
+
96
+
97
+ describe "find" do
98
+ it "should find a job" do
99
+ VCR.use_cassette('find_job') do
100
+ new_address = subject.addresses.create @sample_address_params
101
+
102
+ settings_list = subject.settings.list
103
+ new_object = subject.objects.create(
104
+ @sample_object_params[:name],
105
+ "https://www.lob.com/goblue.pdf",
106
+ settings_list.first["id"]
107
+ )
108
+
109
+ new_job = subject.jobs.create(@sample_job_params[:name], new_address["id"], new_object["id"])
110
+
111
+ result = subject.jobs.find(new_job["id"])
112
+ result["name"].must_equal(@sample_job_params[:name])
113
+ end
114
+ end
115
+ end
116
+
117
+ end
@@ -0,0 +1,93 @@
1
+ require "spec_helper"
2
+
3
+ describe Lob::V1::Object do
4
+
5
+ before :all do
6
+ @sample_params = {
7
+ name: "TestObject",
8
+ }
9
+ end
10
+
11
+ subject { Lob(api_key: ENV["LOB_API_KEY"], api_version: "v1") }
12
+
13
+
14
+ describe "list" do
15
+ it "should list objects" do
16
+ VCR.use_cassette('list_objects') do
17
+ settings_list = subject.settings.list
18
+ new_object = subject.objects.create(
19
+ @sample_params[:name],
20
+ "https://www.lob.com/goblue.pdf",
21
+ settings_list.first["id"]
22
+ )
23
+
24
+ list_result = subject.objects.list
25
+ assert /#{new_object["name"]}/ =~ list_result.to_s
26
+ end
27
+ end
28
+ end
29
+
30
+
31
+ describe "create" do
32
+ it "should create an object with file url" do
33
+ VCR.use_cassette('create_object_with_url') do
34
+ settings_list = subject.settings.list
35
+ result = subject.objects.create(
36
+ @sample_params[:name],
37
+ "https://www.lob.com/goblue.pdf",
38
+ settings_list.first["id"]
39
+ )
40
+
41
+ result["name"].must_equal(@sample_params[:name])
42
+ end
43
+ end
44
+
45
+ it "should create an object with file" do
46
+ VCR.use_cassette('create_object_with_file') do
47
+ settings_list = subject.settings.list
48
+ result = subject.objects.create(
49
+ @sample_params[:name],
50
+ File.new(File.expand_path("../../../samples/goblue.pdf", __FILE__), "rb"),
51
+ settings_list.first["id"]
52
+ )
53
+
54
+ result["name"].must_equal(@sample_params[:name])
55
+ end
56
+ end
57
+ end
58
+
59
+
60
+ describe "find" do
61
+ it "should find an object" do
62
+ VCR.use_cassette('find_object') do
63
+ settings_list = subject.settings.list
64
+ new_object = subject.objects.create(
65
+ @sample_params[:name],
66
+ "https://www.lob.com/goblue.pdf",
67
+ settings_list.first["id"]
68
+ )
69
+
70
+ find_result = subject.objects.find(new_object["id"])
71
+ find_result["name"].must_equal(@sample_params[:name])
72
+ end
73
+ end
74
+ end
75
+
76
+
77
+ describe "destroy" do
78
+ it "should delete an object" do
79
+ VCR.use_cassette('delete_object') do
80
+ settings_list = subject.settings.list
81
+ new_object = subject.objects.create(
82
+ @sample_params[:name],
83
+ "https://www.lob.com/goblue.pdf",
84
+ settings_list.first["id"]
85
+ )
86
+
87
+ delete_result = subject.objects.destroy(new_object["id"])
88
+ assert /has been deleted/ =~ delete_result["message"]
89
+ end
90
+ end
91
+ end
92
+
93
+ end
@@ -0,0 +1,16 @@
1
+ require "spec_helper"
2
+
3
+ describe Lob::V1::Packaging do
4
+
5
+ subject { Lob(api_key: ENV["LOB_API_KEY"], api_version: "v1") }
6
+
7
+ describe "list" do
8
+ it "should list packagings" do
9
+ VCR.use_cassette('list_packagings') do
10
+ result = subject.packagings.list
11
+ result.length.must_be :>, 0
12
+ end
13
+ end
14
+ end
15
+
16
+ end
@@ -0,0 +1,128 @@
1
+ require "spec_helper"
2
+
3
+ describe Lob::V1::Postcard do
4
+
5
+ before :all do
6
+ @sample_address_params = {
7
+ name: "TestAddress",
8
+ email: "test@test.com",
9
+ address_line1: "123 Test Street",
10
+ address_line2: "Unit 199",
11
+ city: "Mountain View",
12
+ state: "CA",
13
+ country: "USA",
14
+ zip: 94085
15
+ }
16
+
17
+ @sample_postcard_params = {
18
+ name: "TestPostcard",
19
+ message: "Sample postcard message"
20
+ }
21
+ end
22
+
23
+ subject { Lob(api_key: ENV["LOB_API_KEY"], api_version: "v1") }
24
+
25
+ describe "list" do
26
+ it "should list postcards" do
27
+ VCR.use_cassette('list_postcards') do
28
+ new_address = subject.addresses.create @sample_address_params
29
+
30
+ new_postcard = subject.postcards.create(
31
+ @sample_postcard_params[:name],
32
+ new_address["id"],
33
+ front: File.new(File.expand_path("../../../samples/postcardfront.pdf", __FILE__), "rb"),
34
+ back: File.new(File.expand_path("../../../samples/postcardback.pdf", __FILE__), "rb")
35
+ )
36
+
37
+ list_result = subject.postcards.list
38
+ assert /#{new_postcard["name"]}/ =~ list_result.to_s
39
+ end
40
+ end
41
+ end
42
+
43
+
44
+ describe "create" do
45
+ it "should create a postcard with address_id" do
46
+ VCR.use_cassette('create_postcard_with_address_id_and_message') do
47
+ new_address = subject.addresses.create @sample_address_params
48
+
49
+ result = subject.postcards.create(
50
+ @sample_postcard_params[:name],
51
+ new_address["id"],
52
+ message: @sample_postcard_params[:message],
53
+ front: "https://www.lob.com/postcardfront.pdf",
54
+ )
55
+
56
+ result["name"].must_equal(@sample_postcard_params[:name])
57
+ end
58
+ end
59
+
60
+
61
+ it "should create a postcard with address params" do
62
+ VCR.use_cassette('create_postcard_with_address_params') do
63
+
64
+ result = subject.postcards.create(
65
+ @sample_postcard_params[:name],
66
+ @sample_address_params,
67
+ message: @sample_postcard_params[:message],
68
+ front: "https://www.lob.com/postcardfront.pdf"
69
+ )
70
+
71
+ result["name"].must_equal(@sample_postcard_params[:name])
72
+ end
73
+ end
74
+
75
+
76
+ it "should create a postcard with front and back as urls" do
77
+ VCR.use_cassette('create_postcard_with_front_and_back_urls') do
78
+ new_address = subject.addresses.create @sample_address_params
79
+
80
+ result = subject.postcards.create(
81
+ @sample_postcard_params[:name],
82
+ new_address["id"],
83
+ front: "https://www.lob.com/postcardfront.pdf",
84
+ back: "https://www.lob.com/postcardback.pdf"
85
+ )
86
+
87
+ result["name"].must_equal(@sample_postcard_params[:name])
88
+ end
89
+ end
90
+
91
+
92
+ it "should create a postcard with front and back as PDFs" do
93
+ VCR.use_cassette('create_postcard_with_front_and_back_pdfs') do
94
+ new_address = subject.addresses.create @sample_address_params
95
+
96
+ result = subject.postcards.create(
97
+ @sample_postcard_params[:name],
98
+ new_address["id"],
99
+ front: File.new(File.expand_path("../../../samples/postcardfront.pdf", __FILE__), "rb"),
100
+ back: File.new(File.expand_path("../../../samples/postcardback.pdf", __FILE__), "rb")
101
+ )
102
+
103
+ result["name"].must_equal(@sample_postcard_params[:name])
104
+ end
105
+ end
106
+
107
+ end
108
+
109
+
110
+ describe "find" do
111
+ it "should find a postcard" do
112
+ VCR.use_cassette('find_postcard') do
113
+ new_address = subject.addresses.create @sample_address_params
114
+
115
+ new_postcard = subject.postcards.create(
116
+ @sample_postcard_params[:name],
117
+ new_address["id"],
118
+ front: File.new(File.expand_path("../../../samples/postcardfront.pdf", __FILE__), "rb"),
119
+ back: File.new(File.expand_path("../../../samples/postcardback.pdf", __FILE__), "rb")
120
+ )
121
+
122
+ result = subject.postcards.find(new_postcard["id"])
123
+ result["name"].must_equal(@sample_postcard_params[:name])
124
+ end
125
+ end
126
+ end
127
+
128
+ end
@@ -0,0 +1,50 @@
1
+ require "spec_helper"
2
+
3
+ describe Lob::V1::Resource do
4
+
5
+ before :all do
6
+ @api_key = "test"
7
+ end
8
+
9
+ subject { Lob(api_key: @api_key) }
10
+
11
+ describe "when Lob is initialized" do
12
+ it "should receive and contain default options when Lob is initialized" do
13
+ subject.options[:protocol].must_equal "https"
14
+ subject.options[:api_host].must_equal "api.lob.com"
15
+ end
16
+
17
+ it "should have API key in options" do
18
+ subject.options[:api_key].must_equal @api_key
19
+ end
20
+ end
21
+
22
+
23
+ it "should return addresses resource" do
24
+ subject.addresses.must_be_kind_of(Lob::V1::Address)
25
+ end
26
+
27
+ it "should return jobs resource" do
28
+ subject.jobs.must_be_kind_of(Lob::V1::Job)
29
+ end
30
+
31
+ it "should return objects resource" do
32
+ subject.objects.must_be_kind_of(Lob::V1::Object)
33
+ end
34
+
35
+ it "should return packagings resource" do
36
+ subject.packagings.must_be_kind_of(Lob::V1::Packaging)
37
+ end
38
+
39
+ it "should return postcards resource" do
40
+ subject.postcards.must_be_kind_of(Lob::V1::Postcard)
41
+ end
42
+
43
+ it "should return services resource" do
44
+ subject.services.must_be_kind_of(Lob::V1::Service)
45
+ end
46
+
47
+ it "should return settings resource" do
48
+ subject.settings.must_be_kind_of(Lob::V1::Setting)
49
+ end
50
+ end
@@ -0,0 +1,16 @@
1
+ require "spec_helper"
2
+
3
+ describe Lob::V1::Service do
4
+
5
+ subject { Lob(api_key: ENV["LOB_API_KEY"], api_version: "v1") }
6
+
7
+ describe "list" do
8
+ it "should list services" do
9
+ VCR.use_cassette('list_services') do
10
+ result = subject.services.list
11
+ result.length.must_be :>, 0
12
+ end
13
+ end
14
+ end
15
+
16
+ end
@@ -0,0 +1,29 @@
1
+ require "spec_helper"
2
+
3
+ describe Lob::V1::Setting do
4
+
5
+ subject { Lob(api_key: ENV["LOB_API_KEY"], api_version: "v1") }
6
+
7
+ describe "list" do
8
+ it "should list settings" do
9
+ VCR.use_cassette('list_settings') do
10
+ result = subject.settings.list
11
+ result.length.must_be :>, 0
12
+ /Document/ =~ result.to_s
13
+ /Poster/ =~ result.to_s
14
+ /Card/ =~ result.to_s
15
+ end
16
+ end
17
+ end
18
+
19
+
20
+ describe "find" do
21
+ it "should find a setting" do
22
+ VCR.use_cassette('find_setting') do
23
+ list_result = subject.settings.list
24
+ result = subject.settings.find(list_result.first["id"])
25
+ result["description"].must_equal(list_result.first["description"])
26
+ end
27
+ end
28
+ end
29
+ end
data/spec/lob_spec.rb ADDED
@@ -0,0 +1,34 @@
1
+ require "spec_helper"
2
+
3
+ module Lob
4
+ module Test
5
+ class Resource
6
+ attr_accessor :options
7
+ def initialize(options)
8
+ @options = options
9
+ end
10
+ end
11
+ end
12
+ end
13
+
14
+
15
+ describe Lob do
16
+
17
+ it "should return the resource object for the specified version" do
18
+ Lob(api_key: "test", api_version: "test").must_be_kind_of(Lob::Test::Resource)
19
+ end
20
+
21
+ it "should raise an error if API key is not passed as an option or set on module" do
22
+ Lob.api_key = nil # make sure API key is nil
23
+ ->{ Lob() }.must_raise(ArgumentError)
24
+ end
25
+
26
+ it "should *not* raise an error if API key has been on module and not passed as option" do
27
+ Lob.api_key = "test"
28
+ Lob().wont_be_nil
29
+ end
30
+
31
+ it "should pass the API key to the resource for the version" do
32
+ Lob(api_key: "test").options[:api_key].must_equal "test"
33
+ end
34
+ end
@@ -0,0 +1,16 @@
1
+ $:.unshift File.expand_path("../lib", File.dirname(__FILE__))
2
+
3
+ require "lob"
4
+ require "minitest/spec"
5
+ require "minitest/pride"
6
+ require "minitest/autorun"
7
+ require "vcr"
8
+
9
+ VCR.configure do |config|
10
+ config.cassette_library_dir = "spec/vcr_cassettes"
11
+ config.hook_into :webmock
12
+ end
13
+
14
+ VCR.use_cassette("example") do
15
+ RestClient.get 'https://raw.github.com/gist/3887508/b84579e450e2fb483b9b0475d938b7acd8861d15/README.md'
16
+ end