sombrero 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Rakefile +1 -2
- data/app/.gitignore +6 -0
- data/app/.pryrc +1 -0
- data/app/Gemfile +6 -0
- data/app/Rakefile +1 -0
- data/app/base/base_controller.rb +3 -0
- data/app/base/boot.rb +2 -0
- data/app/base/helpers/application_helpers.rb +1 -0
- data/app/base/load_controllers.rb +2 -0
- data/app/base/rtcp_controller.rb +22 -0
- data/app/config/config.rb +11 -0
- data/app/config/config.yml +11 -0
- data/app/config/env/development.yml +0 -0
- data/app/config/env/production.yml +0 -0
- data/app/config/env/stage.yml +0 -0
- data/app/config/env/test.yml +0 -0
- data/app/config.ru +3 -0
- data/app/core/Gemfile +5 -0
- data/app/core/boot.rb +17 -0
- data/app/core/client/activity_observer.coffee +37 -0
- data/app/core/client/api.coffee +248 -0
- data/app/core/client/channels.coffee +37 -0
- data/app/core/client/load.coffee +20 -0
- data/app/core/client/page.coffee +68 -0
- data/app/core/client/polyfills/array.compact.coffee +4 -0
- data/app/core/client/polyfills/array.compact_join.coffee +4 -0
- data/app/core/client/polyfills/number.to_money.coffee +3 -0
- data/app/core/client/polyfills/string.capitalize.coffee +4 -0
- data/app/core/client/polyfills/string.strip.coffee +5 -0
- data/app/core/client/polyfills.coffee +6 -0
- data/app/core/client/render.coffee +57 -0
- data/app/core/client/util/alert.coffee +50 -0
- data/app/core/client/util/datetime.coffee +47 -0
- data/app/core/client/util.coffee +38 -0
- data/app/core/generate_controllers_map.rb +4 -0
- data/app/core/generate_webpack_setup.rb +4 -0
- data/app/core/load.rb +5 -0
- data/app/core/load_controllers.rb +16 -0
- data/app/package.json +5 -0
- data/app/webpack.config.js +51 -0
- data/bin/sombrero +5 -0
- data/docker/Dockerfile +5 -0
- data/docker/base/Dockerfile +3 -0
- data/docker/base/build +10 -0
- data/docker/base/build.sh +25 -0
- data/docker/cleanup +7 -0
- data/docker/run +68 -0
- data/docker/skel/build.sh +1 -0
- data/docker/skel/config.yml +24 -0
- data/docker/skel/prepare_build.sh +5 -0
- data/docker/skel/start.sh +1 -0
- data/docker/start +7 -0
- data/lib/sombrero/{version.rb → app.rb} +3 -1
- data/lib/sombrero/base_controller.rb +5 -0
- data/lib/sombrero/cli/app/install.rb +38 -0
- data/lib/sombrero/cli/app/update.rb +20 -0
- data/lib/sombrero/cli/app.rb +10 -0
- data/lib/sombrero/cli/docker/build.rb +170 -0
- data/lib/sombrero/cli/docker/install.rb +23 -0
- data/lib/sombrero/cli/docker.rb +14 -0
- data/lib/sombrero/cli.rb +128 -0
- data/lib/sombrero/rtcp_controller.rb +93 -0
- data/lib/sombrero.rb +110 -2
- data/sombrero.gemspec +6 -1
- metadata +91 -4
@@ -0,0 +1,23 @@
|
|
1
|
+
module Sombrero
|
2
|
+
class CLI
|
3
|
+
module Docker
|
4
|
+
class Install
|
5
|
+
include InstallHelpers
|
6
|
+
|
7
|
+
def initialize dir
|
8
|
+
ensure_dirname_exists(dir)
|
9
|
+
assert_installable_dir(dir)
|
10
|
+
install(dir)
|
11
|
+
end
|
12
|
+
|
13
|
+
def install dir
|
14
|
+
src = dir.to_path == '.' ? BASE_DIR.to_path + '/skel/.' : BASE_DIR / 'skel'
|
15
|
+
FileUtils.cp_r(src, dir)
|
16
|
+
FileUtils.chmod('+x', dir / PREPARE_BUILD_FILE)
|
17
|
+
puts "Done. All files installed into #{dir}"
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Sombrero
|
2
|
+
class CLI
|
3
|
+
module Docker
|
4
|
+
BASE_DIR = (Sombrero::BASE_DIR / 'docker').freeze
|
5
|
+
CONFIG_FILE = './config.yml'.freeze
|
6
|
+
START_FILE = './start.sh'.freeze
|
7
|
+
PREPARE_BUILD_FILE = './prepare_build.sh'.freeze
|
8
|
+
BUILD_FILE = './build.sh'.freeze
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
require 'sombrero/cli/docker/install'
|
14
|
+
require 'sombrero/cli/docker/build'
|
data/lib/sombrero/cli.rb
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'pathname'
|
3
|
+
require 'yaml'
|
4
|
+
require 'pty'
|
5
|
+
|
6
|
+
module Sombrero
|
7
|
+
BASE_DIR = Pathname.new(File.expand_path('../../..', __FILE__)).freeze
|
8
|
+
|
9
|
+
class CLI
|
10
|
+
module InstallHelpers
|
11
|
+
|
12
|
+
def ensure_dirname_exists dir
|
13
|
+
FileUtils.mkdir_p(File.dirname(dir))
|
14
|
+
end
|
15
|
+
|
16
|
+
def assert_installable_dir dir
|
17
|
+
if dir.to_path == '.'
|
18
|
+
assert_empty_dir(dir)
|
19
|
+
else
|
20
|
+
assert_dir_does_not_exists(dir)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def assert_empty_dir dir
|
25
|
+
return if Dir[dir / '*'].empty?
|
26
|
+
puts "", "\t::: #{dir} should be empty :::", ""
|
27
|
+
exit 1
|
28
|
+
end
|
29
|
+
|
30
|
+
def assert_dir_does_not_exists dir
|
31
|
+
return unless File.exists?(dir)
|
32
|
+
puts "", "\t::: #{dir} already exists :::", ""
|
33
|
+
exit 1
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def initialize args
|
38
|
+
case command = args[0]
|
39
|
+
when 'a', 'app'
|
40
|
+
app(args)
|
41
|
+
when 'd', 'docker'
|
42
|
+
docker(args)
|
43
|
+
else
|
44
|
+
unknown_command_error!(command)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def app args
|
49
|
+
missing_destination_error! unless args[2]
|
50
|
+
dir = Pathname.new(args[2])
|
51
|
+
|
52
|
+
case instruction = args[1]
|
53
|
+
when 'i', 'install'
|
54
|
+
App::Install.new(dir, extract_namespace(args))
|
55
|
+
when 'u', 'update'
|
56
|
+
App::Update.new(dir, args)
|
57
|
+
else
|
58
|
+
unknown_instruction_error!(instruction, 'install or (i)', 'update or (u)')
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def extract_namespace args
|
63
|
+
return unless index = args.index('-n')
|
64
|
+
return unless namespace = args[index + 1]
|
65
|
+
if namespace =~ /::/
|
66
|
+
puts "", "\t::: Nested namespaces not supported :::", ""
|
67
|
+
exit 1
|
68
|
+
end
|
69
|
+
if namespace =~ /\W/
|
70
|
+
puts "", "\t::: Namespace may contain only alphanumerics :::", ""
|
71
|
+
exit 1
|
72
|
+
end
|
73
|
+
unless namespace =~ /\A[A-Z]/
|
74
|
+
puts "", "\t::: Namespace should start with a capital letter :::", ""
|
75
|
+
exit 1
|
76
|
+
end
|
77
|
+
namespace
|
78
|
+
end
|
79
|
+
|
80
|
+
def docker args
|
81
|
+
missing_destination_error! unless args[2]
|
82
|
+
dir = Pathname.new(args[2])
|
83
|
+
|
84
|
+
case instruction = args[1]
|
85
|
+
when 'i', 'install'
|
86
|
+
Docker::Install.new(dir)
|
87
|
+
when 'b', 'build'
|
88
|
+
Docker::Build.new(dir, args)
|
89
|
+
else
|
90
|
+
unknown_instruction_error!(instruction, 'install or (i)', 'build or (b)')
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def missing_destination_error!
|
95
|
+
puts "", "\t::: Please provide a directory to install files into :::", ""
|
96
|
+
exit 1
|
97
|
+
end
|
98
|
+
|
99
|
+
def unknown_command_error! command, *available_commands
|
100
|
+
puts "", "\t::: Unknown command #{command}. Use one of #{available_commands*', '} :::", ""
|
101
|
+
exit 1
|
102
|
+
end
|
103
|
+
|
104
|
+
def unknown_instruction_error! instruction, *available_instructions
|
105
|
+
puts "", "\t::: Unknown instruction #{instruction}. Use one of #{available_instructions*', '} :::", ""
|
106
|
+
exit 1
|
107
|
+
end
|
108
|
+
|
109
|
+
def self.run cmd
|
110
|
+
puts "", "$ #{cmd}"
|
111
|
+
PTY.spawn cmd do |r, w, pid|
|
112
|
+
begin
|
113
|
+
r.sync
|
114
|
+
r.each_char do |char|
|
115
|
+
print(char)
|
116
|
+
end
|
117
|
+
rescue Errno::EIO => e
|
118
|
+
# simply ignoring this
|
119
|
+
ensure
|
120
|
+
Process.wait(pid)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
require 'sombrero/cli/app'
|
128
|
+
require 'sombrero/cli/docker'
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# dirty hack until this is merged and released
|
2
|
+
# github.com/ngauthier/tubesock/pull/50
|
3
|
+
class Tubesock
|
4
|
+
def close!
|
5
|
+
if @socket.respond_to?(:closed?)
|
6
|
+
@socket.close unless @socket.closed?
|
7
|
+
else
|
8
|
+
@socket.close
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module Sombrero
|
14
|
+
class RTCPController < BaseController
|
15
|
+
attr_reader :socket
|
16
|
+
|
17
|
+
def get
|
18
|
+
return unless websocket?
|
19
|
+
|
20
|
+
@router = RocketIO::Router.new(*RocketIO.controllers)
|
21
|
+
|
22
|
+
@socket = Tubesock.hijack(env)
|
23
|
+
@socket.onopen(&method(:on_open))
|
24
|
+
@socket.onmessage(&method(:on_message))
|
25
|
+
@socket.onclose(&method(:on_close))
|
26
|
+
@socket.listen
|
27
|
+
|
28
|
+
halt websocket_response
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def on_open
|
34
|
+
connected
|
35
|
+
write(serial: 0, data: initialization_data.update(__initialization_data__))
|
36
|
+
end
|
37
|
+
|
38
|
+
def __initialization_data__
|
39
|
+
{
|
40
|
+
app_url: Cfg.app[:url][RocketIO.environment] || Cfg.app[:url][:development]
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
def on_message msg
|
45
|
+
|
46
|
+
msg = indifferent_params(JSON.parse(msg))
|
47
|
+
if controller = resolve_controller(msg[:controller])
|
48
|
+
status, _, body = call_controller(controller, msg[:method], msg[:arguments])
|
49
|
+
if status == 200
|
50
|
+
write(serial: msg[:serial], data: body) if msg[:reply]
|
51
|
+
return
|
52
|
+
end
|
53
|
+
else
|
54
|
+
body = '404: Not Found'
|
55
|
+
end
|
56
|
+
|
57
|
+
error = if body.is_a?(Array) && body.size == 1
|
58
|
+
body[0]
|
59
|
+
else
|
60
|
+
body
|
61
|
+
end
|
62
|
+
|
63
|
+
if msg && msg[:serial]
|
64
|
+
write(serial: msg[:serial], data: {__rtcp_error__: error})
|
65
|
+
else
|
66
|
+
write(error: error)
|
67
|
+
end
|
68
|
+
|
69
|
+
rescue Errno::EPIPE => e
|
70
|
+
close
|
71
|
+
rescue Exception => e
|
72
|
+
__error__(500, e)
|
73
|
+
end
|
74
|
+
|
75
|
+
def on_close
|
76
|
+
@socket.close! if @socket
|
77
|
+
@socket, @user, @router = nil
|
78
|
+
disconnected
|
79
|
+
end
|
80
|
+
|
81
|
+
def resolve_controller url
|
82
|
+
@router.resolve_path(url)[0]
|
83
|
+
end
|
84
|
+
|
85
|
+
def call_controller controller, method, arguments
|
86
|
+
controller.initialize_controller(method, arguments).call(env.merge(rtcp_env))
|
87
|
+
end
|
88
|
+
|
89
|
+
def write data
|
90
|
+
@socket.send_data(data.to_json)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
data/lib/sombrero.rb
CHANGED
@@ -1,5 +1,113 @@
|
|
1
|
-
require
|
1
|
+
require 'rocketio'
|
2
2
|
|
3
3
|
module Sombrero
|
4
|
-
|
4
|
+
extend self
|
5
|
+
|
6
|
+
def load_config dir, env = RocketIO.environment
|
7
|
+
|
8
|
+
config = load_config_file("#{dir}/config.yml")
|
9
|
+
config.update(load_config_file("#{dir}/env/#{env}.yml"))
|
10
|
+
config[:environment] = env.to_s.freeze
|
11
|
+
|
12
|
+
Dir["#{dir}/**/*.yml"].each do |file|
|
13
|
+
next if File.dirname(file) == './env'
|
14
|
+
|
15
|
+
key = File.basename(file, '.yml')
|
16
|
+
next if key == 'config' || key == 'sombrero'
|
17
|
+
|
18
|
+
key_config = load_config_file(file)
|
19
|
+
key_config_keys = key_config.keys.map(&:to_s)
|
20
|
+
|
21
|
+
config[key] = if key_config_keys.include?(env.to_s)
|
22
|
+
# current environment found, use it
|
23
|
+
key_config[env]
|
24
|
+
else
|
25
|
+
if RocketIO::ENVIRONMENTS.keys.find {|k| key_config_keys.include?(k)}
|
26
|
+
# there are some environment(s), but no current one so set current environment to nil
|
27
|
+
nil
|
28
|
+
else
|
29
|
+
# there are no environments, so this config is available on any environment
|
30
|
+
key_config
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
def config.method_missing key
|
37
|
+
self[key]
|
38
|
+
end
|
39
|
+
|
40
|
+
config
|
41
|
+
end
|
42
|
+
|
43
|
+
def load_config_file file
|
44
|
+
RocketIO.indifferent_params(YAML.load(File.read(file)) || {})
|
45
|
+
end
|
46
|
+
|
47
|
+
def generate_controllers_map dir
|
48
|
+
File.open File.expand_path('controllers.json', dir), 'w' do |f|
|
49
|
+
f << controllers_map(dir).to_json
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def controllers_map dir
|
54
|
+
path_to_api = File.expand_path('base/api', dir)
|
55
|
+
RocketIO.controllers.each_with_object([]) do |controller,o|
|
56
|
+
next unless controller.dirname[path_to_api]
|
57
|
+
|
58
|
+
o << {
|
59
|
+
path: controller.dirname.sub(path_to_api, '').gsub(/\A\/|\/\Z/, ''),
|
60
|
+
url: controller.url,
|
61
|
+
url_pattern: url_pattern(controller),
|
62
|
+
name: controller.name.gsub('::', '__'),
|
63
|
+
api: controller.api
|
64
|
+
}
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def generate_webpack_setup dir
|
69
|
+
config = load_config_file(File.expand_path('config/config.yml', dir))
|
70
|
+
|
71
|
+
entries = controllers_map(dir).each_with_object({}) do |controller,o|
|
72
|
+
|
73
|
+
next unless entry = %w[
|
74
|
+
./base/api/%s/client.js
|
75
|
+
./base/api/%s/client.coffee
|
76
|
+
].map {|p| p % controller[:path]}.find {|f| File.file?(File.expand_path(f, dir))}
|
77
|
+
|
78
|
+
o[controller[:path]] = File.join('./base/api', controller[:path], File.basename(entry))
|
79
|
+
end
|
80
|
+
|
81
|
+
if core = %w[
|
82
|
+
./base/core.js
|
83
|
+
./base/core.coffee
|
84
|
+
].find {|f| File.file?(File.expand_path(f, dir))}
|
85
|
+
entries[:core] = core
|
86
|
+
end
|
87
|
+
|
88
|
+
File.open File.expand_path('webpack_setup.json', dir), 'w' do |f|
|
89
|
+
f << {
|
90
|
+
path: config[:app][:dir],
|
91
|
+
url: config[:app][:url][:development],
|
92
|
+
entries: entries
|
93
|
+
}.to_json
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def url_pattern controller
|
98
|
+
controller.url *controller.instance_method(:get).parameters.each_with_object([]) {|param,o|
|
99
|
+
pattern = if param[0] == :rest
|
100
|
+
"*"
|
101
|
+
elsif param[0] == :req
|
102
|
+
":#{param[1]}"
|
103
|
+
elsif param[0] == :opt
|
104
|
+
":#{param[1]}?"
|
105
|
+
end
|
106
|
+
o << pattern if pattern
|
107
|
+
}
|
108
|
+
end
|
109
|
+
|
5
110
|
end
|
111
|
+
|
112
|
+
require 'sombrero/base_controller'
|
113
|
+
require 'sombrero/rtcp_controller'
|
data/sombrero.gemspec
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
|
-
spec.name, spec.version = %w[
|
4
|
+
spec.name, spec.version = %w[
|
5
|
+
sombrero
|
6
|
+
0.0.2
|
7
|
+
]
|
5
8
|
spec.authors = ['Slee Woo']
|
6
9
|
spec.email = ['mail@sleewoo.com']
|
7
10
|
spec.summary = [spec.name, spec.version]*'-',
|
@@ -16,4 +19,6 @@ Gem::Specification.new do |spec|
|
|
16
19
|
spec.required_ruby_version = '~> 2.0'
|
17
20
|
|
18
21
|
spec.add_runtime_dependency 'rocketio', '~> 0'
|
22
|
+
spec.add_development_dependency 'pry'
|
23
|
+
spec.add_development_dependency 'pry-byebug'
|
19
24
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sombrero
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
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-02
|
11
|
+
date: 2016-03-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rocketio
|
@@ -24,6 +24,34 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pry
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry-byebug
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
27
55
|
description: Opinionated stack for building opinionated web applications
|
28
56
|
email:
|
29
57
|
- mail@sleewoo.com
|
@@ -37,9 +65,68 @@ files:
|
|
37
65
|
- LICENSE.txt
|
38
66
|
- README.md
|
39
67
|
- Rakefile
|
68
|
+
- app/.gitignore
|
69
|
+
- app/.pryrc
|
70
|
+
- app/Gemfile
|
71
|
+
- app/Rakefile
|
72
|
+
- app/base/base_controller.rb
|
73
|
+
- app/base/boot.rb
|
74
|
+
- app/base/helpers/application_helpers.rb
|
75
|
+
- app/base/load_controllers.rb
|
76
|
+
- app/base/rtcp_controller.rb
|
77
|
+
- app/config.ru
|
78
|
+
- app/config/config.rb
|
79
|
+
- app/config/config.yml
|
80
|
+
- app/config/env/development.yml
|
81
|
+
- app/config/env/production.yml
|
82
|
+
- app/config/env/stage.yml
|
83
|
+
- app/config/env/test.yml
|
84
|
+
- app/core/Gemfile
|
85
|
+
- app/core/boot.rb
|
86
|
+
- app/core/client/activity_observer.coffee
|
87
|
+
- app/core/client/api.coffee
|
88
|
+
- app/core/client/channels.coffee
|
89
|
+
- app/core/client/load.coffee
|
90
|
+
- app/core/client/page.coffee
|
91
|
+
- app/core/client/polyfills.coffee
|
92
|
+
- app/core/client/polyfills/array.compact.coffee
|
93
|
+
- app/core/client/polyfills/array.compact_join.coffee
|
94
|
+
- app/core/client/polyfills/number.to_money.coffee
|
95
|
+
- app/core/client/polyfills/string.capitalize.coffee
|
96
|
+
- app/core/client/polyfills/string.strip.coffee
|
97
|
+
- app/core/client/render.coffee
|
98
|
+
- app/core/client/util.coffee
|
99
|
+
- app/core/client/util/alert.coffee
|
100
|
+
- app/core/client/util/datetime.coffee
|
101
|
+
- app/core/generate_controllers_map.rb
|
102
|
+
- app/core/generate_webpack_setup.rb
|
103
|
+
- app/core/load.rb
|
104
|
+
- app/core/load_controllers.rb
|
105
|
+
- app/package.json
|
106
|
+
- app/webpack.config.js
|
40
107
|
- bin/sombrero
|
108
|
+
- docker/Dockerfile
|
109
|
+
- docker/base/Dockerfile
|
110
|
+
- docker/base/build
|
111
|
+
- docker/base/build.sh
|
112
|
+
- docker/cleanup
|
113
|
+
- docker/run
|
114
|
+
- docker/skel/build.sh
|
115
|
+
- docker/skel/config.yml
|
116
|
+
- docker/skel/prepare_build.sh
|
117
|
+
- docker/skel/start.sh
|
118
|
+
- docker/start
|
41
119
|
- lib/sombrero.rb
|
42
|
-
- lib/sombrero/
|
120
|
+
- lib/sombrero/app.rb
|
121
|
+
- lib/sombrero/base_controller.rb
|
122
|
+
- lib/sombrero/cli.rb
|
123
|
+
- lib/sombrero/cli/app.rb
|
124
|
+
- lib/sombrero/cli/app/install.rb
|
125
|
+
- lib/sombrero/cli/app/update.rb
|
126
|
+
- lib/sombrero/cli/docker.rb
|
127
|
+
- lib/sombrero/cli/docker/build.rb
|
128
|
+
- lib/sombrero/cli/docker/install.rb
|
129
|
+
- lib/sombrero/rtcp_controller.rb
|
43
130
|
- sombrero.gemspec
|
44
131
|
homepage: https://github.com/sleewoo/sombrero
|
45
132
|
licenses:
|
@@ -64,5 +151,5 @@ rubyforge_project:
|
|
64
151
|
rubygems_version: 2.5.1
|
65
152
|
signing_key:
|
66
153
|
specification_version: 4
|
67
|
-
summary: '["sombrero-0.0.
|
154
|
+
summary: '["sombrero-0.0.2", "Opinionated stack for building opinionated web applications"]'
|
68
155
|
test_files: []
|