rdm 0.1.12 → 0.1.13

Sign up to get free protection for your applications and to get access to all the features.
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