rdm 0.1.12 → 0.1.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/.rubocop.yml +17 -0
- data/.travis.yml +13 -0
- data/Gemfile +5 -1
- data/LICENSE.txt +1 -1
- data/README.md +84 -28
- data/bin/rdm +72 -0
- data/bin/rubocop +6 -0
- data/docs/_config.yml +1 -0
- data/docs/index.md +98 -0
- data/docs/interface_brainstorming.md +31 -0
- data/example/Rdm.packages +1 -1
- data/example/Readme.md +1 -3
- data/lib/rdm.rb +29 -20
- data/lib/rdm/cli/gen_package.rb +48 -0
- data/lib/rdm/cli/init.rb +43 -0
- data/lib/rdm/config.rb +9 -1
- data/lib/rdm/config_manager.rb +5 -5
- data/lib/rdm/config_scope.rb +3 -3
- data/lib/rdm/errors.rb +2 -0
- data/lib/rdm/gen/concerns/template_handling.rb +81 -0
- data/lib/rdm/gen/init.rb +69 -0
- data/lib/rdm/gen/package.rb +99 -0
- data/lib/rdm/package.rb +17 -16
- data/lib/rdm/package_importer.rb +89 -79
- data/lib/rdm/package_parser.rb +25 -5
- data/lib/rdm/settings.rb +21 -20
- data/lib/rdm/source.rb +1 -1
- data/lib/rdm/source_locator.rb +31 -0
- data/lib/rdm/source_parser.rb +83 -68
- data/lib/rdm/support/colorize.rb +106 -0
- data/lib/rdm/support/render.rb +17 -0
- data/lib/rdm/support/template.rb +30 -0
- data/lib/rdm/templates/init/Gemfile.erb +25 -0
- data/lib/rdm/templates/init/Rdm.packages.erb +18 -0
- data/lib/rdm/templates/init/Readme.md.erb +24 -0
- data/lib/rdm/templates/{tests → init/tests}/run +27 -31
- data/lib/rdm/templates/package/.gitignore +1 -0
- data/lib/rdm/templates/{.rspec → package/.rspec} +0 -0
- data/lib/rdm/templates/{bin → package/bin}/console_irb +4 -5
- data/lib/rdm/templates/{main_module_file.rb.erb → package/main_module_file.rb.erb} +0 -0
- data/lib/rdm/templates/{package.rb.erb → package/package.rb.erb} +0 -0
- data/lib/rdm/templates/{spec → package/spec}/spec_helper.rb +0 -0
- data/lib/rdm/version.rb +1 -1
- data/rdm.gemspec +3 -0
- data/spec/fixtures/SampleSource.rb +3 -1
- data/spec/fixtures/sample_prj/Rdm.packages +12 -0
- data/spec/fixtures/sample_prj/infrastructure/web/Package.rb +16 -0
- data/spec/rdm/cli/gen_package_spec.rb +130 -0
- data/spec/rdm/cli/init_spec.rb +97 -0
- data/spec/rdm/config_manager_spec.rb +37 -1
- data/spec/rdm/gen/init_spec.rb +63 -0
- data/spec/rdm/gen/package_spec.rb +87 -0
- data/spec/rdm/package_importer_spec.rb +5 -1
- data/spec/rdm/package_parser_spec.rb +10 -24
- data/spec/rdm/rdm_spec.rb +42 -0
- data/spec/rdm/source_locator_spec.rb +45 -0
- data/spec/rdm/source_parser_spec.rb +45 -3
- data/spec/rdm/support/colorize_spec.rb +24 -0
- data/spec/rdm/support/template_spec.rb +20 -0
- data/spec/spec_helper.rb +45 -0
- metadata +92 -16
- data/bin/rdm-generate +0 -55
- data/bin/rdm-install +0 -13
- data/lib/rdm/auto_updater.rb +0 -41
- data/lib/rdm/package_generator.rb +0 -121
- data/lib/rdm/source_installer.rb +0 -35
- data/lib/rdm/templates/.gitignore +0 -1
@@ -0,0 +1,48 @@
|
|
1
|
+
module Rdm
|
2
|
+
module CLI
|
3
|
+
class GenPackage
|
4
|
+
class << self
|
5
|
+
def run(opts = {})
|
6
|
+
Rdm::CLI::GenPackage.new(opts).run
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_accessor :package_name, :current_dir, :package_relative_path, :skip_tests
|
11
|
+
def initialize(package_name:, current_dir:, path:, skip_tests:)
|
12
|
+
@current_dir = current_dir
|
13
|
+
@package_name = package_name
|
14
|
+
@package_relative_path = path
|
15
|
+
@skip_tests = skip_tests
|
16
|
+
end
|
17
|
+
|
18
|
+
def run
|
19
|
+
check_preconditions!
|
20
|
+
begin
|
21
|
+
generate
|
22
|
+
rescue Errno::ENOENT => e
|
23
|
+
puts "Error occurred. Possible reasons:\n #{Rdm::SOURCE_FILENAME} not found. Please run on directory containing #{Rdm::SOURCE_FILENAME} \n#{e.inspect}"
|
24
|
+
rescue Rdm::Errors::PackageExists
|
25
|
+
puts 'Error. Package already exist. Package was not generated'
|
26
|
+
rescue Rdm::Errors::PackageDirExists
|
27
|
+
puts "Error. Directory #{package_relative_path} exists. Package was not generated"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def generate
|
32
|
+
Rdm::Gen::Package.generate(
|
33
|
+
current_dir: current_dir,
|
34
|
+
package_name: package_name,
|
35
|
+
package_relative_path: package_relative_path,
|
36
|
+
skip_tests: skip_tests
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
def check_preconditions!
|
41
|
+
return unless package_name.empty?
|
42
|
+
|
43
|
+
puts 'Package name was not specified!'
|
44
|
+
exit 1
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/rdm/cli/init.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
module Rdm
|
2
|
+
module CLI
|
3
|
+
class Init
|
4
|
+
class << self
|
5
|
+
def run(opts = {})
|
6
|
+
Rdm::CLI::Init.new(opts).run
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_accessor :current_dir, :test, :console
|
11
|
+
def initialize(current_dir:, test:, console:)
|
12
|
+
@current_dir = current_dir
|
13
|
+
@test = test
|
14
|
+
@console = console
|
15
|
+
end
|
16
|
+
|
17
|
+
def run
|
18
|
+
check_preconditions!
|
19
|
+
begin
|
20
|
+
generate
|
21
|
+
rescue Errno::ENOENT => e
|
22
|
+
puts "Error occurred. Possible reasons:\n #{current_dir} not found. Please run on empty directory \n#{e.inspect}"
|
23
|
+
rescue Rdm::Errors::ProjectAlreadyInitialized
|
24
|
+
puts 'Error. Project was already initialized.'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def generate
|
29
|
+
Rdm::Gen::Init.generate(
|
30
|
+
current_dir: current_dir,
|
31
|
+
test: test,
|
32
|
+
console: console
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
def check_preconditions!
|
37
|
+
return unless current_dir.empty?
|
38
|
+
puts 'Current directory was not specified!'
|
39
|
+
exit 1
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/rdm/config.rb
CHANGED
data/lib/rdm/config_manager.rb
CHANGED
@@ -2,7 +2,6 @@ require 'yaml'
|
|
2
2
|
require 'erb'
|
3
3
|
|
4
4
|
class Rdm::ConfigManager
|
5
|
-
|
6
5
|
# Update configuration based on given config file
|
7
6
|
# @param config [Rdm::Config] Config entity
|
8
7
|
# @return root scope [Rdm::ConfigScope] Updated root scope
|
@@ -22,7 +21,7 @@ class Rdm::ConfigManager
|
|
22
21
|
# @param config [Hash<String: AnyValue>] Hash with configuration
|
23
22
|
# @return root scope [Rdm::ConfigScope] Updated root scope
|
24
23
|
def update_using_file(path, raise_if_missing: true)
|
25
|
-
if File.
|
24
|
+
if File.exist?(path)
|
26
25
|
compiled_file = ::ERB.new(File.read(path)).result
|
27
26
|
hash = YAML.load(compiled_file)
|
28
27
|
update_using_hash(hash)
|
@@ -62,7 +61,8 @@ class Rdm::ConfigManager
|
|
62
61
|
end
|
63
62
|
|
64
63
|
private
|
65
|
-
|
66
|
-
|
67
|
-
|
64
|
+
|
65
|
+
def root_scope
|
66
|
+
@root_scope ||= Rdm::ConfigScope.new
|
67
|
+
end
|
68
68
|
end
|
data/lib/rdm/config_scope.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
class Rdm::ConfigScope
|
2
2
|
def initialize(attributes = {})
|
3
|
-
@attributes =
|
3
|
+
@attributes = attributes
|
4
4
|
end
|
5
5
|
|
6
6
|
def read_attribute(key)
|
@@ -11,7 +11,7 @@ class Rdm::ConfigScope
|
|
11
11
|
@attributes[key.to_s] = value
|
12
12
|
end
|
13
13
|
|
14
|
-
def method_missing(method_name, *
|
14
|
+
def method_missing(method_name, *_args)
|
15
15
|
read_attribute(method_name)
|
16
16
|
end
|
17
17
|
|
@@ -20,4 +20,4 @@ class Rdm::ConfigScope
|
|
20
20
|
h[k] = Rdm::ConfigScope === v ? v.to_h : v
|
21
21
|
end
|
22
22
|
end
|
23
|
-
end
|
23
|
+
end
|
data/lib/rdm/errors.rb
CHANGED
@@ -0,0 +1,81 @@
|
|
1
|
+
module Rdm
|
2
|
+
module Gen
|
3
|
+
module Concerns
|
4
|
+
module TemplateHandling
|
5
|
+
# depends on target_path, templates_path methods in the including class!
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
def disable_logger!
|
9
|
+
@logger_disabled = true
|
10
|
+
end
|
11
|
+
|
12
|
+
def enable_logger!
|
13
|
+
@logger_disabled = false
|
14
|
+
end
|
15
|
+
|
16
|
+
def should_log?
|
17
|
+
!@logger_disabled
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.included(base)
|
22
|
+
base.instance_eval do
|
23
|
+
include Rdm::Support::Colorize
|
24
|
+
extend ClassMethods
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def log(msg)
|
31
|
+
puts(msg) if self.class.should_log?
|
32
|
+
end
|
33
|
+
|
34
|
+
def warning(msg)
|
35
|
+
log brown(msg)
|
36
|
+
end
|
37
|
+
|
38
|
+
def info(msg)
|
39
|
+
log green(msg)
|
40
|
+
end
|
41
|
+
|
42
|
+
def info_created(file)
|
43
|
+
info("Generated: #{file}")
|
44
|
+
end
|
45
|
+
|
46
|
+
def warning_exists(file)
|
47
|
+
warning("File #{file} already exists, skipping...")
|
48
|
+
end
|
49
|
+
|
50
|
+
def ensure_file(path_array, content = '')
|
51
|
+
filename = File.join(*path_array)
|
52
|
+
FileUtils.mkdir_p(File.dirname(filename))
|
53
|
+
return warning_exists(filename) if File.exist?(filename)
|
54
|
+
File.write(filename, content)
|
55
|
+
info_created(filename)
|
56
|
+
end
|
57
|
+
|
58
|
+
def copy_template(filepath, target_name = nil)
|
59
|
+
from = filepath
|
60
|
+
target_name ||= filepath
|
61
|
+
to = File.join(target_path, target_name)
|
62
|
+
return warning_exists(to) if File.exist?(to)
|
63
|
+
FileUtils.mkdir_p(File.dirname(to))
|
64
|
+
# copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false)
|
65
|
+
FileUtils.copy_entry(from, to, true, false, true)
|
66
|
+
info_created(relative_path(to))
|
67
|
+
end
|
68
|
+
|
69
|
+
def template_content(file, locals = {})
|
70
|
+
template_path = templates_path.join(file)
|
71
|
+
template_content = File.read(template_path)
|
72
|
+
Rdm::Support::Render.render(template_content, locals)
|
73
|
+
end
|
74
|
+
|
75
|
+
def relative_path(file)
|
76
|
+
file.gsub(current_dir + '/', '')
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/lib/rdm/gen/init.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'pathname'
|
3
|
+
require 'active_support/inflector'
|
4
|
+
|
5
|
+
module Rdm
|
6
|
+
module Gen
|
7
|
+
class Init
|
8
|
+
class << self
|
9
|
+
def generate(current_dir:, test: 'rspec', console: 'irb')
|
10
|
+
Rdm::Gen::Init.new(current_dir: current_dir, test: test, console: console).generate
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
include Rdm::Gen::Concerns::TemplateHandling
|
15
|
+
|
16
|
+
attr_accessor :current_dir, :test, :console
|
17
|
+
def initialize(current_dir:, test:, console:)
|
18
|
+
@current_dir = File.expand_path(current_dir)
|
19
|
+
@test = test
|
20
|
+
@console = console
|
21
|
+
end
|
22
|
+
|
23
|
+
def generate
|
24
|
+
check_preconditions!
|
25
|
+
|
26
|
+
Dir.chdir(current_dir) do
|
27
|
+
ensure_file(['.gitignore'])
|
28
|
+
ensure_file(
|
29
|
+
['Rdm.packages'],
|
30
|
+
template_content('Rdm.packages.erb')
|
31
|
+
)
|
32
|
+
|
33
|
+
ensure_file(
|
34
|
+
['Gemfile'],
|
35
|
+
template_content('Gemfile.erb')
|
36
|
+
)
|
37
|
+
|
38
|
+
ensure_file(
|
39
|
+
['Readme.md'],
|
40
|
+
template_content('Readme.md.erb')
|
41
|
+
)
|
42
|
+
move_templates
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def check_preconditions!
|
47
|
+
if File.exist?(File.join(current_dir, Rdm::SOURCE_FILENAME))
|
48
|
+
raise Rdm::Errors::ProjectAlreadyInitialized, "#{current_dir} has already #{Rdm::SOURCE_FILENAME}"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def move_templates
|
53
|
+
Dir.chdir(templates_path) do
|
54
|
+
copy_template('tests/run')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def templates_path
|
61
|
+
Pathname.new(File.join(File.dirname(__FILE__), '..', 'templates/init'))
|
62
|
+
end
|
63
|
+
|
64
|
+
def target_path
|
65
|
+
current_dir
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'pathname'
|
3
|
+
require 'active_support/inflector'
|
4
|
+
|
5
|
+
module Rdm
|
6
|
+
module Gen
|
7
|
+
class Package
|
8
|
+
class << self
|
9
|
+
def generate(current_dir:, package_name:, package_relative_path:, skip_tests: false)
|
10
|
+
Rdm::Gen::Package.new(
|
11
|
+
current_dir, package_name, package_relative_path, skip_tests
|
12
|
+
).create
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
include Rdm::Gen::Concerns::TemplateHandling
|
17
|
+
|
18
|
+
attr_accessor :current_dir, :package_name, :package_relative_path, :skip_tests
|
19
|
+
def initialize(current_dir, package_name, package_relative_path, skip_tests = false)
|
20
|
+
@current_dir = File.expand_path(current_dir)
|
21
|
+
@package_name = package_name
|
22
|
+
@package_relative_path = package_relative_path
|
23
|
+
@skip_tests = skip_tests
|
24
|
+
end
|
25
|
+
|
26
|
+
def rdm_source
|
27
|
+
@rdm_source ||= Rdm::SourceParser.new(source_path).parse_source_content
|
28
|
+
end
|
29
|
+
|
30
|
+
def source_path
|
31
|
+
File.join(current_dir, Rdm::SOURCE_FILENAME)
|
32
|
+
end
|
33
|
+
|
34
|
+
def source_content
|
35
|
+
File.open(source_path).read
|
36
|
+
end
|
37
|
+
|
38
|
+
def create
|
39
|
+
check_preconditions!
|
40
|
+
package_subdir_name = Rdm.settings.send(:package_subdir_name)
|
41
|
+
|
42
|
+
Dir.chdir(current_dir) do
|
43
|
+
ensure_file([package_relative_path, '.gitignore'])
|
44
|
+
ensure_file([package_relative_path, package_subdir_name, package_name, '.gitignore'])
|
45
|
+
ensure_file(
|
46
|
+
[package_relative_path, package_subdir_name, "#{package_name}.rb"],
|
47
|
+
template_content('main_module_file.rb.erb', package_name_camelized: package_name.camelize)
|
48
|
+
)
|
49
|
+
ensure_file(
|
50
|
+
[package_relative_path, 'Package.rb'],
|
51
|
+
template_content('package.rb.erb', package_name: package_name)
|
52
|
+
)
|
53
|
+
init_rspec unless skip_tests
|
54
|
+
|
55
|
+
move_templates
|
56
|
+
append_package_to_rdm_packages
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def check_preconditions!
|
61
|
+
if Dir.exist?(File.join(current_dir, package_relative_path))
|
62
|
+
raise Rdm::Errors::PackageDirExists, 'package dir exists'
|
63
|
+
end
|
64
|
+
|
65
|
+
if rdm_source.package_paths.include?(package_relative_path)
|
66
|
+
raise Rdm::Errors::PackageExists, 'package exists'
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def append_package_to_rdm_packages
|
71
|
+
new_source_content = source_content.strip + "\npackage '#{package_relative_path}'"
|
72
|
+
File.write(source_path, new_source_content)
|
73
|
+
end
|
74
|
+
|
75
|
+
def init_rspec
|
76
|
+
Dir.chdir(templates_path) do
|
77
|
+
copy_template('.rspec')
|
78
|
+
copy_template('spec/spec_helper.rb')
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def move_templates
|
83
|
+
Dir.chdir(templates_path) do
|
84
|
+
copy_template('bin/console_irb', 'bin/console')
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
def templates_path
|
91
|
+
Pathname.new(File.join(File.dirname(__FILE__), '..', 'templates/package'))
|
92
|
+
end
|
93
|
+
|
94
|
+
def target_path
|
95
|
+
File.join(current_dir, package_relative_path)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
data/lib/rdm/package.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
class Rdm::Package
|
2
|
-
DEFAULT_GROUP =
|
2
|
+
DEFAULT_GROUP = '_default_'.freeze
|
3
3
|
|
4
4
|
attr_accessor :metadata, :local_dependencies, :external_dependencies, :file_dependencies, :config_dependencies, :path
|
5
5
|
|
@@ -70,22 +70,23 @@ class Rdm::Package
|
|
70
70
|
end
|
71
71
|
|
72
72
|
private
|
73
|
-
def current_group
|
74
|
-
@current_group || DEFAULT_GROUP
|
75
|
-
end
|
76
73
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
dependencies
|
81
|
-
end
|
74
|
+
def current_group
|
75
|
+
@current_group || DEFAULT_GROUP
|
76
|
+
end
|
82
77
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
78
|
+
def fetch_dependencies(groupes, group)
|
79
|
+
dependencies = groupes[DEFAULT_GROUP] || []
|
80
|
+
dependencies += (groupes[group.to_s] || []) if group
|
81
|
+
dependencies
|
82
|
+
end
|
83
|
+
|
84
|
+
def exec_metadata(key, value)
|
85
|
+
if value.nil?
|
86
|
+
@metadata[key]
|
87
|
+
else
|
88
|
+
@metadata ||= {}
|
89
|
+
@metadata[key] = value
|
90
90
|
end
|
91
|
+
end
|
91
92
|
end
|