straight-server 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +8 -0
  3. data/Gemfile +3 -1
  4. data/Gemfile.lock +57 -47
  5. data/Gemfile.travis +26 -0
  6. data/README.md +175 -22
  7. data/Rakefile +7 -0
  8. data/VERSION +1 -1
  9. data/benchmark/addons.yml +15 -0
  10. data/benchmark/config.yml +78 -0
  11. data/benchmark/default_last_keychain_id +1 -0
  12. data/benchmark/server_secret +1 -0
  13. data/bin/goliath.log +6 -0
  14. data/bin/goliath.log_stdout.log +51 -0
  15. data/bin/straight-server-benchmark +68 -0
  16. data/db/migrations/003_add_payment_id_to_orders.rb +13 -0
  17. data/db/migrations/004_add_description_to_orders.rb +11 -0
  18. data/db/migrations/005_add_orders_expiration_period_to_gateways.rb +11 -0
  19. data/db/migrations/006_add_check_order_status_in_db_first_to_gateways.rb +11 -0
  20. data/db/migrations/007_add_active_switcher_to_gateways.rb +11 -0
  21. data/db/migrations/008_add_order_counters_to_gateways.rb +11 -0
  22. data/db/migrations/009_add_hashed_id_to_gateways.rb +18 -0
  23. data/examples/client/client.dart +5 -0
  24. data/examples/client/client.html +7 -15
  25. data/examples/client/client.js +15 -0
  26. data/lib/straight-server/config.rb +1 -1
  27. data/lib/straight-server/gateway.rb +241 -59
  28. data/lib/straight-server/initializer.rb +170 -44
  29. data/lib/straight-server/logger.rb +1 -1
  30. data/lib/straight-server/order.rb +74 -9
  31. data/lib/straight-server/orders_controller.rb +23 -6
  32. data/lib/straight-server/random_string.rb +18 -0
  33. data/lib/straight-server/server.rb +44 -17
  34. data/lib/straight-server/utils/hash_string_to_sym_keys.rb +24 -0
  35. data/lib/straight-server.rb +6 -3
  36. data/spec/.straight/config.yml +16 -0
  37. data/spec/.straight/server_secret +1 -0
  38. data/spec/fixtures/addons.yml +19 -0
  39. data/spec/fixtures/test_addon.rb +8 -0
  40. data/spec/lib/gateway_spec.rb +93 -13
  41. data/spec/lib/initializer_spec.rb +104 -0
  42. data/spec/lib/order_spec.rb +59 -0
  43. data/spec/lib/orders_controller_spec.rb +34 -1
  44. data/spec/lib/utils/hash_string_to_sym_keys.rb +18 -0
  45. data/spec/spec_helper.rb +10 -2
  46. data/straight-server.gemspec +36 -8
  47. data/templates/addons.yml +15 -0
  48. data/templates/config.yml +41 -0
  49. metadata +47 -5
@@ -0,0 +1,104 @@
1
+ require 'fileutils'
2
+ require_relative '../../lib/straight-server'
3
+
4
+ RSpec.describe StraightServer::Initializer do
5
+
6
+ class StraightServer::TestInitializerClass
7
+ include StraightServer::Initializer
8
+ include StraightServer::Initializer::ConfigDir
9
+ end
10
+
11
+ before(:each) do
12
+ # redefining Kernel #puts and #print, to get rid of outputs/noise while running specs
13
+ module Kernel
14
+ alias :original_puts :puts
15
+ alias :original_print :print
16
+ def puts(s); end
17
+ def print(s); end
18
+ end
19
+ remove_tmp_dir
20
+ @templates_dir = File.expand_path('../../templates', File.dirname(__FILE__))
21
+ ENV['HOME'] = File.expand_path('../tmp', File.dirname(__FILE__))
22
+ @initializer = StraightServer::TestInitializerClass.new
23
+ StraightServer::Initializer::ConfigDir.set!
24
+ end
25
+
26
+ after(:each) do
27
+ # reverting redefinition of Kernel #puts and #print made in before block
28
+ module Kernel
29
+ alias :puts :original_puts
30
+ alias :print :original_print
31
+ end
32
+ remove_tmp_dir
33
+ end
34
+
35
+ # as #create_config_files method contains #exit method we need to rescue SystemExix: exit() error
36
+ # and at the same time its good to assert that method execution went well, which we do in rescue
37
+ let(:create_config_files) do
38
+ begin
39
+ @initializer.create_config_files
40
+ rescue Exception => e
41
+ expect(e.status).to eq 0
42
+ end
43
+ end
44
+
45
+ it "creates config files" do
46
+ create_config_files
47
+ expect(File.exist?(StraightServer::Initializer::ConfigDir.path)).to eq true
48
+ created_config_files = Dir.glob(File.join(File.expand_path('../tmp', File.dirname(__FILE__)), '**', '*'), File::FNM_DOTMATCH).select { |f| File.file? f }
49
+ expect(created_config_files.size).to eq 3
50
+ created_config_files.each do |file|
51
+ expect(File.read(file)).to eq File.read(@templates_dir + '/addons.yml') if file.match(/.*\.straight\/addons.yml\Z/)
52
+ expect(File.read(file)).to eq File.read(@templates_dir + '/config.yml') if file.match(/.*\.straight\/config.yml\Z/)
53
+ expect(File.read(file).scan(/\w+/).join.size).to eq 16 if file.match(/.*\.straight\/server_secret\Z/)
54
+ end
55
+ end
56
+
57
+ it "reads config" do
58
+ create_config_files
59
+ @initializer.read_config_file
60
+ expect(StraightServer::Config.blockchain_adapters).to eq(["BlockchainInfo", "Mycelium"])
61
+ end
62
+
63
+ it "connects to the database" do
64
+ StraightServer::Config.db = {
65
+ adapter: 'sqlite',
66
+ name: 'straight.db',
67
+ }
68
+ create_config_files
69
+ @initializer.connect_to_db
70
+ expect(StraightServer.db_connection.test_connection).to be true
71
+ end
72
+
73
+ it "creates logger" do
74
+ StraightServer::Config.logmaster = { 'log_level' => 'WARN', 'file' => 'straight.log' }
75
+ create_config_files
76
+ expect(@initializer.create_logger).to be_kind_of(StraightServer::Logger)
77
+ end
78
+
79
+ it "runs migrations"
80
+
81
+ it "loads addons" do
82
+ create_config_files
83
+ FileUtils.ln_sf(File.expand_path(File.join(ENV['HOME'], '../fixtures/addons.yml')), File.expand_path(File.join(ENV['HOME'], '../tmp/.straight/addons.yml')))
84
+ FileUtils.ln_sf(File.expand_path(File.join(ENV['HOME'], '../fixtures')), File.expand_path(File.join(ENV['HOME'], '../tmp/.straight/addons')))
85
+ disable_logger_noise
86
+ @initializer.load_addons
87
+ expect(@initializer).to respond_to(:test_addon_method)
88
+ end
89
+
90
+ # Stubing logger with empty string to remove its noise while test run
91
+ def disable_logger_noise
92
+ StraightServer::Config.logmaster = { 'log_level' => 'INFO', 'file' => 'straight.log' }
93
+ @initializer.create_logger
94
+ expect(StraightServer.logger).to receive(:info).and_return ''
95
+ end
96
+
97
+ # Cleans up files created by #create_config_files defined in let:
98
+ def remove_tmp_dir
99
+ if Dir.exist?(File.expand_path('../tmp/', File.dirname(__FILE__)))
100
+ FileUtils.rm_r(File.expand_path('../tmp/', File.dirname(__FILE__)))
101
+ end
102
+ end
103
+
104
+ end
@@ -7,10 +7,23 @@ RSpec.describe StraightServer::Order do
7
7
  DB.run("DELETE FROM orders")
8
8
  @gateway = double("Straight Gateway mock")
9
9
  allow(@gateway).to receive(:id).and_return(1)
10
+ allow(@gateway).to receive(:active).and_return(true)
11
+ allow(@gateway).to receive(:order_status_changed)
12
+ allow(@gateway).to receive(:save)
13
+ allow(@gateway).to receive(:increment_order_counter!)
14
+ allow(@gateway).to receive(:current_exchange_rate).and_return(111)
15
+ allow(@gateway).to receive(:default_currency).and_return('USD')
10
16
  @order = create(:order, gateway_id: @gateway.id)
11
17
  allow(@gateway).to receive(:fetch_transactions_for).with(anything).and_return([])
12
18
  allow(@gateway).to receive(:order_status_changed).with(anything)
19
+ allow(@gateway).to receive(:sign_with_secret).with(anything).and_return("1", "2", "3")
13
20
  allow(StraightServer::Gateway).to receive(:find_by_id).and_return(@gateway)
21
+
22
+ websockets = {}
23
+ StraightServer::GatewayOnConfig.class_variable_get(:@@gateways).each do |g|
24
+ websockets[g.id] = {}
25
+ end
26
+ StraightServer::GatewayModule.class_variable_set(:@@websockets, websockets)
14
27
  end
15
28
 
16
29
  it "prepares data as http params" do
@@ -18,6 +31,47 @@ RSpec.describe StraightServer::Order do
18
31
  expect(@order.to_http_params).to eq("order_id=#{@order.id}&amount=10&status=#{@order.status}&address=#{@order.address}&tid=tid1")
19
32
  end
20
33
 
34
+ it "generates a payment_id" do
35
+ expect(@order.payment_id).to eq(@order.gateway.sign_with_secret("#{@order.id}#{@order.amount}#{@order.created_at}"))
36
+ end
37
+
38
+ it "starts a periodic status check but subtracts the time passed from order creation from the duration of the check" do
39
+ expect(@order).to receive(:check_status_on_schedule).with(duration: 900)
40
+ @order.start_periodic_status_check
41
+
42
+ @order.created_at = (Time.now - 100)
43
+ expect(@order).to receive(:check_status_on_schedule).with(duration: 800)
44
+ @order.start_periodic_status_check
45
+ end
46
+
47
+ it "checks DB for a status update first if the respective option for the gateway is turned on" do
48
+ allow(@order).to receive(:transaction).and_raise("Shouldn't ever be happening!")
49
+ StraightServer::Config.check_order_status_in_db_first = true
50
+ StraightServer::Order.where(id: @order.id).update(status: 2)
51
+ allow(@order.gateway).to receive(:order_status_changed)
52
+ expect(@order.status(reload: false)).to eq(0)
53
+ expect(@order.status(reload: true)).to eq(2)
54
+ end
55
+
56
+ it "updates order status when the time in which it expires passes (periodic status checks finish)" do
57
+ allow(@order).to receive(:status=) do
58
+ expect(@order).to receive(:status_changed?).and_return(true)
59
+ expect(@order).to receive(:save)
60
+ end
61
+ allow(@order).to receive(:check_status_on_schedule).with(duration: 900) { @order.status = 5 }
62
+ @order.start_periodic_status_check
63
+ end
64
+
65
+ it "doesn't allow to create an order for inactive gateway" do
66
+ allow(@gateway).to receive(:active).and_return(false)
67
+ expect( -> { create(:order, gateway_id: @gateway.id) }).to raise_exception(Sequel::ValidationFailed, "gateway is inactive, cannot create order for inactive gateway")
68
+ end
69
+
70
+ it "adds exchange rate at the moment of purchase to the data hash" do
71
+ order = create(:order, gateway_id: @gateway.id)
72
+ expect(order.data[:exchange_rate]).to eq({ price: 111, currency: 'USD' })
73
+ end
74
+
21
75
  describe "DB interaction" do
22
76
 
23
77
  it "saves a new order into the database" do
@@ -25,6 +79,7 @@ RSpec.describe StraightServer::Order do
25
79
  end
26
80
 
27
81
  it "updates an existing order" do
82
+ allow(@order).to receive(:gateway).and_return(@gateway)
28
83
  expect(DB[:orders][:keychain_id => @order.id][:status]).to eq(0)
29
84
  @order.status = 1
30
85
  @order.save
@@ -75,6 +130,10 @@ RSpec.describe StraightServer::Order do
75
130
  expect( -> { create(:order, gateway_id: 0) }).to raise_error()
76
131
  end
77
132
 
133
+ it "doesn't save order if description is too long" do
134
+ expect( -> { create(:order, description: ("text" * 100)) }).to raise_error()
135
+ end
136
+
78
137
  end
79
138
 
80
139
  end
@@ -32,6 +32,24 @@ RSpec.describe StraightServer::OrdersController do
32
32
  send_request "POST", '/gateways/2/orders', amount: 10
33
33
  end
34
34
 
35
+ it "passes data param to Order which then saves it serialized" do
36
+ allow(StraightServer::Thread).to receive(:new) # ignore periodic status checks, we're not testing it here
37
+ send_request "POST", '/gateways/2/orders', amount: 10, data: { hello: 'world' }
38
+ expect(StraightServer::Order.last.data.hello).to eq('world')
39
+ end
40
+
41
+ it "renders 503 page when the gateway is inactive" do
42
+ @gateway.active = false
43
+ send_request "POST", '/gateways/2/orders', amount: 1
44
+ expect(response[0]).to eq(503)
45
+ expect(response[2]).to eq("The gateway is inactive, you cannot create order with it")
46
+ end
47
+
48
+ it "finds gateway using hashed_id" do
49
+ allow(StraightServer::Thread).to receive(:new)
50
+ send_request "POST", "/gateways/#{@gateway.id}/orders", amount: 10
51
+ end
52
+
35
53
  end
36
54
 
37
55
  describe "show action" do
@@ -63,12 +81,20 @@ RSpec.describe StraightServer::OrdersController do
63
81
  expect(response).to eq([404, {}, "GET /gateways/2/orders/1 Not found"])
64
82
  end
65
83
 
84
+ it "finds order by payment_id" do
85
+ allow(@order_mock).to receive(:status_changed?).and_return(false)
86
+ expect(StraightServer::Order).to receive(:[]).with('payment_id').and_return(nil)
87
+ expect(StraightServer::Order).to receive(:[]).with(:payment_id => 'payment_id').and_return(@order_mock)
88
+ send_request "GET", '/gateways/2/orders/payment_id'
89
+ expect(response).to eq([200, {}, "order json mock"])
90
+ end
91
+
66
92
  end
67
93
 
68
94
  describe "websocket action" do
69
95
 
70
96
  before(:each) do
71
- @gateway.instance_variable_set(:@websockets, {})
97
+ StraightServer::GatewayModule.class_variable_set(:@@websockets, { @gateway.id => {} })
72
98
  @ws_mock = double("websocket mock")
73
99
  @order_mock = double("order mock")
74
100
  allow(@ws_mock).to receive(:rack_response).and_return("ws rack response")
@@ -99,6 +125,13 @@ RSpec.describe StraightServer::OrdersController do
99
125
  expect(response).to eq([403, {}, "You cannot listen to this order because it is completed (status > 1)"])
100
126
  end
101
127
 
128
+ it "finds order by payment_id" do
129
+ allow(@order_mock).to receive(:status).and_return(0)
130
+ expect(StraightServer::Order).to receive(:[]).with(:payment_id => 'payment_id').and_return(@order_mock)
131
+ send_request "GET", '/gateways/2/orders/payment_id/websocket'
132
+ expect(response).to eq("ws rack response")
133
+ end
134
+
102
135
  end
103
136
 
104
137
  def send_request(method, path, params={})
@@ -0,0 +1,18 @@
1
+ require_relative "../../../lib/straight-server/utils/hash_string_to_sym_keys"
2
+
3
+ describe Hash do
4
+
5
+ it "converts string keys to symbols in a hash" do
6
+ hash = { 'hello' => 'world', 'hello?' => 'world!' }
7
+ hash.keys_to_sym!
8
+ expect(hash).to include(hello: 'world', :hello? => 'world!')
9
+ expect(hash).not_to include('hello' => 'world', 'hello?' => 'world!')
10
+ end
11
+
12
+ it "doesn't convert string keys that have spaces or other unintended chars in them" do
13
+ hash = { 'hello' => 'world', 'hello hi' => 'world planet' }
14
+ hash.keys_to_sym!
15
+ expect(hash).to include(hello: 'world', 'hello hi' => 'world planet')
16
+ end
17
+
18
+ end
data/spec/spec_helper.rb CHANGED
@@ -21,9 +21,11 @@ ENV['HOME'] = File.expand_path(File.dirname(__FILE__))
21
21
  # 3.2 Actually load the initializer
22
22
  require_relative "../lib/straight-server/config"
23
23
  require_relative "../lib/straight-server/initializer"
24
+ require_relative "../lib/straight-server/utils/hash_string_to_sym_keys"
24
25
  include StraightServer::Initializer
25
-
26
+ StraightServer::Initializer::ConfigDir.set!
26
27
  read_config_file
28
+ setup_redis_connection
27
29
 
28
30
  # 4. Load the rest of the files, including models, which are now ready
29
31
  # to be used as intended and will follow all the previous configuration.
@@ -66,10 +68,16 @@ RSpec.configure do |config|
66
68
  g.last_keychain_id = 0
67
69
  g.save
68
70
  end
71
+
72
+ # Clear Gateway's order counters in Redis
73
+ Redis.current.keys("#{StraightServer::Config.redis[:prefix]}*").each do |k|
74
+ Redis.current.del k
75
+ end
76
+
69
77
  end
70
78
 
71
79
  config.after(:all) do
72
- ["default_last_keychain_id", "second_gateway_last_keychain_id"].each do |f|
80
+ ["default_last_keychain_id", "second_gateway_last_keychain_id", "default_order_counters.yml"].each do |f|
73
81
  FileUtils.rm "#{ENV['HOME']}/.straight/#{f}" if File.exists?("#{ENV['HOME']}/.straight/#{f}")
74
82
  end
75
83
  end
@@ -2,19 +2,19 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: straight-server 0.1.2 ruby lib
5
+ # stub: straight-server 0.2.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "straight-server"
9
- s.version = "0.1.2"
9
+ s.version = "0.2.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Roman Snitko"]
14
- s.date = "2015-01-07"
14
+ s.date = "2015-05-05"
15
15
  s.description = "Accepts orders via http, returns payment info via http or streams updates via websockets, stores orders in a DB"
16
16
  s.email = "roman.snitko@gmail.com"
17
- s.executables = ["straight-console", "straight-server"]
17
+ s.executables = ["goliath.log", "goliath.log_stdout.log", "straight-console", "straight-server", "straight-server-benchmark"]
18
18
  s.extra_rdoc_files = [
19
19
  "LICENSE.txt",
20
20
  "README.md"
@@ -22,18 +22,35 @@ Gem::Specification.new do |s|
22
22
  s.files = [
23
23
  ".document",
24
24
  ".rspec",
25
+ ".travis.yml",
25
26
  "Gemfile",
26
27
  "Gemfile.lock",
28
+ "Gemfile.travis",
27
29
  "LICENSE.txt",
28
30
  "README.md",
29
31
  "Rakefile",
30
32
  "VERSION",
33
+ "benchmark/addons.yml",
34
+ "benchmark/config.yml",
35
+ "benchmark/default_last_keychain_id",
36
+ "benchmark/server_secret",
37
+ "bin/goliath.log",
38
+ "bin/goliath.log_stdout.log",
31
39
  "bin/straight-console",
32
40
  "bin/straight-server",
41
+ "bin/straight-server-benchmark",
33
42
  "db/migrations/001_create_orders.rb",
34
43
  "db/migrations/002_create_gateways.rb",
44
+ "db/migrations/003_add_payment_id_to_orders.rb",
45
+ "db/migrations/004_add_description_to_orders.rb",
46
+ "db/migrations/005_add_orders_expiration_period_to_gateways.rb",
47
+ "db/migrations/006_add_check_order_status_in_db_first_to_gateways.rb",
48
+ "db/migrations/007_add_active_switcher_to_gateways.rb",
49
+ "db/migrations/008_add_order_counters_to_gateways.rb",
50
+ "db/migrations/009_add_hashed_id_to_gateways.rb",
35
51
  "examples/client/client.dart",
36
52
  "examples/client/client.html",
53
+ "examples/client/client.js",
37
54
  "lib/straight-server.rb",
38
55
  "lib/straight-server/config.rb",
39
56
  "lib/straight-server/gateway.rb",
@@ -41,21 +58,29 @@ Gem::Specification.new do |s|
41
58
  "lib/straight-server/logger.rb",
42
59
  "lib/straight-server/order.rb",
43
60
  "lib/straight-server/orders_controller.rb",
61
+ "lib/straight-server/random_string.rb",
44
62
  "lib/straight-server/server.rb",
45
63
  "lib/straight-server/thread.rb",
64
+ "lib/straight-server/utils/hash_string_to_sym_keys.rb",
46
65
  "spec/.straight/config.yml",
66
+ "spec/.straight/server_secret",
47
67
  "spec/factories.rb",
68
+ "spec/fixtures/addons.yml",
69
+ "spec/fixtures/test_addon.rb",
48
70
  "spec/lib/gateway_spec.rb",
71
+ "spec/lib/initializer_spec.rb",
49
72
  "spec/lib/order_spec.rb",
50
73
  "spec/lib/orders_controller_spec.rb",
74
+ "spec/lib/utils/hash_string_to_sym_keys.rb",
51
75
  "spec/spec_helper.rb",
52
76
  "spec/support/custom_matchers.rb",
53
77
  "straight-server.gemspec",
78
+ "templates/addons.yml",
54
79
  "templates/config.yml"
55
80
  ]
56
81
  s.homepage = "http://github.com/snitko/straight-server"
57
82
  s.licenses = ["MIT"]
58
- s.rubygems_version = "2.2.2"
83
+ s.rubygems_version = "2.4.5"
59
84
  s.summary = "A Bitcoin payment gateway server: a state server for the stateless Straight library"
60
85
 
61
86
  if s.respond_to? :specification_version then
@@ -67,8 +92,9 @@ Gem::Specification.new do |s|
67
92
  s.add_runtime_dependency(%q<goliath>, [">= 0"])
68
93
  s.add_runtime_dependency(%q<faye-websocket>, [">= 0"])
69
94
  s.add_runtime_dependency(%q<sequel>, [">= 0"])
70
- s.add_runtime_dependency(%q<logmaster>, ["= 0.1.2"])
95
+ s.add_runtime_dependency(%q<logmaster>, ["= 0.1.5"])
71
96
  s.add_runtime_dependency(%q<ruby-hmac>, [">= 0"])
97
+ s.add_runtime_dependency(%q<httparty>, [">= 0"])
72
98
  s.add_development_dependency(%q<bundler>, ["~> 1.0"])
73
99
  s.add_development_dependency(%q<jeweler>, ["~> 2.0.1"])
74
100
  s.add_development_dependency(%q<github_api>, ["= 0.11.3"])
@@ -78,8 +104,9 @@ Gem::Specification.new do |s|
78
104
  s.add_dependency(%q<goliath>, [">= 0"])
79
105
  s.add_dependency(%q<faye-websocket>, [">= 0"])
80
106
  s.add_dependency(%q<sequel>, [">= 0"])
81
- s.add_dependency(%q<logmaster>, ["= 0.1.2"])
107
+ s.add_dependency(%q<logmaster>, ["= 0.1.5"])
82
108
  s.add_dependency(%q<ruby-hmac>, [">= 0"])
109
+ s.add_dependency(%q<httparty>, [">= 0"])
83
110
  s.add_dependency(%q<bundler>, ["~> 1.0"])
84
111
  s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
85
112
  s.add_dependency(%q<github_api>, ["= 0.11.3"])
@@ -90,8 +117,9 @@ Gem::Specification.new do |s|
90
117
  s.add_dependency(%q<goliath>, [">= 0"])
91
118
  s.add_dependency(%q<faye-websocket>, [">= 0"])
92
119
  s.add_dependency(%q<sequel>, [">= 0"])
93
- s.add_dependency(%q<logmaster>, ["= 0.1.2"])
120
+ s.add_dependency(%q<logmaster>, ["= 0.1.5"])
94
121
  s.add_dependency(%q<ruby-hmac>, [">= 0"])
122
+ s.add_dependency(%q<httparty>, [">= 0"])
95
123
  s.add_dependency(%q<bundler>, ["~> 1.0"])
96
124
  s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
97
125
  s.add_dependency(%q<github_api>, ["= 0.11.3"])
@@ -0,0 +1,15 @@
1
+ # This is where you put info about your addons.
2
+ #
3
+ # Addons are just modules that extend the StraightServer::Server module.
4
+ #
5
+ # Addon modules can be both rubygems or files under ~/.straight/addons/.
6
+ # If ~/.straight/addons.yml contains a 'path' key for a particular addon, then it means
7
+ # the addon is placed under the ~/.straight/addons/. If not, it is assumed it is
8
+ # already in the LOAD_PATH somehow, with rubygems for example.
9
+ #
10
+ #
11
+ # Example:
12
+ #
13
+ # payment_ui: # <- name doesn't affect anything, just shows up in the log file
14
+ # path: addons/payment_ui # <- This is unnecessary if addon is already in the LOAD_PATH
15
+ # module: PaymentUI # <- actual module should be a submodule of StraightServer::Addon
data/templates/config.yml CHANGED
@@ -2,6 +2,21 @@
2
2
  # useful when your run many gateways on the same server.
3
3
  gateways_source: config
4
4
 
5
+ environment: development
6
+
7
+ # This enabled order counting using Redis. Please see he README file for details.
8
+ # You're gonna need to install redis-server and redis rubygem on your system and provide
9
+ # redis-server connection details below.
10
+ count_orders: false
11
+
12
+ # Uncomment this if you want to use Gateway's order counters feature
13
+ # It requires redis.
14
+ #redis:
15
+ #host: localhost
16
+ #port: 6380
17
+ #db: null # change to 1, 2, 3 etc. or leave as is
18
+ #password: null # if no password is needed, leave as is
19
+
5
20
  gateways:
6
21
  default:
7
22
  pubkey: xpub-xxx # <- TODO: change this to your BIP32 pubkey
@@ -11,6 +26,18 @@ gateways:
11
26
  check_signature: false
12
27
  callback_url: 'http://localhost:3000/my_app/payment_callback'
13
28
  default_currency: 'BTC'
29
+ orders_expiration_period: 600 # seconds
30
+
31
+ # This options decides whether we should also check the DB for status updates first
32
+ # when we check order status. That is, if we're tracking an order and this option
33
+ # is set to true, it first fetches the fields from the local DB, sees if the status has changed there,
34
+ # and if it did - we no longer need to query the blockchain.
35
+ #
36
+ # Usecase? Currently mostly debugging (so set it to false for production). For example,
37
+ # when testing payments, you don't actually want to pay, you can just run the server console,
38
+ # change order status in the DB and see how your client picks it up, showing you that your
39
+ # order has been paid for.
40
+ check_order_status_in_db_first: true # Consider changing to `false` in production.
14
41
 
15
42
  # The order matters here, we check for prices with the first adapter,
16
43
  # if it fails, move on to the next
@@ -19,6 +46,20 @@ gateways:
19
46
  - Coinbase
20
47
  - Bitstamp
21
48
 
49
+ # This affects whether it is possible to create a new order with the gateway.
50
+ # If it's set to false, then it won't be possible to create a new order, but
51
+ # it will keep checking on the existing ones.
52
+ active: true
53
+
54
+ # These adapters are used to query the blockchain. If the first one fails, the second one is tried and
55
+ # so on. The adapters are generally looked up as subclasses of Straight::Blockchain::Adapter
56
+ # but you are free to create your own and put a fully qualified class name below. The order is,
57
+ # of course, important.
58
+ blockchain_adapters:
59
+ - BlockchainInfo # uses Straight::Blockchain::BlockchainInfoAdapter
60
+ - Mycelium # uses Straight::Blockchain::MyceliumAdapter
61
+ # - MyCustomClass::MyCustomBlockchainAdapter
62
+
22
63
  logmaster:
23
64
  log_level: INFO # Wise to change to WARN for production
24
65
  file: straight.log
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: straight-server
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roman Snitko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-07 00:00:00.000000000 Z
11
+ date: 2015-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: straight
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - '='
88
88
  - !ruby/object:Gem::Version
89
- version: 0.1.2
89
+ version: 0.1.5
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - '='
95
95
  - !ruby/object:Gem::Version
96
- version: 0.1.2
96
+ version: 0.1.5
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: ruby-hmac
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: httparty
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: bundler
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -154,8 +168,11 @@ description: Accepts orders via http, returns payment info via http or streams u
154
168
  via websockets, stores orders in a DB
155
169
  email: roman.snitko@gmail.com
156
170
  executables:
171
+ - goliath.log
172
+ - goliath.log_stdout.log
157
173
  - straight-console
158
174
  - straight-server
175
+ - straight-server-benchmark
159
176
  extensions: []
160
177
  extra_rdoc_files:
161
178
  - LICENSE.txt
@@ -163,18 +180,35 @@ extra_rdoc_files:
163
180
  files:
164
181
  - ".document"
165
182
  - ".rspec"
183
+ - ".travis.yml"
166
184
  - Gemfile
167
185
  - Gemfile.lock
186
+ - Gemfile.travis
168
187
  - LICENSE.txt
169
188
  - README.md
170
189
  - Rakefile
171
190
  - VERSION
191
+ - benchmark/addons.yml
192
+ - benchmark/config.yml
193
+ - benchmark/default_last_keychain_id
194
+ - benchmark/server_secret
195
+ - bin/goliath.log
196
+ - bin/goliath.log_stdout.log
172
197
  - bin/straight-console
173
198
  - bin/straight-server
199
+ - bin/straight-server-benchmark
174
200
  - db/migrations/001_create_orders.rb
175
201
  - db/migrations/002_create_gateways.rb
202
+ - db/migrations/003_add_payment_id_to_orders.rb
203
+ - db/migrations/004_add_description_to_orders.rb
204
+ - db/migrations/005_add_orders_expiration_period_to_gateways.rb
205
+ - db/migrations/006_add_check_order_status_in_db_first_to_gateways.rb
206
+ - db/migrations/007_add_active_switcher_to_gateways.rb
207
+ - db/migrations/008_add_order_counters_to_gateways.rb
208
+ - db/migrations/009_add_hashed_id_to_gateways.rb
176
209
  - examples/client/client.dart
177
210
  - examples/client/client.html
211
+ - examples/client/client.js
178
212
  - lib/straight-server.rb
179
213
  - lib/straight-server/config.rb
180
214
  - lib/straight-server/gateway.rb
@@ -182,16 +216,24 @@ files:
182
216
  - lib/straight-server/logger.rb
183
217
  - lib/straight-server/order.rb
184
218
  - lib/straight-server/orders_controller.rb
219
+ - lib/straight-server/random_string.rb
185
220
  - lib/straight-server/server.rb
186
221
  - lib/straight-server/thread.rb
222
+ - lib/straight-server/utils/hash_string_to_sym_keys.rb
187
223
  - spec/.straight/config.yml
224
+ - spec/.straight/server_secret
188
225
  - spec/factories.rb
226
+ - spec/fixtures/addons.yml
227
+ - spec/fixtures/test_addon.rb
189
228
  - spec/lib/gateway_spec.rb
229
+ - spec/lib/initializer_spec.rb
190
230
  - spec/lib/order_spec.rb
191
231
  - spec/lib/orders_controller_spec.rb
232
+ - spec/lib/utils/hash_string_to_sym_keys.rb
192
233
  - spec/spec_helper.rb
193
234
  - spec/support/custom_matchers.rb
194
235
  - straight-server.gemspec
236
+ - templates/addons.yml
195
237
  - templates/config.yml
196
238
  homepage: http://github.com/snitko/straight-server
197
239
  licenses:
@@ -213,7 +255,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
213
255
  version: '0'
214
256
  requirements: []
215
257
  rubyforge_project:
216
- rubygems_version: 2.2.2
258
+ rubygems_version: 2.4.5
217
259
  signing_key:
218
260
  specification_version: 4
219
261
  summary: 'A Bitcoin payment gateway server: a state server for the stateless Straight