rdm 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c4c87a608dd7147f5a49ab3680d4489fcdcf9911
4
+ data.tar.gz: e0abf7431514b10da231bf2707895c786ed0c8ed
5
+ SHA512:
6
+ metadata.gz: fd41ca819ff874780f6a1578cc56ca267a5df70e72681e009a8185f5f5c3505c76ba7c3718a281be0d01691f96bbcdf8c277dbd597b40912429849970d9efcf7
7
+ data.tar.gz: 4eaebb451cdebf53859bdbf0c572d11ca4a726bba25642e59315ad36dac7f7a9a10a51a1f0191727d0fa2301b8b776c39a65de5d1d0b2927b848af14870160ad
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ .DS_Store
2
+ Gemfile.lock
3
+ Package.rb.lock
4
+ pkg
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2016 Droidlabs
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ ### RDM (Ruby Dependecy Manager)
2
+
3
+ Ruby dependency manager, helps managing local package dependencies.
4
+ See sample application in "example" folder.
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/rdm-install ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- encoding: utf-8 -*-
3
+
4
+ require 'rubygems'
5
+ require 'bundler'
6
+ require 'rdm'
7
+
8
+ source_path = File.join(`pwd`.chomp, Rdm::SOURCE_FILENAME)
9
+ begin
10
+ Rdm::SourceInstaller.install(source_path)
11
+ rescue Errno::ENOENT
12
+ puts "#{Rdm::SOURCE_FILENAME} not found. Please run on directory containing #{Rdm::SOURCE_FILENAME}"
13
+ end
data/example/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "sequel"
4
+ gem "rdm", path: "../"
@@ -0,0 +1,4 @@
1
+ package "server"
2
+ package "application/web"
3
+ package "domain/core"
4
+ package "infrastructure/repository"
data/example/Readme.md ADDED
File without changes
@@ -0,0 +1,10 @@
1
+ package do
2
+ name "web"
3
+ version "1.0"
4
+ end
5
+
6
+ dependency do
7
+ require_file "lib/web.rb"
8
+
9
+ import "core"
10
+ end
@@ -0,0 +1,11 @@
1
+ class Web::SampleController
2
+ #inject :sample_service
3
+
4
+ def create_something
5
+ sample_service.create_something
6
+ end
7
+
8
+ def sample_service
9
+ Core::SampleService.new
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ require 'active_support'
2
+ require 'active_support/dependencies'
3
+ require 'active_support/core_ext'
4
+
5
+ ActiveSupport::Dependencies.autoload_paths << Pathname.new(__FILE__).parent.to_s
6
+
7
+ module Web
8
+ end
@@ -0,0 +1,10 @@
1
+ package do
2
+ name "core"
3
+ version "1.0"
4
+ end
5
+
6
+ dependency do
7
+ require_file "lib/core.rb"
8
+
9
+ import "repository"
10
+ end
@@ -0,0 +1,11 @@
1
+ class Core::SampleService
2
+ #inject :sample_repository
3
+
4
+ def create_something
5
+ sample_repository.create_something
6
+ end
7
+
8
+ def sample_repository
9
+ Repository::SampleRepository.new
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ require 'active_support'
2
+ require 'active_support/dependencies'
3
+ require 'active_support/core_ext'
4
+
5
+ ActiveSupport::Dependencies.autoload_paths << Pathname.new(__FILE__).parent.to_s
6
+
7
+ module Core
8
+ end
@@ -0,0 +1,10 @@
1
+ package do
2
+ name "repository"
3
+ version "1.0"
4
+ end
5
+
6
+ dependency do
7
+ require_file "lib/repository.rb"
8
+
9
+ require "sequel"
10
+ end
@@ -0,0 +1,5 @@
1
+ class Repository::SampleRepository
2
+ def create_something
3
+ puts "WORKS!"
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ require 'active_support'
2
+ require 'active_support/dependencies'
3
+ require 'active_support/core_ext'
4
+
5
+ ActiveSupport::Dependencies.autoload_paths << Pathname.new(__FILE__).parent.to_s
6
+
7
+ module Repository
8
+ end
@@ -0,0 +1,8 @@
1
+ package do
2
+ name "server"
3
+ version "1.0"
4
+ end
5
+
6
+ dependency do
7
+ import "web"
8
+ end
@@ -0,0 +1,8 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require "rdm"
4
+
5
+ Rdm.init(File.expand_path("../", __FILE__))
6
+
7
+ Web::SampleController.new.create_something
8
+ #BikeManager::Container[:sample_controller].create_something
@@ -0,0 +1,80 @@
1
+ class Rdm::Package
2
+ DEFAULT_GROUP = "_default_"
3
+
4
+ attr_accessor :metadata, :local_dependencies, :external_dependencies, :file_dependencies, :path
5
+
6
+ def local_dependencies(group = nil)
7
+ fetch_dependencies(@local_dependencies || {}, group)
8
+ end
9
+
10
+ def external_dependencies(group = nil)
11
+ fetch_dependencies(@external_dependencies || {}, group)
12
+ end
13
+
14
+ def file_dependencies(group = nil)
15
+ fetch_dependencies(@file_dependencies || {}, group)
16
+ end
17
+
18
+ # Import local dependency, e.g another package
19
+ def import(dependency)
20
+ @local_dependencies ||= {}
21
+ @local_dependencies[current_group] ||= []
22
+ @local_dependencies[current_group] << dependency
23
+ end
24
+
25
+ # General ruby requires, e.g. require another gem
26
+ def require(dependency)
27
+ @external_dependencies ||= {}
28
+ @external_dependencies[current_group] ||= []
29
+ @external_dependencies[current_group] << dependency
30
+ end
31
+
32
+ # Require file relative to package, e.g. require root file
33
+ def require_file(file)
34
+ @file_dependencies ||= {}
35
+ @file_dependencies[current_group] ||= []
36
+ @file_dependencies[current_group] << file
37
+ end
38
+
39
+ def package
40
+ yield
41
+ end
42
+
43
+ def dependency(group = nil)
44
+ @current_group = group ? group.to_s : nil
45
+ yield
46
+ @current_group = nil
47
+ end
48
+
49
+ def source(value = nil)
50
+ exec_metadata :source, value
51
+ end
52
+
53
+ def name(value = nil)
54
+ exec_metadata :name, value
55
+ end
56
+
57
+ def version(value = nil)
58
+ exec_metadata :verion, value
59
+ end
60
+
61
+ private
62
+ def current_group
63
+ @current_group || DEFAULT_GROUP
64
+ end
65
+
66
+ def fetch_dependencies(groupes, group)
67
+ dependencies = groupes[DEFAULT_GROUP] || []
68
+ dependencies += (groupes[group.to_s] || []) if group
69
+ dependencies
70
+ end
71
+
72
+ def exec_metadata(key, value)
73
+ if value
74
+ @metadata ||= {}
75
+ @metadata[key] = value
76
+ else
77
+ @metadata[key]
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,64 @@
1
+ class Rdm::PackageImporter
2
+ class << self
3
+ # Initialize current package using Package.rb
4
+ def import_file(package_path, group: nil)
5
+ if File.directory?(package_path)
6
+ package_path = File.join(package_path, Rdm::PACKAGE_LOCK_FILENAME)
7
+ end
8
+ package_content = File.open(package_path).read
9
+ package = package_parser.parse(package_content)
10
+
11
+ packages = fetch_packages(package.source)
12
+ import_package(package.name, packages: packages, group: group.to_s)
13
+ end
14
+
15
+ # Import package and initialize module
16
+ def import_package(package_name, packages:, imported_packages: [], group: nil)
17
+ return if imported_packages.include?(package_name.to_s)
18
+ package = packages[package_name.to_s]
19
+ init_package(package, group: group)
20
+ imported_packages << package_name
21
+
22
+ # also import local dependencies
23
+ package.local_dependencies(group).each do |dependency|
24
+ import_package(dependency, packages: packages, imported_packages: imported_packages)
25
+ end
26
+
27
+ imported_packages
28
+ end
29
+
30
+ private
31
+ def source_parser
32
+ Rdm::SourceParser
33
+ end
34
+
35
+ def package_parser
36
+ Rdm::PackageParser
37
+ end
38
+
39
+ def init_package(package, group:)
40
+ package.external_dependencies(group).each do |dependency|
41
+ require dependency
42
+ end
43
+ package.file_dependencies(group).each do |file_path|
44
+ require File.join(package.path, file_path)
45
+ end
46
+ end
47
+
48
+ def fetch_packages(source_path)
49
+ root_path = File.dirname(source_path)
50
+ source_content = File.open(source_path).read
51
+
52
+ packages = {}
53
+ source_parser.parse(source_content).each do |package|
54
+ package_path = File.join(root_path, package)
55
+ package_rb_path = File.join(package_path, Rdm::PACKAGE_FILENAME)
56
+ package_content = File.open(package_rb_path).read
57
+ package = package_parser.parse(package_content)
58
+ package.path = package_path
59
+ packages[package.name] = package
60
+ end
61
+ packages
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,7 @@
1
+ class Rdm::PackageParser
2
+ def self.parse(package_content)
3
+ spec = Rdm::Package.new
4
+ spec.instance_eval(package_content)
5
+ spec
6
+ end
7
+ end
@@ -0,0 +1,27 @@
1
+ class Rdm::SourceInstaller
2
+ class << self
3
+ # Install source by locking all it's specs
4
+ def install(source_path)
5
+ source_content = File.open(source_path).read
6
+ source_parser.parse(source_content).each do |package_path|
7
+ full_path = File.join(File.dirname(source_path), package_path, Rdm::PACKAGE_FILENAME)
8
+ lock(full_path, source_path)
9
+ end
10
+ end
11
+
12
+ # Lock package on installation
13
+ def lock(package_path, source_path)
14
+ package_content = File.open(package_path).read
15
+
16
+ locked = "source \"#{source_path}\"\r\n\r\n"
17
+ locked += package_content
18
+
19
+ File.open("#{package_path}.lock", "w+").write(locked)
20
+ end
21
+
22
+ private
23
+ def source_parser
24
+ Rdm::SourceParser
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,19 @@
1
+ class Rdm::SourceParser
2
+ class Scope
3
+ attr_accessor :package_paths
4
+
5
+ def package(package_path)
6
+ self.package_paths ||= []
7
+ self.package_paths << package_path
8
+ end
9
+ end
10
+
11
+ class << self
12
+ # Parse source file and return package paths
13
+ def parse(source_content)
14
+ scope = Scope.new
15
+ scope.instance_eval(source_content)
16
+ scope.package_paths
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ module Rdm
2
+ VERSION = "0.0.1"
3
+ end
data/lib/rdm.rb ADDED
@@ -0,0 +1,18 @@
1
+ module Rdm
2
+ SOURCE_FILENAME = "Rdm.packages"
3
+ PACKAGE_FILENAME = "Package.rb"
4
+ PACKAGE_LOCK_FILENAME = "#{PACKAGE_FILENAME}.lock"
5
+
6
+ require "rdm/source_parser"
7
+ require "rdm/source_installer"
8
+ require "rdm/package"
9
+ require "rdm/package_parser"
10
+ require "rdm/package_importer"
11
+
12
+ class << self
13
+ # Initialize current package using Package.rb
14
+ def init(package_path, group = nil)
15
+ Rdm::PackageImporter.import_file(package_path, group: group)
16
+ end
17
+ end
18
+ end
data/rdm.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
+ require 'rdm/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rdm"
8
+ spec.version = Rdm::VERSION
9
+ spec.authors = ["Droid Labs"]
10
+ spec.description = %q{Ruby Dependency Manager}
11
+ spec.summary = %q{Ruby Dependency Manager}
12
+
13
+ spec.files = `git ls-files`.split($/)
14
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
15
+ spec.test_files = spec.files.grep(%r{^(spec)/})
16
+
17
+ spec.require_paths = ["lib"]
18
+
19
+ spec.add_development_dependency "bundler", "~> 1.3"
20
+ spec.add_development_dependency "rake"
21
+ spec.add_development_dependency "rspec"
22
+ spec.add_dependency "activesupport"
23
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rdm::PackageImporter do
4
+ def build_package(name, dependencies: [])
5
+ package = Rdm::Package.new
6
+ package.name(name)
7
+ dependencies.each do |dependency|
8
+ package.import(dependency)
9
+ end
10
+ package
11
+ end
12
+
13
+ describe "#import_package" do
14
+ subject { Rdm::PackageImporter }
15
+
16
+ context "no group given" do
17
+ it "imports all depended global packages" do
18
+ web_pack = build_package("web", dependencies: ["core"])
19
+ core_pack = build_package("core")
20
+ packages = {"web" => web_pack, "core" => core_pack}
21
+
22
+ imported = subject.import_package("web", packages: packages)
23
+ expect(imported).to include("core")
24
+ end
25
+ end
26
+
27
+ context "group given" do
28
+ it "imports global and group dependencies" do
29
+ web_pack = build_package("web", dependencies: ["core"])
30
+ web_pack.dependency "test" do
31
+ web_pack.import('factory')
32
+ end
33
+ core_pack = build_package("core")
34
+ factory_pack = build_package("factory")
35
+
36
+ packages = {"web" => web_pack, "core" => core_pack, "factory" => factory_pack}
37
+
38
+ imported = subject.import_package("web", packages: packages, group: "test")
39
+ expect(imported).to include("factory")
40
+ end
41
+
42
+ it "does not import not required group" do
43
+ web_pack = build_package("web", dependencies: ["core"])
44
+ web_pack.dependency "test" do
45
+ web_pack.import('factory')
46
+ end
47
+ core_pack = build_package("core")
48
+ factory_pack = build_package("factory")
49
+
50
+ packages = {"web" => web_pack, "core" => core_pack, "factory" => factory_pack}
51
+
52
+ imported = subject.import_package("web", packages: packages)
53
+ expect(imported).to_not include("factory")
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rdm::PackageParser do
4
+ describe "#parse" do
5
+ subject { Rdm::PackageParser }
6
+
7
+ let(:package_content) {
8
+ %Q{
9
+ package do
10
+ name "web"
11
+ version "1.0"
12
+ end
13
+
14
+ dependency do
15
+ import "core"
16
+ require "active_support"
17
+ require_file "lib/web.rb"
18
+ end
19
+
20
+ dependency :test do
21
+ import "test_factory"
22
+ require "rspec"
23
+ require_file "lib/spec.rb"
24
+ end
25
+ }
26
+ }
27
+
28
+ let(:package) { subject.parse(package_content) }
29
+
30
+ it "parses package meta information" do
31
+ expect(package.name).to eq("web")
32
+ expect(package.version).to eq("1.0")
33
+ end
34
+
35
+ it "parses local dependecies" do
36
+ expect(package.local_dependencies).to include("core")
37
+ expect(package.local_dependencies).to_not include("test_factory")
38
+
39
+ expect(package.local_dependencies(:test)).to include("core")
40
+ expect(package.local_dependencies(:test)).to include("test_factory")
41
+ end
42
+
43
+ it "parses external dependecies" do
44
+ expect(package.external_dependencies).to include("active_support")
45
+ expect(package.external_dependencies).to_not include("rspec")
46
+
47
+ expect(package.external_dependencies(:test)).to include("active_support")
48
+ expect(package.external_dependencies(:test)).to include("rspec")
49
+ end
50
+
51
+ it "parses file dependecies" do
52
+ expect(package.file_dependencies).to include("lib/web.rb")
53
+ expect(package.file_dependencies).to_not include("lib/spec.rb")
54
+
55
+ expect(package.file_dependencies(:test)).to include("lib/web.rb")
56
+ expect(package.file_dependencies(:test)).to include("lib/spec.rb")
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rdm::SourceParser do
4
+ describe "#parse" do
5
+ subject { Rdm::SourceParser }
6
+
7
+ let(:source_content) {
8
+ %Q{package "application/web"\r\npackage "domain/core"}
9
+ }
10
+
11
+ it "returns all packages paths" do
12
+ paths = subject.parse(source_content)
13
+ expect(paths.count).to be(2)
14
+ expect(paths).to include("application/web")
15
+ expect(paths).to include("domain/core")
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,6 @@
1
+ require 'rdm'
2
+
3
+ RSpec.configure do |config|
4
+ config.color = true
5
+ end
6
+
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rdm
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Droid Labs
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-01-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Ruby Dependency Manager
70
+ email:
71
+ executables:
72
+ - rdm-install
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - Gemfile
78
+ - LICENSE.txt
79
+ - README.md
80
+ - Rakefile
81
+ - bin/rdm-install
82
+ - example/Gemfile
83
+ - example/Rdm.packages
84
+ - example/Readme.md
85
+ - example/application/web/Package.rb
86
+ - example/application/web/lib/web.rb
87
+ - example/application/web/lib/web/sample_controller.rb
88
+ - example/domain/core/Package.rb
89
+ - example/domain/core/lib/core.rb
90
+ - example/domain/core/lib/core/sample_service.rb
91
+ - example/infrastructure/repository/Package.rb
92
+ - example/infrastructure/repository/lib/repository.rb
93
+ - example/infrastructure/repository/lib/repository/sample_repository.rb
94
+ - example/server/Package.rb
95
+ - example/server/server.rb
96
+ - lib/rdm.rb
97
+ - lib/rdm/package.rb
98
+ - lib/rdm/package_importer.rb
99
+ - lib/rdm/package_parser.rb
100
+ - lib/rdm/source_installer.rb
101
+ - lib/rdm/source_parser.rb
102
+ - lib/rdm/version.rb
103
+ - rdm.gemspec
104
+ - spec/rdm/package_importer_spec.rb
105
+ - spec/rdm/package_parser_spec.rb
106
+ - spec/rdm/source_parser_spec.rb
107
+ - spec/spec_helper.rb
108
+ homepage:
109
+ licenses: []
110
+ metadata: {}
111
+ post_install_message:
112
+ rdoc_options: []
113
+ require_paths:
114
+ - lib
115
+ required_ruby_version: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ required_rubygems_version: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ requirements: []
126
+ rubyforge_project:
127
+ rubygems_version: 2.2.2
128
+ signing_key:
129
+ specification_version: 4
130
+ summary: Ruby Dependency Manager
131
+ test_files:
132
+ - spec/rdm/package_importer_spec.rb
133
+ - spec/rdm/package_parser_spec.rb
134
+ - spec/rdm/source_parser_spec.rb
135
+ - spec/spec_helper.rb