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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 66772ce18f205894e338d4488a739f64251fc1a7
4
- data.tar.gz: 787ec81e2d74245cb9c7e8344da6638e4a27a731
3
+ metadata.gz: 8dcb5bace74354caa9f02899805e8cffce5781fc
4
+ data.tar.gz: 3421a86c4e1b8f140fea4b9039b5800349fdb5f0
5
5
  SHA512:
6
- metadata.gz: e14981c363eb19b7c2bd57feaa3af786421821db7872d266132929d70e9555475a9a06d8cd385a9bee808191ab2422d48070c9bdcade6fff0f3c64e7dca9615e
7
- data.tar.gz: c3525e1e6ad865d092fe46dab42b7e676864c6e4e8455d861b98f0eaccda2321eaadbba0f233c712efa76dbae70bfb3afdd788a9269ccfb7c310dd0fcb496538
6
+ metadata.gz: 4f73c1caa72e08ce36dbd8fea7890aba454464d513a7494d5f9e47dabbe0149eb66feaa2d756e127cf2c2dc999e55664112a79870e872723b820254bf9941d7b
7
+ data.tar.gz: d6c4e38225c564ffe46751bfdb8ad1c434377d9a41a95bb19b3755b460f2d0e081efced32d304fc1973d20024c8c4f4ae73cb522800745787666387199933713
data/.gitignore CHANGED
@@ -1,4 +1,6 @@
1
1
  .DS_Store
2
2
  Gemfile.lock
3
3
  Package.rb.lock
4
- pkg
4
+ pkg
5
+ coverage/
6
+ .byebug_history
@@ -0,0 +1,17 @@
1
+ AllCops:
2
+ Exclude:
3
+ - 'lib/rdm/templates/**/**/*'
4
+
5
+ Style/Documentation:
6
+ Enabled: false
7
+
8
+ Style/ClassAndModuleChildren:
9
+ Enabled: false
10
+
11
+ Style/DocumentationMethod:
12
+ Enabled: false
13
+ RequireForNonPublicMethods: false
14
+
15
+
16
+ Metrics/LineLength:
17
+ Max: 90
@@ -0,0 +1,13 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.2
4
+ - 2.3.0
5
+ - 2.4.0
6
+
7
+ before_install:
8
+ - gem update --system
9
+ - gem --version
10
+ - gem install bundler
11
+
12
+ script:
13
+ - bundle exec rspec
data/Gemfile CHANGED
@@ -1,3 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gemspec
3
+ gemspec
4
+
5
+ group :test do
6
+ gem "rubocop", "~> 0.46"
7
+ end
@@ -1,4 +1,4 @@
1
- Copyright (c) 2016 Droidlabs
1
+ Copyright (c) 2016-2017 Droidlabs
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,42 +1,98 @@
1
- ### RDM (Ruby Dependecy Manager)
1
+ # Rdm (Ruby Dependecy Manager)
2
+ [![Build Status](https://travis-ci.org/ddd-ruby/rdm.png)](https://travis-ci.org/ddd-ruby/rdm)
3
+ [![Code Climate](https://codeclimate.com/github/ddd-ruby/rdm/badges/gpa.svg)](https://codeclimate.com/github/ddd-ruby/rdm)
4
+ [![codecov](https://codecov.io/gh/ddd-ruby/rdm/branch/master/graph/badge.svg)](https://codecov.io/gh/ddd-ruby/rdm)
5
+ [![Dependency Status](https://gemnasium.com/ddd-ruby/rdm.png)](https://gemnasium.com/ddd-ruby/rdm)
6
+
2
7
 
3
8
  Ruby dependency manager, helps managing local package dependencies.
4
9
  See sample application in "example" folder.
5
10
 
6
11
 
7
12
  ## Setup
8
- 1. create Rdm.packages in the root dir of your application
9
- ```ruby
10
- setup do
11
- role ENV['RUBY_ENV'] || 'production'
12
- configs_dir 'configs'
13
- config_path ":configs_dir/:config_name/default.yml"
14
- role_config_path ":configs_dir/:config_name/:role.yml"
15
- package_subdir_name 'package'
16
- end
13
+ You can initialize a project with `rdm`:
14
+
15
+ $ mkdir my_project && rdm init
16
+
17
+ Alternatively you could manually create the an `Rdm.packages` file with similar content in your existing project:
18
+
19
+ ```ruby
20
+ setup do
21
+ role ENV['RUBY_ENV'] || 'production'
22
+ configs_dir 'configs'
23
+ config_path ":configs_dir/:config_name/default.yml"
24
+ role_config_path ":configs_dir/:config_name/:role.yml"
25
+ package_subdir_name 'package'
26
+ end
27
+
28
+ config :database
29
+ config :app
30
+
31
+ package 'server'
32
+ package 'application/web'
33
+ package 'domain/core'
34
+ package 'infrastructure/repository'
35
+ ```
36
+
37
+
38
+ ## Generating new packages
39
+
40
+ # see available options
41
+ $ rdm gen.package -h
42
+
43
+ # generate commands package in a relative path to root directory
44
+ $ rdm gen.package commands --path core/application/commands
45
+
46
+
47
+ ## Example Package.rb
48
+
49
+ ```ruby
50
+ package do
51
+ name 'system_bus'
52
+ version '1.0.0'
53
+ end
54
+
55
+ dependency do
56
+ import 'utils'
57
+ end
58
+
59
+ dependency :test do
60
+ import 'repository'
61
+ import 'database'
62
+ import 'events'
63
+ end
64
+ ```
65
+
66
+
67
+ ## Rough Idea
68
+
69
+ `Rdm` positions itself somewhere between Ruby gems and Rails engines. It allows you to define clear boundaries in your application by splitting it up in application-level, framework-agnostic packages. Each package defines in its `Package.rb` file clear dependencies on other packages / gems for each environment.
70
+
71
+ When you `boot` a package (eg. by loading it in IRB), only defined dependencies are available to you. This is done by letting `Rdm` manage the Ruby-`$LOAD_PATH` behind the scenes for you.
72
+
73
+ All packages share the same Gemfile, but get access to only explicitly defined subset of gems / packages from the `Package.rb` file
74
+
75
+ When needed you can ask `Rdm` to programmatically give you dependencies for a particular package and use it. At `DroidLabs` we use this to generate very lightweight Dockerimages with just the necessary dependencies for each application.
76
+
77
+
78
+ ## Rules of RDM to structure big Ruby applications
79
+
80
+ - define all your gems in `Gemfile` to be __lazily__ loaded, like `gem 'sequel', '4.41.0', require: false`
81
+ - name your classes / modules after Rails-established conventions, so files are loaded only on demand, when encountering a new class / module constant (const_missing from ActiveSupport)
17
82
 
18
- config :database
19
- config :app
83
+ - use a Dependency Injection library with lazy-loading support, we recommend `smart_ioc`
20
84
 
21
- package 'server'
22
- package 'application/web'
23
- package 'domain/core'
24
- package 'infrastructure/repository'
25
- ```
26
85
 
27
- 1. Use package generator to create new package
86
+ ## Loading `Rdm`
28
87
 
29
- ```ruby
30
- rdm-generate package server --path=core/server
31
- ```
88
+ Setup RDM in boot.rb or spec_helper.rb or any other initializer. Rdm.init should point to a directory with `Package.rb`-file
32
89
 
33
- 1. Setup RDM in boot.rb or spec_helper.rb or any other initializer. Rdm.init should point to the directory where Rdm.packages file is located
90
+ ```ruby
91
+ require 'rdm'
92
+ Rdm.init(File.expand_path("../../", __FILE__), :test)
93
+ ```
34
94
 
35
- ```ruby
36
- require 'rdm'
37
- Rdm.init(File.expand_path("../../", __FILE__), :test)
38
- ```
39
95
 
40
- 1. Run rdm-install in root directory to create Package.rb.lock for each package. You should do that each time you create new package or update existing package dependencies.
96
+ ## Examples
41
97
 
42
- 1. Go to package directory, create some tests and run them.
98
+ - [small dummy application](/example)
data/bin/rdm ADDED
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- encoding: utf-8 -*-
3
+
4
+ require 'rubygems'
5
+ require 'bundler/setup'
6
+ require 'commander'
7
+ require 'rdm'
8
+
9
+ class RdmCliRunner
10
+ TESTFRAMEWORKS = %w[minitest rspec]
11
+ CONSOLES = %w[irb pry]
12
+ include Commander::Methods
13
+
14
+ def run
15
+ program :name, 'RDM'
16
+ program :version, Rdm::VERSION
17
+ program :description, 'Ruby Dependencies Manager'
18
+
19
+ command :init do |c|
20
+ c.syntax = 'rdm init, [options]'
21
+ c.description = 'generates project scaffold in current folder'
22
+ c.summary = '> ' + c.description
23
+ c.example 'generate scaffold with minitest', 'rdm init --test=minitest'
24
+ c.example 'generate scaffold with rspec', 'rdm init --test=rspec'
25
+ c.example 'generate scaffold with irb', 'rdm init --console=irb'
26
+ c.example 'generate scaffold with pry', 'rdm init --console=pry'
27
+ c.option '--test FRAMEWORK', TESTFRAMEWORKS, "select test framework: #{TESTFRAMEWORKS.join(", ")}"
28
+ c.option '--console CONSOLE', CONSOLES, "select console: #{CONSOLES.join(", ")}"
29
+ c.option '--current_dir [ROOT_DIR]', String, 'Path for the root folder'
30
+ c.action do |args, options|
31
+ defaults = {
32
+ test: "rspec",
33
+ console: "irb",
34
+ current_dir: `pwd`.strip
35
+ }
36
+ options_with_defaults = defaults.merge!(options.__hash__)
37
+ Rdm::CLI::Init.run(options_with_defaults)
38
+ end
39
+ end
40
+
41
+ command :"gen.package" do |c|
42
+ c.syntax = 'rdm gen.package PACKAGE_NAME [options]'
43
+ c.description = 'generates a package scaffold in specified folder'
44
+ c.summary = '> ' + c.description
45
+ c.example 'generate commands package',
46
+ 'rdm gen.package commands --path core/application/commands'
47
+ c.example 'generate pack/age package',
48
+ 'rdm gen.package pack/age --path subsystems/package'
49
+ c.example 'generate events package within /some/other/path folder',
50
+ 'rdm gen.package events --path core/domain/events --current_dir /some/other/path'
51
+ c.example 'generate auth package without tests', 'rdm gen.package auth --path subsystems/auth --skip-tests'
52
+ c.option '--path [RELATIVE_PATH]', String, 'Path for the package'
53
+ c.option '--current_dir [ROOT_DIR]', String, 'Path for the root folder'
54
+ c.option '--skip-test', '--skip-tests', 'Don\'t generate test files'
55
+ c.action do |args, options|
56
+ package_name = (args.first || "")
57
+ defaults = {
58
+ skip_tests: false,
59
+ current_dir: `pwd`.chomp,
60
+ package_name: package_name,
61
+ path: package_name.downcase.gsub(/\s+/, '_')
62
+ }
63
+ options_with_defaults = defaults.merge!(options.__hash__)
64
+ Rdm::CLI::GenPackage.run(options_with_defaults)
65
+ end
66
+ end
67
+
68
+ run!
69
+ end
70
+ end
71
+
72
+ RdmCliRunner.new.run
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ if RUBY_VERSION.to_f > 2.1
4
+ puts "running rubocop..."
5
+ exec("bundle exec rubocop -a -D lib/")
6
+ end
@@ -0,0 +1 @@
1
+ theme: jekyll-theme-minimal
@@ -0,0 +1,98 @@
1
+ # Rdm (Ruby Dependecy Manager)
2
+ [![Build Status](https://travis-ci.org/ddd-ruby/rdm.png)](https://travis-ci.org/ddd-ruby/rdm)
3
+ [![Code Climate](https://codeclimate.com/github/ddd-ruby/rdm/badges/gpa.svg)](https://codeclimate.com/github/ddd-ruby/rdm)
4
+ [![codecov](https://codecov.io/gh/ddd-ruby/rdm/branch/master/graph/badge.svg)](https://codecov.io/gh/ddd-ruby/rdm)
5
+ [![Dependency Status](https://gemnasium.com/ddd-ruby/rdm.png)](https://gemnasium.com/ddd-ruby/rdm)
6
+
7
+
8
+ Ruby dependency manager, helps managing local package dependencies.
9
+ See sample application in "example" folder.
10
+
11
+
12
+ ## Setup
13
+ You can initialize a project with `rdm`:
14
+
15
+ $ mkdir my_project && rdm init
16
+
17
+ Alternatively you could manually create the an `Rdm.packages` file with similar content in your existing project:
18
+
19
+ ```ruby
20
+ setup do
21
+ role ENV['RUBY_ENV'] || 'production'
22
+ configs_dir 'configs'
23
+ config_path ":configs_dir/:config_name/default.yml"
24
+ role_config_path ":configs_dir/:config_name/:role.yml"
25
+ package_subdir_name 'package'
26
+ end
27
+
28
+ config :database
29
+ config :app
30
+
31
+ package 'server'
32
+ package 'application/web'
33
+ package 'domain/core'
34
+ package 'infrastructure/repository'
35
+ ```
36
+
37
+
38
+ ## Generating new packages
39
+
40
+ # see available options
41
+ $ rdm gen.package -h
42
+
43
+ # generate commands package in a relative path to root directory
44
+ $ rdm gen.package commands --path core/application/commands
45
+
46
+
47
+ ## Example Package.rb
48
+
49
+ ```ruby
50
+ package do
51
+ name 'system_bus'
52
+ version '1.0.0'
53
+ end
54
+
55
+ dependency do
56
+ import 'utils'
57
+ end
58
+
59
+ dependency :test do
60
+ import 'repository'
61
+ import 'database'
62
+ import 'events'
63
+ end
64
+ ```
65
+
66
+
67
+ ## Rough Idea
68
+
69
+ `Rdm` positions itself somewhere between Ruby gems and Rails engines. It allows you to define clear boundaries in your application by splitting it up in application-level, framework-agnostic packages. Each package defines in its `Package.rb` file clear dependencies on other packages / gems for each environment.
70
+
71
+ When you `boot` a package (eg. by loading it in IRB), only defined dependencies are available to you. This is done by letting `Rdm` manage the Ruby-`$LOAD_PATH` behind the scenes for you.
72
+
73
+ All packages share the same Gemfile, but get access to only explicitly defined subset of gems / packages from the `Package.rb` file
74
+
75
+ When needed you can ask `Rdm` to programmatically give you dependencies for a particular package and use it. At `DroidLabs` we use this to generate very lightweight Dockerimages with just the necessary dependencies for each application.
76
+
77
+
78
+ ## Rules of RDM to structure big Ruby applications
79
+
80
+ - define all your gems in `Gemfile` to be __lazily__ loaded, like `gem 'sequel', '4.41.0', require: false`
81
+ - name your classes / modules after Rails-established conventions, so files are loaded only on demand, when encountering a new class / module constant (const_missing from ActiveSupport)
82
+
83
+ - use a Dependency Injection library with lazy-loading support, we recommend `smart_ioc`
84
+
85
+
86
+ ## Loading `Rdm`
87
+
88
+ Setup RDM in boot.rb or spec_helper.rb or any other initializer. Rdm.init should point to a directory with `Package.rb`-file
89
+
90
+ ```ruby
91
+ require 'rdm'
92
+ Rdm.init(File.expand_path("../../", __FILE__), :test)
93
+ ```
94
+
95
+
96
+ ## Examples
97
+
98
+ - [small dummy application](/example)
@@ -0,0 +1,31 @@
1
+ ### possible CLI interface for RDM
2
+
3
+ rdm init --test=minitest
4
+ rdm init --test=rspec
5
+
6
+ rdm init --console=irb
7
+ rdm init --console=pry
8
+
9
+ rdm gen.package some_package --path subsystems/some_package
10
+
11
+ rdm --version
12
+ rdm -v
13
+
14
+ rdm --help
15
+ rdm -h
16
+
17
+
18
+
19
+ ### RDM public API:
20
+
21
+
22
+ Rdm.init("some/Package.rb")
23
+ Rdm.init("some/Package.rb", :test)
24
+
25
+
26
+
27
+ # Rdm::SourceParser.read_and_init_source(rdm_packages_path).packages
28
+
29
+ Rdm.source
30
+ # instance of Rdm::Source
31
+ Rdm.packages
@@ -12,4 +12,4 @@ config :app
12
12
  package "server"
13
13
  package "application/web"
14
14
  package "domain/core"
15
- package "infrastructure/repository"
15
+ package "infrastructure/repository"
@@ -1,5 +1,3 @@
1
- ### Lock all package dependencies
2
- $ bundle exec rdm-install
3
-
4
1
  ### Run server:
2
+ $ bundle
5
3
  $ bundle exec ruby server/server.rb
data/lib/rdm.rb CHANGED
@@ -1,21 +1,32 @@
1
1
  module Rdm
2
- SOURCE_FILENAME = "Rdm.packages"
3
- PACKAGE_FILENAME = "Package.rb"
4
- PACKAGE_LOCK_FILENAME = "#{PACKAGE_FILENAME}.lock"
5
-
6
- require "rdm/errors"
7
- require "rdm/settings"
8
- require "rdm/source"
9
- require "rdm/source_parser"
10
- require "rdm/source_installer"
11
- require "rdm/package"
12
- require "rdm/package_parser"
13
- require "rdm/package_generator"
14
- require "rdm/package_importer"
15
- require "rdm/config"
16
- require "rdm/config_scope"
17
- require "rdm/config_manager"
18
- require "rdm/auto_updater"
2
+ SOURCE_FILENAME = 'Rdm.packages'.freeze
3
+ PACKAGE_FILENAME = 'Package.rb'.freeze
4
+
5
+ # Utils
6
+ require 'rdm/support/colorize'
7
+ require 'rdm/support/render'
8
+ require 'rdm/support/template'
9
+ require 'rdm/version'
10
+
11
+ # CLI part
12
+ require 'rdm/cli/gen_package'
13
+ require 'rdm/cli/init'
14
+ require 'rdm/gen/concerns/template_handling'
15
+ require 'rdm/gen/package'
16
+ require 'rdm/gen/init'
17
+
18
+ # Runtime part
19
+ require 'rdm/config'
20
+ require 'rdm/config_scope'
21
+ require 'rdm/config_manager'
22
+ require 'rdm/errors'
23
+ require 'rdm/package'
24
+ require 'rdm/package_parser'
25
+ require 'rdm/package_importer'
26
+ require 'rdm/settings'
27
+ require 'rdm/source'
28
+ require 'rdm/source_parser'
29
+ require 'rdm/source_locator'
19
30
 
20
31
  class << self
21
32
  # Initialize current package using Package.rb
@@ -45,8 +56,6 @@ module Rdm
45
56
  @root = value
46
57
  end
47
58
 
48
- def root
49
- @root
50
- end
59
+ attr_reader :root
51
60
  end
52
61
  end