appril 0.0.8 → 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/lib/appril/generate_configs.rb +97 -0
- data/lib/appril/load_configs.rb +60 -0
- data/lib/appril/rtcp_controller.rb +16 -14
- data/lib/appril/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9fac08ec14ea8a2fc574565add3a62e956ffe315
|
4
|
+
data.tar.gz: c41b91b89bd6a9f81c95c0cb9cb54da5e1d2e8ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9db9bd50c5909293335a56efce0ca3de492ef6ec8dcbc8228d2d4276f418b5d5535f99fdae83ef7aaad64e73fc6bccad48bf8d121510c01408bdab742b8d022
|
7
|
+
data.tar.gz: 43ceccf951f7e3df393b6cbadc0eff0eb8ef15884a0788bdfa0d025cf7e437b0befd606efad79dce49a3711030ad91b3c8e3efc204ac28be1a09a4607dd21269
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'rocketio'
|
3
|
+
require 'appril/load_configs'
|
4
|
+
|
5
|
+
module Appril
|
6
|
+
extend self
|
7
|
+
|
8
|
+
def generate_configs dir
|
9
|
+
generate_components_file(dir)
|
10
|
+
generate_config_file(dir)
|
11
|
+
generate_store_modules_file(dir)
|
12
|
+
end
|
13
|
+
|
14
|
+
def generate_components_file dir
|
15
|
+
components = JSON.pretty_generate(controllers_map(dir))
|
16
|
+
File.open(File.expand_path('components.json', dir), 'w') {|f| f << components}
|
17
|
+
end
|
18
|
+
|
19
|
+
def generate_config_file dir
|
20
|
+
config = Appril.load_configs("#{dir}/config", env: :development)
|
21
|
+
File.open File.expand_path('config.js', dir), 'w' do |f|
|
22
|
+
f << "// auto-generated file, do not edit\n"
|
23
|
+
f << "module.exports = " << JSON.pretty_generate({
|
24
|
+
build_path: config[:build_path],
|
25
|
+
client_url: config[:client_url],
|
26
|
+
server_url: config[:server_url],
|
27
|
+
default_api: config[:default_api],
|
28
|
+
webpack_entries: webpack_entries(dir, controllers_map(dir))
|
29
|
+
})
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def generate_store_modules_file dir
|
34
|
+
lines = controllers_map(dir).each_with_object([
|
35
|
+
'// auto-generated file, do not edit',
|
36
|
+
'const modules = {}'
|
37
|
+
]) do |c,o|
|
38
|
+
next unless c[:name] # skip anonymous controllers
|
39
|
+
pattern = "base/components/#{c[:path]}/store.*"
|
40
|
+
next unless file = Dir[File.expand_path(pattern, dir)].find {|e| File.file?(e)}
|
41
|
+
path = file.sub(dir, 'app')
|
42
|
+
o << "
|
43
|
+
import #{c[:name]} from '#{path}'
|
44
|
+
modules.#{c[:name]} = #{c[:name]}
|
45
|
+
"
|
46
|
+
end
|
47
|
+
lines.push('export default modules')
|
48
|
+
file = File.expand_path('store_modules.js', dir)
|
49
|
+
FileUtils.mkdir_p(File.dirname(file))
|
50
|
+
File.open(file, 'w') {|f| f << lines.join("\n")}
|
51
|
+
end
|
52
|
+
|
53
|
+
def controllers_map dir
|
54
|
+
path_prefix = File.expand_path('base/components', dir)
|
55
|
+
RocketIO.controllers.each_with_object([]) do |controller,o|
|
56
|
+
next if controller.to_s =~ /BaseController|RTCPController/
|
57
|
+
o << {
|
58
|
+
path: controller.dirname.sub(path_prefix, '').gsub(/\A\/|\/\Z/, ''),
|
59
|
+
url: controller.url,
|
60
|
+
url_pattern: url_pattern(controller),
|
61
|
+
name: controller.name.gsub('::', '__'),
|
62
|
+
controller_name: controller.name,
|
63
|
+
api: controller.api.keys
|
64
|
+
}
|
65
|
+
end.sort do |a,b|
|
66
|
+
b[:url].split('/').size <=> a[:url].split('/').size
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def webpack_entries dir, controllers
|
71
|
+
entries = controllers.each_with_object({}) do |controller,o|
|
72
|
+
pattern = "base/components/#{controller[:path]}/index.*"
|
73
|
+
next unless entry = Dir[File.expand_path(pattern, dir)].find {|e| File.file?(e)}
|
74
|
+
o[controller[:path]] = entry.sub(dir, '.')
|
75
|
+
end
|
76
|
+
|
77
|
+
pattern = "base/core.*"
|
78
|
+
if core = Dir[File.expand_path(pattern, dir)].find {|e| File.file?(e)}
|
79
|
+
entries[:core] = core.sub(dir, '.')
|
80
|
+
end
|
81
|
+
|
82
|
+
entries
|
83
|
+
end
|
84
|
+
|
85
|
+
def url_pattern controller
|
86
|
+
controller.url *controller.instance_method(:index).parameters.each_with_object([]) {|param,o|
|
87
|
+
pattern = if param[0] == :rest
|
88
|
+
"*"
|
89
|
+
elsif param[0] == :req
|
90
|
+
":#{param[1]}"
|
91
|
+
elsif param[0] == :opt
|
92
|
+
":#{param[1]}?"
|
93
|
+
end
|
94
|
+
o << pattern if pattern
|
95
|
+
}
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'rocketio'
|
3
|
+
|
4
|
+
module Appril
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def load_configs *dirs, env: RocketIO.environment
|
8
|
+
|
9
|
+
config = RocketIO.indifferent_params({environment: env.to_s.freeze})
|
10
|
+
|
11
|
+
dirs.each do |dir|
|
12
|
+
config.update(load_config_file("#{dir}/config.yml"))
|
13
|
+
config.update(load_config_file("#{dir}/env/#{env}.yml"))
|
14
|
+
|
15
|
+
loaded = [
|
16
|
+
File.expand_path("config.yml", dir),
|
17
|
+
File.expand_path("env/#{env}.yml", dir)
|
18
|
+
]
|
19
|
+
|
20
|
+
%w[
|
21
|
+
*.yml
|
22
|
+
**/*.yml
|
23
|
+
].each do |pattern|
|
24
|
+
Dir[File.join(dir, pattern)].each do |file|
|
25
|
+
|
26
|
+
path = File.expand_path(file, dir)
|
27
|
+
next if loaded.include?(path)
|
28
|
+
loaded << path
|
29
|
+
|
30
|
+
key = File.basename(file, '.yml')
|
31
|
+
key_config = load_config_file(file)
|
32
|
+
key_config_keys = key_config.keys.map(&:to_s)
|
33
|
+
|
34
|
+
config[key] = if key_config_keys.include?(config[:environment])
|
35
|
+
# current environment found, use it
|
36
|
+
key_config[config[:environment]]
|
37
|
+
else
|
38
|
+
if RocketIO::ENVIRONMENTS.keys.find {|k| key_config_keys.include?(k)}
|
39
|
+
# there are some environment(s), but no current one so set current environment to nil
|
40
|
+
nil
|
41
|
+
else
|
42
|
+
# there are no environments, so this config is available on any environment
|
43
|
+
key_config
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def config.method_missing key
|
51
|
+
self[key]
|
52
|
+
end
|
53
|
+
|
54
|
+
config
|
55
|
+
end
|
56
|
+
|
57
|
+
def load_config_file file
|
58
|
+
RocketIO.indifferent_params(YAML.load(File.read(file)) || {})
|
59
|
+
end
|
60
|
+
end
|
@@ -5,8 +5,6 @@ module Appril
|
|
5
5
|
def index
|
6
6
|
return unless websocket?
|
7
7
|
|
8
|
-
@router = RocketIO::Router.new(*RocketIO.controllers)
|
9
|
-
|
10
8
|
@socket = Tubesock.hijack(env)
|
11
9
|
@socket.onopen(&method(:on_open))
|
12
10
|
@socket.onmessage(&method(:on_message))
|
@@ -20,7 +18,7 @@ module Appril
|
|
20
18
|
|
21
19
|
def on_open
|
22
20
|
connected
|
23
|
-
write(serial: 0, data:
|
21
|
+
write(serial: 0, data: _env)
|
24
22
|
end
|
25
23
|
|
26
24
|
def on_message msg
|
@@ -32,17 +30,20 @@ module Appril
|
|
32
30
|
controller,
|
33
31
|
msg[:method],
|
34
32
|
msg[:arguments],
|
35
|
-
env.merge(rtcp_serial: msg[:serial])
|
33
|
+
env.merge(RocketIO::REQUEST_METHOD => msg[:request_method], rtcp_serial: msg[:serial], **controller_env)
|
36
34
|
)
|
37
35
|
|
38
|
-
if status ==
|
36
|
+
if status.to_i / 100 == 2
|
39
37
|
|
40
38
|
if body.is_a?(Proc)
|
41
39
|
body.call
|
42
40
|
return
|
43
41
|
end
|
44
42
|
|
45
|
-
|
43
|
+
if msg[:reply]
|
44
|
+
write(serial: msg[:serial], data: body)
|
45
|
+
end
|
46
|
+
|
46
47
|
return
|
47
48
|
end
|
48
49
|
else
|
@@ -69,16 +70,17 @@ module Appril
|
|
69
70
|
|
70
71
|
def on_close
|
71
72
|
@socket.close! if @socket
|
72
|
-
@socket
|
73
|
+
@socket = nil
|
73
74
|
disconnected
|
74
75
|
end
|
75
76
|
|
76
|
-
def resolve_controller
|
77
|
-
|
77
|
+
def resolve_controller controller
|
78
|
+
::RocketIO.controllers.find {|c| c.name == controller}
|
78
79
|
end
|
79
80
|
|
80
81
|
def call_controller controller, method, arguments, env
|
81
|
-
|
82
|
+
params = arguments.last.is_a?(Hash) ? arguments.pop : {}
|
83
|
+
controller.new(method, arguments).call(env, params: params)
|
82
84
|
end
|
83
85
|
|
84
86
|
def write data
|
@@ -89,13 +91,13 @@ module Appril
|
|
89
91
|
def connected
|
90
92
|
end
|
91
93
|
|
92
|
-
# data sent to client
|
93
|
-
def
|
94
|
+
# environmental data to be sent to client at App initialization
|
95
|
+
def _env
|
94
96
|
{}
|
95
97
|
end
|
96
98
|
|
97
|
-
# merged into original env when calling a controller
|
98
|
-
def
|
99
|
+
# merged into original env when calling a controller method
|
100
|
+
def controller_env
|
99
101
|
{}
|
100
102
|
end
|
101
103
|
|
data/lib/appril/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appril
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Slee Woo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rocketio
|
@@ -51,6 +51,8 @@ files:
|
|
51
51
|
- appril.gemspec
|
52
52
|
- lib/appril.rb
|
53
53
|
- lib/appril/base_controller.rb
|
54
|
+
- lib/appril/generate_configs.rb
|
55
|
+
- lib/appril/load_configs.rb
|
54
56
|
- lib/appril/rtcp_controller.rb
|
55
57
|
- lib/appril/version.rb
|
56
58
|
homepage: https://github.com/appril/ruby-server
|
@@ -76,5 +78,5 @@ rubyforge_project:
|
|
76
78
|
rubygems_version: 2.5.1
|
77
79
|
signing_key:
|
78
80
|
specification_version: 4
|
79
|
-
summary: '["appril-0.0
|
81
|
+
summary: '["appril-0.2.0", "Opinionated framework for building opinionated web applications"]'
|
80
82
|
test_files: []
|