flack 0.4.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +13 -0
- data/LICENSE.txt +1 -1
- data/Makefile +23 -0
- data/README.md +8 -1
- data/env.txt +38 -0
- data/env2.txt +33 -0
- data/flack.gemspec +3 -1
- data/lib/flack/app/executions.rb +42 -0
- data/lib/flack/app/helpers.rb +169 -0
- data/lib/flack/app/index.rb +36 -0
- data/lib/flack/app/message.rb +98 -0
- data/lib/flack/app/static.rb +40 -0
- data/lib/flack/app.rb +94 -2
- data/lib/flack.rb +6 -4
- data/t.txt +7 -0
- metadata +49 -8
data/CHANGELOG.md
ADDED
data/LICENSE.txt
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
Copyright (c) 2016-
|
2
|
+
Copyright (c) 2016-2017, John Mettraux, jmettraux+flor@gmail.com
|
3
3
|
|
4
4
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
5
|
of this software and associated documentation files (the "Software"), to deal
|
data/Makefile
CHANGED
@@ -26,3 +26,26 @@ build: gemspec_validate
|
|
26
26
|
push: build
|
27
27
|
gem push pkg/$(NAME)-$(VERSION).gem
|
28
28
|
|
29
|
+
|
30
|
+
## flor tasks
|
31
|
+
|
32
|
+
RUBY=bundle exec ruby
|
33
|
+
FLOR_ENV?=dev
|
34
|
+
TO?=nil
|
35
|
+
FROM?=nil
|
36
|
+
|
37
|
+
migrate:
|
38
|
+
$(RUBY) -Ilib -e "require 'flor/unit'; Flor::Unit.new('envs/$(FLOR_ENV)/etc/conf.json').storage.migrate($(TO), $(FROM))"
|
39
|
+
|
40
|
+
|
41
|
+
## flack tasks
|
42
|
+
|
43
|
+
serve:
|
44
|
+
bundle exec rackup -p 7007
|
45
|
+
s: serve
|
46
|
+
|
47
|
+
curl:
|
48
|
+
curl -s http://127.0.0.1:7007/ | \
|
49
|
+
$(RUBY) -e "require 'json'; puts JSON.pretty_generate(JSON.load(STDIN.read))"
|
50
|
+
c: curl
|
51
|
+
|
data/README.md
CHANGED
@@ -1,7 +1,14 @@
|
|
1
1
|
|
2
2
|
# flack
|
3
3
|
|
4
|
-
|
4
|
+
[![Build Status](https://secure.travis-ci.org/floraison/flack.svg)](http://travis-ci.org/floraison/flack)
|
5
|
+
[![Gem Version](https://badge.fury.io/rb/flack.svg)](http://badge.fury.io/rb/flack)
|
6
|
+
|
7
|
+
Flack is a Rack app for the [flor](https://github.com/floraison/flor) workflow engine.
|
8
|
+
|
9
|
+
## api
|
10
|
+
|
11
|
+
Based on HAL ([spec](http://stateless.co/hal_specification.html) and [draft](https://tools.ietf.org/html/draft-kelly-json-hal-08)).
|
5
12
|
|
6
13
|
## license
|
7
14
|
|
data/env.txt
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
|
2
|
+
GATEWAY_INTERFACE: "CGI/1.1"
|
3
|
+
PATH_INFO: "/debug/77"
|
4
|
+
QUERY_STRING: "a=b&c=d"
|
5
|
+
REMOTE_ADDR: "::1"
|
6
|
+
REMOTE_HOST: "localhost"
|
7
|
+
REQUEST_METHOD: "GET"
|
8
|
+
REQUEST_URI: "http://localhost:7007/debug/77?a=b&c=d"
|
9
|
+
SCRIPT_NAME: ""
|
10
|
+
SERVER_NAME: "localhost"
|
11
|
+
SERVER_PORT: "7007"
|
12
|
+
SERVER_PROTOCOL: "HTTP/1.1"
|
13
|
+
SERVER_SOFTWARE: "WEBrick/1.3.1 (Ruby/1.9.3/2014-05-14)"
|
14
|
+
HTTP_HOST: "localhost:7007"
|
15
|
+
HTTP_CONNECTION: "keep-alive"
|
16
|
+
HTTP_UPGRADE_INSECURE_REQUESTS: "1"
|
17
|
+
HTTP_USER_AGENT: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
|
18
|
+
HTTP_ACCEPT: "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
|
19
|
+
HTTP_ACCEPT_ENCODING: "gzip, deflate, sdch"
|
20
|
+
HTTP_ACCEPT_LANGUAGE: "ja,en-US;q=0.8,en;q=0.6,fr;q=0.4,de;q=0.2,it;q=0.2,zh-TW;q=0.2,zh;q=0.2"
|
21
|
+
HTTP_COOKIE: "sg_dev=2ebdd63d694602c96834d5a261fc471732a2a44c37f40d6446c5cab1b724a263"
|
22
|
+
rack.version: [1, 3]
|
23
|
+
rack.input: #<Rack::Lint::InputWrapper:0x007fb27b230048 @input=#<StringIO:0x007fb27b238b30>>
|
24
|
+
rack.errors: #<Rack::Lint::ErrorWrapper:0x007fb27b22fee0 @error=#<IO:<STDERR>>>
|
25
|
+
rack.multithread: true
|
26
|
+
rack.multiprocess: false
|
27
|
+
rack.run_once: false
|
28
|
+
rack.url_scheme: "http"
|
29
|
+
rack.hijack?: true
|
30
|
+
rack.hijack: #<Proc:0x007fb27b230ae8@/Users/jmettraux/.gem/ruby/1.9.3/gems/rack-1.6.4/lib/rack/lint.rb:525>
|
31
|
+
rack.hijack_io: nil
|
32
|
+
HTTP_VERSION: "HTTP/1.1"
|
33
|
+
REQUEST_PATH: "/debug/77"
|
34
|
+
rack.tempfiles: []
|
35
|
+
flack.path_info: ["debug", "77"]
|
36
|
+
flack.args: [77]
|
37
|
+
flack.query_string: {"a"=>"b", "c"=>"d"}
|
38
|
+
|
data/env2.txt
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
GATEWAY_INTERFACE:CGI/1.1
|
2
|
+
PATH_INFO:/debug
|
3
|
+
QUERY_STRING:
|
4
|
+
REMOTE_ADDR:127.0.0.1
|
5
|
+
REMOTE_HOST:localhost
|
6
|
+
REQUEST_METHOD:GET
|
7
|
+
REQUEST_URI:http://127.0.0.1:7007/flack/debug
|
8
|
+
SCRIPT_NAME:/flack
|
9
|
+
SERVER_NAME:127.0.0.1
|
10
|
+
SERVER_PORT:7007
|
11
|
+
SERVER_PROTOCOL:HTTP/1.1
|
12
|
+
SERVER_SOFTWARE:WEBrick/1.3.1 (Ruby/1.9.3/2014-05-14)
|
13
|
+
HTTP_HOST:127.0.0.1:7007
|
14
|
+
HTTP_USER_AGENT:curl/7.43.0
|
15
|
+
HTTP_ACCEPT:*/*
|
16
|
+
rack.version:[1
|
17
|
+
3]
|
18
|
+
rack.input:#<Rack::Lint::InputWrapper:0x007ff6baa373a8>
|
19
|
+
rack.errors:#<Rack::Lint::ErrorWrapper:0x007ff6baa37290>
|
20
|
+
rack.multithread:true
|
21
|
+
rack.multiprocess:false
|
22
|
+
rack.run_once:false
|
23
|
+
rack.url_scheme:http
|
24
|
+
rack.hijack?:true
|
25
|
+
rack.hijack:#<Proc:0x007ff6baa38208@/Users/jmettraux/.gem/ruby/1.9.3/gems/rack-1.6.4/lib/rack/lint.rb:525>
|
26
|
+
rack.hijack_io:null
|
27
|
+
HTTP_VERSION:HTTP/1.1
|
28
|
+
REQUEST_PATH:/flack/debug
|
29
|
+
rack.tempfiles:[]
|
30
|
+
flack.path_info:[debug]
|
31
|
+
flack.args:[]
|
32
|
+
flack.query_string:{}
|
33
|
+
flack.root_uri:http://127.0.0.1:7007
|
data/flack.gemspec
CHANGED
@@ -27,8 +27,10 @@ A web front-end to the flor workflow engine
|
|
27
27
|
]
|
28
28
|
|
29
29
|
s.add_runtime_dependency 'flor', s.version
|
30
|
+
s.add_runtime_dependency 'rack', '~> 1.6'
|
31
|
+
s.add_runtime_dependency 'sequel', '~> 4'
|
30
32
|
|
31
|
-
s.add_development_dependency 'rspec', '3
|
33
|
+
s.add_development_dependency 'rspec', '~> 3'
|
32
34
|
|
33
35
|
s.require_path = 'lib'
|
34
36
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2016-2017, John Mettraux, jmettraux+flor@gmail.com
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
+
# of this software and associated documentation files (the "Software"), to deal
|
6
|
+
# in the Software without restriction, including without limitation the rights
|
7
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
# copies of the Software, and to permit persons to whom the Software is
|
9
|
+
# furnished to do so, subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included in
|
12
|
+
# all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20
|
+
# THE SOFTWARE.
|
21
|
+
#
|
22
|
+
# Made in Japan.
|
23
|
+
#++
|
24
|
+
|
25
|
+
|
26
|
+
# /executions/*
|
27
|
+
#
|
28
|
+
class Flack::App
|
29
|
+
|
30
|
+
def get_executions(env)
|
31
|
+
|
32
|
+
# TODO implement paging
|
33
|
+
respond(env, @unit.executions.all)
|
34
|
+
end
|
35
|
+
|
36
|
+
def get_executions_i(env)
|
37
|
+
|
38
|
+
# TODO
|
39
|
+
debug_respond(env)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
@@ -0,0 +1,169 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2016-2017, John Mettraux, jmettraux+flor@gmail.com
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
+
# of this software and associated documentation files (the "Software"), to deal
|
6
|
+
# in the Software without restriction, including without limitation the rights
|
7
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
# copies of the Software, and to permit persons to whom the Software is
|
9
|
+
# furnished to do so, subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included in
|
12
|
+
# all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20
|
+
# THE SOFTWARE.
|
21
|
+
#
|
22
|
+
# Made in Japan.
|
23
|
+
#++
|
24
|
+
|
25
|
+
|
26
|
+
# helpers
|
27
|
+
#
|
28
|
+
class Flack::App
|
29
|
+
|
30
|
+
protected
|
31
|
+
|
32
|
+
def debug_respond(env)
|
33
|
+
|
34
|
+
[ 200, { 'Content-Type' => 'application/json' }, [ JSON.dump(env) ] ]
|
35
|
+
end
|
36
|
+
|
37
|
+
def is_response?(o)
|
38
|
+
|
39
|
+
o.is_a?(Array) &&
|
40
|
+
o.length == 3 &&
|
41
|
+
o[0].is_a?(Fixnum) &&
|
42
|
+
o[1].is_a?(Hash) &&
|
43
|
+
o[2].is_a?(Array)
|
44
|
+
end
|
45
|
+
|
46
|
+
def respond(env, data, opts={})
|
47
|
+
|
48
|
+
return data if opts == {} && is_response?(data)
|
49
|
+
|
50
|
+
status = nil
|
51
|
+
links = nil
|
52
|
+
location = nil
|
53
|
+
|
54
|
+
if data.is_a?(Hash)
|
55
|
+
status = data['_status'] || data[:_status]
|
56
|
+
links = data.delete('_links') || data.delete(:_links)
|
57
|
+
location = data['_location'] || data[:_location]
|
58
|
+
end
|
59
|
+
|
60
|
+
status = status || opts[:code] || opts[:status] || 200
|
61
|
+
|
62
|
+
headers = { 'Content-Type' => 'application/json' }
|
63
|
+
headers['Location'] = location if location
|
64
|
+
|
65
|
+
json = serialize(env, data, opts)
|
66
|
+
|
67
|
+
json['_links'].merge!(links) if links
|
68
|
+
|
69
|
+
json['_status'] = status
|
70
|
+
json['_status_text'] = Rack::Utils::HTTP_STATUS_CODES[status]
|
71
|
+
|
72
|
+
if e = opts[:error]; json['error'] = e; end
|
73
|
+
|
74
|
+
[ status, headers, [ JSON.dump(json) ] ]
|
75
|
+
end
|
76
|
+
|
77
|
+
def try(o, meth)
|
78
|
+
|
79
|
+
o.respond_to?(meth) ? o.send(meth) : nil
|
80
|
+
end
|
81
|
+
|
82
|
+
def serialize(env, data, opts)
|
83
|
+
|
84
|
+
return serialize_array(env, data, opts) if data.is_a?(Array)
|
85
|
+
|
86
|
+
r =
|
87
|
+
(data.is_a?(Hash) ? Flor.dup(data) : nil) ||
|
88
|
+
(data.nil? ? {} : nil) ||
|
89
|
+
data.to_h
|
90
|
+
|
91
|
+
#r['_klass'] = data.class.to_s # too rubyish
|
92
|
+
r['_links'] = links(env)
|
93
|
+
r['_forms'] = forms(env)
|
94
|
+
|
95
|
+
r
|
96
|
+
end
|
97
|
+
|
98
|
+
def serialize_array(env, data, opts)
|
99
|
+
|
100
|
+
{ '_links' => links(env),
|
101
|
+
'_embedded' => data.collect { |e| serialize(env, e, opts) } }
|
102
|
+
end
|
103
|
+
|
104
|
+
def determine_root_uri(env)
|
105
|
+
|
106
|
+
hh = env['HTTP_HOST'] || "#{env['SERVER_NAME']}:#{env['SERVER_PORT']}"
|
107
|
+
|
108
|
+
"#{env['rack.url_scheme']}://#{hh}#{env['SCRIPT_NAME']}"
|
109
|
+
end
|
110
|
+
|
111
|
+
def abs(env, href)
|
112
|
+
|
113
|
+
return href if href[0, 4] == 'http'
|
114
|
+
"#{env['flack.root_uri']}#{href[0, 1] == '/' ? '': '/'}#{href}"
|
115
|
+
end
|
116
|
+
|
117
|
+
def rel(env, href)
|
118
|
+
|
119
|
+
return href if href[0, 4] == 'http'
|
120
|
+
"#{env['SCRIPT_NAME']}#{href[0, 1] == '/' ? '': '/'}#{href}"
|
121
|
+
end
|
122
|
+
|
123
|
+
def link(env, h, type)
|
124
|
+
|
125
|
+
h["flack:#{type}"] = { href: rel(env, "/#{type}") }
|
126
|
+
end
|
127
|
+
|
128
|
+
def links(env)
|
129
|
+
|
130
|
+
h = {}
|
131
|
+
|
132
|
+
h['self'] = {
|
133
|
+
href: rel(env, env['REQUEST_PATH']) }
|
134
|
+
m = env['REQUEST_METHOD']
|
135
|
+
h['self'][:method] = m unless %w[ GET HEAD ].include?(m)
|
136
|
+
|
137
|
+
h['curies'] = [{
|
138
|
+
name: 'flack',
|
139
|
+
href: 'https://github.com/floraison/flack/blob/master/doc/rels.md#{rel}',
|
140
|
+
templated: true }]
|
141
|
+
|
142
|
+
link(env, h, :executions)
|
143
|
+
|
144
|
+
h
|
145
|
+
end
|
146
|
+
|
147
|
+
def forms(env)
|
148
|
+
|
149
|
+
h = {}
|
150
|
+
|
151
|
+
h['flack:forms/message'] = {
|
152
|
+
action: rel(env, '/message'),
|
153
|
+
method: 'POST',
|
154
|
+
_inputs: { 'flack:forms/message-content' => { type: 'json' } } }
|
155
|
+
|
156
|
+
h
|
157
|
+
end
|
158
|
+
|
159
|
+
def respond_bad_request(env, error=nil)
|
160
|
+
|
161
|
+
respond(env, {}, code: 400, error: error)
|
162
|
+
end
|
163
|
+
|
164
|
+
def respond_not_found(env, error=nil)
|
165
|
+
|
166
|
+
respond(env, {}, code: 404, error: error)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2016-2017, John Mettraux, jmettraux+flor@gmail.com
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
+
# of this software and associated documentation files (the "Software"), to deal
|
6
|
+
# in the Software without restriction, including without limitation the rights
|
7
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
# copies of the Software, and to permit persons to whom the Software is
|
9
|
+
# furnished to do so, subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included in
|
12
|
+
# all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20
|
+
# THE SOFTWARE.
|
21
|
+
#
|
22
|
+
# Made in Japan.
|
23
|
+
#++
|
24
|
+
|
25
|
+
|
26
|
+
# /
|
27
|
+
#
|
28
|
+
class Flack::App
|
29
|
+
|
30
|
+
def get_index(env)
|
31
|
+
|
32
|
+
# TODO
|
33
|
+
respond(env, nil)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
@@ -0,0 +1,98 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2016-2017, John Mettraux, jmettraux+flor@gmail.com
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
+
# of this software and associated documentation files (the "Software"), to deal
|
6
|
+
# in the Software without restriction, including without limitation the rights
|
7
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
# copies of the Software, and to permit persons to whom the Software is
|
9
|
+
# furnished to do so, subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included in
|
12
|
+
# all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20
|
+
# THE SOFTWARE.
|
21
|
+
#
|
22
|
+
# Made in Japan.
|
23
|
+
#++
|
24
|
+
|
25
|
+
|
26
|
+
# /message
|
27
|
+
#
|
28
|
+
class Flack::App
|
29
|
+
|
30
|
+
def post_message(env)
|
31
|
+
|
32
|
+
msg = JSON.load(env['rack.input'].read)
|
33
|
+
#pp msg
|
34
|
+
|
35
|
+
pt = msg['point']
|
36
|
+
|
37
|
+
return respond_bad_request(env, 'missing msg point') \
|
38
|
+
unless pt
|
39
|
+
return respond_bad_request(env, "bad msg point #{pt.inspect}") \
|
40
|
+
unless %w[ launch cancel ].include?(pt)
|
41
|
+
|
42
|
+
r = self.send("queue_#{pt}", env, msg, { point: pt })
|
43
|
+
|
44
|
+
respond(env, r)
|
45
|
+
end
|
46
|
+
|
47
|
+
protected
|
48
|
+
|
49
|
+
def queue_launch(env, msg, ret)
|
50
|
+
|
51
|
+
dom = msg['domain']
|
52
|
+
src = msg['tree'] || msg['name']
|
53
|
+
|
54
|
+
return respond_bad_request(env, 'missing domain') \
|
55
|
+
unless dom
|
56
|
+
return respond_bad_request(env, 'missing "tree" or "name" in launch msg') \
|
57
|
+
unless src
|
58
|
+
|
59
|
+
opts = {}
|
60
|
+
opts[:domain] = dom
|
61
|
+
|
62
|
+
r = @unit.launch(src, opts)
|
63
|
+
|
64
|
+
ret['exid'] = r
|
65
|
+
ret['_status'] = 201
|
66
|
+
ret['_location'] = rel(env, '/executions/' + r)
|
67
|
+
|
68
|
+
ret['_links'] = {
|
69
|
+
'flack:forms/message-created' => { 'href' => ret['_location'] } }
|
70
|
+
|
71
|
+
ret
|
72
|
+
end
|
73
|
+
|
74
|
+
def queue_cancel(env, msg, ret)
|
75
|
+
|
76
|
+
exid = msg['exid']
|
77
|
+
nid = msg['nid'] || '0'
|
78
|
+
|
79
|
+
return respond_bad_request(env, 'missing exid') \
|
80
|
+
unless exid
|
81
|
+
|
82
|
+
exe = @unit.executions[exid: exid]
|
83
|
+
|
84
|
+
return respond_not_found(env, 'missing execution') \
|
85
|
+
unless exe
|
86
|
+
return respond_not_found(env, 'missing execution node') \
|
87
|
+
unless exe.nodes[nid]
|
88
|
+
|
89
|
+
ret['xxx'] = @unit.queue({ 'point' => 'cancel', 'exid' => exid, 'nid' => nid })
|
90
|
+
|
91
|
+
ret['_status'] = 202
|
92
|
+
ret['_location'] = rel(env, '/executions/' + exid)
|
93
|
+
ret['_links'] = { 'flack:execution' => { 'href' => ret['_location'] } }
|
94
|
+
|
95
|
+
ret
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2016-2017, John Mettraux, jmettraux+flor@gmail.com
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
+
# of this software and associated documentation files (the "Software"), to deal
|
6
|
+
# in the Software without restriction, including without limitation the rights
|
7
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
# copies of the Software, and to permit persons to whom the Software is
|
9
|
+
# furnished to do so, subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included in
|
12
|
+
# all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20
|
+
# THE SOFTWARE.
|
21
|
+
#
|
22
|
+
# Made in Japan.
|
23
|
+
#++
|
24
|
+
|
25
|
+
|
26
|
+
# /static/+
|
27
|
+
#
|
28
|
+
class Flack::App
|
29
|
+
|
30
|
+
RACK_FILE = Rack::File.new(
|
31
|
+
File.absolute_path(
|
32
|
+
File.join(
|
33
|
+
File.dirname(__FILE__), '..')))
|
34
|
+
|
35
|
+
def get_static_plus(env)
|
36
|
+
|
37
|
+
RACK_FILE.call(env)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
data/lib/flack/app.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2016-
|
2
|
+
# Copyright (c) 2016-2017, John Mettraux, jmettraux+flor@gmail.com
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
@@ -22,7 +22,99 @@
|
|
22
22
|
# Made in Japan.
|
23
23
|
#++
|
24
24
|
|
25
|
+
require 'flack/app/helpers'
|
26
|
+
#
|
27
|
+
require 'flack/app/index'
|
28
|
+
require 'flack/app/static'
|
29
|
+
require 'flack/app/message'
|
30
|
+
require 'flack/app/executions'
|
25
31
|
|
26
|
-
|
32
|
+
|
33
|
+
class Flack::App
|
34
|
+
|
35
|
+
attr_reader :unit
|
36
|
+
|
37
|
+
def initialize(root, opts={})
|
38
|
+
|
39
|
+
@root = root
|
40
|
+
|
41
|
+
conf_path =
|
42
|
+
root.end_with?(File::SEPARATOR + 'conf.json') ?
|
43
|
+
root :
|
44
|
+
File.join(@root, 'etc', 'conf.json')
|
45
|
+
|
46
|
+
@unit = Flor::Unit.new(conf_path)
|
47
|
+
|
48
|
+
@unit.start unless opts[:start] == false
|
49
|
+
|
50
|
+
self.class.unit = @unit
|
51
|
+
|
52
|
+
@unit
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.unit
|
56
|
+
@unit
|
57
|
+
end
|
58
|
+
def self.unit=(u)
|
59
|
+
@unit = u
|
60
|
+
end
|
61
|
+
|
62
|
+
def call(env)
|
63
|
+
|
64
|
+
flack_path_info = (env['PATH_INFO'][1..-1] || '')
|
65
|
+
.split('/')
|
66
|
+
|
67
|
+
flack_path_info = [ 'index' ] if flack_path_info.empty?
|
68
|
+
|
69
|
+
env['flack.path_info'] = flack_path_info
|
70
|
+
|
71
|
+
METHS.each do |m|
|
72
|
+
|
73
|
+
next if env['REQUEST_METHOD'] != m[1]
|
74
|
+
next if flack_path_info.length != m[2].length
|
75
|
+
|
76
|
+
match = true
|
77
|
+
args = []
|
78
|
+
|
79
|
+
for i in 0..flack_path_info.length - 1
|
80
|
+
|
81
|
+
break unless match
|
82
|
+
|
83
|
+
pi = flack_path_info[i]
|
84
|
+
mi = m[2][i]
|
85
|
+
|
86
|
+
break if mi == 'plus' || mi == 'star'
|
87
|
+
|
88
|
+
if mi == 'i'
|
89
|
+
match = pi.match(/\A\d+\z/)
|
90
|
+
args << pi.to_i
|
91
|
+
elsif mi == 's'
|
92
|
+
args << pi
|
93
|
+
else
|
94
|
+
match = pi == mi
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
next unless match
|
99
|
+
|
100
|
+
env['flack.args'] = args
|
101
|
+
env['flack.query_string'] = Rack::Utils.parse_query(env['QUERY_STRING'])
|
102
|
+
env['flack.root_uri'] = determine_root_uri(env)
|
103
|
+
|
104
|
+
return send(m[0], env)
|
105
|
+
end
|
106
|
+
|
107
|
+
respond_not_found(env)
|
108
|
+
end
|
109
|
+
|
110
|
+
def get_debug(env); debug_respond(env); end
|
111
|
+
alias get_debug_i get_debug
|
112
|
+
|
113
|
+
METHS = instance_methods
|
114
|
+
.collect(&:to_s)
|
115
|
+
.select { |m| m.match(/\A(get|head|put|post|delete)_.+\z/) }
|
116
|
+
.select { |m| instance_method(m).arity == 1 }
|
117
|
+
.collect { |m| s = m.split('_'); [ m, s.shift.upcase, s ] }
|
118
|
+
.collect(&:freeze).freeze
|
27
119
|
end
|
28
120
|
|
data/lib/flack.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2016-
|
2
|
+
# Copyright (c) 2016-2017, John Mettraux, jmettraux+flor@gmail.com
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
@@ -22,13 +22,15 @@
|
|
22
22
|
# Made in Japan.
|
23
23
|
#++
|
24
24
|
|
25
|
-
require '
|
25
|
+
require 'rack'
|
26
26
|
|
27
|
-
require '
|
27
|
+
require 'flor/unit'
|
28
28
|
|
29
29
|
|
30
30
|
module Flack
|
31
31
|
|
32
|
-
VERSION = '0.
|
32
|
+
VERSION = '0.9.0'
|
33
33
|
end
|
34
34
|
|
35
|
+
require 'flack/app'
|
36
|
+
|
data/t.txt
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2017-01-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: flor
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - '='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.
|
21
|
+
version: 0.9.0
|
22
22
|
prerelease:
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
@@ -27,24 +27,56 @@ dependencies:
|
|
27
27
|
requirements:
|
28
28
|
- - '='
|
29
29
|
- !ruby/object:Gem::Version
|
30
|
-
version: 0.
|
30
|
+
version: 0.9.0
|
31
31
|
prerelease:
|
32
|
+
- !ruby/object:Gem::Dependency
|
33
|
+
name: rack
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
35
|
+
none: false
|
36
|
+
requirements:
|
37
|
+
- - ~>
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1.6'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.6'
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: sequel
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ~>
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '4'
|
56
|
+
type: :runtime
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ~>
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '4'
|
32
64
|
- !ruby/object:Gem::Dependency
|
33
65
|
name: rspec
|
34
66
|
requirement: !ruby/object:Gem::Requirement
|
35
67
|
none: false
|
36
68
|
requirements:
|
37
|
-
- -
|
69
|
+
- - ~>
|
38
70
|
- !ruby/object:Gem::Version
|
39
|
-
version: 3
|
71
|
+
version: '3'
|
40
72
|
type: :development
|
41
73
|
prerelease: false
|
42
74
|
version_requirements: !ruby/object:Gem::Requirement
|
43
75
|
none: false
|
44
76
|
requirements:
|
45
|
-
- -
|
77
|
+
- - ~>
|
46
78
|
- !ruby/object:Gem::Version
|
47
|
-
version: 3
|
79
|
+
version: '3'
|
48
80
|
description: A web front-end to the flor workflow engine
|
49
81
|
email:
|
50
82
|
- jmettraux@gmail.com
|
@@ -53,10 +85,19 @@ extensions: []
|
|
53
85
|
extra_rdoc_files: []
|
54
86
|
files:
|
55
87
|
- Makefile
|
88
|
+
- lib/flack/app/executions.rb
|
89
|
+
- lib/flack/app/helpers.rb
|
90
|
+
- lib/flack/app/index.rb
|
91
|
+
- lib/flack/app/message.rb
|
92
|
+
- lib/flack/app/static.rb
|
56
93
|
- lib/flack/app.rb
|
57
94
|
- lib/flack.rb
|
58
95
|
- flack.gemspec
|
96
|
+
- env.txt
|
97
|
+
- env2.txt
|
59
98
|
- LICENSE.txt
|
99
|
+
- t.txt
|
100
|
+
- CHANGELOG.md
|
60
101
|
- README.md
|
61
102
|
homepage: http://github.com/floraison
|
62
103
|
licenses:
|