factor 0.5.05 → 0.5.06
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 +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