rdm 0.1.12 → 0.1.13
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![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
|
-
|
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
|
+
[![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
|
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
|