contracto 0.1.0 → 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 +4 -4
- data/contracto.gemspec +1 -0
- data/lib/contracto.rb +6 -10
- data/lib/contracto/command.rb +6 -3
- data/lib/contracto/command/init.rb +24 -0
- data/lib/contracto/command/start.rb +16 -0
- data/lib/contracto/command/start/local.rb +11 -0
- data/lib/contracto/command/start/remote.rb +22 -0
- data/lib/contracto/command/stop.rb +14 -0
- data/lib/contracto/config.rb +11 -0
- data/lib/contracto/constants.rb +37 -0
- data/lib/contracto/contract.rb +32 -0
- data/lib/contracto/parser.rb +15 -0
- data/lib/contracto/server/ruby/contract.con.json +46 -0
- data/lib/contracto/server/ruby/server.rb +10 -1
- data/lib/contracto/system_action.rb +125 -0
- data/lib/contracto/system_action_chain.rb +34 -0
- data/lib/contracto/version.rb +1 -1
- data/script/start_from_remote.sh +1 -0
- data/script/start_locally.sh +1 -0
- data/spec/spec_helper.rb +52 -0
- data/spec/unit/parser_spec.rb +12 -0
- metadata +33 -10
- data/lib/contracto/installer.rb +0 -52
- data/lib/contracto/runner.rb +0 -17
- data/lib/contracto/runner/base.rb +0 -36
- data/lib/contracto/runner/local.rb +0 -5
- data/lib/contracto/runner/remote.rb +0 -29
- data/lib/contracto/server/ruby/contract.cdc.rb +0 -5
- data/lib/contracto/terminator.rb +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58f8e5bbd43d3c7f0cc80462dd1c199a6c734b57
|
4
|
+
data.tar.gz: 2d9e6e2a914a81128f0e6aea61cf1dec04451328
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d31d65158ca0e151e0e30eaa207cff7a87ef4595030770aad0e55f8f4ebc83ef4a48a286c0105ff21401a6c5460125682c3fc48b447042ef5513378551bb6c6
|
7
|
+
data.tar.gz: 0890abb491534d3f6e3c14329f2061fccf06f88a85b7d294714570f72bf0f54e4da5ec5bed6de2d435e4274047d566f390efc6d13fb5b1fc206dab30d3f356e8
|
data/contracto.gemspec
CHANGED
data/lib/contracto.rb
CHANGED
@@ -1,15 +1,11 @@
|
|
1
1
|
require_relative 'contracto/version' # TODO: replace all #require with #require_relative
|
2
2
|
|
3
3
|
module Contracto
|
4
|
-
GEM_DIR = Gem::Specification.find_by_name('contracto').gem_dir
|
5
|
-
CONTRACTO_DIR = 'contracto'
|
6
|
-
CONTRACTO_TMP_DIR = '.tmp.contracto'
|
7
|
-
RUBY_SERVER_DIR = "#{GEM_DIR}/lib/contracto/server/ruby"
|
8
|
-
CONTRACT_FILENAME = 'contract.cdc.rb'
|
9
|
-
CONTRACT_PID_FILEPATH = "#{CONTRACTO_DIR}/server.pid"
|
10
|
-
|
11
4
|
require_relative 'contracto/errors'
|
12
|
-
require_relative 'contracto/
|
13
|
-
require_relative 'contracto/
|
14
|
-
require_relative 'contracto/
|
5
|
+
require_relative 'contracto/constants'
|
6
|
+
require_relative 'contracto/config'
|
7
|
+
require_relative 'contracto/contract'
|
8
|
+
require_relative 'contracto/parser'
|
9
|
+
require_relative 'contracto/system_action_chain'
|
10
|
+
require_relative 'contracto/command'
|
15
11
|
end
|
data/lib/contracto/command.rb
CHANGED
@@ -1,14 +1,17 @@
|
|
1
1
|
class Contracto::Command
|
2
|
+
require_relative 'command/init'
|
3
|
+
require_relative 'command/start'
|
4
|
+
require_relative 'command/stop'
|
2
5
|
class << self
|
3
6
|
|
4
7
|
def run(command, args)
|
5
8
|
case command
|
6
9
|
when 'init'
|
7
|
-
Contracto::
|
10
|
+
Contracto::Command::Init.new(args).execute
|
8
11
|
when 'start'
|
9
|
-
Contracto::
|
12
|
+
Contracto::Command::Start.new(args).execute
|
10
13
|
when 'stop'
|
11
|
-
Contracto::
|
14
|
+
Contracto::Command::Stop.new(args).execute
|
12
15
|
end
|
13
16
|
end
|
14
17
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Contracto::Command::Init
|
2
|
+
def initialize(args)
|
3
|
+
end
|
4
|
+
|
5
|
+
def execute
|
6
|
+
initialized = Contracto::SystemActionChain.new(*actions).execute
|
7
|
+
|
8
|
+
if initialized
|
9
|
+
puts 'contract initialized, enter \'contracto start\' to start server'
|
10
|
+
else
|
11
|
+
puts 'initializing contract failed'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def actions
|
18
|
+
[
|
19
|
+
:remove_contracto_dir,
|
20
|
+
:copy_server_files,
|
21
|
+
:create_sample_contract
|
22
|
+
]
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Contracto::Command::Start
|
2
|
+
require_relative 'start/remote'
|
3
|
+
require_relative 'start/local'
|
4
|
+
|
5
|
+
def initialize(args)
|
6
|
+
if args.first
|
7
|
+
@strategy = Contracto::Command::Start::Remote.new(args.first)
|
8
|
+
else
|
9
|
+
@strategy = Contracto::Command::Start::Local.new
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute
|
14
|
+
@strategy.execute
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class Contracto::Command::Start::Remote
|
2
|
+
def initialize(repo_url)
|
3
|
+
Contracto::Config.repo_url = repo_url
|
4
|
+
end
|
5
|
+
|
6
|
+
def execute
|
7
|
+
puts "downloading contract from #{Contracto::Config.repo_url}"
|
8
|
+
Contracto::SystemActionChain.new(*actions).execute
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def actions
|
14
|
+
[
|
15
|
+
:clone_repo_to_tmp_contracto_dir,
|
16
|
+
:move_repo_files_to_root_dir,
|
17
|
+
:remove_tmp_contracto_dir,
|
18
|
+
:copy_server_files,
|
19
|
+
:start_server
|
20
|
+
]
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Contracto::Constants
|
2
|
+
GEM_DIR = Gem::Specification.find_by_name('contracto').gem_dir
|
3
|
+
CONTRACTO_DIR = '.contracto'
|
4
|
+
CONTRACTO_TMP_DIR = '.tmp.contracto'
|
5
|
+
RUBY_SERVER_DIR = "#{GEM_DIR}/lib/contracto/server/ruby"
|
6
|
+
CONTRACT_FILENAME = 'contract.con.json'
|
7
|
+
CONTRACT_PID_FILEPATH = "#{CONTRACTO_DIR}/server.pid"
|
8
|
+
PORT = 54321
|
9
|
+
|
10
|
+
def gem_dir
|
11
|
+
GEM_DIR
|
12
|
+
end
|
13
|
+
|
14
|
+
def contracto_dir
|
15
|
+
CONTRACTO_DIR
|
16
|
+
end
|
17
|
+
|
18
|
+
def contracto_tmp_dir
|
19
|
+
CONTRACTO_TMP_DIR
|
20
|
+
end
|
21
|
+
|
22
|
+
def ruby_server_dir
|
23
|
+
RUBY_SERVER_DIR
|
24
|
+
end
|
25
|
+
|
26
|
+
def contract_filename
|
27
|
+
CONTRACT_FILENAME
|
28
|
+
end
|
29
|
+
|
30
|
+
def contract_pid_filepath
|
31
|
+
CONTRACT_PID_FILEPATH
|
32
|
+
end
|
33
|
+
|
34
|
+
def port
|
35
|
+
PORT
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class Contracto::Contract
|
2
|
+
def initialize(hash)
|
3
|
+
@hash = hash
|
4
|
+
@request = Contracto::Contract::Request.new(@hash.fetch('request'))
|
5
|
+
end
|
6
|
+
|
7
|
+
def http_method
|
8
|
+
@request.http_method
|
9
|
+
end
|
10
|
+
|
11
|
+
def url_pattern
|
12
|
+
@request.url_pattern
|
13
|
+
end
|
14
|
+
|
15
|
+
def response_body(params)
|
16
|
+
params.to_s
|
17
|
+
end
|
18
|
+
|
19
|
+
class Contracto::Contract::Request
|
20
|
+
def initialize(hash)
|
21
|
+
@hash = hash
|
22
|
+
end
|
23
|
+
|
24
|
+
def http_method
|
25
|
+
@hash.fetch('http_method')
|
26
|
+
end
|
27
|
+
|
28
|
+
def url_pattern
|
29
|
+
@hash.fetch('path')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
class Contracto::Parser
|
4
|
+
def initialize(strings_with_json)
|
5
|
+
@json_collection = strings_with_json.map { |string| JSON.parse(string) }
|
6
|
+
end
|
7
|
+
|
8
|
+
def contracts
|
9
|
+
@json_collection.map do |json|
|
10
|
+
Array(json).map do |json|
|
11
|
+
Contracto::Contract.new(json)
|
12
|
+
end
|
13
|
+
end.flatten
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"request": {
|
4
|
+
"http_method": "get",
|
5
|
+
"path": "/users"
|
6
|
+
},
|
7
|
+
"examples": [
|
8
|
+
{
|
9
|
+
"request": {
|
10
|
+
"headers": {
|
11
|
+
"Content-Type": "application/json"
|
12
|
+
},
|
13
|
+
"body": {
|
14
|
+
"firstName": "Max",
|
15
|
+
"lastName": "Lincoln"
|
16
|
+
}
|
17
|
+
},
|
18
|
+
"response": {
|
19
|
+
"body": {}
|
20
|
+
}
|
21
|
+
}
|
22
|
+
]
|
23
|
+
},
|
24
|
+
{
|
25
|
+
"request": {
|
26
|
+
"http_method": "get",
|
27
|
+
"path": "/users/:id"
|
28
|
+
},
|
29
|
+
"examples": [
|
30
|
+
{
|
31
|
+
"request": {
|
32
|
+
"headers": {
|
33
|
+
"Content-Type": "application/json"
|
34
|
+
},
|
35
|
+
"body": {
|
36
|
+
"firstName": "Max",
|
37
|
+
"lastName": "Lincoln"
|
38
|
+
}
|
39
|
+
},
|
40
|
+
"response": {
|
41
|
+
"body": {}
|
42
|
+
}
|
43
|
+
}
|
44
|
+
]
|
45
|
+
}
|
46
|
+
]
|
@@ -1,8 +1,17 @@
|
|
1
1
|
require 'sinatra'
|
2
|
+
require 'contracto'
|
2
3
|
|
3
4
|
get '/contracto' do
|
4
5
|
"*** Contracto server is working! [#{Gem::Specification.find_by_name('contracto').version}] ***"
|
5
6
|
end
|
6
7
|
|
7
|
-
|
8
|
+
json_string = File.read Contracto::Constants::CONTRACT_FILENAME
|
9
|
+
json_strings = [json_string]
|
10
|
+
|
11
|
+
Contracto::Parser.new(json_strings).contracts.each do |contract|
|
12
|
+
send(contract.http_method, contract.url_pattern) do
|
13
|
+
contract.response_body(params)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
8
17
|
|
@@ -0,0 +1,125 @@
|
|
1
|
+
class Contracto::SystemAction
|
2
|
+
class << self
|
3
|
+
include Contracto::Constants
|
4
|
+
|
5
|
+
def remove_contracto_dir
|
6
|
+
FileUtils.rm_rf contracto_dir
|
7
|
+
end
|
8
|
+
|
9
|
+
def remove_tmp_contracto_dir
|
10
|
+
FileUtils.rm_rf contracto_tmp_dir
|
11
|
+
end
|
12
|
+
|
13
|
+
def copy_server_files
|
14
|
+
FileUtils.cp_r ruby_server_dir, contracto_tmp_dir
|
15
|
+
FileUtils.mv contracto_tmp_dir, contracto_dir
|
16
|
+
end
|
17
|
+
|
18
|
+
def revert_copy_server_files
|
19
|
+
remove_contracto_dir
|
20
|
+
remove_tmp_contracto_dir
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_sample_contract
|
24
|
+
if contract_already_exists?
|
25
|
+
puts 'contract already exists, creating sample contract skipped'
|
26
|
+
remove_sample_contract
|
27
|
+
else
|
28
|
+
FileUtils.mv sample_contract_path, FileUtils.pwd
|
29
|
+
puts "created: #{contract_filename}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def start_server
|
34
|
+
raise Contracto::ServerAlreadyRunningError if server_already_running?
|
35
|
+
|
36
|
+
system "rackup #{contracto_dir}/config.ru -p #{port} -D -P #{contract_pid_filepath}"
|
37
|
+
# TODO: loop below should terminate after n tries
|
38
|
+
system "while ! echo exit | nc localhost #{port} > /dev/null && echo \"waiting for contracto server...\"; do sleep 1; done"
|
39
|
+
test_request
|
40
|
+
end
|
41
|
+
|
42
|
+
def stop_server
|
43
|
+
puts 'killing server...'
|
44
|
+
Process.kill(15, File.read(contract_pid_filepath).to_i)
|
45
|
+
puts '...server killed'
|
46
|
+
rescue Errno::ENOENT
|
47
|
+
puts 'could not kill server (pidfile not found)'
|
48
|
+
end
|
49
|
+
|
50
|
+
def revert_start_server
|
51
|
+
stop_server
|
52
|
+
rescue StandardError
|
53
|
+
end
|
54
|
+
|
55
|
+
def clone_repo_to_tmp_contracto_dir
|
56
|
+
success = system "git clone -q --depth 1 --single-branch --branch master #{Contracto::Config.repo_url} #{contracto_tmp_dir}"
|
57
|
+
raise(Contracto::CouldNotDownloadContractError.new(Contracto::Config.repo_url)) unless success
|
58
|
+
end
|
59
|
+
|
60
|
+
def revert_clone_repo_to_tmp_contracto_dir
|
61
|
+
remove_tmp_contracto_dir
|
62
|
+
end
|
63
|
+
|
64
|
+
def move_repo_files_to_root_dir
|
65
|
+
system "mv #{contracto_tmp_dir}/* #{contracto_tmp_dir}/.[^.]* . 2> /dev/null" # Could not use FileUtils for some reason
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def contract_already_exists?
|
71
|
+
File.exist?(contract_filename)
|
72
|
+
end
|
73
|
+
|
74
|
+
def remove_sample_contract
|
75
|
+
FileUtils.rm sample_contract_path
|
76
|
+
end
|
77
|
+
|
78
|
+
def sample_contract_path
|
79
|
+
"#{contracto_dir}/#{contract_filename}"
|
80
|
+
end
|
81
|
+
|
82
|
+
def server_already_running?
|
83
|
+
test_request(silent: true)
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_request(options = {})
|
87
|
+
args = ''
|
88
|
+
args << '-s -o /dev/null' if options[:silent]
|
89
|
+
system "curl #{args} 0.0.0.0:#{port}/contracto"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
class Contracto::SystemActionChain
|
95
|
+
def initialize(*actions)
|
96
|
+
@actions = actions
|
97
|
+
@finished_actions = []
|
98
|
+
end
|
99
|
+
|
100
|
+
def execute
|
101
|
+
perform_actions and true
|
102
|
+
rescue StandardError => e
|
103
|
+
revert_actions and false
|
104
|
+
raise e
|
105
|
+
end
|
106
|
+
|
107
|
+
private
|
108
|
+
|
109
|
+
def perform_actions
|
110
|
+
@actions.each do |action|
|
111
|
+
@finished_actions << action
|
112
|
+
Contracto::SystemAction.send(action)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def revert_actions
|
117
|
+
@finished_actions.reverse.each do |action|
|
118
|
+
revert_method_name = "revert_#{action}"
|
119
|
+
if Contracto::SystemAction.respond_to? revert_method_name
|
120
|
+
Contracto::SystemAction.send revert_method_name
|
121
|
+
end
|
122
|
+
end
|
123
|
+
rescue StandardError
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class Contracto::SystemActionChain
|
2
|
+
require_relative 'system_action'
|
3
|
+
|
4
|
+
def initialize(*actions)
|
5
|
+
@actions = actions
|
6
|
+
@finished_actions = []
|
7
|
+
end
|
8
|
+
|
9
|
+
def execute
|
10
|
+
perform_actions and true
|
11
|
+
rescue StandardError => e
|
12
|
+
revert_actions and false
|
13
|
+
raise e
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def perform_actions
|
19
|
+
@actions.each do |action|
|
20
|
+
@finished_actions << action
|
21
|
+
Contracto::SystemAction.send(action)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def revert_actions
|
26
|
+
@finished_actions.reverse.each do |action|
|
27
|
+
revert_method_name = "revert_#{action}"
|
28
|
+
if Contracto::SystemAction.respond_to? revert_method_name
|
29
|
+
Contracto::SystemAction.send revert_method_name
|
30
|
+
end
|
31
|
+
end
|
32
|
+
rescue StandardError
|
33
|
+
end
|
34
|
+
end
|
data/lib/contracto/version.rb
CHANGED
data/script/start_from_remote.sh
CHANGED
data/script/start_locally.sh
CHANGED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require_relative '../lib/contracto'
|
2
|
+
|
3
|
+
STRINGS_WITH_JSON = []
|
4
|
+
STRINGS_WITH_JSON << <<JSON
|
5
|
+
{
|
6
|
+
"request": {
|
7
|
+
"http_method": "get",
|
8
|
+
"path": "/api/users"
|
9
|
+
},
|
10
|
+
"examples": [
|
11
|
+
{
|
12
|
+
"request": {
|
13
|
+
"headers": {
|
14
|
+
"Content-Type": "application/json"
|
15
|
+
},
|
16
|
+
"body": {
|
17
|
+
"firstName": "Max",
|
18
|
+
"lastName": "Lincoln"
|
19
|
+
}
|
20
|
+
},
|
21
|
+
"response": {
|
22
|
+
"body": { }
|
23
|
+
}
|
24
|
+
}
|
25
|
+
]
|
26
|
+
}
|
27
|
+
JSON
|
28
|
+
|
29
|
+
STRINGS_WITH_JSON << <<JSON
|
30
|
+
{
|
31
|
+
"request": {
|
32
|
+
"http_method": "get",
|
33
|
+
"path": "/api/users/:id"
|
34
|
+
},
|
35
|
+
"examples": [
|
36
|
+
{
|
37
|
+
"request": {
|
38
|
+
"headers": {
|
39
|
+
"Content-Type": "application/json"
|
40
|
+
},
|
41
|
+
"body": {
|
42
|
+
"firstName": "Max",
|
43
|
+
"lastName": "Lincoln"
|
44
|
+
}
|
45
|
+
},
|
46
|
+
"response": {
|
47
|
+
"body": { }
|
48
|
+
}
|
49
|
+
}
|
50
|
+
]
|
51
|
+
}
|
52
|
+
JSON
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Contracto::Parser do
|
4
|
+
context '#contracts' do
|
5
|
+
subject { described_class.new(STRINGS_WITH_JSON).contracts }
|
6
|
+
|
7
|
+
it do
|
8
|
+
expect(subject).to be_a Array
|
9
|
+
expect(subject.first).to be_a Contracto::Contract
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: contracto
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kacper Walanus
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sinatra
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.4'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.2'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.2'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -69,19 +83,26 @@ files:
|
|
69
83
|
- contracto.gemspec
|
70
84
|
- lib/contracto.rb
|
71
85
|
- lib/contracto/command.rb
|
86
|
+
- lib/contracto/command/init.rb
|
87
|
+
- lib/contracto/command/start.rb
|
88
|
+
- lib/contracto/command/start/local.rb
|
89
|
+
- lib/contracto/command/start/remote.rb
|
90
|
+
- lib/contracto/command/stop.rb
|
91
|
+
- lib/contracto/config.rb
|
92
|
+
- lib/contracto/constants.rb
|
93
|
+
- lib/contracto/contract.rb
|
72
94
|
- lib/contracto/errors.rb
|
73
|
-
- lib/contracto/
|
74
|
-
- lib/contracto/runner.rb
|
75
|
-
- lib/contracto/runner/base.rb
|
76
|
-
- lib/contracto/runner/local.rb
|
77
|
-
- lib/contracto/runner/remote.rb
|
95
|
+
- lib/contracto/parser.rb
|
78
96
|
- lib/contracto/server/ruby/config.ru
|
79
|
-
- lib/contracto/server/ruby/contract.
|
97
|
+
- lib/contracto/server/ruby/contract.con.json
|
80
98
|
- lib/contracto/server/ruby/server.rb
|
81
|
-
- lib/contracto/
|
99
|
+
- lib/contracto/system_action.rb
|
100
|
+
- lib/contracto/system_action_chain.rb
|
82
101
|
- lib/contracto/version.rb
|
83
102
|
- script/start_from_remote.sh
|
84
103
|
- script/start_locally.sh
|
104
|
+
- spec/spec_helper.rb
|
105
|
+
- spec/unit/parser_spec.rb
|
85
106
|
homepage: ''
|
86
107
|
licenses:
|
87
108
|
- MIT
|
@@ -106,4 +127,6 @@ rubygems_version: 2.4.6
|
|
106
127
|
signing_key:
|
107
128
|
specification_version: 4
|
108
129
|
summary: XXX
|
109
|
-
test_files:
|
130
|
+
test_files:
|
131
|
+
- spec/spec_helper.rb
|
132
|
+
- spec/unit/parser_spec.rb
|
data/lib/contracto/installer.rb
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
|
3
|
-
class Contracto::Installer
|
4
|
-
def initialize(args)
|
5
|
-
end
|
6
|
-
|
7
|
-
def execute
|
8
|
-
remove_old_dir
|
9
|
-
cp_server_files
|
10
|
-
if contract_already_exists?
|
11
|
-
remove_sample_contract_file
|
12
|
-
else
|
13
|
-
create_contract
|
14
|
-
end
|
15
|
-
puts 'contracto initialized'
|
16
|
-
puts "start writing contracts in #{Contracto::CONTRACT_FILENAME}"
|
17
|
-
rescue
|
18
|
-
revert
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def remove_old_dir
|
24
|
-
FileUtils.rm_rf Contracto::CONTRACTO_DIR
|
25
|
-
end
|
26
|
-
|
27
|
-
def cp_server_files
|
28
|
-
FileUtils.cp_r Contracto::RUBY_SERVER_DIR, Contracto::CONTRACTO_TMP_DIR
|
29
|
-
FileUtils.mv Contracto::CONTRACTO_TMP_DIR, Contracto::CONTRACTO_DIR
|
30
|
-
end
|
31
|
-
|
32
|
-
def create_contract
|
33
|
-
FileUtils.mv sample_contract_path, FileUtils.pwd
|
34
|
-
puts "created: #{installer.CONTRACT_FILENAME}"
|
35
|
-
end
|
36
|
-
|
37
|
-
def contract_already_exists?
|
38
|
-
File.exist? Contracto::CONTRACT_FILENAME
|
39
|
-
end
|
40
|
-
|
41
|
-
def remove_sample_contract_file
|
42
|
-
FileUtils.rm sample_contract_path
|
43
|
-
end
|
44
|
-
|
45
|
-
def sample_contract_path
|
46
|
-
"#{Contracto::CONTRACTO_DIR}/#{Contracto::CONTRACT_FILENAME}"
|
47
|
-
end
|
48
|
-
|
49
|
-
def revert
|
50
|
-
# TODO: implement
|
51
|
-
end
|
52
|
-
end
|
data/lib/contracto/runner.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
class Contracto::Runner
|
2
|
-
require_relative 'runner/base'
|
3
|
-
require_relative 'runner/remote'
|
4
|
-
require_relative 'runner/local'
|
5
|
-
|
6
|
-
def initialize(args)
|
7
|
-
if args.first
|
8
|
-
@strategy = Contracto::Runner::Remote.new(args)
|
9
|
-
else
|
10
|
-
@strategy = Contracto::Runner::Local.new(args)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def execute
|
15
|
-
@strategy.execute
|
16
|
-
end
|
17
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
class Contracto::Runner::Base
|
2
|
-
PORT = 54321
|
3
|
-
|
4
|
-
def initialize(args)
|
5
|
-
@args = args
|
6
|
-
end
|
7
|
-
|
8
|
-
def execute
|
9
|
-
raise NotImplementedError
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def start_server
|
15
|
-
raise Contracto::ServerAlreadyRunningError if server_already_running?
|
16
|
-
|
17
|
-
system "rackup #{Contracto::CONTRACTO_DIR}/config.ru -p #{PORT} -D -P #{Contracto::CONTRACT_PID_FILEPATH}"
|
18
|
-
# TODO: loop below should terminate after n tries
|
19
|
-
system "while ! echo exit | nc localhost #{PORT} > /dev/null && echo \"waiting for contracto server...\"; do sleep 1; done"
|
20
|
-
test_request
|
21
|
-
end
|
22
|
-
|
23
|
-
def server_already_running?
|
24
|
-
test_request(silent: true)
|
25
|
-
end
|
26
|
-
|
27
|
-
def test_request(options = {})
|
28
|
-
args = ''
|
29
|
-
args << '-s -o /dev/null' if options[:silent]
|
30
|
-
system "curl #{args} 0.0.0.0:#{PORT}/contracto"
|
31
|
-
end
|
32
|
-
|
33
|
-
def server_repo_url
|
34
|
-
@args.first
|
35
|
-
end
|
36
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
class Contracto::Runner::Remote < Contracto::Runner::Base
|
2
|
-
require 'fileutils'
|
3
|
-
|
4
|
-
def execute
|
5
|
-
puts 'downloading contract...'
|
6
|
-
clone_repo || raise(Contracto::CouldNotDownloadContractError.new(server_repo_url))
|
7
|
-
mv_repo_files_to_current_dir
|
8
|
-
remove_old_repo_dir
|
9
|
-
start_server
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def clone_repo
|
15
|
-
system "git clone -q --depth 1 --single-branch --branch master #{server_repo_url} #{tmp_dir}"
|
16
|
-
end
|
17
|
-
|
18
|
-
def mv_repo_files_to_current_dir
|
19
|
-
system "mv #{tmp_dir}/* #{tmp_dir}/.[^.]* . 2> /dev/null" # Could not use FileUtils for some reason
|
20
|
-
end
|
21
|
-
|
22
|
-
def remove_old_repo_dir
|
23
|
-
FileUtils.rm_rf tmp_dir
|
24
|
-
end
|
25
|
-
|
26
|
-
def tmp_dir
|
27
|
-
Contracto::CONTRACTO_TMP_DIR
|
28
|
-
end
|
29
|
-
end
|