envandle 0.1.0 → 0.2.0
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/.travis.yml +1 -1
- data/README.md +29 -15
- data/lib/envandle/argset.rb +61 -0
- data/lib/envandle/as_context.rb +16 -0
- data/lib/envandle/as_dsl.rb +23 -0
- data/lib/envandle/as_reference.rb +1 -1
- data/lib/envandle/binding.rb +2 -7
- data/lib/envandle/elements/element.rb +61 -0
- data/lib/envandle/elements/gem.rb +30 -0
- data/lib/envandle/elements/gemfile.rb +71 -0
- data/lib/envandle/elements/gemspec.rb +37 -0
- data/lib/envandle/elements/git_source_block.rb +18 -0
- data/lib/envandle/elements/group_block.rb +36 -0
- data/lib/envandle/elements/illegal_element.rb +7 -0
- data/lib/envandle/elements/illegals_and_unsupporteds.rb +31 -0
- data/lib/envandle/elements/source.rb +15 -0
- data/lib/envandle/elements/unsupported_element.rb +7 -0
- data/lib/envandle/elements.rb +10 -0
- data/lib/envandle/exceptions.rb +13 -0
- data/lib/envandle/gemspec_cache.rb +64 -0
- data/lib/envandle/git.rb +45 -10
- data/lib/envandle/git_branch_reference.rb +26 -6
- data/lib/envandle/helper.rb +22 -0
- data/lib/envandle/lib.rb +12 -5
- data/lib/envandle/location.rb +12 -0
- data/lib/envandle/path_reference.rb +9 -5
- data/lib/envandle/reference_cache.rb +25 -9
- data/lib/envandle/shell.rb +4 -2
- data/lib/envandle/version.rb +1 -1
- metadata +21 -7
- data/lib/envandle/bundle_dsl.rb +0 -31
- data/lib/envandle/gem.rb +0 -20
- data/lib/envandle/gemfile.rb +0 -48
- data/lib/envandle/group_dsl.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ff69392778f46788da2d586a57395dd909d84936
|
4
|
+
data.tar.gz: 601ea8bffd72c9460f953b6356702cda831f1ec3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70fe6bade653580f5351ebd44ab4bb8ddd476dcd2ccd0a3f85efc05c0f5ef95894d98eb3990c973f6a9d397ea122db4d0559221f13ed739560677c5a194461e6
|
7
|
+
data.tar.gz: 1794974ec6611b2e511e599939da7c9c03a7cea7064f241f45a08b8f1a281587bf90c2034f0eb858e8ceb0026a6a622e7a3171aa6fdc4c7db747d3c71d05ef38
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
A rubygem for enabling Gemfiles to specify gem locations from environment variables.
|
4
4
|
|
5
|
+
[](https://travis-ci.org/mosop/envandle)
|
6
|
+
|
5
7
|
## Installation
|
6
8
|
|
7
9
|
```sh
|
@@ -10,14 +12,14 @@ $ gem install envandle
|
|
10
12
|
|
11
13
|
## Usage
|
12
14
|
|
13
|
-
|
15
|
+
Enclose your Gemfile's code with an envandle block.
|
14
16
|
|
15
17
|
```ruby
|
16
18
|
require "envandle"
|
17
19
|
|
18
|
-
|
20
|
+
binding.envandle do
|
21
|
+
source "https://rubygems.org"
|
19
22
|
|
20
|
-
binding.envandle do |bundle|
|
21
23
|
bundle.gem "mygem", "~> 1.0"
|
22
24
|
end
|
23
25
|
```
|
@@ -45,8 +47,10 @@ For example,
|
|
45
47
|
```ruby
|
46
48
|
ENV["ENVANDLE_GEM_PATH"] = "mygem:/path/to/mygem"
|
47
49
|
|
48
|
-
binding.envandle do
|
49
|
-
|
50
|
+
binding.envandle do
|
51
|
+
source "https://rubygems.org"
|
52
|
+
|
53
|
+
gem "mygem", "~> 1.0"
|
50
54
|
end
|
51
55
|
```
|
52
56
|
|
@@ -61,8 +65,10 @@ If the variable is not set,
|
|
61
65
|
```ruby
|
62
66
|
ENV["ENVANDLE_GEM_PATH"] = ""
|
63
67
|
|
64
|
-
binding.envandle do
|
65
|
-
|
68
|
+
binding.envandle do
|
69
|
+
source "https://rubygems.org"
|
70
|
+
|
71
|
+
gem "mygem", "~> 1.0"
|
66
72
|
end
|
67
73
|
```
|
68
74
|
|
@@ -81,8 +87,10 @@ For example,
|
|
81
87
|
```ruby
|
82
88
|
ENV["ENVANDLE_GEM_GIT_BRANCH"] = "mygem:https://github.com/mosop/mygem.git#edge"
|
83
89
|
|
84
|
-
|
85
|
-
|
90
|
+
envandle do
|
91
|
+
source "https://rubygems.org"
|
92
|
+
|
93
|
+
gem "mygem", "~> 1.0"
|
86
94
|
end
|
87
95
|
```
|
88
96
|
|
@@ -97,8 +105,10 @@ If the variable is not set,
|
|
97
105
|
```ruby
|
98
106
|
ENV["ENVANDLE_GEM_GIT_BRANCH"] = ""
|
99
107
|
|
100
|
-
binding.envandle do
|
101
|
-
|
108
|
+
binding.envandle do
|
109
|
+
source "https://rubygems.org"
|
110
|
+
|
111
|
+
gem "mygem", "~> 1.0"
|
102
112
|
end
|
103
113
|
```
|
104
114
|
|
@@ -117,8 +127,10 @@ For example, if your gem's name is "mygem", the gemspec refers the a, b and c ge
|
|
117
127
|
```ruby
|
118
128
|
ENV["ENVANDLE_GEM_PATH"] = "a:/path/to/a;b:/path/to/b"
|
119
129
|
|
120
|
-
binding.envandle do
|
121
|
-
|
130
|
+
binding.envandle do
|
131
|
+
source "https://rubygems.org"
|
132
|
+
|
133
|
+
gemspec
|
122
134
|
end
|
123
135
|
```
|
124
136
|
|
@@ -138,8 +150,10 @@ For example, if a Gemfile refers the gem a that depends on the gem b, Envandle a
|
|
138
150
|
```ruby
|
139
151
|
ENV["ENVANDLE_GEM_PATH"] = "a:/path/to/a;b:/path/to/b"
|
140
152
|
|
141
|
-
binding.envandle do
|
142
|
-
|
153
|
+
binding.envandle do
|
154
|
+
source "https://rubygems.org"
|
155
|
+
|
156
|
+
gem "a", "~> 1.0"
|
143
157
|
end
|
144
158
|
```
|
145
159
|
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Envandle
|
2
|
+
class Argset
|
3
|
+
def initialize(context, *args, &block)
|
4
|
+
@context = context
|
5
|
+
@args = args
|
6
|
+
h = Envandle.options!(args)
|
7
|
+
@options = {}
|
8
|
+
h.each do |k, v|
|
9
|
+
@options[k.to_s.to_sym] = v
|
10
|
+
end
|
11
|
+
@block = block
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :args, :options, :block
|
15
|
+
|
16
|
+
def dup
|
17
|
+
Argset.new(@context, *@args.dup, @options.dup, &@block)
|
18
|
+
end
|
19
|
+
|
20
|
+
def clear_reference
|
21
|
+
@args = [@args[0]]
|
22
|
+
@options.delete :path
|
23
|
+
@options.delete :git
|
24
|
+
@options.delete :github
|
25
|
+
@options.delete :ref
|
26
|
+
@options.delete :branch
|
27
|
+
@options.delete :tag
|
28
|
+
end
|
29
|
+
|
30
|
+
def args_and_options
|
31
|
+
@args_and_options ||= begin
|
32
|
+
if @options.empty?
|
33
|
+
[*@args]
|
34
|
+
else
|
35
|
+
[*@args, @options]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_s
|
41
|
+
a = [@context, *args_and_options]
|
42
|
+
a << @block if @block
|
43
|
+
a.to_s
|
44
|
+
end
|
45
|
+
|
46
|
+
def send_to(o)
|
47
|
+
o.__send__ @context, *args_and_options, &@block
|
48
|
+
end
|
49
|
+
|
50
|
+
def contextual_groups
|
51
|
+
@contextual_groups ||= get_contexutual_groups
|
52
|
+
end
|
53
|
+
|
54
|
+
def get_contexutual_groups
|
55
|
+
if option = @options[:groups] || @options[:group]
|
56
|
+
return option.is_a?(Array) ? option : [option]
|
57
|
+
end
|
58
|
+
@context.groups_or_default
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Envandle
|
2
|
+
module AsDsl
|
3
|
+
def self.extended(mod)
|
4
|
+
mod.class_eval do
|
5
|
+
def initialize(e)
|
6
|
+
@element = e
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def dsl_method(name)
|
12
|
+
name = name.to_s
|
13
|
+
class_name = Envandle.pascal(name)
|
14
|
+
block_class_name = "#{class_name}Block"
|
15
|
+
define_method name do |*args, &block|
|
16
|
+
klass = ::Envandle::Elements.const_get(block ? block_class_name : class_name)
|
17
|
+
o = klass.new(::Envandle.loc, @element, *args, &block)
|
18
|
+
@element << o
|
19
|
+
o.draw
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/envandle/binding.rb
CHANGED
@@ -1,12 +1,7 @@
|
|
1
1
|
require "envandle/lib"
|
2
2
|
|
3
3
|
class Binding
|
4
|
-
def envandle
|
5
|
-
|
6
|
-
yield ::Envandle::BundleDsl.new(::Envandle::Gemfile.new($1, self))
|
7
|
-
end
|
8
|
-
|
9
|
-
def gem(*args)
|
10
|
-
receiver.__send__ :gem, *args
|
4
|
+
def envandle(&block)
|
5
|
+
::Envandle::Elements::Gemfile.new(::Envandle.loc.file, self).draw &block
|
11
6
|
end
|
12
7
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Envandle
|
2
|
+
class Element
|
3
|
+
def initialize(loc, context, *args, &block)
|
4
|
+
@loc = loc
|
5
|
+
@context = context
|
6
|
+
@args = Argset.new(self, *args, &block)
|
7
|
+
end
|
8
|
+
|
9
|
+
def parse_string_value(v, type)
|
10
|
+
if v
|
11
|
+
v = v.to_s.strip
|
12
|
+
Envandle.arg! @loc, type if v.empty?
|
13
|
+
v
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def parse_string_option(name, type)
|
18
|
+
parse_string_value(@args.options[name], type)
|
19
|
+
end
|
20
|
+
|
21
|
+
def gemfile
|
22
|
+
@context.gemfile
|
23
|
+
end
|
24
|
+
|
25
|
+
def groups_or_default
|
26
|
+
@context.groups_or_default
|
27
|
+
end
|
28
|
+
|
29
|
+
def dsl
|
30
|
+
self.class::Dsl.new(self)
|
31
|
+
end
|
32
|
+
|
33
|
+
def draw(&block)
|
34
|
+
block ||= @args.block
|
35
|
+
dsl.instance_exec &block if block
|
36
|
+
end
|
37
|
+
|
38
|
+
def children
|
39
|
+
@children ||= []
|
40
|
+
end
|
41
|
+
|
42
|
+
def children_by_type(type = nil)
|
43
|
+
if type
|
44
|
+
(@children_by_type ||= {})[type] ||= []
|
45
|
+
else
|
46
|
+
@children_by_type ||= {}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def <<(child)
|
51
|
+
children << child
|
52
|
+
children_by_type(child.type) << child
|
53
|
+
end
|
54
|
+
|
55
|
+
def exec(context)
|
56
|
+
executable_argsets.each do |i|
|
57
|
+
i.send_to context
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Envandle
|
2
|
+
module Elements
|
3
|
+
class Gem < Element
|
4
|
+
def initialize(*)
|
5
|
+
super
|
6
|
+
@name = parse_string_value(@args.args[0].to_s, "gem name")
|
7
|
+
end
|
8
|
+
|
9
|
+
def type
|
10
|
+
:gem
|
11
|
+
end
|
12
|
+
|
13
|
+
def extract_executable_argsets(a, cache)
|
14
|
+
found = false
|
15
|
+
@args.contextual_groups.each do |group|
|
16
|
+
if gemfile.references.extract_executable_argsets(@args, group, @name, a, cache)
|
17
|
+
found = true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
a << Argset.new(:gem, *@args.args_and_options) unless found
|
21
|
+
end
|
22
|
+
|
23
|
+
def executable_argsets
|
24
|
+
@executable_argsets ||= [].tap do |a|
|
25
|
+
extract_executable_argsets a, {}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Envandle
|
2
|
+
module Elements
|
3
|
+
class Gemfile < Element
|
4
|
+
extend AsContext
|
5
|
+
|
6
|
+
class Dsl
|
7
|
+
extend AsDsl
|
8
|
+
|
9
|
+
dsl_method :source
|
10
|
+
dsl_method :group
|
11
|
+
dsl_method :gem
|
12
|
+
dsl_method :gemspec
|
13
|
+
dsl_method :git_source
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(file, binding, config_dir = nil)
|
17
|
+
super Location.new(file, 1), nil
|
18
|
+
@binding = binding
|
19
|
+
@config_dir = config_dir
|
20
|
+
end
|
21
|
+
|
22
|
+
def binding_receiver
|
23
|
+
@binding.receiver
|
24
|
+
end
|
25
|
+
|
26
|
+
def draw(&block)
|
27
|
+
super
|
28
|
+
exec
|
29
|
+
end
|
30
|
+
|
31
|
+
def exec
|
32
|
+
receiver = @binding.receiver
|
33
|
+
children.each do |child|
|
34
|
+
child.exec receiver
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def dir
|
39
|
+
@dir ||= File.dirname(@loc.file)
|
40
|
+
end
|
41
|
+
|
42
|
+
def config_dir
|
43
|
+
@config_dir ||= File.join(dir, ".envandle")
|
44
|
+
end
|
45
|
+
|
46
|
+
def gemfile
|
47
|
+
self
|
48
|
+
end
|
49
|
+
|
50
|
+
def references
|
51
|
+
@references ||= ReferenceCache.new(self)
|
52
|
+
end
|
53
|
+
|
54
|
+
def gemspecs
|
55
|
+
@gemspecs ||= GemspecCache.new(File.join(config_dir, "cache", "gemspecs"))
|
56
|
+
end
|
57
|
+
|
58
|
+
def sources
|
59
|
+
children_by_type(:source)
|
60
|
+
end
|
61
|
+
|
62
|
+
def source_urls
|
63
|
+
sources.map{|i| i.url}
|
64
|
+
end
|
65
|
+
|
66
|
+
def groups
|
67
|
+
[]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Envandle
|
2
|
+
module Elements
|
3
|
+
class Gemspec < Element
|
4
|
+
extend AsContext
|
5
|
+
|
6
|
+
def initialize(*)
|
7
|
+
super
|
8
|
+
dev_group = parse_string_option(:development_group, "gemspec's development group") || :development
|
9
|
+
@development_group = dev_group ? dev_group.to_s.to_sym : :development
|
10
|
+
@name = parse_string_option(:name, "gemspec's name")
|
11
|
+
@path = parse_string_option(:path, "gemspec's path")
|
12
|
+
end
|
13
|
+
|
14
|
+
def type
|
15
|
+
:gemspec
|
16
|
+
end
|
17
|
+
|
18
|
+
def executable_argsets
|
19
|
+
@executable_argsets ||= begin
|
20
|
+
[].tap do |a|
|
21
|
+
path = @path || ::Envandle::Gemspec.find_file(gemfile.dir, name: @name)
|
22
|
+
spec = ::Envandle::Gemspec.new(path)
|
23
|
+
a << Argset.new(:gem, spec.name, path: ".")
|
24
|
+
found = {}
|
25
|
+
spec.dependencies.each do |i|
|
26
|
+
group = i.type == :development ? @development_group : nil
|
27
|
+
argset = Argset.new(nil, i.name, *i.requirements_list)
|
28
|
+
argset.options[:group] = group if group
|
29
|
+
gem = Gem.new(@loc, @context, *argset.args_and_options)
|
30
|
+
gem.extract_executable_argsets a, found
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Envandle
|
2
|
+
module Elements
|
3
|
+
class GitSourceBlock < Element
|
4
|
+
def draw
|
5
|
+
end
|
6
|
+
|
7
|
+
def type
|
8
|
+
:git_source_block
|
9
|
+
end
|
10
|
+
|
11
|
+
def executable_argsets
|
12
|
+
@executable_argsets ||= [].tap do |a|
|
13
|
+
a << Argset.new(:git_source, *@args.args_and_options, &@args.block)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Envandle
|
2
|
+
module Elements
|
3
|
+
class GroupBlock < Element
|
4
|
+
extend AsContext
|
5
|
+
|
6
|
+
class Dsl
|
7
|
+
extend AsDsl
|
8
|
+
|
9
|
+
dsl_method :gem
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(*)
|
13
|
+
super
|
14
|
+
Envandle.arg! @loc, "No group names." if @args.args.empty?
|
15
|
+
end
|
16
|
+
|
17
|
+
def type
|
18
|
+
:group_block
|
19
|
+
end
|
20
|
+
|
21
|
+
def groups
|
22
|
+
@groups ||= @args.args.dup
|
23
|
+
end
|
24
|
+
|
25
|
+
def executable_argsets
|
26
|
+
@executable_argsets ||= [].tap do |a|
|
27
|
+
a << Argset.new(:group, *@args.args_and_options) do
|
28
|
+
children.each do |child|
|
29
|
+
child.exec gemfile.binding_receiver
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Envandle
|
2
|
+
class GemBlock < IllegalElement
|
3
|
+
def type
|
4
|
+
"gem with block"
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
class GemspecBlock < IllegalElement
|
9
|
+
def type
|
10
|
+
"gemspec with block"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class GitSource < IllegalElement
|
15
|
+
def type
|
16
|
+
"git_source without block"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Group < IllegalElement
|
21
|
+
def type
|
22
|
+
"group without block"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class SourceBlock < UnsupportedElement
|
27
|
+
def type
|
28
|
+
"source with block"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require "envandle/elements/element"
|
2
|
+
require "envandle/elements/illegal_element"
|
3
|
+
require "envandle/elements/unsupported_element"
|
4
|
+
require "envandle/elements/gem"
|
5
|
+
require "envandle/elements/gemfile"
|
6
|
+
require "envandle/elements/gemspec"
|
7
|
+
require "envandle/elements/git_source_block"
|
8
|
+
require "envandle/elements/group_block"
|
9
|
+
require "envandle/elements/illegals_and_unsupporteds"
|
10
|
+
require "envandle/elements/source"
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Envandle
|
2
|
+
def self.arg!(loc, type)
|
3
|
+
raise ArgumentError.new("Missing argument: #{type} (#{loc})")
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.legal!(loc, type)
|
7
|
+
raise ArgumentError.new("Illegal element: #{type} (#{loc})")
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.support!(loc, type)
|
11
|
+
raise NotImplementedError.new("Unsupported element: #{type} (#{loc})")
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Envandle
|
2
|
+
class GemspecCache
|
3
|
+
@@mutex = Mutex.new
|
4
|
+
|
5
|
+
def initialize(path)
|
6
|
+
@path = path
|
7
|
+
FileUtils.mkdir_p @path
|
8
|
+
end
|
9
|
+
|
10
|
+
def with_file
|
11
|
+
path = File.join(@path, "list")
|
12
|
+
@@mutex.synchronize do
|
13
|
+
File.open(path, File::RDWR | File::CREAT) do |f|
|
14
|
+
f.flock File::LOCK_EX
|
15
|
+
yield f
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def append(url, dir)
|
21
|
+
with_file do |f|
|
22
|
+
data = YAML.load(f.read) || {}
|
23
|
+
data[url] = dir
|
24
|
+
f.rewind
|
25
|
+
f.write data.to_yaml
|
26
|
+
f.flush
|
27
|
+
f.truncate f.pos
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def load
|
32
|
+
with_file do |f|
|
33
|
+
YAML.load(f.read) || {}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def find(url)
|
38
|
+
if dir = load[url]
|
39
|
+
File.join(@path, dir)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def reserve
|
44
|
+
Reserved.new(@path)
|
45
|
+
end
|
46
|
+
|
47
|
+
class Reserved
|
48
|
+
def initialize(cache_path)
|
49
|
+
@cache_path = cache_path
|
50
|
+
@path = Dir.mktmpdir(nil, cache_path)
|
51
|
+
end
|
52
|
+
|
53
|
+
attr_reader :path
|
54
|
+
|
55
|
+
def url=(v)
|
56
|
+
@url = v
|
57
|
+
end
|
58
|
+
|
59
|
+
def save
|
60
|
+
GemspecCache.new(@cache_path).append @url, @path[(@cache_path.size+1)..-1]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/envandle/git.rb
CHANGED
@@ -1,15 +1,50 @@
|
|
1
1
|
module Envandle
|
2
|
-
|
2
|
+
GIT_BIN = `which git`.chomp
|
3
3
|
|
4
|
-
def self.
|
5
|
-
raise "No git installed." if
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
4
|
+
def self.raise_if_no_git_installed
|
5
|
+
raise "No git installed." if GIT_BIN.empty?
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.git_init(dir, url, &block)
|
9
|
+
unless dir
|
10
|
+
Dir.mktmpdir do |tmpdir|
|
11
|
+
git_init tmpdir, url, &block
|
12
|
+
end
|
13
|
+
else
|
14
|
+
raise_if_no_git_installed
|
15
|
+
Dir.chdir(dir) do
|
16
|
+
sh "#{GIT_BIN} init"
|
17
|
+
sh "#{GIT_BIN} remote add origin #{url}"
|
18
|
+
yield dir if block_given?
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.git_ls_remote_sha(dir, q)
|
24
|
+
Dir.chdir(dir) do
|
25
|
+
data = sh("#{GIT_BIN} ls-remote origin #{q}").chomp
|
26
|
+
data = if data.empty?
|
27
|
+
[]
|
28
|
+
else
|
29
|
+
data.split("\n").map{|i| i.split(/\s+/)[0] }
|
30
|
+
end
|
31
|
+
if block_given?
|
32
|
+
yield data
|
33
|
+
else
|
34
|
+
data
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.git_pull(dir, ref, branch)
|
40
|
+
Dir.chdir(dir) do
|
41
|
+
sh "#{GIT_BIN} checkout -b #{branch}"
|
42
|
+
sh "#{GIT_BIN} pull origin #{ref}:#{branch}"
|
43
|
+
sha = sh("#{GIT_BIN} rev-parse HEAD").chomp
|
44
|
+
if block_given?
|
45
|
+
yield sha
|
46
|
+
else
|
47
|
+
sha
|
13
48
|
end
|
14
49
|
end
|
15
50
|
end
|
@@ -2,21 +2,41 @@ module Envandle
|
|
2
2
|
class GitBranchReference
|
3
3
|
extend AsGitReference
|
4
4
|
|
5
|
-
def initialize(group, name, url, ref)
|
5
|
+
def initialize(context, group, name, url, ref)
|
6
|
+
@context = context
|
6
7
|
@group = group
|
7
8
|
@name = name
|
8
9
|
@url = url
|
9
10
|
@ref = ref
|
10
11
|
end
|
11
12
|
|
12
|
-
def to_gem(args, options)
|
13
|
-
Gem.new(@group, @name, [], {git: @url, branch: @ref})
|
14
|
-
end
|
15
|
-
|
16
13
|
def spec
|
17
|
-
|
14
|
+
@spec ||= begin
|
15
|
+
cache = @context.gemfile.gemspecs
|
16
|
+
shas = Envandle.git_init(nil, @url) do |dir|
|
17
|
+
Envandle.git_ls_remote_sha(dir, "refs/heads/#{@ref}")
|
18
|
+
end
|
19
|
+
sha = shas[0]
|
20
|
+
cache_url = "#{@url}##{sha}"
|
21
|
+
raise "Can't get a git commit. (url: #{@url}, branch: #{@ref})" unless sha
|
22
|
+
dir = cache.find(cache_url) || begin
|
23
|
+
reserve = cache.reserve
|
24
|
+
Envandle.git_init reserve.path, @url
|
25
|
+
sha = Envandle.git_pull(reserve.path, @ref, "master")
|
26
|
+
reserve.url = cache_url
|
27
|
+
reserve.save
|
28
|
+
reserve.path
|
29
|
+
end
|
18
30
|
Gemspec.new(File.join(dir, "#{@name}.gemspec"))
|
19
31
|
end
|
20
32
|
end
|
33
|
+
|
34
|
+
def to_executable_argset(base)
|
35
|
+
args = base.dup
|
36
|
+
args.clear_reference
|
37
|
+
args.options[:git] = @url
|
38
|
+
args.options[:branch] = @ref
|
39
|
+
Argset.new(:gem, *args.args_and_options)
|
40
|
+
end
|
21
41
|
end
|
22
42
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Envandle
|
2
|
+
def self.options!(args)
|
3
|
+
args.last.is_a?(Hash) ? args.pop : {}
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.loc(level = 2)
|
7
|
+
/^(.+?):(\d+)(?::in `(.*)')?/ =~ caller(level, 1).first
|
8
|
+
Location.new($1, $2.to_i)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.pascal(s)
|
12
|
+
s.split("_").map{|i| i.capitalize}.join("")
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.reference_key(group, name)
|
16
|
+
if group
|
17
|
+
"#{name}@#{group}"
|
18
|
+
else
|
19
|
+
name
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/envandle/lib.rb
CHANGED
@@ -1,14 +1,21 @@
|
|
1
|
+
require "open3"
|
2
|
+
require "thread"
|
1
3
|
require "tmpdir"
|
4
|
+
require "yaml"
|
2
5
|
require "envandle/version"
|
3
|
-
require "envandle/
|
6
|
+
require "envandle/helper"
|
7
|
+
require "envandle/exceptions"
|
8
|
+
require "envandle/as_context"
|
9
|
+
require "envandle/as_dsl"
|
4
10
|
require "envandle/as_git_reference"
|
5
|
-
require "envandle/
|
6
|
-
require "envandle/
|
7
|
-
require "envandle/
|
11
|
+
require "envandle/as_reference"
|
12
|
+
require "envandle/argset"
|
13
|
+
require "envandle/elements"
|
14
|
+
require "envandle/location"
|
8
15
|
require "envandle/gemspec"
|
16
|
+
require "envandle/gemspec_cache"
|
9
17
|
require "envandle/git"
|
10
18
|
require "envandle/git_branch_reference"
|
11
|
-
require "envandle/group_dsl"
|
12
19
|
require "envandle/path_reference"
|
13
20
|
require "envandle/shell"
|
14
21
|
require "envandle/reference_cache"
|
@@ -2,18 +2,22 @@ module Envandle
|
|
2
2
|
class PathReference
|
3
3
|
extend AsReference
|
4
4
|
|
5
|
-
def initialize(group, name, path)
|
5
|
+
def initialize(context, group, name, path)
|
6
|
+
@context = context
|
6
7
|
@group = group
|
7
8
|
@name = name
|
8
9
|
@path = path
|
9
10
|
end
|
10
11
|
|
11
|
-
def to_gem(args, options)
|
12
|
-
Gem.new(@group, @name, [], {path: @path})
|
13
|
-
end
|
14
|
-
|
15
12
|
def spec
|
16
13
|
@spec ||= Gemspec.new(Gemspec.find_file(@path, name: @name))
|
17
14
|
end
|
15
|
+
|
16
|
+
def to_executable_argset(base)
|
17
|
+
args = base.dup
|
18
|
+
args.clear_reference
|
19
|
+
args.options[:path] = @path
|
20
|
+
Argset.new(:gem, *args.args_and_options)
|
21
|
+
end
|
18
22
|
end
|
19
23
|
end
|
@@ -1,14 +1,11 @@
|
|
1
1
|
module Envandle
|
2
2
|
class ReferenceCache
|
3
|
-
def
|
4
|
-
|
5
|
-
"#{name}@#{group}"
|
6
|
-
else
|
7
|
-
name
|
8
|
-
end
|
3
|
+
def initialize(context)
|
4
|
+
@context = context
|
9
5
|
end
|
10
6
|
|
11
|
-
def find(
|
7
|
+
def find(group, name)
|
8
|
+
key = Envandle.reference_key(group, name)
|
12
9
|
paths[key] ||
|
13
10
|
git_branches[key] ||
|
14
11
|
paths[name] ||
|
@@ -49,7 +46,7 @@ module Envandle
|
|
49
46
|
name = a[0].to_s.strip
|
50
47
|
path = a[1..-1].join(":").to_s.strip
|
51
48
|
raise "No gem path (#{env}): #{ENV[env]}" if path.empty?
|
52
|
-
klass.new(*parse_group_and_name(env, name), path)
|
49
|
+
klass.new(@context, *parse_group_and_name(env, name), path)
|
53
50
|
end
|
54
51
|
|
55
52
|
def parse_git(klass, env, v)
|
@@ -63,7 +60,26 @@ module Envandle
|
|
63
60
|
ref = url_and_ref[1].to_s.strip
|
64
61
|
raise "No gem git url (#{env}): #{ENV[env]}" if url.empty?
|
65
62
|
raise "No gem git ref/branch/tag (#{env}): #{ENV[env]}" if ref.empty?
|
66
|
-
klass.new(*parse_group_and_name(env, name), url, ref)
|
63
|
+
klass.new(@context, *parse_group_and_name(env, name), url, ref)
|
64
|
+
end
|
65
|
+
|
66
|
+
def extract_executable_argsets(base, group, name, argsets, found = {})
|
67
|
+
key = Envandle.reference_key(group, name)
|
68
|
+
return true if found.key?(key)
|
69
|
+
found[key] = true
|
70
|
+
if ref = find(group, name)
|
71
|
+
ref.spec.runtime_dependencies.each do |i|
|
72
|
+
if ref2 = find(nil, i.name)
|
73
|
+
extract_executable_argsets base, nil, i.name, argsets, found
|
74
|
+
end
|
75
|
+
end
|
76
|
+
args = base.dup
|
77
|
+
args.args[0] = name
|
78
|
+
argsets << ref.to_executable_argset(args)
|
79
|
+
true
|
80
|
+
else
|
81
|
+
false
|
82
|
+
end
|
67
83
|
end
|
68
84
|
end
|
69
85
|
end
|
data/lib/envandle/shell.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module Envandle
|
2
2
|
def self.sh(cmd)
|
3
|
-
|
4
|
-
|
3
|
+
# output, status = Open3.capture2(cmd)
|
4
|
+
output, error, status = Open3.capture3(cmd)
|
5
|
+
raise "Command error: #{cmd}" unless status.success?
|
6
|
+
output
|
5
7
|
end
|
6
8
|
end
|
data/lib/envandle/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: envandle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mosop
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-01-
|
11
|
+
date: 2017-01-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -68,17 +68,31 @@ files:
|
|
68
68
|
- bin/setup
|
69
69
|
- envandle.gemspec
|
70
70
|
- lib/envandle.rb
|
71
|
+
- lib/envandle/argset.rb
|
72
|
+
- lib/envandle/as_context.rb
|
73
|
+
- lib/envandle/as_dsl.rb
|
71
74
|
- lib/envandle/as_git_reference.rb
|
72
75
|
- lib/envandle/as_reference.rb
|
73
76
|
- lib/envandle/binding.rb
|
74
|
-
- lib/envandle/
|
75
|
-
- lib/envandle/
|
76
|
-
- lib/envandle/
|
77
|
+
- lib/envandle/elements.rb
|
78
|
+
- lib/envandle/elements/element.rb
|
79
|
+
- lib/envandle/elements/gem.rb
|
80
|
+
- lib/envandle/elements/gemfile.rb
|
81
|
+
- lib/envandle/elements/gemspec.rb
|
82
|
+
- lib/envandle/elements/git_source_block.rb
|
83
|
+
- lib/envandle/elements/group_block.rb
|
84
|
+
- lib/envandle/elements/illegal_element.rb
|
85
|
+
- lib/envandle/elements/illegals_and_unsupporteds.rb
|
86
|
+
- lib/envandle/elements/source.rb
|
87
|
+
- lib/envandle/elements/unsupported_element.rb
|
88
|
+
- lib/envandle/exceptions.rb
|
77
89
|
- lib/envandle/gemspec.rb
|
90
|
+
- lib/envandle/gemspec_cache.rb
|
78
91
|
- lib/envandle/git.rb
|
79
92
|
- lib/envandle/git_branch_reference.rb
|
80
|
-
- lib/envandle/
|
93
|
+
- lib/envandle/helper.rb
|
81
94
|
- lib/envandle/lib.rb
|
95
|
+
- lib/envandle/location.rb
|
82
96
|
- lib/envandle/path_reference.rb
|
83
97
|
- lib/envandle/reference_cache.rb
|
84
98
|
- lib/envandle/shell.rb
|
@@ -103,7 +117,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
103
117
|
version: '0'
|
104
118
|
requirements: []
|
105
119
|
rubyforge_project:
|
106
|
-
rubygems_version: 2.5.
|
120
|
+
rubygems_version: 2.5.2
|
107
121
|
signing_key:
|
108
122
|
specification_version: 4
|
109
123
|
summary: A library for enabling Gemfiles to specify gem locations from environment
|
data/lib/envandle/bundle_dsl.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
module Envandle
|
2
|
-
class BundleDsl
|
3
|
-
def initialize(gemfile)
|
4
|
-
@gemfile = gemfile
|
5
|
-
end
|
6
|
-
|
7
|
-
def gem(*args)
|
8
|
-
@gemfile.gem nil, *args
|
9
|
-
end
|
10
|
-
|
11
|
-
def group(name)
|
12
|
-
yield GroupDsl.new(@gemfile, name)
|
13
|
-
end
|
14
|
-
|
15
|
-
def gemspec(development_group: "development", path: nil, name: nil)
|
16
|
-
development_group = development_group.to_s.strip
|
17
|
-
raise "No gemspec's development group." if development_group.empty?
|
18
|
-
name = name.to_s.strip if name
|
19
|
-
raise "No gemspec's name." if name && name.empty
|
20
|
-
path ||= Gemspec.find_file(@gemfile.dir, name: name)
|
21
|
-
path = path.to_s.strip
|
22
|
-
raise "No gemspec's path." if path.empty?
|
23
|
-
spec = Gemspec.new(path)
|
24
|
-
@gemfile.gem nil, spec.name, path: "."
|
25
|
-
spec.dependencies.each do |i|
|
26
|
-
group = i.type == :development ? development_group : nil
|
27
|
-
@gemfile.gem group, i.name, *i.requirements_list
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
data/lib/envandle/gem.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
module Envandle
|
2
|
-
class Gem
|
3
|
-
def initialize(group, name, args, options)
|
4
|
-
@group = group
|
5
|
-
@name = name
|
6
|
-
@args = args
|
7
|
-
@options = options
|
8
|
-
end
|
9
|
-
|
10
|
-
def args
|
11
|
-
h = @group ? {group: @group} : {}
|
12
|
-
h.merge! @options
|
13
|
-
if h.empty?
|
14
|
-
[@name, *@args]
|
15
|
-
else
|
16
|
-
[@name, *@args, h]
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
data/lib/envandle/gemfile.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
module Envandle
|
2
|
-
class Gemfile
|
3
|
-
def initialize(path, binding)
|
4
|
-
@path = path
|
5
|
-
@binding = binding
|
6
|
-
end
|
7
|
-
|
8
|
-
def dir
|
9
|
-
@dir ||= File.dirname(@path)
|
10
|
-
end
|
11
|
-
|
12
|
-
def gems
|
13
|
-
@gems ||= {}
|
14
|
-
end
|
15
|
-
|
16
|
-
def references
|
17
|
-
@references ||= ReferenceCache.new
|
18
|
-
end
|
19
|
-
|
20
|
-
def append(group, name, args, options)
|
21
|
-
key = ReferenceCache.key(group, name)
|
22
|
-
gems[key] || begin
|
23
|
-
if ref = references.find(key, name)
|
24
|
-
gem = ref.to_gem(args, options)
|
25
|
-
gems[key] = gem
|
26
|
-
ref.spec.runtime_dependencies.each do |i|
|
27
|
-
append nil, i.name, [], {}
|
28
|
-
end
|
29
|
-
@binding.gem *gem.args
|
30
|
-
else
|
31
|
-
gems[key] = gem = Gem.new(group, name, args, options)
|
32
|
-
@binding.gem *gem.args
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def gem(group, *args)
|
38
|
-
h = args.last.is_a?(Hash) ? args.pop : {}
|
39
|
-
options = {}
|
40
|
-
h.each do |k, v|
|
41
|
-
options[k.to_s.to_sym] = v
|
42
|
-
end
|
43
|
-
name = args.shift.to_s.strip
|
44
|
-
raise "No gem name." if name.empty?
|
45
|
-
append group, name, args, options
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
data/lib/envandle/group_dsl.rb
DELETED