rdm 0.1.12 → 0.1.13
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/.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
|