mimi 0.0.1 → 0.1.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/Gemfile +0 -1
- data/README.md +1 -2
- data/bin/console +4 -11
- data/exe/mimi +4 -0
- data/lib/mimi/application/dsl.rb +58 -0
- data/lib/mimi/application/runner.rb +60 -0
- data/lib/mimi/application.rb +83 -0
- data/lib/mimi/cli/app_generator.rb +112 -0
- data/lib/mimi/cli/template/Gemfile +8 -0
- data/lib/mimi/cli/template/Rakefile +3 -0
- data/lib/mimi/cli/template/app/messaging/README.md +0 -0
- data/lib/mimi/cli/template/app/models/README.md +0 -0
- data/lib/mimi/cli/template/app.env +0 -0
- data/lib/mimi/cli/template/app.gitignore +0 -0
- data/lib/mimi/cli/template/bin/start +6 -0
- data/lib/mimi/cli/template/config/manifest.yml +3 -0
- data/lib/mimi/cli/template/lib/boot.rb +1 -0
- data/lib/mimi/cli/template/lib/file_name/application.rb +13 -0
- data/lib/mimi/cli/template/lib/file_name/version.rb +1 -0
- data/lib/mimi/cli/template/lib/file_name.rb +13 -0
- data/lib/mimi/cli.rb +30 -0
- data/lib/mimi/console.rb +115 -0
- data/lib/mimi/version.rb +1 -1
- data/lib/mimi.rb +4 -1
- data/lib/tasks/config.rake +69 -0
- data/lib/tasks/console.rake +16 -0
- data/lib/tasks/core.rake +30 -0
- data/mimi.gemspec +6 -0
- metadata +96 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 50aa52965b69cf0acfebc2aa2567e3e0c8b2f538
|
4
|
+
data.tar.gz: b2067e89e1fdd6082303f5c0ae276cf9d324f924
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 428879cddaf1aa447424f681612262f9718f2fe90260f172622a007ce3517de734c34564bd7ed7d692700a887b91be2f8f9461756d97cbded1ff65b44f687f14
|
7
|
+
data.tar.gz: a6d47b0780faf22eee3ebba4959307e8563a377b7f90f06aebf67bfc623fd93d453f61d8277fa7cfcc01806e70e814e19b4d17fd762542969467b29caf2579a5
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# mimi
|
1
|
+
# mimi — microframework for microservices
|
2
2
|
|
3
3
|
[in development]
|
4
4
|
|
@@ -10,4 +10,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/kukush
|
|
10
10
|
## License
|
11
11
|
|
12
12
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
13
|
-
|
data/bin/console
CHANGED
@@ -1,14 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'mimi'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start
|
6
|
+
require 'pry'
|
7
|
+
Pry.start
|
data/exe/mimi
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
module Mimi
|
2
|
+
class Application
|
3
|
+
module DSL
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
class_methods do
|
7
|
+
#
|
8
|
+
#
|
9
|
+
def configure(opts = nil, &block)
|
10
|
+
if opts
|
11
|
+
super(opts)
|
12
|
+
else
|
13
|
+
register_event_handler(:configure, block)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# Registers handler
|
18
|
+
#
|
19
|
+
def on(event, &block)
|
20
|
+
register_event_handler(event, block)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Registers 'every <sec>' handler
|
24
|
+
#
|
25
|
+
def every(seconds, &block)
|
26
|
+
if !seconds.is_a?(Numeric) || seconds <= 0
|
27
|
+
raise ArgumentError, 'Positive number of seconds is expected as an argument'
|
28
|
+
end
|
29
|
+
wrap_block = proc do
|
30
|
+
@every_block_opts ||= {}
|
31
|
+
opts = @every_block_opts[block.object_id] || {}
|
32
|
+
next_run_at = opts[:next_run_at]
|
33
|
+
next if next_run_at && next_run_at >= Time.now
|
34
|
+
block.call
|
35
|
+
opts[:next_run_at] = Time.now + seconds
|
36
|
+
@every_block_opts[block.object_id] = opts
|
37
|
+
end
|
38
|
+
register_event_handler(:every, wrap_block)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Registers event handler
|
42
|
+
#
|
43
|
+
def register_event_handler(event, block, opts = {})
|
44
|
+
@event_handlers ||= []
|
45
|
+
@event_handlers << { event: event, block: block, options: opts }
|
46
|
+
end
|
47
|
+
|
48
|
+
# Returns list of event handlers, including those defined in a subclass
|
49
|
+
#
|
50
|
+
def event_handlers
|
51
|
+
local_event_handlers = @event_handlers || []
|
52
|
+
return local_event_handlers unless superclass.respond_to?(:event_handlers)
|
53
|
+
superclass.event_handlers + local_event_handlers
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end # module DSL
|
57
|
+
end # class Application
|
58
|
+
end # module Mimi
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Mimi
|
2
|
+
class Application
|
3
|
+
class Runner
|
4
|
+
include Mimi::Logger::Instance
|
5
|
+
|
6
|
+
attr_reader :application_class, :application_instance
|
7
|
+
|
8
|
+
def initialize(application_class)
|
9
|
+
@application_class = application_class
|
10
|
+
@application_instance = application_class.instance
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
application_instance.stop_requested = false
|
15
|
+
init_signal_handlers
|
16
|
+
emit(:configure)
|
17
|
+
emit(:start)
|
18
|
+
loop do
|
19
|
+
break if application_instance.stop_requested
|
20
|
+
emit(:tick)
|
21
|
+
emit(:every)
|
22
|
+
break if application_instance.stop_requested
|
23
|
+
sleep Mimi::Application.module_options[:tick_interval]
|
24
|
+
end
|
25
|
+
emit(:stop)
|
26
|
+
true
|
27
|
+
rescue Exception => e
|
28
|
+
# abort "FATAL: #{e}"
|
29
|
+
abort "FATAL: #{e}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def stop_by_signal(signal)
|
33
|
+
# TODO: cant' run to log in the trap context
|
34
|
+
# puts "Signal caught (#{signal}), exiting"
|
35
|
+
application_instance.stop_requested = true
|
36
|
+
end
|
37
|
+
|
38
|
+
def emit(event)
|
39
|
+
logger.debug "emit(#{event})"
|
40
|
+
handlers = application_class.event_handlers.select { |h| h[:event] == event }
|
41
|
+
handlers.each do |h|
|
42
|
+
application_instance.instance_exec(&h[:block])
|
43
|
+
end
|
44
|
+
rescue Exception => e
|
45
|
+
logger.fatal "Failed to process event '#{event}': #{e}"
|
46
|
+
logger.debug e.backtrace.join("\n")
|
47
|
+
raise
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def init_signal_handlers
|
53
|
+
%w(INT TERM QUIT).each do |stop_signal|
|
54
|
+
Signal.trap(stop_signal) { stop_by_signal(stop_signal) }
|
55
|
+
end
|
56
|
+
# Signal.trap('KILL') { stop_now! }
|
57
|
+
end
|
58
|
+
end # class Runner
|
59
|
+
end # class Application
|
60
|
+
end # module Mimi
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'mimi/logger'
|
2
|
+
require 'mimi/config'
|
3
|
+
require 'singleton'
|
4
|
+
|
5
|
+
require_relative 'application/dsl'
|
6
|
+
require_relative 'application/runner'
|
7
|
+
|
8
|
+
module Mimi
|
9
|
+
class Application
|
10
|
+
include Mimi::Core::Module
|
11
|
+
include Mimi::Logger::Instance
|
12
|
+
include Singleton
|
13
|
+
include DSL
|
14
|
+
|
15
|
+
default_options(
|
16
|
+
manifest_filename: 'config/manifest.yml',
|
17
|
+
tick_interval: 1.second
|
18
|
+
)
|
19
|
+
|
20
|
+
def self.module_path
|
21
|
+
Pathname.new(__dir__).join('..', '..').expand_path
|
22
|
+
end
|
23
|
+
|
24
|
+
configure do
|
25
|
+
config # read config or fail
|
26
|
+
logger.level = config.log_level if config.include?(:log_level)
|
27
|
+
logger.debug "Configuring the application: #{config.params}"
|
28
|
+
# TODO: application-wide configuration
|
29
|
+
end
|
30
|
+
|
31
|
+
on :start do
|
32
|
+
logger.debug "Starting the application: #{self.class}"
|
33
|
+
Mimi.start
|
34
|
+
end
|
35
|
+
|
36
|
+
on :tick do
|
37
|
+
# nothing
|
38
|
+
end
|
39
|
+
|
40
|
+
on :stop do
|
41
|
+
logger.debug "Shutting down the application: #{self.class}"
|
42
|
+
Mimi.stop
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.manifest_filename
|
46
|
+
Mimi.app_path_to(Mimi::Application.module_options[:manifest_filename])
|
47
|
+
end
|
48
|
+
|
49
|
+
def use(mod, opts = nil)
|
50
|
+
Mimi.use(mod, opts || config.to_h)
|
51
|
+
end
|
52
|
+
|
53
|
+
def config
|
54
|
+
@config ||= Mimi::Config.new(self.class.manifest_filename)
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.inherited(subclass)
|
58
|
+
super
|
59
|
+
@default_application_class = subclass
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.run(application_class = nil)
|
63
|
+
runner(application_class).run
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.runner(application_class = nil)
|
67
|
+
return @runner if @runner
|
68
|
+
application_class ||= @default_application_class || self
|
69
|
+
@runner = Mimi::Application::Runner.new(application_class)
|
70
|
+
end
|
71
|
+
|
72
|
+
attr_accessor :stop_requested
|
73
|
+
def stop
|
74
|
+
self.stop_requested = true
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.name_version
|
78
|
+
name = defined?(self::NAME) ? self::NAME : '<unnamed>'
|
79
|
+
version = defined?(self::VERSION) ? self::VERSION : '<unknown>'
|
80
|
+
"#{name} v#{version}"
|
81
|
+
end
|
82
|
+
end # class Application
|
83
|
+
end # module Mimi
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'erb'
|
3
|
+
|
4
|
+
module Mimi
|
5
|
+
class CLI
|
6
|
+
class AppGenerator
|
7
|
+
attr_reader :app_name, :target_path
|
8
|
+
FILE_MAPPINGS = {
|
9
|
+
'app/models/README.md' => 'app/models/README.md',
|
10
|
+
'app/messaging/README.md' => 'app/messaging/README.md',
|
11
|
+
'bin/start' => 'bin/start',
|
12
|
+
'config/manifest.yml' => 'config/manifest.yml',
|
13
|
+
'lib/file_name.rb' => 'lib/#{file_dirname}/#{file_basename}.rb',
|
14
|
+
'lib/file_name/application.rb' => 'lib/#{file_name}/application.rb',
|
15
|
+
'lib/file_name/version.rb' => 'lib/#{file_name}/version.rb',
|
16
|
+
'lib/boot.rb' => 'lib/boot.rb',
|
17
|
+
'Gemfile' => 'Gemfile',
|
18
|
+
'Rakefile' => 'Rakefile',
|
19
|
+
'app.env' => '.env',
|
20
|
+
'app.gitignore' => '.gitignore'
|
21
|
+
}
|
22
|
+
FILE_MAPPINGS_EXEC = ['bin/start']
|
23
|
+
|
24
|
+
APP_TEMPLATE_PATH = Pathname.new(__FILE__).dirname.join('template')
|
25
|
+
|
26
|
+
def initialize(app_name, target_path = nil)
|
27
|
+
@app_name = app_name
|
28
|
+
@target_path = Pathname.new(target_path).expand_path
|
29
|
+
end
|
30
|
+
|
31
|
+
# Returns application name as class name.
|
32
|
+
#
|
33
|
+
# @example
|
34
|
+
# "some-my_app" -> "Some::MyApp"
|
35
|
+
#
|
36
|
+
def module_name
|
37
|
+
name_parts = app_name.split('-').map do |word|
|
38
|
+
word.gsub(/(^|_)(\w)/) { |m| m.chars.last.upcase }
|
39
|
+
end
|
40
|
+
name_parts.join('::')
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns module name split into parts
|
44
|
+
#
|
45
|
+
def module_name_parts
|
46
|
+
module_name.split('::')
|
47
|
+
end
|
48
|
+
|
49
|
+
# Returns application name as file name.
|
50
|
+
#
|
51
|
+
# @example
|
52
|
+
# "some-my_app" -> "some/my_app"
|
53
|
+
#
|
54
|
+
def file_name
|
55
|
+
app_name.split('-').join('/')
|
56
|
+
end
|
57
|
+
|
58
|
+
# Returns base part of the application name as file name.
|
59
|
+
#
|
60
|
+
# @example
|
61
|
+
# "some-my_app" -> "my_app"
|
62
|
+
#
|
63
|
+
def file_basename
|
64
|
+
app_name.split('-').last
|
65
|
+
end
|
66
|
+
|
67
|
+
# Returns directory part of the application name as file name.
|
68
|
+
#
|
69
|
+
# @example
|
70
|
+
# "some-my_app" -> "some"
|
71
|
+
#
|
72
|
+
def file_dirname
|
73
|
+
app_name.split('-')[0..-2].join('/')
|
74
|
+
end
|
75
|
+
|
76
|
+
def app_root_path
|
77
|
+
target_path.join(app_name).expand_path
|
78
|
+
end
|
79
|
+
|
80
|
+
def generate(opts = {})
|
81
|
+
raise "Application already exists: #{app_root_path}" if app_root_path.exist?
|
82
|
+
install_path(app_root_path) unless opts[:dry_run]
|
83
|
+
FILE_MAPPINGS.each do |from_file, to_file|
|
84
|
+
to_file = eval "\"#{to_file}\""
|
85
|
+
from_path = APP_TEMPLATE_PATH.join(from_file)
|
86
|
+
to_path = app_root_path.join(to_file)
|
87
|
+
puts " #{from_path} -> #{to_path}"
|
88
|
+
next if opts[:dry_run]
|
89
|
+
if from_path.directory?
|
90
|
+
install_path(to_path)
|
91
|
+
else
|
92
|
+
file_contents = File.read(from_path)
|
93
|
+
file_processed = ERB.new(file_contents).result(binding)
|
94
|
+
install_file(to_path, file_processed, FILE_MAPPINGS_EXEC.include?(from_file))
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def install_path(path)
|
100
|
+
FileUtils.mkdir_p(path)
|
101
|
+
end
|
102
|
+
|
103
|
+
def install_file(path, contents, executable = false)
|
104
|
+
FileUtils.mkdir_p(path.dirname)
|
105
|
+
File.open(path, 'w') do |f|
|
106
|
+
f.puts contents
|
107
|
+
end
|
108
|
+
FileUtils.chmod(0755, path, verbose: true) if executable
|
109
|
+
end
|
110
|
+
end # class AppGenerator
|
111
|
+
end # class CLI
|
112
|
+
end # module Mimi
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
require_relative '<%= file_name %>'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'mimi'
|
2
|
+
# require 'mimi/db'
|
3
|
+
# require 'mimi/messaging'
|
4
|
+
|
5
|
+
class <%= module_name %>::Application < Mimi::Application
|
6
|
+
NAME = '<%= app_name %>'.freeze
|
7
|
+
VERSION = '0.0.1'.freeze
|
8
|
+
|
9
|
+
configure do
|
10
|
+
# use Mimi::DB
|
11
|
+
# use Mimi::Messaging
|
12
|
+
end
|
13
|
+
end # class <%= module_name %>::Application
|
@@ -0,0 +1 @@
|
|
1
|
+
#
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<%=
|
2
|
+
@module_statements = module_name_parts.reverse.reduce(['# Your code here']) do |a, e|
|
3
|
+
# indent accumulator
|
4
|
+
a = a.map { |l| ' ' + l }
|
5
|
+
|
6
|
+
# wrap in module clause
|
7
|
+
["module #{e}", *a, "end # module #{e}"]
|
8
|
+
end
|
9
|
+
@module_statements.join("\n")
|
10
|
+
%>
|
11
|
+
|
12
|
+
require_relative '<%= file_basename %>/application'
|
13
|
+
require_relative '<%= file_basename %>/version'
|
data/lib/mimi/cli.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'pathname'
|
3
|
+
|
4
|
+
module Mimi
|
5
|
+
class CLI < Thor
|
6
|
+
map %w(--version -v) => :__print_version
|
7
|
+
desc '--version, -v', 'Display version'
|
8
|
+
def __print_version
|
9
|
+
puts "mimi v#{Mimi::VERSION}"
|
10
|
+
end
|
11
|
+
|
12
|
+
desc 'create NAME [PATH]', 'Create application in the specified directory'
|
13
|
+
def create(name, path = Pathname.pwd)
|
14
|
+
app_generator = Mimi::CLI::AppGenerator.new(name, path)
|
15
|
+
puts " name: #{app_generator.app_name}"
|
16
|
+
puts " path: #{app_generator.target_path}"
|
17
|
+
puts "app_root_path: #{app_generator.app_root_path}"
|
18
|
+
puts " module_name: #{app_generator.module_name}"
|
19
|
+
puts
|
20
|
+
app_generator.generate # (dry_run: truew)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def app_name_to_class_name(name)
|
26
|
+
end
|
27
|
+
end # class CLI
|
28
|
+
end # module Mimi
|
29
|
+
|
30
|
+
require_relative 'cli/app_generator'
|
data/lib/mimi/console.rb
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
module Mimi
|
2
|
+
module Console
|
3
|
+
module Colors
|
4
|
+
SEQUENCE = %w(31 32 33 34 35 36 37 31;1 32;1 33;1 34;1 35;1 36;1 37;1)
|
5
|
+
|
6
|
+
# Returns ANSI escaped string.
|
7
|
+
#
|
8
|
+
def esc_string(esc, text)
|
9
|
+
esc + text.to_s + "\e[0m"
|
10
|
+
end
|
11
|
+
|
12
|
+
def unesc_string(text)
|
13
|
+
text.gsub(/\e[^m]+m/, '')
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns ANSI escaped string for the colored text.
|
17
|
+
#
|
18
|
+
def esc_color(color_code, text)
|
19
|
+
esc_string "\e[#{color_code}m", text
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns ANSI escaped string for the red colored text.
|
23
|
+
#
|
24
|
+
def esc_red(text)
|
25
|
+
esc_color 31, text
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns ANSI escaped string for the green colored text.
|
29
|
+
#
|
30
|
+
def esc_green(text)
|
31
|
+
esc_color 32, text
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns ANSI escaped string for the yellow colored text.
|
35
|
+
#
|
36
|
+
def esc_yellow(text)
|
37
|
+
esc_color 33, text
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns ANSI escaped string for the blue colored text.
|
41
|
+
#
|
42
|
+
def esc_blue(text)
|
43
|
+
esc_color 34, text
|
44
|
+
end
|
45
|
+
|
46
|
+
#
|
47
|
+
#
|
48
|
+
def esc_gray(text)
|
49
|
+
esc_color '30;1', text
|
50
|
+
end
|
51
|
+
|
52
|
+
# Returns ANSI escaped string for the bold text.
|
53
|
+
#
|
54
|
+
def esc_bold(text)
|
55
|
+
esc_string "\e[01;37m", text
|
56
|
+
end
|
57
|
+
|
58
|
+
# Returns string padded to given number of characters, text can be escaped.
|
59
|
+
#
|
60
|
+
def esc_pad(text, num, color = nil)
|
61
|
+
text = text.to_s
|
62
|
+
esc_text = text
|
63
|
+
case color
|
64
|
+
when :red, :yellow, :green
|
65
|
+
esc_text = send :"esc_#{color}", text
|
66
|
+
end
|
67
|
+
pad = esc_text.size - unesc_string(text).size
|
68
|
+
num > 0 ? ("%-#{num + pad}s" % esc_text) : esc_text
|
69
|
+
end
|
70
|
+
|
71
|
+
# Returns string with formatted and padded fields
|
72
|
+
# Each arg is an Array:
|
73
|
+
# [<text>, [padding_num], [color]]
|
74
|
+
#
|
75
|
+
def esc_format(*args)
|
76
|
+
out = []
|
77
|
+
args.each do |arg|
|
78
|
+
out << esc_pad(arg[0], arg[1] || 0, arg[2])
|
79
|
+
end
|
80
|
+
out.join(' ')
|
81
|
+
end
|
82
|
+
|
83
|
+
# Returns rows, as arrays strings, formatted as a table
|
84
|
+
#
|
85
|
+
# @param rows [Array<Array<String>>]
|
86
|
+
#
|
87
|
+
# @return [String]
|
88
|
+
#
|
89
|
+
def esc_format_table(rows, params = {})
|
90
|
+
return nil if rows.empty?
|
91
|
+
params = {
|
92
|
+
delimiter: ' '
|
93
|
+
}.merge(params)
|
94
|
+
columns_count = rows.map(&:size).max
|
95
|
+
columns = columns_count.times.map do |c|
|
96
|
+
rows.map { |r| unesc_string(r[c].to_s).size }.max # width of the column
|
97
|
+
end
|
98
|
+
rows.map do |row|
|
99
|
+
row.map.with_index do |t, i|
|
100
|
+
esc_pad(t, columns[i])
|
101
|
+
end.join(params[:delimiter])
|
102
|
+
end.join("\n")
|
103
|
+
end
|
104
|
+
|
105
|
+
# Color output disabled
|
106
|
+
#
|
107
|
+
module Disabled
|
108
|
+
def esc_string(_, text)
|
109
|
+
text
|
110
|
+
end
|
111
|
+
end # module Disabled
|
112
|
+
|
113
|
+
end # module Colors
|
114
|
+
end # module Console
|
115
|
+
end # module Mimi
|
data/lib/mimi/version.rb
CHANGED
data/lib/mimi.rb
CHANGED
@@ -0,0 +1,69 @@
|
|
1
|
+
def rake_task_config(show_all = false)
|
2
|
+
config = Mimi::Config.new(
|
3
|
+
Mimi::Application.manifest_filename, raise_on_missing_params: false
|
4
|
+
)
|
5
|
+
config.manifest.each do |param|
|
6
|
+
next if param[:const] && !show_all
|
7
|
+
name = param[:name]
|
8
|
+
annotation = []
|
9
|
+
if param[:const]
|
10
|
+
annotation << esc_bold('[CONST]')
|
11
|
+
else
|
12
|
+
annotation << esc_red('[MISSING]') if config.missing_params.include?(name)
|
13
|
+
annotation << "(default: #{param[:default].inspect})" unless param[:required]
|
14
|
+
end
|
15
|
+
annotation << param[:desc] if param.key?(:desc)
|
16
|
+
annotation.unshift(' #') unless annotation.empty?
|
17
|
+
puts "#{name}=#{config[name]}#{annotation.join(' ')}"
|
18
|
+
end
|
19
|
+
abort(esc_red('# configure missing parameters')) unless config.missing_params.empty?
|
20
|
+
end
|
21
|
+
|
22
|
+
def rake_task_config_manifest_generate
|
23
|
+
config = Mimi::Config.new
|
24
|
+
config.load(
|
25
|
+
Mimi::Application.manifest_filename, raise_on_missing_params: false
|
26
|
+
) if File.exist?(Mimi::Application.manifest_filename)
|
27
|
+
|
28
|
+
# first deep_merge to preserve key order in the existing app manifest
|
29
|
+
manifest = config.manifest_raw.deep_merge(Mimi.loaded_modules_manifest)
|
30
|
+
# second deep_merge to preserve key values in the existing app manifest
|
31
|
+
manifest = manifest.deep_merge(config.manifest_raw)
|
32
|
+
|
33
|
+
manifest.to_yaml
|
34
|
+
end
|
35
|
+
|
36
|
+
desc 'Display config manifest and current config'
|
37
|
+
task :config do
|
38
|
+
rake_task_config(false)
|
39
|
+
end
|
40
|
+
|
41
|
+
namespace :config do
|
42
|
+
desc 'Display config manifest and current config, including consts'
|
43
|
+
task :all do
|
44
|
+
rake_task_config(true)
|
45
|
+
end
|
46
|
+
|
47
|
+
desc 'Generate and display a combined manifest for all loaded modules'
|
48
|
+
task :manifest do
|
49
|
+
puts rake_task_config_manifest_generate
|
50
|
+
end
|
51
|
+
|
52
|
+
namespace :manifest do
|
53
|
+
desc "Generate and write a combined manifest to: #{Mimi::Application.manifest_filename}"
|
54
|
+
task :create do
|
55
|
+
if File.exist?(Mimi::Application.manifest_filename)
|
56
|
+
puts "* Found an existing application manifest, loading: #{Mimi::Application.manifest_filename}"
|
57
|
+
end
|
58
|
+
puts '* Generating a combined manifest'
|
59
|
+
manifest_contents = rake_task_config_manifest_generate
|
60
|
+
config_path = Mimi.app_path_to('config')
|
61
|
+
puts "* Writing the combined manifest to: #{Mimi::Application.manifest_filename}"
|
62
|
+
sh "install -d #{config_path}" unless File.directory?(config_path)
|
63
|
+
manifest_filename = Mimi.app_path_to('config', 'manifest.yml')
|
64
|
+
File.open(manifest_filename, 'w') do |f|
|
65
|
+
f.puts manifest_contents
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
desc 'Start development console'
|
2
|
+
task console: :"application:configure" do
|
3
|
+
require 'pry'
|
4
|
+
puts "** @application: #{@application.class.name_version}, used modules: #{Mimi.used_modules.join(', ')}"
|
5
|
+
puts '** run "Mimi.start" to start modules' unless Mimi.used_modules.empty?
|
6
|
+
Pry.start
|
7
|
+
end
|
8
|
+
|
9
|
+
namespace :console do
|
10
|
+
desc 'Run development console in debug mode'
|
11
|
+
task :debug do
|
12
|
+
Mimi::Logger.configure(level: :debug)
|
13
|
+
ENV['log_level'] = 'debug'
|
14
|
+
Rake::Task['console'].invoke
|
15
|
+
end
|
16
|
+
end
|
data/lib/tasks/core.rake
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'mimi/console'
|
2
|
+
|
3
|
+
extend Mimi::Console::Colors
|
4
|
+
extend Mimi::Console::Colors::Disabled unless STDOUT.isatty
|
5
|
+
|
6
|
+
#
|
7
|
+
# Include this task as dependency to require application instantiation
|
8
|
+
#
|
9
|
+
task :application do
|
10
|
+
@application_runner = Mimi::Application.runner
|
11
|
+
@application = @application_runner.application_instance
|
12
|
+
define_method :logger do
|
13
|
+
@application.logger
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
namespace :application do
|
18
|
+
# Include this task as dependency to require application instantiation and startup
|
19
|
+
#
|
20
|
+
task configure: :application do
|
21
|
+
@application_runner.emit(:configure)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Include this task as dependency to require application instantiation, startup
|
25
|
+
# and starting of all modules
|
26
|
+
#
|
27
|
+
task environment: [:application, :"application:configure"] do
|
28
|
+
@application_runner.emit(:start)
|
29
|
+
end
|
30
|
+
end
|
data/mimi.gemspec
CHANGED
@@ -27,7 +27,13 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
28
|
spec.require_paths = ['lib']
|
29
29
|
|
30
|
+
spec.add_dependency 'mimi-core', '~> 0.1'
|
31
|
+
spec.add_dependency 'mimi-logger', '~> 0.1'
|
32
|
+
spec.add_dependency 'mimi-config', '~> 0.1'
|
33
|
+
spec.add_dependency 'thor', '~> 0.19'
|
34
|
+
|
30
35
|
spec.add_development_dependency 'bundler', '~> 1.11'
|
31
36
|
spec.add_development_dependency 'rake', '~> 10.0'
|
32
37
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
38
|
+
spec.add_development_dependency 'pry', '~> 0.10'
|
33
39
|
end
|
metadata
CHANGED
@@ -1,15 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mimi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Kukushkin
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-05-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: mimi-core
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: mimi-logger
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: mimi-config
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.1'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.1'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: thor
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.19'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.19'
|
13
69
|
- !ruby/object:Gem::Dependency
|
14
70
|
name: bundler
|
15
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,10 +108,25 @@ dependencies:
|
|
52
108
|
- - "~>"
|
53
109
|
- !ruby/object:Gem::Version
|
54
110
|
version: '3.0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: pry
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0.10'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0.10'
|
55
125
|
description: microframework for microservices
|
56
126
|
email:
|
57
127
|
- alex@kukushk.in
|
58
|
-
executables:
|
128
|
+
executables:
|
129
|
+
- mimi
|
59
130
|
extensions: []
|
60
131
|
extra_rdoc_files: []
|
61
132
|
files:
|
@@ -69,8 +140,30 @@ files:
|
|
69
140
|
- Rakefile
|
70
141
|
- bin/console
|
71
142
|
- bin/setup
|
143
|
+
- exe/mimi
|
72
144
|
- lib/mimi.rb
|
145
|
+
- lib/mimi/application.rb
|
146
|
+
- lib/mimi/application/dsl.rb
|
147
|
+
- lib/mimi/application/runner.rb
|
148
|
+
- lib/mimi/cli.rb
|
149
|
+
- lib/mimi/cli/app_generator.rb
|
150
|
+
- lib/mimi/cli/template/Gemfile
|
151
|
+
- lib/mimi/cli/template/Rakefile
|
152
|
+
- lib/mimi/cli/template/app.env
|
153
|
+
- lib/mimi/cli/template/app.gitignore
|
154
|
+
- lib/mimi/cli/template/app/messaging/README.md
|
155
|
+
- lib/mimi/cli/template/app/models/README.md
|
156
|
+
- lib/mimi/cli/template/bin/start
|
157
|
+
- lib/mimi/cli/template/config/manifest.yml
|
158
|
+
- lib/mimi/cli/template/lib/boot.rb
|
159
|
+
- lib/mimi/cli/template/lib/file_name.rb
|
160
|
+
- lib/mimi/cli/template/lib/file_name/application.rb
|
161
|
+
- lib/mimi/cli/template/lib/file_name/version.rb
|
162
|
+
- lib/mimi/console.rb
|
73
163
|
- lib/mimi/version.rb
|
164
|
+
- lib/tasks/config.rake
|
165
|
+
- lib/tasks/console.rake
|
166
|
+
- lib/tasks/core.rake
|
74
167
|
- mimi.gemspec
|
75
168
|
homepage: https://github.com/kukushkin/mimi
|
76
169
|
licenses:
|