lob 4.3.0 → 5.4.6

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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/forked_tests_job.yml +36 -0
  3. data/.github/workflows/run_tests_job.yml +32 -0
  4. data/.github/workflows/update_gem.yml +27 -0
  5. data/.gitignore +1 -0
  6. data/CHANGELOG.md +47 -0
  7. data/README.md +16 -85
  8. data/examples/README.md +95 -9
  9. data/examples/cards.rb +51 -0
  10. data/examples/checks.rb +4 -3
  11. data/examples/csv_checks/create_checks.rb +3 -2
  12. data/examples/csv_letters/create_letters.rb +3 -2
  13. data/examples/csv_letters/letter_template.html +1 -1
  14. data/examples/csv_postcards/create_postcards.rb +3 -2
  15. data/examples/csv_postcards/input.csv +7 -7
  16. data/examples/csv_postcards/postcard_back.html +1 -1
  17. data/examples/csv_verify/verify.rb +3 -2
  18. data/examples/letters.rb +4 -3
  19. data/examples/list_postcards_metadata.rb +94 -0
  20. data/examples/postcards.rb +6 -5
  21. data/examples/postcards_idempotent.rb +92 -0
  22. data/examples/postcards_intl.rb +87 -0
  23. data/examples/postcards_remote.rb +87 -0
  24. data/examples/postcards_send_date.rb +97 -0
  25. data/examples/postcards_template.rb +98 -0
  26. data/examples/self_mailers.rb +38 -0
  27. data/lib/lob/client.rb +33 -8
  28. data/lib/lob/resources/bulk_intl_verifications.rb +27 -0
  29. data/lib/lob/resources/bulk_us_verifications.rb +28 -0
  30. data/lib/lob/resources/card.rb +46 -0
  31. data/lib/lob/resources/{area.rb → group.rb} +2 -4
  32. data/lib/lob/resources/groups_member.rb +66 -0
  33. data/lib/lob/resources/resource_base.rb +20 -9
  34. data/lib/lob/resources/self_mailer.rb +14 -0
  35. data/lib/lob/resources/us_reverse_geocode_lookups.rb +26 -0
  36. data/lib/lob/version.rb +1 -1
  37. data/lob.gemspec +7 -7
  38. data/spec/lob/resources/bulk_intl_verifications_spec.rb +39 -0
  39. data/spec/lob/resources/bulk_us_verifications_spec.rb +51 -0
  40. data/spec/lob/resources/card_spec.rb +145 -0
  41. data/spec/lob/resources/check_spec.rb +21 -0
  42. data/spec/lob/resources/group_spec.rb +50 -0
  43. data/spec/lob/resources/intl_verifications_spec.rb +4 -7
  44. data/spec/lob/resources/letter_spec.rb +24 -4
  45. data/spec/lob/resources/member_spec.rb +65 -0
  46. data/spec/lob/resources/postcard_spec.rb +30 -5
  47. data/spec/lob/resources/resource_base_spec.rb +4 -16
  48. data/spec/lob/resources/self_mailer_spec.rb +177 -0
  49. data/spec/lob/resources/us_reverse_geocode_lookups_spec.rb +22 -0
  50. data/spec/samples/card.pdf +744 -0
  51. data/spec/samples/sfm-12x9-inside.pdf +0 -0
  52. data/spec/samples/sfm-12x9-outside.pdf +0 -0
  53. data/spec/samples/sfm-6x18-inside.pdf +0 -0
  54. data/spec/samples/sfm-6x18-outside.pdf +0 -0
  55. data/spec/spec_helper.rb +7 -5
  56. metadata +73 -39
  57. data/.travis.yml +0 -19
  58. data/lib/lob/resources/route.rb +0 -33
  59. data/spec/lob/resources/area_spec.rb +0 -59
  60. data/spec/lob/resources/route_spec.rb +0 -39
data/lib/lob/client.rb CHANGED
@@ -1,12 +1,17 @@
1
1
  require "lob/resources/address"
2
- require "lob/resources/area"
3
2
  require "lob/resources/bank_account"
3
+ require "lob/resources/bulk_intl_verifications"
4
+ require "lob/resources/bulk_us_verifications"
5
+ require "lob/resources/card"
4
6
  require "lob/resources/check"
7
+ require "lob/resources/group"
8
+ require "lob/resources/groups_member"
5
9
  require "lob/resources/intl_verifications"
6
10
  require "lob/resources/letter"
7
11
  require "lob/resources/postcard"
8
- require "lob/resources/route"
12
+ require "lob/resources/self_mailer"
9
13
  require "lob/resources/us_autocompletions"
14
+ require "lob/resources/us_reverse_geocode_lookups"
10
15
  require "lob/resources/us_verifications"
11
16
  require "lob/resources/us_zip_lookups"
12
17
 
@@ -23,10 +28,6 @@ module Lob
23
28
  @config = config
24
29
  end
25
30
 
26
- def areas
27
- Lob::Resources::Area.new(config)
28
- end
29
-
30
31
  def addresses
31
32
  Lob::Resources::Address.new(config)
32
33
  end
@@ -35,9 +36,29 @@ module Lob
35
36
  Lob::Resources::BankAccount.new(config)
36
37
  end
37
38
 
39
+ def bulk_intl_verifications
40
+ Lob::Resources::BulkIntlVerifications.new(config)
41
+ end
42
+
43
+ def bulk_us_verifications
44
+ Lob::Resources::BulkUSVerifications.new(config)
45
+ end
46
+
47
+ def cards
48
+ Lob::Resources::Card.new(config)
49
+ end
50
+
38
51
  def checks
39
52
  Lob::Resources::Check.new(config)
40
53
  end
54
+
55
+ def groups
56
+ Lob::Resources::Group.new(config)
57
+ end
58
+
59
+ def groups_members
60
+ Lob::Resources::GroupsMember.new(config)
61
+ end
41
62
 
42
63
  def intl_verifications
43
64
  Lob::Resources::IntlVerifications.new(config)
@@ -51,14 +72,18 @@ module Lob
51
72
  Lob::Resources::Postcard.new(config)
52
73
  end
53
74
 
54
- def routes
55
- Lob::Resources::Route.new(config)
75
+ def self_mailers
76
+ Lob::Resources::SelfMailer.new(config)
56
77
  end
57
78
 
58
79
  def us_autocompletions
59
80
  Lob::Resources::USAutocompletions.new(config)
60
81
  end
61
82
 
83
+ def us_reverse_geocode_lookups
84
+ Lob::Resources::USReverseGeocodeLookups.new(config)
85
+ end
86
+
62
87
  def us_verifications
63
88
  Lob::Resources::USVerifications.new(config)
64
89
  end
@@ -0,0 +1,27 @@
1
+ require "lob/resources/resource_base"
2
+
3
+ module Lob
4
+ module Resources
5
+ class BulkIntlVerifications < Lob::Resources::ResourceBase
6
+
7
+ undef_method :list, :find, :create, :destroy
8
+
9
+ def initialize(config)
10
+ super(config)
11
+ @endpoint = "bulk/intl_verifications"
12
+ end
13
+
14
+ def verify(body={})
15
+ body[:addresses] = body[:addresses].to_json
16
+ request = {
17
+ method: :post,
18
+ url: endpoint_url,
19
+ body: body
20
+ }
21
+
22
+ submit request
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,28 @@
1
+ require "lob/resources/resource_base"
2
+
3
+ module Lob
4
+ module Resources
5
+ class BulkUSVerifications < Lob::Resources::ResourceBase
6
+
7
+ undef_method :list, :find, :create, :destroy
8
+
9
+ def initialize(config)
10
+ super(config)
11
+ @endpoint = "bulk/us_verifications"
12
+ end
13
+
14
+ def verify(body={}, query={})
15
+ body[:addresses] = body[:addresses].to_json
16
+ request = {
17
+ method: :post,
18
+ url: endpoint_url,
19
+ body: body,
20
+ query: query
21
+ }
22
+
23
+ submit request
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,46 @@
1
+ require "lob/resources/resource_base"
2
+
3
+ module Lob
4
+ module Resources
5
+ class Card < Lob::Resources::ResourceBase
6
+
7
+ def initialize(config)
8
+ super(config)
9
+ @endpoint = "cards"
10
+ end
11
+
12
+ def update(resource_id, body={}, headers={})
13
+ request = {
14
+ method: :post,
15
+ url: resource_url(resource_id),
16
+ body: body,
17
+ headers: headers
18
+ }
19
+
20
+ submit(request)
21
+ end
22
+
23
+ def create_order(resource_id, body={}, headers={})
24
+ request = {
25
+ method: :post,
26
+ url: "#{resource_url(resource_id)}/orders",
27
+ body: body,
28
+ headers: headers
29
+ }
30
+
31
+ submit(request)
32
+ end
33
+
34
+ def list_orders(resource_id, query={})
35
+ request = {
36
+ method: :get,
37
+ url: "#{resource_url(resource_id)}/orders",
38
+ query: query
39
+ }
40
+
41
+ submit(request)
42
+ end
43
+
44
+ end
45
+ end
46
+ end
@@ -2,13 +2,11 @@ require "lob/resources/resource_base"
2
2
 
3
3
  module Lob
4
4
  module Resources
5
- class Area < Lob::Resources::ResourceBase
6
-
7
- undef_method :destroy
5
+ class Group < Lob::Resources::ResourceBase
8
6
 
9
7
  def initialize(config)
10
8
  super(config)
11
- @endpoint = "areas"
9
+ @endpoint = "groups"
12
10
  end
13
11
 
14
12
  end
@@ -0,0 +1,66 @@
1
+ require "rest-client"
2
+ require "json"
3
+ require "uri"
4
+
5
+ module Lob
6
+ module Resources
7
+ class GroupsMember < Lob::Resources::ResourceBase
8
+
9
+ attr_reader :config, :endpoint
10
+
11
+ def initialize(config)
12
+ super(config)
13
+ @endpoint = "members"
14
+ end
15
+
16
+ def list(group_id, query={})
17
+ request = {
18
+ method: :get,
19
+ url: endpoint_url(group_id),
20
+ query: query
21
+ }
22
+
23
+ submit request
24
+ end
25
+
26
+ def find(group_id, resource_id)
27
+ request = {
28
+ method: :get,
29
+ url: resource_url(group_id, resource_id)
30
+ }
31
+
32
+ submit request
33
+ end
34
+
35
+ def create(group_id, body={}, headers={}, query={})
36
+ request = {
37
+ method: :post,
38
+ url: endpoint_url(group_id),
39
+ body: body,
40
+ headers: headers,
41
+ query: query
42
+ }
43
+
44
+ submit request
45
+ end
46
+
47
+ def destroy(group_id, resource_id)
48
+ request = {
49
+ method: :delete,
50
+ url: resource_url(group_id, resource_id)
51
+ }
52
+
53
+ submit request
54
+ end
55
+
56
+ def endpoint_url(group_id)
57
+ "#{base_url}/groups/#{group_id}/#{endpoint}"
58
+ end
59
+
60
+ def resource_url(group_id, resource_id)
61
+ "#{endpoint_url(group_id)}/#{resource_id}"
62
+ end
63
+
64
+ end
65
+ end
66
+ end
@@ -19,7 +19,7 @@ module Lob
19
19
  query: query
20
20
  }
21
21
 
22
- submit request
22
+ submit(request)
23
23
  end
24
24
 
25
25
  def find(resource_id)
@@ -28,7 +28,7 @@ module Lob
28
28
  url: resource_url(resource_id)
29
29
  }
30
30
 
31
- submit request
31
+ submit(request)
32
32
  end
33
33
 
34
34
  def create(body={}, headers={}, query={})
@@ -40,7 +40,7 @@ module Lob
40
40
  query: query
41
41
  }
42
42
 
43
- submit request
43
+ submit(request)
44
44
  end
45
45
 
46
46
  def destroy(resource_id)
@@ -49,7 +49,7 @@ module Lob
49
49
  url: resource_url(resource_id)
50
50
  }
51
51
 
52
- submit request
52
+ submit(request)
53
53
  end
54
54
 
55
55
  private
@@ -72,13 +72,24 @@ module Lob
72
72
  url = "#{url}?#{build_nested_query(query)}"
73
73
  end
74
74
 
75
- begin
76
- if method == :get || method == :delete
77
- response = RestClient.send(method, url, headers)
78
- else
79
- response = RestClient.send(method, url, body, headers)
75
+ client_params = {
76
+ headers: headers,
77
+ method: method,
78
+ url: url,
79
+ }
80
+
81
+ client_params[:proxy] = config[:proxy] if config.key?(:proxy)
82
+
83
+ unless method == :delete || method == :get
84
+ if body and body[:merge_variables] and body[:merge_variables].class == Hash
85
+ body[:merge_variables] = body[:merge_variables].to_json
80
86
  end
81
87
 
88
+ client_params[:payload] = body
89
+ end
90
+ begin
91
+ response = RestClient::Request.execute(client_params)
92
+
82
93
  body = JSON.parse(response)
83
94
 
84
95
  body.define_singleton_method(:_response) do
@@ -0,0 +1,14 @@
1
+ require "lob/resources/resource_base"
2
+
3
+ module Lob
4
+ module Resources
5
+ class SelfMailer < Lob::Resources::ResourceBase
6
+
7
+ def initialize(config)
8
+ super(config)
9
+ @endpoint = "self_mailers"
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,26 @@
1
+ require "lob/resources/resource_base"
2
+
3
+ module Lob
4
+ module Resources
5
+ class USReverseGeocodeLookups < Lob::Resources::ResourceBase
6
+
7
+ undef_method :list, :find, :create, :destroy
8
+
9
+ def initialize(config)
10
+ super(config)
11
+ @endpoint = "us_reverse_geocode_lookups"
12
+ end
13
+
14
+ def lookup(body={})
15
+ request = {
16
+ method: :post,
17
+ url: endpoint_url,
18
+ body: body
19
+ }
20
+
21
+ submit request
22
+ end
23
+
24
+ end
25
+ end
26
+ end
data/lib/lob/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Lob
2
- VERSION = "4.3.0"
2
+ VERSION = "5.4.6"
3
3
  end
data/lob.gemspec CHANGED
@@ -18,14 +18,14 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency "rest-client", ">= 1.8", "< 3.0"
21
+ spec.add_dependency "rest-client", ">= 2.0.1", "< 3.0"
22
22
 
23
- spec.add_development_dependency "bundler", "~> 1.3"
24
- spec.add_development_dependency "rake", "~> 10.4.2"
23
+ spec.add_development_dependency "rake", "~> 12.3.3"
25
24
  spec.add_development_dependency "minitest", "~> 5.6.1"
26
25
  spec.add_development_dependency "webmock", "~> 1.2"
27
- spec.add_development_dependency "travis-lint", "~> 2.0.0"
28
- spec.add_development_dependency "coveralls", "~> 0.8.1"
29
- spec.add_development_dependency "simplecov", "~> 0.10.0"
30
- spec.add_development_dependency "pry", "~> 0.10.0"
26
+ spec.add_development_dependency "simplecov-lcov"
27
+ spec.add_development_dependency "coveralls_reborn", "~> 0.23.1"
28
+ spec.add_development_dependency "simplecov", "~> 0.21.0"
29
+ spec.add_development_dependency "json", "~> 2.3.1"
30
+ spec.add_development_dependency "uri", "~> 0.10.1"
31
31
  end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe Lob::Resources::BulkIntlVerifications do
4
+
5
+ before :each do
6
+ @sample_params = {
7
+ addresses: [
8
+ {
9
+ primary_line: "123 Test St",
10
+ city: "HEARST",
11
+ state: "ONTARIO",
12
+ postal_code: "P0L1N0",
13
+ country: "CA"
14
+ },
15
+ {
16
+ primary_line: "123 Test St",
17
+ city: "HEARST",
18
+ state: "ONTARIO",
19
+ postal_code: "P0L1N0",
20
+ country: "CA"
21
+ }
22
+ ]
23
+ }
24
+ end
25
+
26
+ subject { Lob::Client.new(api_key: API_KEY) }
27
+
28
+ describe "verify" do
29
+ it "should verify an international address" do
30
+ result = subject.bulk_intl_verifications.verify @sample_params
31
+ addresses = result["addresses"]
32
+ address = addresses.first
33
+ address["recipient"].must_equal("TEST KEYS DO NOT VERIFY ADDRESSES")
34
+ address = addresses[1]
35
+ address["recipient"].must_equal("TEST KEYS DO NOT VERIFY ADDRESSES")
36
+ end
37
+ end
38
+
39
+ end
@@ -0,0 +1,51 @@
1
+ require "spec_helper"
2
+
3
+ describe Lob::Resources::BulkUSVerifications do
4
+
5
+ before :each do
6
+ @sample_params = {
7
+ addresses: [
8
+ {
9
+ recipient: "LOB.COM",
10
+ primary_line: "185 BERRY ST STE 6600",
11
+ city: "SAN FRANCISCO",
12
+ state: "CA",
13
+ zip_code: "94107"
14
+ },
15
+ {
16
+ recipient: "Harry Zhou",
17
+ primary_line: "325 BERRY ST",
18
+ city: "SAN FRANCISCO",
19
+ state: "CA",
20
+ zip_code: "94107"
21
+ }
22
+ ]
23
+ }
24
+ end
25
+
26
+ subject { Lob::Client.new(api_key: API_KEY) }
27
+
28
+ describe "verify" do
29
+ it "should verify a US address" do
30
+ result = subject.bulk_us_verifications.verify @sample_params
31
+ addresses = result["addresses"]
32
+ address = addresses.first
33
+ address["recipient"].must_equal("TEST KEYS DO NOT VERIFY ADDRESSES")
34
+ address = addresses[1]
35
+ address["recipient"].must_equal("TEST KEYS DO NOT VERIFY ADDRESSES")
36
+
37
+
38
+ end
39
+
40
+ it "should allow 'case' in query params" do
41
+ result = subject.bulk_us_verifications.verify @sample_params, {case: "proper"}
42
+ addresses = result["addresses"]
43
+ address = addresses.first
44
+ address["recipient"].must_equal("Test Keys Do Not Verify Addresses")
45
+ address = addresses[1]
46
+ address["recipient"].must_equal("Test Keys Do Not Verify Addresses")
47
+
48
+ end
49
+ end
50
+
51
+ end
@@ -0,0 +1,145 @@
1
+ require "spec_helper"
2
+
3
+ describe Lob::Resources::Card do
4
+
5
+ before :each do
6
+ @horizontal_card_url = "https://s3-us-west-2.amazonaws.com/public.lob.com/assets/card_horizontal.pdf"
7
+ @horizontal_card_front = File.new(File.expand_path("../../../samples/card.pdf", __FILE__))
8
+ @horizontal_card_back = File.new(File.expand_path("../../../samples/card.pdf", __FILE__))
9
+
10
+ @sample_card_params = {
11
+ description: "Test Card",
12
+ front: @horizontal_card_url
13
+ }
14
+ end
15
+
16
+ subject { Lob::Client.new(api_key: API_KEY) }
17
+
18
+ describe "list" do
19
+ it "should list cards" do
20
+ assert subject.cards.list({ include: ['total_count'] })["object"] == "list"
21
+ end
22
+ end
23
+
24
+ describe "create" do
25
+ it "should create a card with a front url" do
26
+ result = subject.cards.create(@sample_card_params)
27
+
28
+ result["description"].must_equal(@sample_card_params[:description])
29
+ end
30
+
31
+ it "should create a card with front and back as urls" do
32
+ result = subject.cards.create(
33
+ @sample_card_params.merge(back: @horizontal_card_url)
34
+ )
35
+
36
+ result["description"].must_equal(@sample_card_params[:description])
37
+ end
38
+
39
+ it "should create a card with a front PDF" do
40
+ result = subject.cards.create(
41
+ @sample_card_params.merge(front: @horizontal_card_front)
42
+ )
43
+
44
+ result["description"].must_equal(@sample_card_params[:description])
45
+ end
46
+
47
+ it "should create a card with front and back as PDFs" do
48
+ result = subject.cards.create(
49
+ @sample_card_params.merge({
50
+ front: @horizontal_card_front,
51
+ back: @horizontal_card_back
52
+ })
53
+ )
54
+
55
+ result["description"].must_equal(@sample_card_params[:description])
56
+ end
57
+
58
+ it "should return an error without a front" do
59
+ assert_raises Lob::InvalidRequestError do
60
+ subject.cards.create(
61
+ @sample_card_params.merge({ front: nil })
62
+ )
63
+ end
64
+ end
65
+ end
66
+
67
+
68
+ describe "find" do
69
+ it "should find a card" do
70
+ new_card = subject.cards.create(
71
+ @sample_card_params.merge(front: @horizontal_card_front)
72
+ )
73
+
74
+ result = subject.cards.find(new_card["id"])
75
+ result["description"].must_equal(@sample_card_params[:description])
76
+ end
77
+ end
78
+
79
+
80
+ describe "update" do
81
+ it "should update a card" do
82
+ new_card = subject.cards.create(
83
+ @sample_card_params.merge(front: @horizontal_card_front)
84
+ )
85
+
86
+ result = subject.cards.update(
87
+ new_card["id"],
88
+ { description: "Updated card description" }
89
+ )
90
+ result["description"].must_equal("Updated card description")
91
+ end
92
+ end
93
+
94
+
95
+ describe "destroy" do
96
+ it "should destroy a card" do
97
+ new_card = subject.cards.create(
98
+ @sample_card_params.merge(front: @horizontal_card_front)
99
+ )
100
+
101
+ result = subject.cards.destroy(new_card["id"])
102
+ result["id"].must_equal(new_card["id"])
103
+ result["deleted"].must_equal(true)
104
+ end
105
+ end
106
+
107
+
108
+ describe "create_order" do
109
+ it "should create an order for a card" do
110
+ new_card = subject.cards.create(
111
+ @sample_card_params.merge(front: @horizontal_card_front)
112
+ )
113
+
114
+ card_order_params = {
115
+ quantity: 10001
116
+ }
117
+
118
+ result = subject.cards.create_order(new_card["id"], card_order_params)
119
+ result["card_id"].must_equal(new_card["id"])
120
+ result["quantity_ordered"].must_equal(card_order_params[:quantity])
121
+ result["object"].must_equal("card_order")
122
+ end
123
+ end
124
+
125
+
126
+ describe "list_orders" do
127
+ it "should list all orders for a card" do
128
+ new_card = subject.cards.create(
129
+ @sample_card_params.merge(front: @horizontal_card_front)
130
+ )
131
+ card_order_params = {
132
+ quantity: 10001
133
+ }
134
+ new_card_order = subject.cards.create_order(
135
+ new_card["id"],
136
+ card_order_params
137
+ )
138
+
139
+ result = subject.cards.list_orders(new_card["id"])
140
+ result["object"].must_equal("list")
141
+ result["count"].must_equal(1)
142
+ end
143
+ end
144
+
145
+ end
@@ -50,6 +50,27 @@ describe Lob::Resources::Check do
50
50
 
51
51
  result["amount"].to_s.must_equal("2000.12")
52
52
  end
53
+
54
+ it "should create a check with a merge variable conditional" do
55
+ new_address = subject.addresses.create @sample_address_params
56
+
57
+ new_bank_account = subject.bank_accounts.create(@sample_bank_account_params)
58
+
59
+ subject.bank_accounts.verify(new_bank_account["id"], amounts: [1, 2])
60
+
61
+ result = subject.checks.create(
62
+ bank_account: new_bank_account["id"],
63
+ to: new_address["id"],
64
+ from: new_address["id"],
65
+ amount: "2000.12",
66
+ attachment: "<html>{{#is_awesome}}You are awesome!{{/is_awesome}}</html>",
67
+ merge_variables: {
68
+ is_awesome: false
69
+ }
70
+ )
71
+
72
+ result["merge_variables"]["is_awesome"].must_equal(false)
73
+ end
53
74
  end
54
75
 
55
76