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
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