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.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/.rubocop.yml +17 -0
  4. data/.travis.yml +13 -0
  5. data/Gemfile +5 -1
  6. data/LICENSE.txt +1 -1
  7. data/README.md +84 -28
  8. data/bin/rdm +72 -0
  9. data/bin/rubocop +6 -0
  10. data/docs/_config.yml +1 -0
  11. data/docs/index.md +98 -0
  12. data/docs/interface_brainstorming.md +31 -0
  13. data/example/Rdm.packages +1 -1
  14. data/example/Readme.md +1 -3
  15. data/lib/rdm.rb +29 -20
  16. data/lib/rdm/cli/gen_package.rb +48 -0
  17. data/lib/rdm/cli/init.rb +43 -0
  18. data/lib/rdm/config.rb +9 -1
  19. data/lib/rdm/config_manager.rb +5 -5
  20. data/lib/rdm/config_scope.rb +3 -3
  21. data/lib/rdm/errors.rb +2 -0
  22. data/lib/rdm/gen/concerns/template_handling.rb +81 -0
  23. data/lib/rdm/gen/init.rb +69 -0
  24. data/lib/rdm/gen/package.rb +99 -0
  25. data/lib/rdm/package.rb +17 -16
  26. data/lib/rdm/package_importer.rb +89 -79
  27. data/lib/rdm/package_parser.rb +25 -5
  28. data/lib/rdm/settings.rb +21 -20
  29. data/lib/rdm/source.rb +1 -1
  30. data/lib/rdm/source_locator.rb +31 -0
  31. data/lib/rdm/source_parser.rb +83 -68
  32. data/lib/rdm/support/colorize.rb +106 -0
  33. data/lib/rdm/support/render.rb +17 -0
  34. data/lib/rdm/support/template.rb +30 -0
  35. data/lib/rdm/templates/init/Gemfile.erb +25 -0
  36. data/lib/rdm/templates/init/Rdm.packages.erb +18 -0
  37. data/lib/rdm/templates/init/Readme.md.erb +24 -0
  38. data/lib/rdm/templates/{tests → init/tests}/run +27 -31
  39. data/lib/rdm/templates/package/.gitignore +1 -0
  40. data/lib/rdm/templates/{.rspec → package/.rspec} +0 -0
  41. data/lib/rdm/templates/{bin → package/bin}/console_irb +4 -5
  42. data/lib/rdm/templates/{main_module_file.rb.erb → package/main_module_file.rb.erb} +0 -0
  43. data/lib/rdm/templates/{package.rb.erb → package/package.rb.erb} +0 -0
  44. data/lib/rdm/templates/{spec → package/spec}/spec_helper.rb +0 -0
  45. data/lib/rdm/version.rb +1 -1
  46. data/rdm.gemspec +3 -0
  47. data/spec/fixtures/SampleSource.rb +3 -1
  48. data/spec/fixtures/sample_prj/Rdm.packages +12 -0
  49. data/spec/fixtures/sample_prj/infrastructure/web/Package.rb +16 -0
  50. data/spec/rdm/cli/gen_package_spec.rb +130 -0
  51. data/spec/rdm/cli/init_spec.rb +97 -0
  52. data/spec/rdm/config_manager_spec.rb +37 -1
  53. data/spec/rdm/gen/init_spec.rb +63 -0
  54. data/spec/rdm/gen/package_spec.rb +87 -0
  55. data/spec/rdm/package_importer_spec.rb +5 -1
  56. data/spec/rdm/package_parser_spec.rb +10 -24
  57. data/spec/rdm/rdm_spec.rb +42 -0
  58. data/spec/rdm/source_locator_spec.rb +45 -0
  59. data/spec/rdm/source_parser_spec.rb +45 -3
  60. data/spec/rdm/support/colorize_spec.rb +24 -0
  61. data/spec/rdm/support/template_spec.rb +20 -0
  62. data/spec/spec_helper.rb +45 -0
  63. metadata +92 -16
  64. data/bin/rdm-generate +0 -55
  65. data/bin/rdm-install +0 -13
  66. data/lib/rdm/auto_updater.rb +0 -41
  67. data/lib/rdm/package_generator.rb +0 -121
  68. data/lib/rdm/source_installer.rb +0 -35
  69. 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
@@ -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
@@ -1,3 +1,11 @@
1
1
  class Rdm::Config
2
2
  attr_accessor :name, :default_path, :role_path
3
- end
3
+
4
+ def self.build(name:, default_path:, role_path:)
5
+ new.tap do |i|
6
+ i.name = name
7
+ i.default_path = default_path
8
+ i.role_path = role_path
9
+ end
10
+ end
11
+ end
@@ -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.exists?(path)
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
- def root_scope
66
- @root_scope ||= Rdm::ConfigScope.new
67
- end
64
+
65
+ def root_scope
66
+ @root_scope ||= Rdm::ConfigScope.new
67
+ end
68
68
  end
@@ -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, *args)
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
@@ -1,5 +1,7 @@
1
1
  module Rdm
2
2
  module Errors
3
+ class ProjectAlreadyInitialized < StandardError
4
+ end
3
5
  class PackageExists < StandardError
4
6
  end
5
7
 
@@ -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
@@ -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
@@ -1,5 +1,5 @@
1
1
  class Rdm::Package
2
- DEFAULT_GROUP = "_default_"
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
- def fetch_dependencies(groupes, group)
78
- dependencies = groupes[DEFAULT_GROUP] || []
79
- dependencies += (groupes[group.to_s] || []) if group
80
- dependencies
81
- end
74
+ def current_group
75
+ @current_group || DEFAULT_GROUP
76
+ end
82
77
 
83
- def exec_metadata(key, value)
84
- if value.nil?
85
- @metadata[key]
86
- else
87
- @metadata ||= {}
88
- @metadata[key] = value
89
- end
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