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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8dcb5bace74354caa9f02899805e8cffce5781fc
|
4
|
+
data.tar.gz: 3421a86c4e1b8f140fea4b9039b5800349fdb5f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f73c1caa72e08ce36dbd8fea7890aba454464d513a7494d5f9e47dabbe0149eb66feaa2d756e127cf2c2dc999e55664112a79870e872723b820254bf9941d7b
|
7
|
+
data.tar.gz: d6c4e38225c564ffe46751bfdb8ad1c434377d9a41a95bb19b3755b460f2d0e081efced32d304fc1973d20024c8c4f4ae73cb522800745787666387199933713
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
@@ -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
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,42 +1,98 @@
|
|
1
|
-
|
1
|
+
# Rdm (Ruby Dependecy Manager)
|
2
|
+
[](https://travis-ci.org/ddd-ruby/rdm)
|
3
|
+
[](https://codeclimate.com/github/ddd-ruby/rdm)
|
4
|
+
[](https://codecov.io/gh/ddd-ruby/rdm)
|
5
|
+
[](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
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|
-
|
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
|
-
|
86
|
+
## Loading `Rdm`
|
28
87
|
|
29
|
-
|
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
|
-
|
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
|
-
|
96
|
+
## Examples
|
41
97
|
|
42
|
-
|
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
|
data/bin/rubocop
ADDED
data/docs/_config.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
theme: jekyll-theme-minimal
|
data/docs/index.md
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
# Rdm (Ruby Dependecy Manager)
|
2
|
+
[](https://travis-ci.org/ddd-ruby/rdm)
|
3
|
+
[](https://codeclimate.com/github/ddd-ruby/rdm)
|
4
|
+
[](https://codecov.io/gh/ddd-ruby/rdm)
|
5
|
+
[](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
|
data/example/Rdm.packages
CHANGED
data/example/Readme.md
CHANGED
data/lib/rdm.rb
CHANGED
@@ -1,21 +1,32 @@
|
|
1
1
|
module Rdm
|
2
|
-
SOURCE_FILENAME =
|
3
|
-
PACKAGE_FILENAME =
|
4
|
-
|
5
|
-
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
|
11
|
-
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
|
18
|
-
|
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
|
-
|
49
|
-
@root
|
50
|
-
end
|
59
|
+
attr_reader :root
|
51
60
|
end
|
52
61
|
end
|