invoiced 0.12.0 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
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: []