smartkiosk-client 0.0.10 → 0.0.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. data/.gitignore +2 -1
  2. data/Gemfile +1 -1
  3. data/app/controllers/payments.rb +28 -10
  4. data/app/controllers/terminal.rb +5 -18
  5. data/app/models/payment.rb +6 -2
  6. data/app/models/terminal.rb +18 -17
  7. data/app/workers/orders/acknowledge_worker.rb +0 -2
  8. data/app/workers/orders/complete_worker.rb +0 -2
  9. data/app/workers/orders/disable_worker.rb +0 -2
  10. data/app/workers/orders/durable_order_execution.rb +47 -0
  11. data/app/workers/orders/enable_worker.rb +0 -2
  12. data/app/workers/orders/reboot_worker.rb +4 -8
  13. data/app/workers/orders/reload_worker.rb +4 -8
  14. data/app/workers/orders/upgrade_worker.rb +4 -5
  15. data/app/workers/payments/check_worker.rb +6 -7
  16. data/app/workers/payments/collect_worker.rb +0 -2
  17. data/app/workers/payments/pay_worker.rb +10 -4
  18. data/app/workers/ping_worker.rb +0 -2
  19. data/app/workers/sync/icons_worker.rb +0 -2
  20. data/app/workers/sync/receipt_templates_worker.rb +0 -2
  21. data/bin/smartkiosk-client +31 -0
  22. data/config/boot.rb +10 -15
  23. data/db/migrate/20130106181548_create_payments.rb +4 -0
  24. data/lib/{smartkiosk → patches}/sidekiq.rb +0 -7
  25. data/lib/smartkiosk/client/logging.rb +4 -0
  26. data/lib/smartkiosk/client/version.rb +2 -2
  27. data/smartkiosk-client.gemspec +7 -5
  28. data/tmp/cache/.gitkeep +0 -0
  29. data/tmp/pids/.gitkeep +0 -0
  30. metadata +274 -109
  31. data/app/assets/flash/amqp.swf +0 -0
  32. data/app/assets/flash/expressInstall.swf +0 -0
  33. data/app/assets/javascripts/amqp.js +0 -18
  34. data/app/workers/startup_worker.rb +0 -11
  35. data/vendor/assets/javascripts/mq.js +0 -393
  36. data/vendor/assets/javascripts/swfobject.js +0 -4
data/.gitignore CHANGED
@@ -1,4 +1,5 @@
1
1
  pkg/
2
2
  db/*.sqlite3
3
3
  Gemfile.lock
4
- tmp/*
4
+ tmp/pids
5
+ tmp/cache
data/Gemfile CHANGED
@@ -2,4 +2,4 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- gem 'pry'
5
+ gem 'pry'
@@ -1,30 +1,48 @@
1
1
  class Application
2
2
  post '/payments' do
3
3
  payment = Payment.create! params[:payment]
4
+
4
5
  json (payment.check ? payment.as_json : false)
5
6
  end
6
7
 
7
- post '/payments/:id/open' do
8
+ post '/payments/:id/open_cash_acceptor' do
8
9
  payment = Payment.find(params[:id])
9
10
  Smartware.cash_acceptor.open(payment.limit.try('[]', :min), payment.limit.try('[]', :max))
10
- json (Smartware.cash_acceptor.error.blank? ? true : false)
11
+
12
+ json Smartware.cash_acceptor.error.blank?
11
13
  end
12
14
 
13
- post '/payments/:id/pay' do
14
- payment = Payment.find(params[:id])
15
+ post '/payments/close_cash_acceptor' do
15
16
  Smartware.cash_acceptor.close
16
- payment.update_attributes :banknotes => Smartware.cash_acceptor.banknotes
17
- payment.receipt.print
18
- payment.pay
19
17
  nil
20
18
  end
21
19
 
22
- get '/payments/cash' do
23
- json Smartware.cash_acceptor.sum.to_json
20
+ post '/payments/open_card_reader' do
21
+ Smartware.card_reader.open
22
+ nil
23
+ end
24
+
25
+ post '/payments/close_card_reader' do
26
+ Smartware.card_reader.close
27
+ nil
24
28
  end
25
29
 
26
- get '/payments/reset' do
30
+ post '/payments/:id/pay' do
31
+ payment = Payment.find(params[:id])
27
32
  Smartware.cash_acceptor.close
33
+
34
+ if payment.payment_type == 0
35
+ payment.update_attributes(:banknotes => Smartware.cash_acceptor.banknotes)
36
+ else
37
+ payment.update_attributes(
38
+ :paid_amount => params['payment']['paid_amount'],
39
+ :card_track1 => params['payment']['card_track1'],
40
+ :card_track2 => params['payment']['card_track2']
41
+ )
42
+ end
43
+
44
+ payment.receipt.print
45
+ payment.pay
28
46
  nil
29
47
  end
30
48
  end
@@ -4,20 +4,7 @@ Application.load 'lib/pinger'
4
4
 
5
5
  class Application
6
6
  get '/terminal' do
7
- Terminal.payment_in_progress = params[:payment_in_progress] == 'true'
8
-
9
- result = {
10
- :enabled => Terminal.enabled?,
11
- :started_at => Terminal.started_at.value
12
- }
13
-
14
- modified_at = Terminal.actual_modified_at.change(:usec => 0)
15
-
16
- if params[:modified_at] && (modified_at > DateTime.parse(params[:modified_at]))
17
- result[:terminal] = Terminal.as_json
18
- end
19
-
20
- json result
7
+ json Terminal
21
8
  end
22
9
 
23
10
  get '/terminal/condition' do
@@ -48,22 +35,22 @@ class Application
48
35
 
49
36
  post '/terminal/enable' do
50
37
  Terminal.enable
51
- json(:state => Terminal.actual_state)
38
+ json(:state => Terminal.state)
52
39
  end
53
40
 
54
41
  post '/terminal/disable' do
55
42
  Terminal.disable
56
- json(:state => Terminal.actual_state)
43
+ json(:state => Terminal.state)
57
44
  end
58
45
 
59
46
  post '/terminal/reload' do
60
47
  Terminal.reload
61
- json(:state => Terminal.actual_state)
48
+ json(:state => Terminal.state)
62
49
  end
63
50
 
64
51
  post '/terminal/reboot' do
65
52
  Terminal.reboot
66
- json(:state => Terminal.actual_state)
53
+ json(:state => Terminal.state)
67
54
  end
68
55
 
69
56
  get '/terminal/test_connection' do
@@ -13,10 +13,14 @@ class Payment < ActiveRecord::Base
13
13
  serialize :banknotes
14
14
 
15
15
  validates :provider, :presence => true
16
+ validates :payment_type, :presence => true
16
17
 
17
18
  before_save do
18
19
  if banknotes
19
20
  self.paid_amount = banknotes.inject(0){|sum, (nominal, count)| sum + nominal.to_i*count.to_i }
21
+ end
22
+
23
+ if paid_amount
20
24
  self.commission_amount = commission_for(self.paid_amount)
21
25
  end
22
26
  end
@@ -27,7 +31,7 @@ class Payment < ActiveRecord::Base
27
31
  r.update_attributes :template => self.receipt_template,
28
32
  :keyword => 'payment',
29
33
  :fields => {
30
- :recipient => provider.title,
34
+ :recipient => title,
31
35
  :account => account,
32
36
  :payment_paid_amount => paid_amount || 0,
33
37
  :payment_enrolled_amount => ((paid_amount || 0) - (commission_amount || 0)).round(2),
@@ -50,7 +54,7 @@ class Payment < ActiveRecord::Base
50
54
  end
51
55
 
52
56
  def title
53
- provider.title
57
+ provider.title rescue "-"
54
58
  end
55
59
 
56
60
  def commission_for(amount)
@@ -1,25 +1,22 @@
1
1
  require 'smartware'
2
+ require 'smartguard'
2
3
  require 'socket'
3
4
  require 'redis'
4
5
  require 'redis/objects'
6
+ require 'file-tail'
5
7
 
6
8
  Application.load 'lib/smartkiosk/config/yaml'
7
9
 
8
10
  class Terminal
9
11
  include Redis::Objects
10
12
 
11
- value :state, :global => true
12
- value :started_at, :global => true, :marshal => true
13
+ value :actual_state, :global => true
13
14
  value :modified_at, :global => true, :marshal => true
14
15
  value :payment_in_progress, :global => true
15
16
 
16
17
  value :support_phone, :global => true
17
18
  value :providers_updates, :global => true, :marshal => true
18
19
 
19
- def self.smartguard
20
- DRbObject.new_with_uri(Terminal.config.smartguard_host)
21
- end
22
-
23
20
  #
24
21
  # STATES
25
22
  #
@@ -35,8 +32,12 @@ class Terminal
35
32
  self.payment_in_progress.value == "true"
36
33
  end
37
34
 
38
- def self.actual_state
39
- self.state.value || 'active'
35
+ def self.state
36
+ self.actual_state.value || 'active'
37
+ end
38
+
39
+ def self.state=(value)
40
+ self.actual_state = value
40
41
  end
41
42
 
42
43
  def self.actual_modified_at
@@ -59,14 +60,11 @@ class Terminal
59
60
  end
60
61
 
61
62
  def self.reload
62
- smartguard.restart_async
63
+ Smartguard::Client.restart_async
63
64
  end
64
65
 
65
66
  def self.reboot
66
- self.state = 'rebooting'
67
- StartupWorker.perform_async self.name, :enable
68
-
69
- smartguard.reboot_async
67
+ Smartguard::Client.reboot_async
70
68
  end
71
69
 
72
70
  #
@@ -81,7 +79,7 @@ class Terminal
81
79
  end
82
80
 
83
81
  def self.enabled?
84
- self.actual_state == 'active'
82
+ self.state == 'active'
85
83
  end
86
84
 
87
85
  def self.version
@@ -101,9 +99,8 @@ class Terminal
101
99
  Socket.do_not_reverse_lookup = orig
102
100
  end
103
101
 
104
- def self.as_json
102
+ def self.as_json(*args)
105
103
  {
106
- :started_at => Terminal.started_at.value,
107
104
  :modified_at => Terminal.actual_modified_at,
108
105
  :keyword => Terminal.keyword,
109
106
  :support_phone => Terminal.support_phone.value,
@@ -113,10 +110,14 @@ class Terminal
113
110
  }
114
111
  end
115
112
 
113
+ def self.to_json(*args)
114
+ as_json.to_json
115
+ end
116
+
116
117
  def self.condition
117
118
  {
118
119
  :ip => ip,
119
- :state => Terminal.actual_state,
120
+ :state => Terminal.state,
120
121
  :banknotes => Payment.merge_banknotes(Payment.uncollected),
121
122
  :cash => Payment.merge_cash(Payment.uncollected),
122
123
  :providers => {
@@ -1,7 +1,5 @@
1
1
  require 'rest-client'
2
2
 
3
- Application.load 'lib/smartkiosk/sidekiq'
4
-
5
3
  module Orders
6
4
  class AcknowledgeWorker
7
5
  include Sidekiq::Worker
@@ -1,7 +1,5 @@
1
1
  require 'rest-client'
2
2
 
3
- Application.load 'lib/smartkiosk/sidekiq'
4
-
5
3
  module Orders
6
4
  class CompleteWorker
7
5
  include Sidekiq::Worker
@@ -1,5 +1,3 @@
1
- Application.load 'lib/smartkiosk/sidekiq'
2
-
3
1
  module Orders
4
2
  class DisableWorker
5
3
  include Sidekiq::Worker
@@ -0,0 +1,47 @@
1
+ module Orders
2
+ module DurableOrderExecution
3
+ def safely_execute_order(order_id, &block)
4
+ pid = Process.fork
5
+ return unless pid.nil?
6
+
7
+ Process.setsid
8
+
9
+ begin
10
+ Smartkiosk::Client::Logging.logger.debug "Started execution of order #{order_id}"
11
+ yield
12
+ Smartkiosk::Client::Logging.logger.debug "Completed execution of order #{order_id}"
13
+
14
+ rescue => e
15
+ Smartkiosk::Client::Logging.logger.debug "Execution of order #{order_id} failed: #{e}"
16
+
17
+ begin
18
+ AcknowledgeWorker.perform_async order_id, e.to_s
19
+ rescue => ne
20
+ Smartkiosk::Client::Logging.logger.debug "Unable to schedule AcknowlegeWorker #{ne}"
21
+ sleep 1
22
+ retry
23
+ end
24
+ end
25
+
26
+ begin
27
+ CompleteWorker.perform_async order_id
28
+ rescue => ne
29
+ Smartkiosk::Client::Logging.logger.debug "Unable to schedule CompleteWorker: #{ne}"
30
+ sleep 1
31
+ retry
32
+ end
33
+
34
+ begin
35
+ ActiveRecord::Base.connection.reconnect!
36
+
37
+ Order.find(order_id).update_attribute(:complete, true)
38
+ rescue => ne
39
+ Smartkiosk::Client::Logging.logger.debug "Unable to mark completion: #{ne}"
40
+ sleep 1
41
+ retry
42
+ end
43
+
44
+ Process.exit!
45
+ end
46
+ end
47
+ end
@@ -1,5 +1,3 @@
1
- Application.load 'lib/smartkiosk/sidekiq'
2
-
3
1
  module Orders
4
2
  class EnableWorker
5
3
  include Sidekiq::Worker
@@ -1,18 +1,14 @@
1
- Application.load 'lib/smartkiosk/sidekiq'
2
-
3
1
  module Orders
4
2
  class RebootWorker
5
3
  include Sidekiq::Worker
4
+ include DurableOrderExecution
6
5
 
7
6
  sidekiq_options :queue => :orders
8
7
 
9
8
  def perform(order_id)
10
- StartupWorker.perform_async self.class.name, :finish, [order_id]
11
- Terminal.reboot
12
- end
13
-
14
- def self.finish(order_id)
15
- Order.find(order_id).complete
9
+ safely_execute_order(order_id) do
10
+ Smartguard::Client.reboot
11
+ end
16
12
  end
17
13
  end
18
14
  end
@@ -1,18 +1,14 @@
1
- Application.load 'lib/smartkiosk/sidekiq'
2
-
3
1
  module Orders
4
2
  class ReloadWorker
5
3
  include Sidekiq::Worker
4
+ include DurableOrderExecution
6
5
 
7
6
  sidekiq_options :queue => :orders
8
7
 
9
8
  def perform(order_id)
10
- StartupWorker.perform_async self.class.name, :finish, [order_id]
11
- Terminal.reload
12
- end
13
-
14
- def self.finish(order_id)
15
- Order.find(order_id).complete
9
+ safely_execute_order(order_id) do
10
+ Smartguard::Client.restart
11
+ end
16
12
  end
17
13
  end
18
14
  end
@@ -2,11 +2,10 @@ require 'pathname'
2
2
  require 'rubygems'
3
3
  require 'fileutils'
4
4
 
5
- Application.load 'lib/smartkiosk/sidekiq'
6
-
7
5
  module Orders
8
6
  class UpgradeWorker
9
7
  include Sidekiq::Worker
8
+ include DurableOrderExecution
10
9
 
11
10
  sidekiq_options :queue => :orders
12
11
 
@@ -19,12 +18,12 @@ module Orders
19
18
  @base_url = URI.parse(order.args[3]).scheme.nil? ? "#{Terminal.config.host}#{order.args[3]}"
20
19
  : order.args[3]
21
20
 
22
- @releases_pathname = Terminal.smartguard.releases_path
21
+ @releases_pathname = Smartguard::Client.releases_path
23
22
  @build_pathname = @releases_pathname.join @build_version.to_s
24
23
 
25
24
  self.sync!
26
- Terminal.smartguard.switch_release @build_version.to_s.to_sym do
27
- order.complete
25
+ safely_execute_order(order_id) do
26
+ Smartguard::Client.switch_release @build_version.to_s.to_sym
28
27
  end
29
28
  end
30
29
 
@@ -1,7 +1,5 @@
1
1
  require 'rest-client'
2
2
 
3
- Application.load 'lib/smartkiosk/sidekiq'
4
-
5
3
  module Payments
6
4
  class CheckWorker
7
5
  include Sidekiq::Worker
@@ -13,8 +11,9 @@ module Payments
13
11
  response = RestClient.post "#{Terminal.config.host}/payments",
14
12
  :provider => payment.provider.keyword,
15
13
  :terminal => Terminal.config.keyword,
16
- :payment => {
14
+ :payment => {
17
15
  :account => payment.account,
16
+ :payment_type => payment.payment_type,
18
17
  :fields => payment.fields,
19
18
  :session_id => payment.id
20
19
  }
@@ -22,11 +21,11 @@ module Payments
22
21
  answer = JSON.parse(response.to_s, :symbolize_names => true)
23
22
 
24
23
  unless answer[:id].nil?
25
- payment.update_attributes :foreign_id => answer[:id],
26
- :limit => answer[:limits].sort_by(&:weight).last,
27
- :commissions => (answer[:commissions].empty? ? nil : answer[:commissions]),
24
+ payment.update_attributes :foreign_id => answer[:id],
25
+ :limit => answer[:limits].sort_by(&:weight).last,
26
+ :commissions => (answer[:commissions].empty? ? nil : answer[:commissions]),
28
27
  :receipt_template => answer[:receipt_template],
29
- :checked => true
28
+ :checked => true
30
29
  end
31
30
  rescue => e
32
31
  Payment.find(payment_id).update_attributes :error => true
@@ -1,5 +1,3 @@
1
- Application.load 'lib/smartkiosk/sidekiq'
2
-
3
1
  module Payments
4
2
  class CollectWorker
5
3
  include Sidekiq::Worker
@@ -1,7 +1,5 @@
1
1
  require 'rest-client'
2
2
 
3
- Application.load 'lib/smartkiosk/sidekiq'
4
-
5
3
  module Payments
6
4
  class PayWorker
7
5
  include Sidekiq::Worker
@@ -13,9 +11,17 @@ module Payments
13
11
  response = RestClient.post "#{Terminal.config.host}/payments/#{payment.foreign_id}/pay",
14
12
  :provider => payment.provider.keyword,
15
13
  :terminal => Terminal.config.keyword,
16
- :payment => { :paid_amount => payment.paid_amount }
14
+ :payment => {
15
+ :paid_amount => payment.paid_amount,
16
+ :card_track1 => payment.card_track1,
17
+ :card_track2 => payment.card_track2
18
+ }
17
19
  Sidekiq::Logging.logger.debug "Pay response: #{response.to_s}"
18
- payment.update_attributes(:processed => true) if response
20
+ payment.update_attributes(
21
+ :processed => true,
22
+ :card_track1 => nil,
23
+ :card_track2 => nil
24
+ ) if response
19
25
  end
20
26
  end
21
27
  end
@@ -1,7 +1,5 @@
1
1
  require 'rest-client'
2
2
 
3
- Application.load 'lib/smartkiosk/sidekiq'
4
-
5
3
  class PingWorker
6
4
  include Sidekiq::Worker
7
5
 
@@ -1,7 +1,5 @@
1
1
  require 'rest-client'
2
2
 
3
- Application.load 'lib/smartkiosk/sidekiq'
4
-
5
3
  module Sync
6
4
  class IconsWorker
7
5
  include Sidekiq::Worker
@@ -1,7 +1,5 @@
1
1
  require 'rest-client'
2
2
 
3
- Application.load 'lib/smartkiosk/sidekiq'
4
-
5
3
  module Sync
6
4
  class ReceiptTemplatesWorker
7
5
  include Sidekiq::Worker
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'bundler/setup'
4
4
  require 'eventmachine'
5
+ require 'em-websocket'
5
6
  require 'thin'
6
7
  require 'trollop'
7
8
 
@@ -17,6 +18,9 @@ Smartkiosk::Client::Logging.destination = opts[:log] if opts[:log]
17
18
  Smartkiosk::Client::Logging.init
18
19
 
19
20
  EventMachine.run do
21
+ #
22
+ # Serving front
23
+ #
20
24
  Thin::Server.start '0.0.0.0', 3001 do
21
25
  map '/assets' do
22
26
  run Application.sprockets
@@ -24,4 +28,31 @@ EventMachine.run do
24
28
  use Smartkiosk::Client::Logging::Middleware
25
29
  run Application
26
30
  end
31
+
32
+ #
33
+ # Serving WebSockets
34
+ #
35
+ @front_orders = EM::Channel.new
36
+
37
+ EventMachine.add_periodic_timer 1 do
38
+ @front_orders.push ['state', Terminal.state].to_json
39
+ end
40
+
41
+ EventMachine.add_periodic_timer 5 do
42
+ @front_orders.push ['modified_at', Terminal.modified_at].to_json
43
+ end
44
+
45
+ Smartware.subscribe do |key, *value|
46
+ @front_orders.push ["smartware.#{key}", value].to_json
47
+ end
48
+
49
+ EventMachine::WebSocket.run(:host => '0.0.0.0', :port => 3002) do |ws|
50
+ ws.onopen {
51
+ sid = @front_orders.subscribe { |msg| ws.send msg }
52
+
53
+ ws.onclose {
54
+ @front_orders.unsubscribe(sid)
55
+ }
56
+ }
57
+ end
27
58
  end
data/config/boot.rb CHANGED
@@ -9,7 +9,6 @@ require 'sprockets/helpers'
9
9
  require 'sinatra/base'
10
10
  require 'sinatra/activerecord'
11
11
  require 'sinatra/reloader'
12
- require 'sinatra/json'
13
12
 
14
13
  module Smartkiosk
15
14
  class Client < Sinatra::Base
@@ -25,6 +24,7 @@ module Smartkiosk
25
24
  set :sprockets, Sprockets::Environment.new(root)
26
25
  set :database_file, root.join('config/services/database.yml')
27
26
  set :views, [File.expand_path('../../app/views', __FILE__)]
27
+ set :logging, nil
28
28
 
29
29
  assets_types.map do |x|
30
30
  sprockets.append_path root.join("app/assets/#{x}")
@@ -61,32 +61,28 @@ module Smartkiosk
61
61
  data.to_json
62
62
  end
63
63
 
64
- get "/assets/*" do
65
- env["PATH_INFO"].sub!(%r{^/assets}, "")
66
- settings.sprockets.call(env)
67
- end
68
-
69
64
  def self.load(path)
70
65
  require File.expand_path File.join('../..', path), __FILE__
71
66
  end
72
67
 
73
- def self.run!(*args)
74
- load 'lib/smartkiosk/sidekiq'
75
- Sidekiq.startup!
76
- super
77
- end
78
-
79
68
  def self.load_tasks!
80
69
  require "sinatra/activerecord/rake"
81
70
  Dir[File.expand_path "../../lib/tasks/*.rb", __FILE__].each {|file| require file}
82
71
  end
83
72
 
84
73
  def self.load_app!
74
+ load 'lib/smartkiosk/client/logging'
75
+ load 'lib/patches/sidekiq'
76
+
77
+ require_relative "../app/workers/orders/durable_order_execution"
78
+
85
79
  %w(uploaders models workers controllers).each do |dir|
86
80
  Dir[File.expand_path "../../app/#{dir}/**/*.rb", __FILE__].each {|file| require file }
87
81
  end
88
82
 
89
- load 'lib/smartkiosk/client/logging'
83
+ CarrierWave.root = ->() { Application.public_folder }
84
+
85
+ self
90
86
  end
91
87
 
92
88
  def self.expand!(path)
@@ -102,5 +98,4 @@ module Smartkiosk
102
98
  end
103
99
  end
104
100
 
105
- Application = Smartkiosk::Client
106
- Application.load_app!
101
+ (Application = Smartkiosk::Client).load_app!
@@ -18,6 +18,10 @@ class CreatePayments < ActiveRecord::Migration
18
18
  t.decimal :paid_amount, :precision => 38, :scale => 2
19
19
  t.decimal :commission_amount, :precision => 38, :scale => 2
20
20
 
21
+ t.integer :payment_type
22
+ t.string :card_track1
23
+ t.string :card_track2
24
+
21
25
  t.timestamps
22
26
  end
23
27
 
@@ -10,11 +10,4 @@ module Sidekiq
10
10
  end
11
11
  end
12
12
  end
13
-
14
- def self.startup!
15
- jobs = Sidekiq::Queue.new("startup").map do |job|
16
- job.delete
17
- job.klass.constantize.new.perform(*job.args)
18
- end
19
- end
20
13
  end
@@ -1,3 +1,5 @@
1
+ require 'smartkiosk/common'
2
+
1
3
  module Smartkiosk
2
4
  class Client
3
5
  module Logging extend Smartkiosk::Common::Logging
@@ -10,6 +12,8 @@ module Smartkiosk
10
12
 
11
13
  def call(env)
12
14
  began_at = Time.now
15
+
16
+ env['rack.logger'] = Smartkiosk::Client::Logging.logger
13
17
  status, header, body = @app.call(env)
14
18
  header = Rack::Utils::HeaderHash.new(header)
15
19
  log(env, status, header, began_at)
@@ -2,6 +2,6 @@ require 'sinatra/base'
2
2
 
3
3
  module Smartkiosk
4
4
  class Client < Sinatra::Base
5
- VERSION = '0.0.10'
5
+ VERSION = '0.0.16'
6
6
  end
7
- end
7
+ end