licencetobill 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a6837ba8d900d617642764c5cee1bd3d61df1500
4
+ data.tar.gz: b14f89bfbdda1fe429d0a4db97159bf06b51c332
5
+ SHA512:
6
+ metadata.gz: 2d819bf718982a5efc27b32b5963c4920e3dc936c26f9c0e0a7a9de9160da8bd0114d6d8bd2ae48ed67b362aa0590dfa42271e5f5cb270ed73b95208522ae5c0
7
+ data.tar.gz: a649be735af8c2bb3575a763b1c9cbbf07384aa35aa76fa8e74e22ad9192d6b329992bd967d78d6b89492dfdfdff3c9b88aa5ba724eb20aa2aa2106a72c7ff76
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "https://rubygems.org"
2
+ gemspec
data/README.md ADDED
@@ -0,0 +1,151 @@
1
+ # LicenceToBill
2
+
3
+ A simple Ruby wrapper to easily interact with the [LicenceToBill API](https://api.licencetobill.com/?lcid=12).
4
+
5
+ ## Installation
6
+
7
+ ```ruby
8
+ gem 'licencetobill'
9
+ ```
10
+ or
11
+
12
+ ```ruby
13
+ gem install licencetobill
14
+ ```
15
+
16
+ To install the latest dev version
17
+
18
+ ```ruby
19
+ gem 'licencetobill', git: "git://github.com/gtroppee/licencetobill.git"
20
+ ```
21
+
22
+ ## Setup
23
+ The only thing you need to provide is you LicenceToBill credentials. In the context of a Rails app, the best way to do so is to simply create a initializer for it:
24
+
25
+ ```ruby
26
+ # config/initializers/licencetobill.rb
27
+ LicenceToBill.configure do |config|
28
+ config.business_key = 'your_business_key'
29
+ config.agent_key = 'your_agent_key'
30
+ end
31
+ ```
32
+
33
+ ## Use cases
34
+ To start using the gem, just proceed like so:
35
+
36
+ * Provided your credentials are loaded
37
+ ```ruby
38
+ @api = LicenceToBill::API.new
39
+ ```
40
+
41
+ * Or if you want to load your credentials upon instantiation
42
+ ```ruby
43
+ # config/initializers/licencetobill.rb
44
+ @api = LicenceToBill::API.new('your_business_key', 'your_agent_key')
45
+ ```
46
+
47
+ Then, simply use the object to interact with the platform:
48
+ ```ruby
49
+ @offers = @api.get_offers
50
+ ```
51
+
52
+ Here is a quick inventory of the methods at your disposal (per resource):
53
+
54
+ #### USERS
55
+
56
+ ```ruby
57
+ get_users
58
+ #=> Get all the registered users
59
+
60
+ get_user(key_user)
61
+ #=> Get a single registered user
62
+
63
+ get_users_for(key_feature)
64
+ #=> Get the registered user that have access to a specific feature
65
+
66
+ get_billing_address_for(key_user)
67
+ #=> Get the registered address for a specific user
68
+
69
+ register_user(key_user, name_user)
70
+ #=> Register the user to LicenceToBill.
71
+ # Note: . LicenceToBill gives you the liberty to give any key you want when you register the user. Just make sure this is and will remain unique for each user.
72
+ ```
73
+
74
+ #### OFFERS
75
+
76
+ ```ruby
77
+ get_offers(lcid = nil)
78
+ #=> Get all the offers (language optional)
79
+
80
+ get_offers_for(key_user)
81
+ #=> Get all the offers for a specific user (with a redirection url if you choose to host the offers page directly in your app)
82
+
83
+ get_stages
84
+ #=> Get all the stages for a specific offer (of course you'll need to send this message to an offer object = @offer.get_stages)
85
+ ```
86
+
87
+ #### FEATURES
88
+ ```ruby
89
+ get_features(lcid = nil)
90
+ #=> Get all the features
91
+
92
+ get_features_for(key_user)
93
+ #=> Get the features a specific user has access to
94
+
95
+ get_features_details_for(key_feature, key_user)
96
+ #=> Get details of a specific feature for a specific user
97
+ ```
98
+ #### DEALS
99
+ ```ruby
100
+ get_deals_for(key_user)
101
+ #=> Get the deals of a specific user
102
+
103
+ add_trial_for(key_user)
104
+ #=> Create a trial offer for a specific user
105
+ ```
106
+
107
+ #### STAGES
108
+ ```ruby
109
+ get_features
110
+ #=> Get the features of a specific stage (of course you'll need to send this message to a stage object = @stage.get_features)
111
+ ```
112
+ **Note that if there is not resource returned, the gem will return an empty array []**
113
+
114
+ Of course, you'll find all the information you need [here](https://api.licencetobill.com/?lcid=12).
115
+
116
+ ## Customisation
117
+ This gem is only aiming at making it easier to read and write data from and to LicenceToBill, but if you want more flexibility/logic to it, you can easily add extra behaviour, like so:
118
+
119
+ ```ruby
120
+ require 'licencetobill'
121
+
122
+ LicenceToBill::Deal.class_eval do
123
+
124
+ # Make the end date independent from the fact that the deal can be renewed or not
125
+ def end_date
126
+ if respond_to?(:date_renewal)
127
+ date_renewal
128
+ elsif respond_to?(:date_end)
129
+ date_end
130
+ end
131
+ end
132
+
133
+ def price
134
+ self.amount.to_i / 100
135
+ end
136
+
137
+ end
138
+ ```
139
+ All LicenceToBill resources have their own corresponding classes so you can basically add any behaviour you want for your app. Just FYI, the current resources are:
140
+
141
+ * Users
142
+ * Offers
143
+ * Features
144
+ * Stages
145
+ * Deals
146
+ * UserAddress (this one is not a resource per say, but being able to customise it as well might come in handy)
147
+
148
+
149
+ ## Contribution
150
+ Contribution are more than welcome, be sure to add relevant unit tests and pass them all before submitting any code.
151
+
@@ -0,0 +1,89 @@
1
+ module LicenceToBill
2
+ class << self
3
+ attr_accessor :configuration
4
+ end
5
+
6
+ class API
7
+ include LicenceToBill::Helpers
8
+ attr_accessor :token, :base_uri
9
+
10
+ def initialize(business_key = LicenceToBill.configuration.business_key, agent_key = LicenceToBill.configuration.agent_key)
11
+ @business_key = business_key
12
+ @agent_key = agent_key
13
+ @token = set_token
14
+
15
+ # DEFAULTS
16
+ @base_uri = 'https://api.licencetobill.com/v2'
17
+ end
18
+
19
+ # USERS
20
+ def get_users
21
+ get_collection(LicenceToBill::User, call_to("/users"))
22
+ end
23
+
24
+ def get_user(key_user)
25
+ get_collection(LicenceToBill::User, call_to("/users/#{key_user}"))
26
+ end
27
+
28
+ def get_users_for(key_feature)
29
+ get_collection(LicenceToBill::User, call_to("/users/features/#{key_feature}"))
30
+ end
31
+
32
+ def get_billing_address_for(key_user)
33
+ get_collection(LicenceToBill::UserAddress, call_to("/address/users/#{key_user}"))
34
+ end
35
+
36
+ def register_user(key_user, name_user)
37
+ call_to("/users/#{key_user}", :post, { key_user: "#{key_user}", name_user: "#{name_user}" })
38
+ end
39
+
40
+ # FEATURES
41
+ def get_features(lcid = nil)
42
+ get_collection(LicenceToBill::Feature, call_to("/features/#{lcid}"))
43
+ end
44
+
45
+ def get_features_for(key_user)
46
+ get_collection(LicenceToBill::Feature, call_to("/features/users/#{key_user}"))
47
+ end
48
+
49
+ def get_features_details_for(key_feature, key_user)
50
+ get_collection(LicenceToBill::Feature, call_to("/features/#{key_feature}/users/#{key_user}"))
51
+ end
52
+
53
+ # OFFERS
54
+ def get_offers(lcid = nil)
55
+ get_collection(LicenceToBill::Offer, call_to("/offers/#{lcid}"))
56
+ end
57
+
58
+ def get_offers_for(key_user)
59
+ get_collection(LicenceToBill::Offer, call_to("/offers/users/#{key_user}"))
60
+ end
61
+
62
+ # DEALS
63
+ def get_deals_for(key_user)
64
+ get_collection(LicenceToBill::Deal, call_to("/deals/users/#{key_user}"))
65
+ end
66
+
67
+ def add_trial_for(key_user)
68
+ call_to("/trial/#{key_user}", :post)
69
+ end
70
+
71
+ protected
72
+ def set_token
73
+ token = Base64.encode64("#{@business_key}:#{@agent_key}").delete!("\n")
74
+ "Basic #{token}"
75
+ end
76
+
77
+ def call_to(endpoint, method = :get, params = {})
78
+ HTTParty.send(method,
79
+ "#{@base_uri}#{endpoint}",
80
+ headers: { "Authorization" => @token, 'Content-Type' => "application/json" },
81
+ body: params.to_json)
82
+ end
83
+ end
84
+
85
+ def self.configure
86
+ self.configuration ||= Configuration.new
87
+ yield(configuration)
88
+ end
89
+ end
@@ -0,0 +1,19 @@
1
+ module LicenceToBill
2
+ module Concerns
3
+
4
+ include LicenceToBill::Helpers
5
+
6
+ def initialize(data_source)
7
+ @data_source = data_source
8
+ end
9
+
10
+ def method_missing(method_name)
11
+ super unless @data_source.has_key?("#{method_name}")
12
+ @data_source["#{method_name}"]
13
+ end
14
+
15
+ def respond_to_missing?(method_name, include_private = false)
16
+ @data_source.has_key?("#{method_name}") || super
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,8 @@
1
+ class Configuration
2
+ attr_accessor :business_key, :agent_key
3
+
4
+ def initialize
5
+ @business_key = 'your_business_key'
6
+ @agent_key = 'your_agent_key'
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ module LicenceToBill
2
+ class Deal
3
+ include LicenceToBill::Concerns
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module LicenceToBill
2
+ class Feature
3
+ include LicenceToBill::Concerns
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module LicenceToBill::Helpers
2
+ def get_collection(klass, api_call)
3
+ LicenceToBill::Manager.return_collection(klass, api_call)
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ module LicenceToBill
2
+ class Manager
3
+ def self.return_collection(klass, params)
4
+ if params.kind_of?(Array)
5
+ params.map { |hash| klass.new(hash) }
6
+ else
7
+ return [] if params.parsed_response['Status'] === 404
8
+ params = JSON.parse(params.body)
9
+ [klass.new(params)]
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ module LicenceToBill
2
+ class Offer
3
+ include LicenceToBill::Concerns
4
+
5
+ def get_stages
6
+ get_collection(LicenceToBill::Stage, self.stages)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module LicenceToBill
2
+ class Stage
3
+ include LicenceToBill::Concerns
4
+
5
+ def get_features
6
+ get_collection(LicenceToBill::Feature, self.features)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ module LicenceToBill
2
+ class User
3
+ include LicenceToBill::Concerns
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module LicenceToBill
2
+ class UserAddress
3
+ include LicenceToBill::Concerns
4
+ end
5
+ end
@@ -0,0 +1,21 @@
1
+ module LicenceToBill
2
+ def self.root
3
+ File.dirname __dir__
4
+ end
5
+ end
6
+
7
+ require 'json'
8
+ require 'httparty'
9
+ require 'vcr'
10
+
11
+ require_relative 'licencetobill/configuration'
12
+ require_relative 'licencetobill/helpers'
13
+ require_relative 'licencetobill/api'
14
+ require_relative 'licencetobill/concerns'
15
+ require_relative 'licencetobill/deal'
16
+ require_relative 'licencetobill/feature'
17
+ require_relative 'licencetobill/manager'
18
+ require_relative 'licencetobill/offer'
19
+ require_relative 'licencetobill/stage'
20
+ require_relative 'licencetobill/user'
21
+ require_relative 'licencetobill/user_address'
data/spec/api_spec.rb ADDED
@@ -0,0 +1,87 @@
1
+ require 'spec_helper'
2
+
3
+ describe LicenceToBill::API do
4
+
5
+ before { @api = LicenceToBill::API.new }
6
+
7
+ describe 'Users' do
8
+ it '#get_users', :vcr do
9
+ users = @api.get_users
10
+ user = users.first
11
+ expect(users).to be_a(Array)
12
+ expect(user).to be_a(LicenceToBill::User) if user
13
+ end
14
+
15
+ it '#get_user', :vcr do
16
+ user = @api.get_user(1)
17
+ expect(user).to be_a(LicenceToBill::User) if user
18
+ end
19
+
20
+ it '#get_user_for', :vcr do
21
+ key_feature = @api.get_features.first.key_feature
22
+ users = @api.get_users_for(key_feature)
23
+ user = users.first
24
+ expect(users).to be_a(Array)
25
+ expect(user).to be_a(LicenceToBill::User) if user
26
+ end
27
+
28
+ it '#get_billing_address_for', :vcr do
29
+ user = @api.get_users.select{|u| u.key_user == '1'}.first
30
+ address = @api.get_billing_address_for(user.key_user)
31
+ expect(address).to be_a(LicenceToBill::UserAddress) if address
32
+ expect(user.name_user).to eq(address.fullname) if address
33
+ end
34
+ end
35
+
36
+ describe 'Features' do
37
+ it '#get_features', :vcr do
38
+ features = @api.get_features
39
+ feature = features.first
40
+ expect(features).to be_a(Array)
41
+ expect(feature).to be_a(LicenceToBill::Feature) if feature
42
+ end
43
+
44
+ it '#get_features_for', :vcr do
45
+ user = @api.get_user(1)
46
+ features = @api.get_features_for(user.key_user)
47
+ feature = features.first
48
+ expect(features).to be_a(Array)
49
+ expect(feature).to be_a(LicenceToBill::Feature) if feature
50
+ end
51
+
52
+ it '#get_features_details_for', :vcr do
53
+ user = @api.get_user(1)
54
+ features = @api.get_features
55
+ feature = features.first
56
+ restriction = @api.get_features_details_for(feature.key_feature, user.key_user)
57
+ expect(features).to be_a(Array)
58
+ expect(feature).to be_a(LicenceToBill::Feature) if feature
59
+ end
60
+ end
61
+
62
+ describe 'Offers' do
63
+ it '#get_offers', :vcr do
64
+ offers = @api.get_offers
65
+ offer = offers.first
66
+ expect(offers).to be_a(Array)
67
+ expect(offer).to be_a(LicenceToBill::Offer) if offer
68
+ end
69
+
70
+ it '#get_offers_for', :vcr do
71
+ user = @api.get_user(1)
72
+ offers = @api.get_offers_for(user.key_user)
73
+ offer = offers.first
74
+ expect(offers).to be_a(Array)
75
+ expect(offer).to be_a(LicenceToBill::Offer) if offer
76
+ end
77
+
78
+ it '#features', :vcr do
79
+ user = @api.get_user(1)
80
+ offers = @api.get_offers_for(user.key_user)
81
+ offer = offers[1]
82
+ expect(offer.features).to be_a(Array)
83
+ expect(offer.features.first).to be_a(LicenceToBill::Feature) if offer
84
+ end
85
+ end
86
+
87
+ end
@@ -0,0 +1,12 @@
1
+ require 'bundler/setup'
2
+ require 'utilities'
3
+ require 'webmock/rspec'
4
+ require 'licencetobill' # and any other gems you need
5
+ Bundler.setup
6
+
7
+ RSpec.configure do |config|
8
+ config.around(:each, :vcr) do |example|
9
+ name = example.metadata[:full_description].split(/\s+/)[-1]
10
+ VCR.use_cassette(name) { example.call }
11
+ end
12
+ end
data/spec/utilities.rb ADDED
@@ -0,0 +1,3 @@
1
+ def resources_path(file)
2
+ "#{LicenceToBill.root}/spec/resources/#{file}"
3
+ end
metadata ADDED
@@ -0,0 +1,131 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: licencetobill
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Guillaume Troppée
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: httparty
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: vcr
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: addressable
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description:
84
+ email: gtroppee@gmail.com
85
+ executables: []
86
+ extensions: []
87
+ extra_rdoc_files: []
88
+ files:
89
+ - README.md
90
+ - Gemfile
91
+ - spec/api_spec.rb
92
+ - spec/spec_helper.rb
93
+ - spec/utilities.rb
94
+ - lib/licencetobill/api.rb
95
+ - lib/licencetobill/concerns.rb
96
+ - lib/licencetobill/configuration.rb
97
+ - lib/licencetobill/deal.rb
98
+ - lib/licencetobill/feature.rb
99
+ - lib/licencetobill/helpers.rb
100
+ - lib/licencetobill/manager.rb
101
+ - lib/licencetobill/offer.rb
102
+ - lib/licencetobill/stage.rb
103
+ - lib/licencetobill/user.rb
104
+ - lib/licencetobill/user_address.rb
105
+ - lib/licencetobill.rb
106
+ homepage: http://rubygems.org/gems/licencetobill
107
+ licenses:
108
+ - MIT
109
+ metadata: {}
110
+ post_install_message:
111
+ rdoc_options: []
112
+ require_paths:
113
+ - lib
114
+ required_ruby_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - '>='
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ requirements: []
125
+ rubyforge_project:
126
+ rubygems_version: 2.1.11
127
+ signing_key:
128
+ specification_version: 4
129
+ summary: A simple ruby wrapper for the LicenceToBill API
130
+ test_files: []
131
+ has_rdoc: