invoiced 0.12.0 → 0.13.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5997cf1ddd23e0cece25a26780c348354a672b9c
4
- data.tar.gz: 7f0a09349c1b87b9cfb11c8afbdf6533a566cdd2
3
+ metadata.gz: af3c9c33d3ab2a41846eec239e659b6a83567f1e
4
+ data.tar.gz: c27763abfd2ac362595eb44c9ff4afd067485346
5
5
  SHA512:
6
- metadata.gz: cf0aa2c91593969dfe034a8f6f5db01fe6e7ee7164c0327ddd67de29c968b2378311af6ccbae253d90f75be240491cda23fa8bb3d3b09bc351ef9ce2a27cabdf
7
- data.tar.gz: 9c936769e5d820574fdfef68e508454c1aa0fba468a602bfc4bc1e49edba3dcad2a2d4f8ca27fe92d2f2a546d6a55a45ecf58783b1bcfcb8541cbb43cf95dca4
6
+ metadata.gz: df10f784d4468a435fab99638180f213c30325cc0f40a695809b306bf3ebad5846804eb5a47d1f9a865ddc77ececf0694f634c28ff6fea45b1d102425a8aed7e
7
+ data.tar.gz: 5a0e7161ac5632520f9cf7c39e4f91ab2a2d39f47a4e240c8144e314fc22dc8a81839864da14a2bcc8e3b8f28d1b48101fe3e959de35eeec79673d0e19c95267
data/.travis.yml CHANGED
@@ -4,6 +4,8 @@ rvm:
4
4
  - 2.0
5
5
  - 2.1
6
6
  - 2.2
7
+ - 2.3
8
+ - 2.4
7
9
 
8
10
  sudo: false
9
11
 
data/Gemfile CHANGED
@@ -1,9 +1,14 @@
1
1
  source "https://rubygems.org"
2
2
  gemspec
3
3
 
4
- gem 'json', '~> 1.8.3'
5
4
  gem 'rest-client', '~> 2.0.0'
6
- gem 'activesupport', '~> 4.2.3'
5
+ gem 'jwt', '~> 2.0.0'
6
+
7
+ gem 'mocha', '~> 0.13.2', :require => false, :group => :test
8
+ gem 'shoulda', '~> 3.4.0', :require => false, :group => :test
9
+ gem 'test-unit', :require => false, :group => :test
10
+ gem 'rake', :require => false, :group => :test
11
+ gem 'activesupport', '~> 4.2.9', :require => false, :group => :test
7
12
  gem 'coveralls', :require => false, :group => :test
8
13
  gem 'simplecov', '~> 0.10.0', :require => false, :group => :test
9
14
  gem 'simplecov-console', '~> 0.3.1', :require => false, :group => :test
data/README.md CHANGED
@@ -25,7 +25,7 @@ gem 'invoiced'
25
25
  ## Requirements
26
26
 
27
27
  - Ruby 2.0+
28
- - rest_client, json, and active_support gems
28
+ - rest_client gem
29
29
 
30
30
  ## Usage
31
31
 
data/invoiced.gemspec CHANGED
@@ -15,13 +15,7 @@ Gem::Specification.new do |s|
15
15
  s.required_ruby_version = '>= 2.0.0'
16
16
 
17
17
  s.add_dependency('rest-client', '~> 2.0.0')
18
- s.add_dependency('json', '~> 1.8.3')
19
- s.add_dependency('activesupport', '~> 4.2.3')
20
-
21
- s.add_development_dependency('mocha', '~> 0.13.2')
22
- s.add_development_dependency('shoulda', '~> 3.4.0')
23
- s.add_development_dependency('test-unit')
24
- s.add_development_dependency('rake')
18
+ s.add_dependency('jwt', '~> 2.0.0')
25
19
 
26
20
  s.files = `git ls-files`.split("\n")
27
21
  s.test_files = `git ls-files -- test/*`.split("\n")
@@ -1,4 +1,5 @@
1
1
  module Invoiced
2
2
  class Attachment < Object
3
+ OBJECT_NAME = 'attachment'
3
4
  end
4
5
  end
@@ -4,5 +4,7 @@ module Invoiced
4
4
  include Invoiced::Operations::Create
5
5
  include Invoiced::Operations::Update
6
6
  include Invoiced::Operations::Delete
7
+
8
+ OBJECT_NAME = 'catalog_item'
7
9
  end
8
10
  end
@@ -4,5 +4,7 @@ module Invoiced
4
4
  include Invoiced::Operations::Create
5
5
  include Invoiced::Operations::Update
6
6
  include Invoiced::Operations::Delete
7
+
8
+ OBJECT_NAME = 'contact'
7
9
  end
8
10
  end
@@ -5,6 +5,8 @@ module Invoiced
5
5
  include Invoiced::Operations::Update
6
6
  include Invoiced::Operations::Delete
7
7
 
8
+ OBJECT_NAME = 'credit_note'
9
+
8
10
  def send(params={}, opts={})
9
11
  response = @client.request(:post, "#{self.endpoint()}/emails", params, opts)
10
12
 
@@ -5,6 +5,8 @@ module Invoiced
5
5
  include Invoiced::Operations::Update
6
6
  include Invoiced::Operations::Delete
7
7
 
8
+ OBJECT_NAME = 'customer'
9
+
8
10
  def send_statement(params={}, opts={})
9
11
  response = @client.request(:post, "#{self.endpoint()}/emails", params, opts)
10
12
 
@@ -1,4 +1,5 @@
1
1
  module Invoiced
2
2
  class Email < Object
3
+ OBJECT_NAME = 'email'
3
4
  end
4
5
  end
@@ -5,6 +5,8 @@ module Invoiced
5
5
  include Invoiced::Operations::Update
6
6
  include Invoiced::Operations::Delete
7
7
 
8
+ OBJECT_NAME = 'estimate'
9
+
8
10
  def send(params={}, opts={})
9
11
  response = @client.request(:post, "#{self.endpoint()}/emails", params, opts)
10
12
 
@@ -1,5 +1,7 @@
1
1
  module Invoiced
2
2
  class Event < Object
3
3
  include Invoiced::Operations::List
4
+
5
+ OBJECT_NAME = 'event'
4
6
  end
5
7
  end
data/lib/invoiced/file.rb CHANGED
@@ -2,5 +2,7 @@ module Invoiced
2
2
  class File < Object
3
3
  include Invoiced::Operations::Create
4
4
  include Invoiced::Operations::Delete
5
+
6
+ OBJECT_NAME = 'file'
5
7
  end
6
8
  end
@@ -5,6 +5,8 @@ module Invoiced
5
5
  include Invoiced::Operations::Update
6
6
  include Invoiced::Operations::Delete
7
7
 
8
+ OBJECT_NAME = 'invoice'
9
+
8
10
  def send(params={}, opts={})
9
11
  response = @client.request(:post, "#{self.endpoint()}/emails", params, opts)
10
12
 
@@ -4,5 +4,7 @@ module Invoiced
4
4
  include Invoiced::Operations::Create
5
5
  include Invoiced::Operations::Update
6
6
  include Invoiced::Operations::Delete
7
+
8
+ OBJECT_NAME = 'line_item'
7
9
  end
8
10
  end
@@ -8,10 +8,8 @@ module Invoiced
8
8
 
9
9
  def initialize(client, id=nil, values={})
10
10
  @client = client
11
- class_name = self.class.name.split('::').last
12
11
  @endpoint_base = ''
13
- @endpoint = '/' + class_name.underscore.pluralize.downcase
14
-
12
+ @endpoint = build_endpoint
15
13
  @id = id
16
14
  @values = {}
17
15
 
@@ -35,6 +33,14 @@ module Invoiced
35
33
  @endpoint_base + @endpoint
36
34
  end
37
35
 
36
+ def build_endpoint
37
+ if self.class.const_defined? "OBJECT_NAME"
38
+ '/' + self.class::OBJECT_NAME + 's'
39
+ else
40
+ '/objects'
41
+ end
42
+ end
43
+
38
44
  def retrieve(id, params={})
39
45
  if !id
40
46
  raise ArgumentError.new("Missing ID.")
@@ -2,6 +2,8 @@ module Invoiced
2
2
  class PaymentPlan < Object
3
3
  include Invoiced::Operations::Delete
4
4
 
5
+ OBJECT_NAME = 'payment_plan'
6
+
5
7
  def initialize(client, id=nil, values={})
6
8
  super
7
9
  @endpoint = '/payment_plan'
data/lib/invoiced/plan.rb CHANGED
@@ -4,5 +4,7 @@ module Invoiced
4
4
  include Invoiced::Operations::Create
5
5
  include Invoiced::Operations::Update
6
6
  include Invoiced::Operations::Delete
7
+
8
+ OBJECT_NAME = 'plan'
7
9
  end
8
10
  end
@@ -5,6 +5,8 @@ module Invoiced
5
5
  include Invoiced::Operations::Update
6
6
  include Invoiced::Operations::Delete
7
7
 
8
+ OBJECT_NAME = 'subscription'
9
+
8
10
  def cancel
9
11
  delete
10
12
  end
@@ -5,6 +5,8 @@ module Invoiced
5
5
  include Invoiced::Operations::Update
6
6
  include Invoiced::Operations::Delete
7
7
 
8
+ OBJECT_NAME = 'transaction'
9
+
8
10
  def send(params={}, opts={})
9
11
  response = @client.request(:post, "#{self.endpoint()}/emails", params, opts)
10
12
 
@@ -1,3 +1,3 @@
1
1
  module Invoiced
2
- VERSION = '0.12.0'
2
+ VERSION = '0.13.0'
3
3
  end
data/lib/invoiced.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require 'rest-client'
2
2
  require 'json'
3
3
  require 'base64'
4
- require 'active_support/inflector'
5
4
 
6
5
  require 'invoiced/version'
7
6
  require 'invoiced/util'
@@ -42,13 +41,14 @@ module Invoiced
42
41
  OpenTimeout = 30
43
42
  ReadTimeout = 80
44
43
 
45
- attr_reader :api_key, :api_url, :sandbox
44
+ attr_reader :api_key, :api_url, :sandbox, :sso_key
46
45
  attr_reader :CatalogItem, :CreditNote, :Customer, :Estimate, :Event, :File, :Invoice, :Plan, :Subscription, :Transaction
47
46
 
48
- def initialize(api_key, sandbox=false)
47
+ def initialize(api_key, sandbox=false, sso_key=false)
49
48
  @api_key = api_key
50
49
  @sandbox = sandbox
51
50
  @api_url = sandbox ? ApiBaseSandbox : ApiBase
51
+ @sso_key = sso_key
52
52
 
53
53
  # Object endpoints
54
54
  @CatalogItem = Invoiced::CatalogItem.new(self)
@@ -97,6 +97,23 @@ module Invoiced
97
97
  parse(response)
98
98
  end
99
99
 
100
+ def generate_sign_in_token(customerId, ttl)
101
+ if !@sso_key
102
+ raise "Please provide a single sign-on key! You can find this value in Settings > Developers > Single Sign-On of the Invoiced application."
103
+ end
104
+
105
+ expires = Time.now + ttl # TTL should be in seconds
106
+
107
+ payload = {
108
+ :sub => customerId,
109
+ :iss => "Invoiced Ruby/#{Invoiced::VERSION}",
110
+ :iat => Time.now.to_i,
111
+ :exp => expires.to_i
112
+ }
113
+
114
+ JWT.encode payload, @sso_key, 'HS256'
115
+ end
116
+
100
117
  private
101
118
 
102
119
  def buildHeaders(opts)
@@ -2,6 +2,7 @@ require 'invoiced'
2
2
  require 'test/unit'
3
3
  require 'mocha/setup'
4
4
  require 'shoulda'
5
+ require 'jwt'
5
6
 
6
7
  module Invoiced
7
8
  class InvoicedTest < Test::Unit::TestCase
@@ -261,5 +262,31 @@ module Invoiced
261
262
  client.request("POST", "/invoices")
262
263
  end
263
264
  end
265
+
266
+ should "generate a single sign-on token" do
267
+ ssoKey = '8baa4dbc338a54bbf7696eef3ee4aa2daadd61bba85fcfe8df96c7cfa227c43'
268
+ client = Invoiced::Client.new('API_KEY', false, ssoKey)
269
+ t = Time.now
270
+
271
+ token = client.generate_sign_in_token(1234, 3600)
272
+
273
+ decrypted = JWT.decode token, ssoKey, true, { :algorithm => 'HS256' }
274
+ assert_operator decrypted[0]['exp'] - t.to_i - 3600, :<, 3 # this accounts for slow running tests
275
+ decrypted[0].delete('exp')
276
+
277
+ expected = {
278
+ 'iat' => t.to_i,
279
+ 'sub' => 1234,
280
+ 'iss' => 'Invoiced Ruby/'+Invoiced::VERSION
281
+ }
282
+ assert_equal(expected, decrypted[0])
283
+ end
284
+
285
+ should "raise an error when generating a single sign-on token with no key" do
286
+ client = Invoiced::Client.new('test')
287
+ assert_raise do
288
+ client.generate_sign_in_token(1234, 3600)
289
+ end
290
+ end
264
291
  end
265
292
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: invoiced
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 0.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jared King
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-27 00:00:00.000000000 Z
11
+ date: 2017-12-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -25,89 +25,19 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 2.0.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: json
28
+ name: jwt
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.8.3
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: 1.8.3
41
- - !ruby/object:Gem::Dependency
42
- name: activesupport
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: 4.2.3
33
+ version: 2.0.0
48
34
  type: :runtime
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
38
  - - "~>"
53
39
  - !ruby/object:Gem::Version
54
- version: 4.2.3
55
- - !ruby/object:Gem::Dependency
56
- name: mocha
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: 0.13.2
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: 0.13.2
69
- - !ruby/object:Gem::Dependency
70
- name: shoulda
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: 3.4.0
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: 3.4.0
83
- - !ruby/object:Gem::Dependency
84
- name: test-unit
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: rake
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
40
+ version: 2.0.0
111
41
  description: Invoiced makes invoicing and recurring billing dead simple
112
42
  email: support@invoiced.com
113
43
  executables: []