factor 0.5.05 → 0.5.06
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +8 -0
- data/Gemfile.lock +2 -2
- data/LICENSE +21 -0
- data/Rakefile +9 -2
- data/factor.gemspec +18 -15
- data/lib/commands/base.rb +11 -17
- data/lib/commands/workflows.rb +4 -7
- data/lib/factor.rb +19 -2
- data/lib/factor/version.rb +1 -1
- data/lib/listener.rb +5 -9
- data/lib/runtime.rb +12 -27
- data/lib/websocket_manager.rb +72 -72
- data/spec/base_spec.rb +105 -0
- data/spec/listener_spec.rb +9 -0
- data/spec/spec_helper.rb +28 -0
- data/spec/workflow_spec.rb +11 -0
- metadata +18 -31
- data/lib/cli.rb +0 -21
- data/lib/factor/base.rb +0 -17
- data/spec/rspec_helper.rb +0 -2
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: bddfffa82901828336ac74f9e5d7e4a36b6e7f7a
|
4
|
+
data.tar.gz: c59c12d7fcc496dc86913fdb3700ffd643a6b833
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 603c84c45c762bd51b582bef876c0a5a3e8284c0967f8af863a504fcbec93975eab9857375c5a536eaa53a1866d1f71344fd4ce104705bae36401d1398ebf551
|
7
|
+
data.tar.gz: 016fcc9526e20f0550a5bc92c1dce3c00bdfdc44da357647646db8ac9d5e356d7f5dbaffb50667500a0370086188c1cdcfb72c6adac819824ba1e1f41e8d3122
|
data/.travis.yml
CHANGED
@@ -4,3 +4,11 @@ rvm:
|
|
4
4
|
env:
|
5
5
|
matrix:
|
6
6
|
secure: Tq2/ECBrOTUmGLk/IaoeukgjCZ3ZfBVvAh8rvX6c2GJ0MopTXbWGRAaOxK+CXPqEW1X3NCtvJx26ti+QiXfEufACHllfYFpGeD9+AEreDyyFjA10X4/vgh5k4EiFP7p+3VAj8N1i2/+H5554IRxJgmhWNR7iATOavRf7g05nfec=
|
7
|
+
deploy:
|
8
|
+
provider: rubygems
|
9
|
+
api_key:
|
10
|
+
secure: EVy47RrKK9cntDCXnc+akDp51TwsOl9saXvELArQSUOVsY3CaPhnvd1KPFW/EJoJ3OQiDG8xiR1j8sMn8ldwjSdjQ64q66eEMQBBSQBnwxDqv2vZbCZYcAu9MQpQfX1LdY5E2wvkos5nB1/d138wWoXzD2Ylvlf15YI7CxiV/hA=
|
11
|
+
gem: factor
|
12
|
+
on:
|
13
|
+
tags: true
|
14
|
+
repo: factor-io/factor
|
data/Gemfile.lock
CHANGED
@@ -11,7 +11,7 @@ PATH
|
|
11
11
|
GEM
|
12
12
|
remote: https://rubygems.org/
|
13
13
|
specs:
|
14
|
-
codeclimate-test-reporter (0.
|
14
|
+
codeclimate-test-reporter (0.4.0)
|
15
15
|
simplecov (>= 0.7.1, < 1.0.0)
|
16
16
|
colored (1.2)
|
17
17
|
commander (4.2.0)
|
@@ -52,7 +52,7 @@ PLATFORMS
|
|
52
52
|
ruby
|
53
53
|
|
54
54
|
DEPENDENCIES
|
55
|
-
codeclimate-test-reporter (~> 0.
|
55
|
+
codeclimate-test-reporter (~> 0.4.0)
|
56
56
|
factor!
|
57
57
|
rake (~> 10.3.2)
|
58
58
|
rspec (~> 3.0.0)
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) {{{year}}} {{{fullname}}}
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/Rakefile
CHANGED
@@ -1,5 +1,12 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'bundler/gem_tasks'
|
1
4
|
require 'rspec/core/rake_task'
|
2
5
|
|
3
|
-
|
6
|
+
desc 'Run specs'
|
7
|
+
RSpec::Core::RakeTask.new do |t|
|
8
|
+
t.verbose = false
|
9
|
+
t.rspec_opts = '--color --order random'
|
10
|
+
end
|
4
11
|
|
5
|
-
task :
|
12
|
+
task default: :spec
|
data/factor.gemspec
CHANGED
@@ -1,27 +1,30 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# encoding: UTF-8
|
2
|
+
$LOAD_PATH.push File.expand_path('../lib', __FILE__)
|
3
|
+
require 'factor/version'
|
3
4
|
|
4
|
-
|
5
|
-
s.name =
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'factor'
|
6
7
|
s.version = Factor::VERSION
|
7
8
|
s.platform = Gem::Platform::RUBY
|
8
|
-
s.authors = [
|
9
|
-
s.email = [
|
10
|
-
s.homepage =
|
11
|
-
s.summary =
|
12
|
-
s.description =
|
9
|
+
s.authors = ['Maciej Skierkowski']
|
10
|
+
s.email = ['maciej@factor.io']
|
11
|
+
s.homepage = 'https://factor.io'
|
12
|
+
s.summary = 'CLI to manager workflows on Factor.io'
|
13
|
+
s.description = 'CLI to manager workflows on Factor.io'
|
13
14
|
|
14
|
-
s.files =
|
15
|
-
s.test_files =
|
16
|
-
s.executables =
|
17
|
-
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map do |f|
|
18
|
+
File.basename(f)
|
19
|
+
end
|
20
|
+
s.require_paths = ['lib']
|
18
21
|
|
19
22
|
s.add_runtime_dependency 'commander', '~> 4.2.0'
|
20
23
|
s.add_runtime_dependency 'rest_client', '~> 1.7.3'
|
21
24
|
s.add_runtime_dependency 'faye-websocket', '~> 0.7.4'
|
22
25
|
s.add_runtime_dependency 'colored', '~> 1.2'
|
23
26
|
s.add_runtime_dependency 'configatron', '~> 4.2.0'
|
24
|
-
s.add_development_dependency 'codeclimate-test-reporter', '~> 0.
|
27
|
+
s.add_development_dependency 'codeclimate-test-reporter', '~> 0.4.0'
|
25
28
|
s.add_development_dependency 'rspec', '~> 3.0.0'
|
26
29
|
s.add_development_dependency 'rake', '~> 10.3.2'
|
27
|
-
|
30
|
+
end
|
data/lib/commands/base.rb
CHANGED
@@ -7,7 +7,6 @@ require 'fileutils'
|
|
7
7
|
|
8
8
|
module Factor
|
9
9
|
module Commands
|
10
|
-
|
11
10
|
# Base command with common methods used by all commands
|
12
11
|
class Command
|
13
12
|
DEFAULT_FILENAME = {
|
@@ -33,9 +32,6 @@ module Factor
|
|
33
32
|
log_line :success, options
|
34
33
|
end
|
35
34
|
|
36
|
-
def debug(options = {})
|
37
|
-
end
|
38
|
-
|
39
35
|
def exception(message, exception)
|
40
36
|
error 'message' => message
|
41
37
|
error 'message' => " #{exception.message}"
|
@@ -54,11 +50,11 @@ module Factor
|
|
54
50
|
def load_config_data(config_type, options = {})
|
55
51
|
relative_path = options[config_type] || DEFAULT_FILENAME[config_type]
|
56
52
|
absolute_path = File.expand_path(relative_path)
|
57
|
-
info message: "Loading #{config_type
|
53
|
+
info message: "Loading #{config_type} from #{absolute_path}"
|
58
54
|
data = YAML.load(File.read(absolute_path))
|
59
55
|
configatron[config_type].configure_from_hash(data)
|
60
56
|
rescue => ex
|
61
|
-
exception "Couldn't load #{config_type
|
57
|
+
exception "Couldn't load #{config_type} from #{absolute_path}", ex
|
62
58
|
end
|
63
59
|
|
64
60
|
def log_line(section, options = {})
|
@@ -81,19 +77,17 @@ module Factor
|
|
81
77
|
end
|
82
78
|
|
83
79
|
def tag(options)
|
84
|
-
|
85
|
-
if options['
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
end
|
92
|
-
tag
|
80
|
+
primary = options['service_id'] || options['instance_id']
|
81
|
+
secondary = if options['service_id'] && options['instance_id']
|
82
|
+
":#{options['instane_id']}"
|
83
|
+
else
|
84
|
+
''
|
85
|
+
end
|
86
|
+
primary ? "[#{primary}#{secondary}]" : ''
|
93
87
|
end
|
94
88
|
|
95
89
|
def time
|
96
|
-
|
90
|
+
Time.now.localtime.strftime('%m/%d/%y %T.%L')
|
97
91
|
end
|
98
92
|
|
99
93
|
def write(message)
|
@@ -103,4 +97,4 @@ module Factor
|
|
103
97
|
end
|
104
98
|
end
|
105
99
|
end
|
106
|
-
end
|
100
|
+
end
|
data/lib/commands/workflows.rb
CHANGED
@@ -7,15 +7,13 @@ require 'runtime'
|
|
7
7
|
|
8
8
|
module Factor
|
9
9
|
module Commands
|
10
|
-
|
11
10
|
# Workflow is a Command to start the factor runtime from the CLI
|
12
11
|
class Workflow < Factor::Commands::Command
|
13
|
-
|
14
12
|
def initialize
|
15
13
|
@workflows = {}
|
16
14
|
end
|
17
15
|
|
18
|
-
def server(
|
16
|
+
def server(_args, options)
|
19
17
|
config_settings = {}
|
20
18
|
config_settings[:credentials] = options.credentials
|
21
19
|
config_settings[:connectors] = options.connectors
|
@@ -46,7 +44,7 @@ module Factor
|
|
46
44
|
def block_until_interupt
|
47
45
|
log_message 'status' => 'info', 'message' => 'Ctrl-c to exit'
|
48
46
|
begin
|
49
|
-
|
47
|
+
loop do
|
50
48
|
sleep 1
|
51
49
|
end
|
52
50
|
rescue Interrupt
|
@@ -75,7 +73,7 @@ module Factor
|
|
75
73
|
connector_settings = configatron.connectors.to_hash
|
76
74
|
credential_settings = configatron.credentials.to_hash
|
77
75
|
runtime = Runtime.new(connector_settings, credential_settings)
|
78
|
-
runtime.logger =
|
76
|
+
runtime.logger = method(:log_message)
|
79
77
|
rescue => ex
|
80
78
|
message = "Couldn't setup workflow process for #{workflow_filename}"
|
81
79
|
exception message, ex
|
@@ -106,10 +104,9 @@ module Factor
|
|
106
104
|
when 'info' then info message_info
|
107
105
|
when 'success' then success message_info
|
108
106
|
when 'warn' then warn message_info
|
109
|
-
when 'debug' then debug message_info
|
110
107
|
else error message_info
|
111
108
|
end
|
112
109
|
end
|
113
110
|
end
|
114
111
|
end
|
115
|
-
end
|
112
|
+
end
|
data/lib/factor.rb
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'commander/import'
|
4
|
+
|
4
5
|
require 'factor/version'
|
5
|
-
require '
|
6
|
+
require 'commands/workflows'
|
7
|
+
|
8
|
+
program :name, 'Factor.io Server'
|
9
|
+
program :version, Factor::VERSION
|
10
|
+
program :description, 'Factor.io Server to run workflows'
|
11
|
+
|
12
|
+
command 'server' do |c|
|
13
|
+
c.syntax = 'factor server [options]'
|
14
|
+
c.description = 'Start the Factor.io Server in the current local directory'
|
15
|
+
c.option '--log FILE', String, 'Log file path. Default is stdout.'
|
16
|
+
c.option '--credentials FILE', String, 'credentials.yml file path.'
|
17
|
+
c.option '--connectors FILE', String, 'connectors.yml file path'
|
18
|
+
c.option '--path FILE', String, 'Path to workflows'
|
19
|
+
c.when_called Factor::Commands::Workflow, :server
|
20
|
+
end
|
21
|
+
|
22
|
+
alias_command 's', 'server'
|
data/lib/factor/version.rb
CHANGED
data/lib/listener.rb
CHANGED
@@ -4,10 +4,8 @@ require 'rest_client'
|
|
4
4
|
require 'websocket_manager'
|
5
5
|
|
6
6
|
module Factor
|
7
|
-
|
8
7
|
# Class Listener for integrating with connector service
|
9
8
|
class Listener
|
10
|
-
|
11
9
|
def initialize(url)
|
12
10
|
@url = url
|
13
11
|
end
|
@@ -16,14 +14,12 @@ module Factor
|
|
16
14
|
get("#{@url}/definition")
|
17
15
|
end
|
18
16
|
|
19
|
-
def listener(listener_id
|
20
|
-
|
21
|
-
ws
|
17
|
+
def listener(listener_id)
|
18
|
+
listen("#{@url}/listeners/#{listener_id}")
|
22
19
|
end
|
23
20
|
|
24
|
-
def action(action_id
|
25
|
-
|
26
|
-
ws
|
21
|
+
def action(action_id)
|
22
|
+
listen("#{@url}/actions/#{action_id}")
|
27
23
|
end
|
28
24
|
|
29
25
|
private
|
@@ -45,4 +41,4 @@ module Factor
|
|
45
41
|
WebSocketManager.new(uri_path)
|
46
42
|
end
|
47
43
|
end
|
48
|
-
end
|
44
|
+
end
|
data/lib/runtime.rb
CHANGED
@@ -6,6 +6,7 @@ require 'yaml'
|
|
6
6
|
require 'eventmachine'
|
7
7
|
require 'uri'
|
8
8
|
require 'faye/websocket'
|
9
|
+
require 'ostruct'
|
9
10
|
|
10
11
|
require 'listener'
|
11
12
|
require 'commands/base'
|
@@ -41,24 +42,17 @@ module Factor
|
|
41
42
|
|
42
43
|
def load(workflow_definition)
|
43
44
|
EM.run do
|
44
|
-
|
45
|
+
instance_eval(workflow_definition)
|
45
46
|
end
|
46
47
|
end
|
47
48
|
|
48
|
-
def
|
49
|
-
|
50
|
-
@name = value if @key == 'name'
|
51
|
-
@id = value if @key == 'id'
|
52
|
-
@description = value if @key == 'description'
|
53
|
-
end
|
54
|
-
|
55
|
-
def listen(service_id, listener_id, params = {}, &block)
|
56
|
-
|
49
|
+
def listen(service_ref, params = {}, &block)
|
50
|
+
service_id, listener_id = service_ref.split('::')
|
57
51
|
ws = @connectors[service_id.to_sym].listener(listener_id)
|
58
52
|
|
59
53
|
handle_on_open(service_id, listener_id, 'Listener', ws, params)
|
60
54
|
|
61
|
-
ws.on :close do
|
55
|
+
ws.on :close do
|
62
56
|
error 'Listener disconnected'
|
63
57
|
if @reconnect
|
64
58
|
warn 'Reconnecting...'
|
@@ -73,7 +67,7 @@ module Factor
|
|
73
67
|
when'start_workflow'
|
74
68
|
success "Workflow '#{service_id}::#{listener_id}' triggered"
|
75
69
|
error_handle_call(listener_response, &block)
|
76
|
-
when '
|
70
|
+
when 'return'
|
77
71
|
success "Workflow '#{service_id}::#{listener_id}' started"
|
78
72
|
when 'fail'
|
79
73
|
error "Workflow '#{service_id}::#{listener_id}' failed to start"
|
@@ -105,12 +99,13 @@ module Factor
|
|
105
99
|
@sockets << ws
|
106
100
|
end
|
107
101
|
|
108
|
-
def run(
|
102
|
+
def run(service_ref, params = {}, &block)
|
103
|
+
service_id, action_id = service_ref.split('::')
|
109
104
|
ws = @connectors[service_id.to_sym].action(action_id)
|
110
105
|
|
111
106
|
handle_on_open(service_id, action_id, 'Action', ws, params)
|
112
107
|
|
113
|
-
ws.on :error do
|
108
|
+
ws.on :error do
|
114
109
|
error 'Connection dropped while calling action'
|
115
110
|
end
|
116
111
|
|
@@ -141,7 +136,7 @@ module Factor
|
|
141
136
|
private
|
142
137
|
|
143
138
|
def handle_on_open(service_id, action_id, dsl_type, ws, params)
|
144
|
-
ws.on :open do
|
139
|
+
ws.on :open do
|
145
140
|
params.merge!(@credentials[service_id.to_sym] || {})
|
146
141
|
success "#{dsl_type.capitalize} '#{service_id}::#{action_id}' called"
|
147
142
|
ws.send(params.to_json)
|
@@ -149,7 +144,7 @@ module Factor
|
|
149
144
|
end
|
150
145
|
|
151
146
|
def error_handle_call(listener_response, &block)
|
152
|
-
block.call(listener_response['payload']) if block
|
147
|
+
block.call(OpenStruct.new(listener_response['payload'])) if block
|
153
148
|
rescue => ex
|
154
149
|
error "Error in workflow definition: #{ex.message}"
|
155
150
|
ex.backtrace.each do |line|
|
@@ -178,15 +173,5 @@ module Factor
|
|
178
173
|
message_info['workflow_id'] = @id
|
179
174
|
@logger.call(message_info) if @logger
|
180
175
|
end
|
181
|
-
|
182
|
-
def define_method_in_class(class_ref, class_id, method_id, &block)
|
183
|
-
class_name = class_id.classify
|
184
|
-
method_name = method_id.underscore
|
185
|
-
class_ref.class.instance_eval do
|
186
|
-
define_method(method_name) do |params = {}, &passed_block|
|
187
|
-
block.call(class_name, method_name, params, &passed_block)
|
188
|
-
end
|
189
|
-
end
|
190
|
-
end
|
191
176
|
end
|
192
|
-
end
|
177
|
+
end
|
data/lib/websocket_manager.rb
CHANGED
@@ -3,92 +3,92 @@
|
|
3
3
|
require 'faye/websocket'
|
4
4
|
require 'uri'
|
5
5
|
|
6
|
-
|
7
|
-
class
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
def open
|
21
|
-
if closed?
|
22
|
-
@state = :opening
|
23
|
-
connect
|
6
|
+
module Factor
|
7
|
+
# class for managing the web socket connections
|
8
|
+
class WebSocketManager
|
9
|
+
attr_accessor :keep_open, :events, :state
|
10
|
+
|
11
|
+
def initialize(uri, headers = {})
|
12
|
+
u = URI(uri)
|
13
|
+
@uri = u.to_s
|
14
|
+
@settings = { ping: 10, retry: 5 }
|
15
|
+
@settings[:headers] = headers if headers && headers != {}
|
16
|
+
@state = :closed
|
17
|
+
@events = {}
|
24
18
|
end
|
25
|
-
@state
|
26
|
-
end
|
27
19
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
20
|
+
def open
|
21
|
+
if closed?
|
22
|
+
@state = :opening
|
23
|
+
connect
|
24
|
+
end
|
25
|
+
@state
|
32
26
|
end
|
33
|
-
@state
|
34
|
-
end
|
35
|
-
|
36
|
-
def on(event, &block)
|
37
|
-
@events[event] = block
|
38
|
-
end
|
39
27
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
def closed?
|
49
|
-
@state == :closed
|
50
|
-
end
|
28
|
+
def close
|
29
|
+
if open?
|
30
|
+
@state = :closing
|
31
|
+
@ws.close
|
32
|
+
end
|
33
|
+
@state
|
34
|
+
end
|
51
35
|
|
52
|
-
|
53
|
-
|
54
|
-
|
36
|
+
def on(event, &block)
|
37
|
+
@events[event] = block
|
38
|
+
end
|
55
39
|
|
56
|
-
|
57
|
-
|
58
|
-
|
40
|
+
def open?
|
41
|
+
@state == :open
|
42
|
+
end
|
59
43
|
|
60
|
-
|
44
|
+
def opening?
|
45
|
+
@state == :opening
|
46
|
+
end
|
61
47
|
|
62
|
-
|
63
|
-
|
64
|
-
|
48
|
+
def closed?
|
49
|
+
@state == :closed
|
50
|
+
end
|
65
51
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
@ws = Faye::WebSocket::Client.new(@uri, nil, @settings)
|
52
|
+
def closing?
|
53
|
+
@state == :closing
|
54
|
+
end
|
70
55
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
end
|
56
|
+
def send(msg)
|
57
|
+
@ws.send(msg)
|
58
|
+
end
|
75
59
|
|
76
|
-
|
77
|
-
call_event :message, msg
|
78
|
-
end
|
60
|
+
private
|
79
61
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
end
|
62
|
+
def call_event(event, data)
|
63
|
+
@events[event].call(data) if @events[event]
|
64
|
+
end
|
84
65
|
|
85
|
-
|
86
|
-
|
66
|
+
def connect
|
67
|
+
EM.run do
|
68
|
+
begin
|
69
|
+
@ws = Faye::WebSocket::Client.new(@uri, nil, @settings)
|
70
|
+
|
71
|
+
@ws.on :close do |event|
|
72
|
+
@state = :closed
|
73
|
+
call_event :close, event
|
74
|
+
end
|
75
|
+
|
76
|
+
@ws.on :message do |msg|
|
77
|
+
call_event :message, msg
|
78
|
+
end
|
79
|
+
|
80
|
+
@ws.on :open do |event|
|
81
|
+
@state = :open
|
82
|
+
call_event :open, event
|
83
|
+
end
|
84
|
+
|
85
|
+
@ws.on :error do |event|
|
86
|
+
call_event :error, event
|
87
|
+
end
|
88
|
+
rescue => ex
|
89
|
+
call_event :fail, ex.message
|
87
90
|
end
|
88
|
-
rescue => ex
|
89
|
-
call_event :fail, ex.message
|
90
91
|
end
|
91
92
|
end
|
92
93
|
end
|
93
|
-
|
94
|
-
end
|
94
|
+
end
|
data/spec/base_spec.rb
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'tempfile'
|
5
|
+
require 'yaml'
|
6
|
+
require 'commander'
|
7
|
+
|
8
|
+
describe Factor::Commands::Command do
|
9
|
+
before :each do
|
10
|
+
@command = Factor::Commands::Command.new
|
11
|
+
end
|
12
|
+
|
13
|
+
output_methods = %w(info warn error success)
|
14
|
+
|
15
|
+
output_methods.each do |method_name|
|
16
|
+
describe ".#{method_name}" do
|
17
|
+
it "logs #{method_name}" do
|
18
|
+
|
19
|
+
test_string = 'Hello World'
|
20
|
+
output = capture_stdout do
|
21
|
+
@command.method(method_name.to_sym).call message: test_string
|
22
|
+
end
|
23
|
+
|
24
|
+
expect(output).to include(test_string)
|
25
|
+
expect(output).to include(method_name.upcase)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '.exception' do
|
31
|
+
it 'logs exception' do
|
32
|
+
|
33
|
+
test_string = 'Hello World'
|
34
|
+
exception_string = 'Something be busted'
|
35
|
+
output = capture_stdout do
|
36
|
+
begin
|
37
|
+
fail ArgumentError, exception_string
|
38
|
+
rescue => ex
|
39
|
+
@command.exception test_string, ex
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
expect(output).to include(test_string)
|
44
|
+
expect(output).to include(exception_string)
|
45
|
+
expect(output).to include('ERROR')
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '.load_config' do
|
51
|
+
it 'can load credentials and connectors' do
|
52
|
+
credentials_file = Tempfile.new('credentials')
|
53
|
+
connectors_file = Tempfile.new('connectors')
|
54
|
+
|
55
|
+
credentials_content = {
|
56
|
+
'github' => {
|
57
|
+
'api_key' => 'fake_github_key'
|
58
|
+
},
|
59
|
+
'heroku' => {
|
60
|
+
'api_key' => 'fake_heroku_key'
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
connectors_content = {
|
65
|
+
'timer' => 'http://localhost:9294/v0.4/timer',
|
66
|
+
'web' => 'http://localhost:9294/v0.4/web',
|
67
|
+
'github' => 'http://localhost:9294/v0.4/github',
|
68
|
+
'heroku' => 'http://localhost:9294/v0.4/heroku'
|
69
|
+
}
|
70
|
+
|
71
|
+
credentials_file.write(YAML.dump(credentials_content))
|
72
|
+
connectors_file.write(YAML.dump(connectors_content))
|
73
|
+
|
74
|
+
credentials_file.rewind
|
75
|
+
connectors_file.rewind
|
76
|
+
|
77
|
+
options = Commander::Command::Options.new
|
78
|
+
options.credentials = credentials_file.path
|
79
|
+
options.connectors = connectors_file.path
|
80
|
+
|
81
|
+
config_settings = {
|
82
|
+
credentials: options.credentials,
|
83
|
+
connectors: options.connectors
|
84
|
+
}
|
85
|
+
|
86
|
+
output = capture_stdout do
|
87
|
+
@command.load_config config_settings
|
88
|
+
end
|
89
|
+
|
90
|
+
expect(output).to include('Loading credentials')
|
91
|
+
expect(output).to include('Loading connectors')
|
92
|
+
|
93
|
+
expect(configatron.credentials.github.api_key).to eq('fake_github_key')
|
94
|
+
expect(configatron.credentials.heroku.api_key).to eq('fake_heroku_key')
|
95
|
+
connectors_content.keys.each do |expected_connector_key|
|
96
|
+
actual_connector = configatron.connectors[expected_connector_key]
|
97
|
+
expected_connector = connectors_content[expected_connector_key]
|
98
|
+
expect(actual_connector).to eq(expected_connector)
|
99
|
+
end
|
100
|
+
|
101
|
+
credentials_file.close
|
102
|
+
connectors_file.close
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'codeclimate-test-reporter'
|
4
|
+
require 'stringio'
|
5
|
+
|
6
|
+
CodeClimate::TestReporter.start do
|
7
|
+
add_filter '/spec/'
|
8
|
+
end
|
9
|
+
|
10
|
+
# include anything that could be tested
|
11
|
+
require 'commands/base'
|
12
|
+
require 'commands/workflows'
|
13
|
+
require 'listener'
|
14
|
+
require 'runtime'
|
15
|
+
require 'websocket_manager'
|
16
|
+
|
17
|
+
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
|
18
|
+
|
19
|
+
def capture_stdout(&_block)
|
20
|
+
original_stdout = $stdout
|
21
|
+
$stdout = fake = StringIO.new
|
22
|
+
begin
|
23
|
+
yield
|
24
|
+
ensure
|
25
|
+
$stdout = original_stdout
|
26
|
+
end
|
27
|
+
fake.string
|
28
|
+
end
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: factor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
5
|
-
prerelease:
|
4
|
+
version: 0.5.06
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Maciej Skierkowski
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2014-
|
11
|
+
date: 2014-08-31 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: commander
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ~>
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,7 +27,6 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rest_client
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ~>
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ~>
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,7 +41,6 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: faye-websocket
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
45
|
- - ~>
|
52
46
|
- !ruby/object:Gem::Version
|
@@ -54,7 +48,6 @@ dependencies:
|
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
52
|
- - ~>
|
60
53
|
- !ruby/object:Gem::Version
|
@@ -62,7 +55,6 @@ dependencies:
|
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: colored
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
59
|
- - ~>
|
68
60
|
- !ruby/object:Gem::Version
|
@@ -70,7 +62,6 @@ dependencies:
|
|
70
62
|
type: :runtime
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
66
|
- - ~>
|
76
67
|
- !ruby/object:Gem::Version
|
@@ -78,7 +69,6 @@ dependencies:
|
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: configatron
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
73
|
- - ~>
|
84
74
|
- !ruby/object:Gem::Version
|
@@ -86,7 +76,6 @@ dependencies:
|
|
86
76
|
type: :runtime
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
80
|
- - ~>
|
92
81
|
- !ruby/object:Gem::Version
|
@@ -94,23 +83,20 @@ dependencies:
|
|
94
83
|
- !ruby/object:Gem::Dependency
|
95
84
|
name: codeclimate-test-reporter
|
96
85
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
86
|
requirements:
|
99
87
|
- - ~>
|
100
88
|
- !ruby/object:Gem::Version
|
101
|
-
version: 0.
|
89
|
+
version: 0.4.0
|
102
90
|
type: :development
|
103
91
|
prerelease: false
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
93
|
requirements:
|
107
94
|
- - ~>
|
108
95
|
- !ruby/object:Gem::Version
|
109
|
-
version: 0.
|
96
|
+
version: 0.4.0
|
110
97
|
- !ruby/object:Gem::Dependency
|
111
98
|
name: rspec
|
112
99
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
100
|
requirements:
|
115
101
|
- - ~>
|
116
102
|
- !ruby/object:Gem::Version
|
@@ -118,7 +104,6 @@ dependencies:
|
|
118
104
|
type: :development
|
119
105
|
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
107
|
requirements:
|
123
108
|
- - ~>
|
124
109
|
- !ruby/object:Gem::Version
|
@@ -126,7 +111,6 @@ dependencies:
|
|
126
111
|
- !ruby/object:Gem::Dependency
|
127
112
|
name: rake
|
128
113
|
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
114
|
requirements:
|
131
115
|
- - ~>
|
132
116
|
- !ruby/object:Gem::Version
|
@@ -134,7 +118,6 @@ dependencies:
|
|
134
118
|
type: :development
|
135
119
|
prerelease: false
|
136
120
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
121
|
requirements:
|
139
122
|
- - ~>
|
140
123
|
- !ruby/object:Gem::Version
|
@@ -151,43 +134,47 @@ files:
|
|
151
134
|
- .travis.yml
|
152
135
|
- Gemfile
|
153
136
|
- Gemfile.lock
|
137
|
+
- LICENSE
|
154
138
|
- README.md
|
155
139
|
- Rakefile
|
156
140
|
- bin/factor
|
157
141
|
- factor.gemspec
|
158
|
-
- lib/cli.rb
|
159
142
|
- lib/commands/base.rb
|
160
143
|
- lib/commands/workflows.rb
|
161
144
|
- lib/factor.rb
|
162
|
-
- lib/factor/base.rb
|
163
145
|
- lib/factor/version.rb
|
164
146
|
- lib/listener.rb
|
165
147
|
- lib/runtime.rb
|
166
148
|
- lib/websocket_manager.rb
|
167
|
-
- spec/
|
149
|
+
- spec/base_spec.rb
|
150
|
+
- spec/listener_spec.rb
|
151
|
+
- spec/spec_helper.rb
|
152
|
+
- spec/workflow_spec.rb
|
168
153
|
homepage: https://factor.io
|
169
154
|
licenses: []
|
155
|
+
metadata: {}
|
170
156
|
post_install_message:
|
171
157
|
rdoc_options: []
|
172
158
|
require_paths:
|
173
159
|
- lib
|
174
160
|
required_ruby_version: !ruby/object:Gem::Requirement
|
175
|
-
none: false
|
176
161
|
requirements:
|
177
|
-
- -
|
162
|
+
- - '>='
|
178
163
|
- !ruby/object:Gem::Version
|
179
164
|
version: '0'
|
180
165
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
181
|
-
none: false
|
182
166
|
requirements:
|
183
|
-
- -
|
167
|
+
- - '>='
|
184
168
|
- !ruby/object:Gem::Version
|
185
169
|
version: '0'
|
186
170
|
requirements: []
|
187
171
|
rubyforge_project:
|
188
|
-
rubygems_version:
|
172
|
+
rubygems_version: 2.0.3
|
189
173
|
signing_key:
|
190
|
-
specification_version:
|
174
|
+
specification_version: 4
|
191
175
|
summary: CLI to manager workflows on Factor.io
|
192
176
|
test_files:
|
193
|
-
- spec/
|
177
|
+
- spec/base_spec.rb
|
178
|
+
- spec/listener_spec.rb
|
179
|
+
- spec/spec_helper.rb
|
180
|
+
- spec/workflow_spec.rb
|
data/lib/cli.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require 'commander/import'
|
4
|
-
|
5
|
-
require 'commands/workflows'
|
6
|
-
|
7
|
-
program :name, 'Factor.io Server'
|
8
|
-
program :version, Factor::VERSION
|
9
|
-
program :description, 'Factor.io Server to run workflows'
|
10
|
-
|
11
|
-
command 'server' do |c|
|
12
|
-
c.syntax = 'factor server [options]'
|
13
|
-
c.description = 'Start the Factor.io Server in the current local directory'
|
14
|
-
c.option '--log FILE', String, 'Log file path. Default is stdout.'
|
15
|
-
c.option '--credentials FILE', String, 'credentials.yml file path.'
|
16
|
-
c.option '--connectors FILE', String, 'connectors.yml file path'
|
17
|
-
c.option '--path FILE', String, 'Path to workflows'
|
18
|
-
c.when_called Factor::Commands::Workflow, :server
|
19
|
-
end
|
20
|
-
|
21
|
-
alias_command 's', 'server'
|
data/lib/factor/base.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
# Primary Factor.io module
|
4
|
-
module Factor
|
5
|
-
|
6
|
-
String.send :define_method, :classify do
|
7
|
-
self.split('_').collect! { |w| w.capitalize }.join
|
8
|
-
end
|
9
|
-
|
10
|
-
String.send :define_method, :underscore do
|
11
|
-
self.gsub(/::/, '/')
|
12
|
-
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
13
|
-
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
14
|
-
.tr('-', '_')
|
15
|
-
.downcase
|
16
|
-
end
|
17
|
-
end
|
data/spec/rspec_helper.rb
DELETED