tito 0.1.11 → 0.2.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: e7cad48426a05253e1501bc15ad93af76cabc7e9
4
- data.tar.gz: eb967439c0addb93cd0679fb2edf94e3e9d35bc8
3
+ metadata.gz: 9de5568949fb5d26465e2eee09d1d3cd97bb7fea
4
+ data.tar.gz: 5bd9c944468cb8d59c92657c2150c520571234d2
5
5
  SHA512:
6
- metadata.gz: 3dba56a423db17ef65a9a314c7b7f112c7667fa7853f56202419afd9c61fb701d9535dca54d255f36501f7b354b13aa363310f8ebdd5c4e22e4db67dcebbedf4
7
- data.tar.gz: 0b5e022c16f229931c8d3f77036e459f71f2a5b0c80f72ba34b30acc7c008b889a1dd5e04d07738b500598d0f31f12c280ff9f6b210969edd1cb2a13849eac18
6
+ metadata.gz: 19e2e93e3ed7238d288c7a84800d2091d3134022177bb80418ce3d233f99482feaf761d493d97ebd994e34c8ffcf8e46f15016fc4b74bb6fbcdb028fc3d177e7
7
+ data.tar.gz: 1ad72e81a785d828c67594e1be8abd493c96412376e12e25d7a0dd121ac0bb343f51a2b17416343021143a3543d779297ec6e5365a63952eee51a7e827e250ab
data/.env ADDED
@@ -0,0 +1,2 @@
1
+ TITO_SITE=https://dashboard.tito.dev
2
+ TITO_API_KEY=GMM1WzZLbWiznqjqqsLr
@@ -1,8 +1,9 @@
1
- require 'json_api_client'
1
+ require 'http'
2
2
  require "tito/version"
3
3
  require "tito/base"
4
- require "tito/oauth2_middleware"
5
4
  require "tito/eventable"
5
+ require "tito/request_proxy"
6
+ require "tito/response_array"
6
7
 
7
8
  require "tito/account"
8
9
  require "tito/answer"
@@ -17,9 +18,16 @@ require "tito/event"
17
18
  require "tito/webhook_endpoint"
18
19
 
19
20
  module Tito
20
- cattr_accessor :api_key
21
+ def self.api_key
22
+ return @api_key if @api_key
23
+ return ENV['TITO_API_KEY'] if ENV['TITO_API_KEY']
24
+ end
25
+
26
+ def self.api_key=(val)
27
+ @api_key = val
28
+ end
21
29
  end
22
30
 
23
- Tito::Base.connection do |connection|
24
- connection.use Tito::OAuth2Middleware, lambda { |env| Tito.api_key }
25
- end
31
+ # Tito::Base.connection do |connection|
32
+ # connection.use Tito::OAuth2Middleware, lambda { |env| Tito.api_key }
33
+ # end
@@ -1,11 +1,11 @@
1
1
  module Tito
2
2
  class Account < Base
3
- property :name, type: :string
4
- property :description, type: :string
5
- property :slug, type: :string
3
+ # property :name, type: :string
4
+ # property :description, type: :string
5
+ # property :slug, type: :string
6
6
 
7
- def events
8
- Tito::Event.where(account_id: id)
9
- end
7
+ # def events
8
+ # Tito::Event.where(account_id: id)
9
+ # end
10
10
  end
11
11
  end
@@ -1,7 +1,7 @@
1
1
  module Tito
2
2
  class Answer < Base
3
- property :response, type: :string
4
- property :question_slug, type: :string
5
- property :question_title, type: :string
3
+ # property :response, type: :string
4
+ # property :question_slug, type: :string
5
+ # property :question_title, type: :string
6
6
  end
7
7
  end
@@ -1,11 +1,154 @@
1
1
  module Tito
2
- class Base < JsonApiClient::Resource
2
+ class Base
3
+ attr_accessor :path_prefix
3
4
  def self.site
4
- ENV['TITO_SITE'] || "https://api.tito.io/v2"
5
+ @site || ENV['TITO_SITE'] || "https://api.tito.io/v2"
5
6
  end
6
7
 
7
- def self.with_api_key(api_key)
8
- with_params(api_key: api_key)
8
+ def self.site=(val)
9
+ @site = val
10
+ end
11
+
12
+ def self.auth(api_key: nil)
13
+ token = api_key || Tito.api_key
14
+ raise "API key is required" if !token
15
+ if token.length > 30
16
+ %(Bearer #{token})
17
+ else
18
+ %(Token token="#{token}")
19
+ end
20
+ end
21
+
22
+ def self.ssl_context
23
+ @ssl_context ||= begin
24
+ ctx = OpenSSL::SSL::SSLContext.new
25
+ ctx
26
+ end
27
+ end
28
+
29
+ def self.ssl_context=(ctx)
30
+ @ssl_context = ctx
31
+ end
32
+
33
+ def self.http(api_key: nil)
34
+ HTTP.auth(auth(api_key: nil)).accept("application/json")
35
+ end
36
+
37
+ def self.resource_path=(val)
38
+ @resource_path = val
39
+ end
40
+
41
+ def self.resource_name=(val)
42
+ @resource_name = val
43
+ end
44
+
45
+ def self.underscore_class_name
46
+ self.to_s.gsub(/::/, '/').
47
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
48
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
49
+ tr("-", "_").
50
+ downcase
51
+ end
52
+
53
+ def self.resource_name
54
+ @resource_name ||= underscore_class_name.split("/").last
55
+ end
56
+
57
+ def self.resource_path
58
+ @resource_path ||= "#{resource_name}s"
59
+ end
60
+
61
+ def self.get_url(path)
62
+ [Tito::Base.site, path].join("/")
63
+ end
64
+
65
+ def self.get(path, params = {})
66
+ new http.get(get_url(path), params: params, ssl_context: ssl_context).parse[resource_name]
67
+ end
68
+
69
+ def self.all_path(path_prefix: nil)
70
+ [path_prefix, resource_path].compact.join("/")
71
+ end
72
+
73
+ def self.all_url(path_prefix: nil)
74
+ [site, all_path(path_prefix: path_prefix)].join("/")
75
+ end
76
+
77
+ def self.all(params = {})
78
+ api_key = params.delete(:api_key)
79
+ path_prefix = params.delete(:path_prefix)
80
+ response = http(api_key: api_key).get(all_url(path_prefix: path_prefix), params: params, ssl_context: ssl_context).parse
81
+ all_records = response[self.resource_path]
82
+ meta = response["meta"]
83
+ out = ResponseArray.new(all_records.collect do |record|
84
+ new record
85
+ end)
86
+ out.meta = meta
87
+ out
88
+ end
89
+
90
+ def initialize(attrs = {})
91
+ self.path_prefix = (attrs ||= {}).delete(:path_prefix)
92
+ attrs.each do |key, val|
93
+ attributes[key.to_s] = val
94
+ end
95
+ end
96
+
97
+ def attributes
98
+ @attributes ||= {}
99
+ end
100
+
101
+ def attributes=(attrs)
102
+ @attributes = attrs
103
+ end
104
+
105
+ def method_missing(method_name, val = nil)
106
+ if method_name.to_s[-1] == "="
107
+ self.attributes[method_name[0, (method_name.length - 1)]] = val
108
+ else
109
+ self.attributes[method_name.to_s]
110
+ end
111
+ end
112
+
113
+ def new_record?
114
+ attributes["id"] == nil
115
+ end
116
+
117
+ def persisted?
118
+ !new_record?
119
+ end
120
+
121
+ def auth(api_key = nil)
122
+ self.class.auth(api_key: api_key)
123
+ end
124
+
125
+ def http(api_key = nil)
126
+ self.class.http(api_key: api_key)
127
+ end
128
+
129
+ def ssl_context
130
+ self.class.ssl_context
131
+ end
132
+
133
+ def put_url
134
+ [Tito::Base.site, put_path].join("/")
135
+ end
136
+
137
+ def post_url
138
+ [Tito::Base.site, post_path].join("/")
139
+ end
140
+
141
+ def save(api_key: nil)
142
+ if persisted?
143
+ attrs = http(api_key: api_key).put(put_url, json: {self.class.resource_name => attributes}, ssl_context: ssl_context).parse[self.class.resource_name]
144
+ else
145
+ attrs = http(api_key: api_key).post(post_url, json: {self.class.resource_name => attributes}, ssl_context: ssl_context).parse[self.class.resource_name]
146
+ end
147
+ self.attributes = attrs
148
+ end
149
+
150
+ def destroy(api_key: nil)
151
+ http(api_key: api_key).delete(put_url, ssl_context: ssl_context)
9
152
  end
10
153
  end
11
154
  end
@@ -1,40 +1,65 @@
1
1
  module Tito
2
- class Event < Base
3
- belongs_to :account
2
+ class Event < Base
4
3
 
5
- property :title, type: :string
6
- property :security_token, type: :string
4
+ def path
5
+ "#{account_slug}/#{slug}"
6
+ end
7
7
 
8
- def account_id
9
- attributes['account_id'] || attributes['account-id']
8
+ def put_path
9
+ path
10
10
  end
11
11
 
12
- def account_id=(val)
13
- attributes['account_id'] = val
12
+ def post_path
13
+ "#{account_slug}/events"
14
14
  end
15
15
 
16
- def security_token
17
- attributes['security_token'] || attributes['security-token']
16
+ def self.for_account(url)
17
+ RequestProxy.new(proxy_class: self, proxy_path: url)
18
18
  end
19
19
 
20
- class << self
21
-
22
- def get(path)
23
- parts = path.split('/')
24
- where(account_id: parts[0]).find(parts[1]).first
25
- end
26
-
27
- def path(params=nil)
28
- prefix_path = '%{account_id}'
29
- path_params = params.delete(:path) || params
30
- parts = [].unshift(prefix_path % path_params.symbolize_keys)
31
- if !params[:id]
32
- parts << 'events'
33
- end
34
- File.join(*parts)
35
- rescue KeyError
36
- raise ArgumentError, "Please make sure to include account_id"
37
- end
20
+ def self.[](url)
21
+ self.for_account(url)
38
22
  end
23
+
24
+ # property :title, type: :string
25
+ # property :slug, type: :string
26
+ # property :account_slug, type: :string
27
+ # property :security_token, type: :string
28
+
29
+ # def account_id
30
+ # attributes['account_id'] || attributes['account-id']
31
+ # end
32
+
33
+ # def account_id=(val)
34
+ # attributes['account_id'] = val
35
+ # end
36
+
37
+ # def security_token
38
+ # attributes['security_token'] || attributes['security-token']
39
+ # end
40
+
41
+ # def account_slug
42
+ # attributes['account_slug'] || attributes['account-slug']
43
+ # end
44
+
45
+ # class << self
46
+
47
+ # def get(path)
48
+ # parts = path.split('/')
49
+ # where(account_id: parts[0]).find(parts[1]).first
50
+ # end
51
+
52
+ # def path(params=nil)
53
+ # prefix_path = '%{account_id}'
54
+ # path_params = params.delete(:path) || params
55
+ # parts = [].unshift(prefix_path % path_params.symbolize_keys)
56
+ # if !params[:id]
57
+ # parts << 'events'
58
+ # end
59
+ # File.join(*parts)
60
+ # rescue KeyError
61
+ # raise ArgumentError, "Please make sure to include account_id"
62
+ # end
63
+ # end
39
64
  end
40
65
  end
@@ -4,42 +4,57 @@ module Tito
4
4
  def self.included(base)
5
5
  base.extend ClassMethods
6
6
  base.class_eval do
7
- property :event
8
- property :event_id
7
+ attr_accessor :event_slug
8
+ attr_accessor :account_slug
9
9
  end
10
10
  end
11
11
 
12
- def event=(tito_event)
13
- self.event_id = tito_event.id
14
- self.attributes[:event] = tito_event
15
- @event = tito_event
12
+ def put_path
13
+ [path_prefix, self.class.resource_path, id].join("/")
16
14
  end
17
15
 
18
- module ClassMethods
16
+ def post_path
17
+ [path_prefix, self.class.resource_path].join("/")
18
+ end
19
19
 
20
- def event_id_from_params(params)
21
- return params[:event][:id] if params[:event]
22
- return params[:filter][:event_id] if params[:filter]
23
- end
20
+ # def event=(tito_event)
21
+ # self.event_id = tito_event.id
22
+ # self.attributes[:event] = tito_event
23
+ # @event = tito_event
24
+ # end
24
25
 
25
- def account_id_from_params(params)
26
- return params[:event][:account_id] if params[:event]
27
- return params[:filter][:account_id] if params[:filter]
26
+ module ClassMethods
27
+ def for_event(url)
28
+ RequestProxy.new(proxy_class: self, proxy_path: url)
28
29
  end
29
30
 
30
- def path(params=nil)
31
- prefix_path = '%{account_id}/%{event_id}'
32
- path_params = params.delete(:path) || params
33
- path_params[:event_id] = event_id_from_params(params)
34
- path_params[:account_id] = account_id_from_params(params)
35
- parts = [].unshift(prefix_path % path_params.symbolize_keys)
36
- parts << table_name
37
-
38
- File.join(*parts)
39
-
40
- rescue KeyError
41
- raise ArgumentError, "Please make sure to include account_id and event_id"
31
+ def [](url)
32
+ self.for_event(url)
42
33
  end
34
+
35
+ # def event_id_from_params(params)
36
+ # return params[:event][:slug] if params[:event]
37
+ # return params[:filter][:event_id] if params[:filter]
38
+ # end
39
+
40
+ # def account_id_from_params(params)
41
+ # return params[:event]["account-slug"] if params[:event]
42
+ # return params[:filter][:account_id] if params[:filter]
43
+ # end
44
+
45
+ # def path(params=nil)
46
+ # prefix_path = '%{account_id}/%{event_id}'
47
+ # path_params = params.delete(:path) || params
48
+ # path_params[:event_id] = event_id_from_params(params)
49
+ # path_params[:account_id] = account_id_from_params(params)
50
+ # parts = [].unshift(prefix_path % path_params.symbolize_keys)
51
+ # parts << table_name
52
+
53
+ # File.join(*parts)
54
+
55
+ # rescue KeyError
56
+ # raise ArgumentError, "Please make sure to include account_id and event_id"
57
+ # end
43
58
  end
44
59
  end
45
60
  end
@@ -0,0 +1,21 @@
1
+ module Tito
2
+ class RequestProxy
3
+ attr_accessor :proxy_path
4
+ attr_accessor :proxy_class
5
+ attr_accessor :api_key
6
+
7
+ def initialize(proxy_class: nil, proxy_path: nil, api_key: nil)
8
+ @proxy_path = proxy_path
9
+ @proxy_class = proxy_class
10
+ @api_key = api_key
11
+ end
12
+
13
+ def all
14
+ proxy_class.all(path_prefix: proxy_path, api_key: api_key)
15
+ end
16
+
17
+ def new(attrs = {})
18
+ proxy_class.new(attrs.merge(path_prefix: proxy_path, api_key: api_key))
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ class ResponseArray < Array
2
+ attr_accessor :meta
3
+ end
@@ -2,20 +2,22 @@ module Tito
2
2
  class Ticket < Tito::Base
3
3
  include Eventable
4
4
 
5
- property :url, type: :string
6
- property :name, type: :string
7
- property :email, type: :string
5
+ # property :url, type: :string
6
+ # property :name, type: :string
7
+ # property :email, type: :string
8
8
 
9
- property :company_name, type: :string
9
+ # property :company_name, type: :string
10
10
 
11
- property :metadata, type: :string
11
+ # property :metadata, type: :string
12
12
 
13
- property :number, type: :integer
14
- property :phone_number, type: :string
15
- property :price, type: :string
16
- property :reference, type: :string
17
- property :state, type: :string
18
- property :tags, type: :string
19
- property :test_mode, type: :boolean
13
+ # property :number, type: :integer
14
+ # property :phone_number, type: :string
15
+ # property :price, type: :string
16
+ # property :reference, type: :string
17
+ # property :state, type: :string
18
+ # property :tags, type: :string
19
+ # property :test_mode, type: :boolean
20
+
21
+ # property :registration
20
22
  end
21
23
  end
@@ -1,3 +1,3 @@
1
1
  module Tito
2
- VERSION = "0.1.11"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -2,6 +2,6 @@ module Tito
2
2
  class WebhookEndpoint < Tito::Base
3
3
  include Eventable
4
4
 
5
- property :url, type: :string
5
+ # property :url, type: :string
6
6
  end
7
7
  end
@@ -19,8 +19,13 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_runtime_dependency 'json_api_client', '<2'
22
+ spec.add_runtime_dependency 'http', '<3'
23
+ spec.add_runtime_dependency 'virtus', '<2'
23
24
 
24
25
  spec.add_development_dependency "bundler", "~> 1.10"
25
26
  spec.add_development_dependency "rake", "~> 10.0"
27
+ spec.add_development_dependency "minitest", "~> 5.10"
28
+ spec.add_development_dependency "dotenv", "~> 2.2"
29
+ spec.add_development_dependency "byebug", "~> 9.0"
30
+ spec.add_development_dependency "webmock", "~> 2.3"
26
31
  end
metadata CHANGED
@@ -1,17 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tito
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Campbell
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-06-26 00:00:00.000000000 Z
11
+ date: 2017-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: json_api_client
14
+ name: http
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "<"
18
+ - !ruby/object:Gem::Version
19
+ version: '3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "<"
25
+ - !ruby/object:Gem::Version
26
+ version: '3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: virtus
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - "<"
@@ -52,6 +66,62 @@ dependencies:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
68
  version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '5.10'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '5.10'
83
+ - !ruby/object:Gem::Dependency
84
+ name: dotenv
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.2'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.2'
97
+ - !ruby/object:Gem::Dependency
98
+ name: byebug
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '9.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '9.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: webmock
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '2.3'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '2.3'
55
125
  description: Allows interaction with the Tito API
56
126
  email:
57
127
  - paul@rslw.com
@@ -59,6 +129,7 @@ executables: []
59
129
  extensions: []
60
130
  extra_rdoc_files: []
61
131
  files:
132
+ - ".env"
62
133
  - ".gitignore"
63
134
  - ".travis.yml"
64
135
  - CODE_OF_CONDUCT.md
@@ -77,10 +148,11 @@ files:
77
148
  - lib/tito/event_settings.rb
78
149
  - lib/tito/eventable.rb
79
150
  - lib/tito/interested_user.rb
80
- - lib/tito/oauth2_middleware.rb
81
151
  - lib/tito/question.rb
82
152
  - lib/tito/registration.rb
83
153
  - lib/tito/release.rb
154
+ - lib/tito/request_proxy.rb
155
+ - lib/tito/response_array.rb
84
156
  - lib/tito/ticket.rb
85
157
  - lib/tito/version.rb
86
158
  - lib/tito/webhook_endpoint.rb
@@ -106,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
178
  version: '0'
107
179
  requirements: []
108
180
  rubyforge_project:
109
- rubygems_version: 2.5.1
181
+ rubygems_version: 2.5.2
110
182
  signing_key:
111
183
  specification_version: 4
112
184
  summary: Consumer library for Tito API
@@ -1,34 +0,0 @@
1
- module Tito
2
- class OAuth2Middleware < FaradayMiddleware::OAuth2
3
- def call(env)
4
- params = query_params(env[:url])
5
-
6
- token = params.delete(:api_key) || params.delete('api_key')
7
- token ||= if @token.is_a?(Proc)
8
- @token.call(env)
9
- else
10
- @token
11
- end
12
-
13
- token ||= Tito.api_key
14
-
15
- if token.respond_to?(:empty?) && !token.empty?
16
- env[:url].query = build_query params
17
- if token.length > 30
18
- env[:request_headers][AUTH_HEADER] ||= %(Bearer #{token})
19
- else
20
- env[:request_headers][AUTH_HEADER] ||= %(Token token="#{token}")
21
- end
22
- end
23
-
24
- @app.call env
25
- end
26
-
27
- def initialize(app, token = nil, options = {})
28
- super(app)
29
- options, token = token, nil if token.is_a? Hash
30
- @token = token
31
- raise ArgumentError, ":param_name can't be blank" if @param_name.empty?
32
- end
33
- end
34
- end