glue_gun 0.0.2
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 +7 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/Gemfile +10 -0
- data/Guardfile +18 -0
- data/LICENSE.txt +17 -0
- data/README.md +82 -0
- data/Rakefile +1 -0
- data/glue_gun.gemspec +36 -0
- data/lib/glue_gun.rb +21 -0
- data/lib/glue_gun/config_builder.rb +50 -0
- data/lib/glue_gun/config_builder/command.rb +29 -0
- data/lib/glue_gun/config_builder/commands.rb +8 -0
- data/lib/glue_gun/config_builder/commands/after_method.rb +30 -0
- data/lib/glue_gun/config_builder/commands/before_method.rb +29 -0
- data/lib/glue_gun/version.rb +3 -0
- data/spec/lib/glue_gun.rb +10 -0
- data/spec/lib/glue_gun/config_builder/command_spec.rb +10 -0
- data/spec/lib/glue_gun/config_builder/commands/after_method_spec.rb +49 -0
- data/spec/lib/glue_gun/config_builder/commands/before_method_spec.rb +49 -0
- data/spec/lib/glue_gun/config_builder_spec.rb +34 -0
- data/spec/spec_helper.rb +21 -0
- metadata +172 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: fd223260a00a383841134a2a305ac1cecb9b16ce
|
4
|
+
data.tar.gz: 1aae3df283792b7ee46f804f042dac2170f0bb6b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 37589b55c665a7caaa9aa5419ee5f50e63aa4b6d6e313534c0ba56b7f1f2bf29837d50546f292fee56f18d81ac3560092f8a3651b9ae479d9473c05f3560972f
|
7
|
+
data.tar.gz: b64200cb444cd4cefb3c1b3c3f7af3a3bc535d8e0aa8a0ca9d3f6fd8ccf2766d76d92f339f162ffb1d628420f08940318dcccc600ee080925f2b9a3e926eeec9
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'rspec' do
|
5
|
+
watch(%r{^spec/.+_spec\.rb$})
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
7
|
+
watch(%r{^lib/glue_gun/config_builder/commands/.rb$}) { "spec" }
|
8
|
+
watch('spec/spec_helper.rb') { "spec" }
|
9
|
+
watch('spec/support/*') { "spec" }
|
10
|
+
end
|
11
|
+
|
12
|
+
guard 'bundler' do
|
13
|
+
watch('Gemfile')
|
14
|
+
# Uncomment next line if Gemfile contain `gemspec' command
|
15
|
+
watch(/^.+\.gemspec/)
|
16
|
+
end
|
17
|
+
|
18
|
+
notification :gntp
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
##########################################################################
|
2
|
+
# glue_gun
|
3
|
+
#
|
4
|
+
# Copyright © 2013 University of Notre Dame
|
5
|
+
# Additional copyright may be held by others, as reflected in the commit history.
|
6
|
+
#
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
# See the License for the specific language governing permissions and
|
17
|
+
# limitations under the License.
|
data/README.md
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
# GlueGun
|
2
|
+
|
3
|
+
A tool for connecting parts of your application at configuration time.
|
4
|
+
|
5
|
+
## But why?
|
6
|
+
|
7
|
+
This is part thought experiment, as I wanted to explore pluginable builders.
|
8
|
+
This is perhaps needed for working with lots of potentially inter-related Rails engines; Thank you [Project Hydra](https://projecthydra.org).
|
9
|
+
|
10
|
+
## Why might this be helpful?
|
11
|
+
|
12
|
+
Given that you have an application that is based on a Rails engine or multiple Rails engines.
|
13
|
+
When you want to decorate the behavior of one of the engines
|
14
|
+
...And don't want to fork the repository
|
15
|
+
...And don't have an easy means of submitting a pull request
|
16
|
+
Then you may need Glue Gun
|
17
|
+
|
18
|
+
## How to think about this?
|
19
|
+
|
20
|
+
Imagine that you want Rails to report each and every time an action in one of the engines is called.
|
21
|
+
Because of Ruby you can do it relatively easily; Classes can be reopened.
|
22
|
+
However, is it critical that you application do the reporting?
|
23
|
+
Should you always have that overhead in your tests?
|
24
|
+
|
25
|
+
My hope is that with GlueGun you can declare how your various pieces interact together.
|
26
|
+
By declaring those interactions, you also have a chance to greater isolate your tests.
|
27
|
+
And by that, I mean in the future I intend for GlueGun to be disabled for your tests, unless you specifically want the test to enable all of the hot glue.
|
28
|
+
|
29
|
+
## Installation
|
30
|
+
|
31
|
+
Add this line to your application's Gemfile:
|
32
|
+
|
33
|
+
gem 'glue_gun'
|
34
|
+
|
35
|
+
And then execute:
|
36
|
+
|
37
|
+
$ bundle
|
38
|
+
|
39
|
+
Or install it yourself as:
|
40
|
+
|
41
|
+
$ gem install glue_gun
|
42
|
+
|
43
|
+
## Usage
|
44
|
+
|
45
|
+
$before = []
|
46
|
+
$after = []
|
47
|
+
|
48
|
+
class Book
|
49
|
+
def read; end
|
50
|
+
end
|
51
|
+
|
52
|
+
GlueGun do |config|
|
53
|
+
config.after_method(Book, :read) << lambda { |object|
|
54
|
+
$before << object
|
55
|
+
}
|
56
|
+
|
57
|
+
config.after_method(Book, :read) << lambda { |object|
|
58
|
+
$after << [:read,object]
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
GlueGun.configure!
|
63
|
+
|
64
|
+
book = Book.new
|
65
|
+
book.read
|
66
|
+
$before == [book]
|
67
|
+
$after == [[:read, book]]
|
68
|
+
|
69
|
+
## Todo
|
70
|
+
|
71
|
+
* Document the plugin architecture.
|
72
|
+
* Create a rails generator for a new before_method hook
|
73
|
+
* Create a rails generator for a new after_method hook
|
74
|
+
* Create a command for controllers. In theory, after method is adequate for controllers if you always check the status. However, there may be more domain specific details for controller actions.
|
75
|
+
|
76
|
+
## Contributing
|
77
|
+
|
78
|
+
1. Fork it
|
79
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
80
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
81
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
82
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/glue_gun.gemspec
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'glue_gun/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "glue_gun"
|
8
|
+
spec.version = GlueGun::VERSION
|
9
|
+
spec.authors = [
|
10
|
+
"Jeremy Friesen"
|
11
|
+
]
|
12
|
+
spec.email = [
|
13
|
+
"jeremy.n.friesen@gmail.com"
|
14
|
+
]
|
15
|
+
spec.description = <<-EOF
|
16
|
+
A tool for connecting parts of your application at configuration time.
|
17
|
+
Part thought experiment, part useful, part extensible via plugins.
|
18
|
+
EOF
|
19
|
+
spec.summary = %q{A tool for connecting parts of your application at configuration time.}
|
20
|
+
spec.homepage = "https://github.com/jeremyf/glue_gun"
|
21
|
+
spec.license = "APACHE2"
|
22
|
+
|
23
|
+
spec.files = `git ls-files`.split($/)
|
24
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
25
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
26
|
+
spec.require_paths = ["lib"]
|
27
|
+
|
28
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
29
|
+
spec.add_development_dependency "rake"
|
30
|
+
spec.add_development_dependency "rspec"
|
31
|
+
spec.add_development_dependency 'guard'
|
32
|
+
spec.add_development_dependency 'guard-rspec'
|
33
|
+
spec.add_development_dependency 'guard-bundler'
|
34
|
+
spec.add_development_dependency 'guard-livereload'
|
35
|
+
|
36
|
+
end
|
data/lib/glue_gun.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require "glue_gun/version"
|
2
|
+
|
3
|
+
module GlueGun
|
4
|
+
module_function
|
5
|
+
def configuration=(object)
|
6
|
+
@configuration = object
|
7
|
+
end
|
8
|
+
def configuration
|
9
|
+
@configuration
|
10
|
+
end
|
11
|
+
def configure!
|
12
|
+
configuration.configure!
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def GlueGun(config = GlueGun::ConfigBuilder.new(GlueGun))
|
17
|
+
yield(config) if block_given?
|
18
|
+
GlueGun.configuration = config
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'glue_gun/config_builder'
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'glue_gun/config_builder/commands'
|
2
|
+
module GlueGun
|
3
|
+
class ConfigBuilder
|
4
|
+
attr_reader :operations
|
5
|
+
def initialize(context)
|
6
|
+
@context = context
|
7
|
+
end
|
8
|
+
|
9
|
+
def method_missing(method_name, *args, &block)
|
10
|
+
command_name = command_name_for_method(method_name)
|
11
|
+
if Commands.const_defined?(command_name)
|
12
|
+
command_class = Commands.const_get(command_name)
|
13
|
+
command_class.new(self, *args, &block)
|
14
|
+
else
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def respond_to_missing?(method_name, include_private=false)
|
20
|
+
command_name = command_name_for_method(method_name)
|
21
|
+
Commands.const_defined?(command_name) || super
|
22
|
+
rescue NameError
|
23
|
+
super
|
24
|
+
end
|
25
|
+
|
26
|
+
def configure!
|
27
|
+
deferred_commands.each { |commands| commands.call }
|
28
|
+
end
|
29
|
+
|
30
|
+
def cached_command(*args)
|
31
|
+
if cached_value = deferred_commands.detect {|command| command == args }
|
32
|
+
cached_value
|
33
|
+
else
|
34
|
+
command = yield
|
35
|
+
deferred_commands << command
|
36
|
+
command
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def command_name_for_method(method_name)
|
43
|
+
method_name.to_s.gsub(/(?:^|_)([a-z])/) { $1.upcase }
|
44
|
+
end
|
45
|
+
|
46
|
+
def deferred_commands
|
47
|
+
@deferred_commands ||= []
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module GlueGun
|
2
|
+
class ConfigBuilder
|
3
|
+
class Command
|
4
|
+
def self.new(builder, *args)
|
5
|
+
builder.cached_command(*args) {
|
6
|
+
super
|
7
|
+
}
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(builder)
|
11
|
+
@builder = builder
|
12
|
+
@wrappers = []
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_reader :wrappers
|
16
|
+
protected :wrappers
|
17
|
+
def <<(wrapper)
|
18
|
+
@wrappers += Array(wrapper)
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def call
|
23
|
+
raise NotImplementedError,
|
24
|
+
"Method #call should be overriden in child classes"
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'glue_gun/config_builder/command'
|
2
|
+
module GlueGun
|
3
|
+
class ConfigBuilder
|
4
|
+
module Commands
|
5
|
+
class AfterMethod < GlueGun::ConfigBuilder::Command
|
6
|
+
|
7
|
+
attr_reader :klass, :method_name
|
8
|
+
def initialize(builder, klass, method_name)
|
9
|
+
@klass = klass
|
10
|
+
@method_name = method_name
|
11
|
+
super(builder)
|
12
|
+
end
|
13
|
+
|
14
|
+
def call
|
15
|
+
klass.module_exec(method_name, method_to_wrap, wrappers) { |name, method, procs|
|
16
|
+
define_method(name) { |*args, &block|
|
17
|
+
returing_value = method.bind(self).call(*args, &block)
|
18
|
+
procs.each {|proc| proc.call(self) }
|
19
|
+
returing_value
|
20
|
+
}
|
21
|
+
}
|
22
|
+
end
|
23
|
+
private
|
24
|
+
def method_to_wrap
|
25
|
+
klass.instance_method(method_name)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'glue_gun/config_builder/command'
|
2
|
+
module GlueGun
|
3
|
+
class ConfigBuilder
|
4
|
+
module Commands
|
5
|
+
class BeforeMethod < GlueGun::ConfigBuilder::Command
|
6
|
+
|
7
|
+
attr_reader :klass, :method_name
|
8
|
+
def initialize(builder, klass, method_name)
|
9
|
+
@klass = klass
|
10
|
+
@method_name = method_name
|
11
|
+
super(builder)
|
12
|
+
end
|
13
|
+
|
14
|
+
def call
|
15
|
+
klass.module_exec(method_name, method_to_wrap, wrappers) { |name, method, procs|
|
16
|
+
define_method(name) { |*args, &block|
|
17
|
+
procs.each {|proc| proc.call(self) }
|
18
|
+
method.bind(self).call(*args, &block)
|
19
|
+
}
|
20
|
+
}
|
21
|
+
end
|
22
|
+
private
|
23
|
+
def method_to_wrap
|
24
|
+
klass.instance_method(method_name)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
describe GlueGun do
|
3
|
+
describe 'after_method' do
|
4
|
+
let(:klass) {
|
5
|
+
Class.new {
|
6
|
+
def initialize
|
7
|
+
@counter = 0
|
8
|
+
end
|
9
|
+
attr_reader :counter
|
10
|
+
def foo
|
11
|
+
@counter += 1
|
12
|
+
end
|
13
|
+
}
|
14
|
+
}
|
15
|
+
before(:each) do
|
16
|
+
$receiver = []
|
17
|
+
$other_receiver = []
|
18
|
+
GlueGun do |config|
|
19
|
+
config.after_method(klass, :foo) << lambda { |object|
|
20
|
+
$receiver << object
|
21
|
+
}
|
22
|
+
|
23
|
+
config.after_method(klass, :foo) << lambda { |object|
|
24
|
+
$other_receiver << 1
|
25
|
+
}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
let(:klass_instance) { klass.new }
|
29
|
+
|
30
|
+
it 'runs the configuration block when method is called' do
|
31
|
+
GlueGun.configure!
|
32
|
+
expect {
|
33
|
+
expect {
|
34
|
+
klass_instance.foo
|
35
|
+
}.to change { $other_receiver }.from([]).to([1])
|
36
|
+
}.to change { $receiver }.from([]).to([klass_instance])
|
37
|
+
expect(klass_instance.counter).to eq(1)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'does not apply configuration until configurator is configured!' do
|
41
|
+
expect {
|
42
|
+
expect {
|
43
|
+
klass_instance.foo
|
44
|
+
}.to_not change { $other_receiver }
|
45
|
+
}.to_not change { $receiver }
|
46
|
+
expect(klass_instance.counter).to eq(1)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
describe GlueGun do
|
3
|
+
describe 'before_method command' do
|
4
|
+
let(:klass) {
|
5
|
+
Class.new {
|
6
|
+
def initialize
|
7
|
+
@counter = 0
|
8
|
+
end
|
9
|
+
attr_reader :counter
|
10
|
+
def foo
|
11
|
+
@counter += 1
|
12
|
+
end
|
13
|
+
}
|
14
|
+
}
|
15
|
+
before(:each) do
|
16
|
+
$receiver = []
|
17
|
+
$other_receiver = []
|
18
|
+
GlueGun do |config|
|
19
|
+
config.before_method(klass, :foo) << lambda { |object|
|
20
|
+
$receiver << object
|
21
|
+
}
|
22
|
+
|
23
|
+
config.before_method(klass, :foo) << lambda { |object|
|
24
|
+
$other_receiver << 1
|
25
|
+
}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
let(:klass_instance) { klass.new }
|
29
|
+
|
30
|
+
it 'runs the configuration block when method is called' do
|
31
|
+
GlueGun.configure!
|
32
|
+
expect {
|
33
|
+
expect {
|
34
|
+
klass_instance.foo
|
35
|
+
}.to change { $other_receiver }.from([]).to([1])
|
36
|
+
}.to change { $receiver }.from([]).to([klass_instance])
|
37
|
+
expect(klass_instance.counter).to eq(1)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'does not apply configuration until configurator is configured!' do
|
41
|
+
expect {
|
42
|
+
expect {
|
43
|
+
klass_instance.foo
|
44
|
+
}.to_not change { $other_receiver }
|
45
|
+
}.to_not change { $receiver }
|
46
|
+
expect(klass_instance.counter).to eq(1)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module GlueGun
|
4
|
+
class ConfigBuilder
|
5
|
+
module Commands
|
6
|
+
class TestCommand
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe ConfigBuilder do
|
12
|
+
|
13
|
+
let(:container) { double }
|
14
|
+
subject { GlueGun::ConfigBuilder.new(container) }
|
15
|
+
|
16
|
+
it 'responds to commands defined in ConfigBuilder::Commands' do
|
17
|
+
expect(subject).to respond_to(:test_command)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'translates method calls into command invocations including arguments' do
|
21
|
+
test_command = double
|
22
|
+
ConfigBuilder::Commands::TestCommand.should_receive(:new).
|
23
|
+
with(subject, "foo", 42).
|
24
|
+
and_return(test_command)
|
25
|
+
expect(subject.test_command("foo", 42)).to eq(test_command)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'handles missing non-command missing methods normally' do
|
29
|
+
expect(subject).not_to respond_to(:nonexistant_method)
|
30
|
+
expect{subject.nonexistent_method}.to raise_error(NoMethodError)
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
GEM_ROOT = File.expand_path("../../", __FILE__)
|
2
|
+
$:.unshift File.join(GEM_ROOT, "lib")
|
3
|
+
|
4
|
+
require 'glue_gun'
|
5
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
6
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
7
|
+
# Require this file using `require "spec_helper"` to ensure that it is only
|
8
|
+
# loaded once.
|
9
|
+
#
|
10
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
11
|
+
RSpec.configure do |config|
|
12
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
13
|
+
config.run_all_when_everything_filtered = true
|
14
|
+
config.filter_run :focus
|
15
|
+
|
16
|
+
# Run specs in random order to surface order dependencies. If you find an
|
17
|
+
# order dependency and want to debug it, you can fix the order by providing
|
18
|
+
# the seed, which is printed after each run.
|
19
|
+
# --seed 1234
|
20
|
+
config.order = 'random'
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,172 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: glue_gun
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jeremy Friesen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-07-31 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: guard
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: guard-rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: guard-bundler
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: guard-livereload
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: |2
|
112
|
+
A tool for connecting parts of your application at configuration time.
|
113
|
+
Part thought experiment, part useful, part extensible via plugins.
|
114
|
+
email:
|
115
|
+
- jeremy.n.friesen@gmail.com
|
116
|
+
executables: []
|
117
|
+
extensions: []
|
118
|
+
extra_rdoc_files: []
|
119
|
+
files:
|
120
|
+
- .gitignore
|
121
|
+
- .rspec
|
122
|
+
- Gemfile
|
123
|
+
- Guardfile
|
124
|
+
- LICENSE.txt
|
125
|
+
- README.md
|
126
|
+
- Rakefile
|
127
|
+
- glue_gun.gemspec
|
128
|
+
- lib/glue_gun.rb
|
129
|
+
- lib/glue_gun/config_builder.rb
|
130
|
+
- lib/glue_gun/config_builder/command.rb
|
131
|
+
- lib/glue_gun/config_builder/commands.rb
|
132
|
+
- lib/glue_gun/config_builder/commands/after_method.rb
|
133
|
+
- lib/glue_gun/config_builder/commands/before_method.rb
|
134
|
+
- lib/glue_gun/version.rb
|
135
|
+
- spec/lib/glue_gun.rb
|
136
|
+
- spec/lib/glue_gun/config_builder/command_spec.rb
|
137
|
+
- spec/lib/glue_gun/config_builder/commands/after_method_spec.rb
|
138
|
+
- spec/lib/glue_gun/config_builder/commands/before_method_spec.rb
|
139
|
+
- spec/lib/glue_gun/config_builder_spec.rb
|
140
|
+
- spec/spec_helper.rb
|
141
|
+
homepage: https://github.com/jeremyf/glue_gun
|
142
|
+
licenses:
|
143
|
+
- APACHE2
|
144
|
+
metadata: {}
|
145
|
+
post_install_message:
|
146
|
+
rdoc_options: []
|
147
|
+
require_paths:
|
148
|
+
- lib
|
149
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - '>='
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '0'
|
154
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - '>='
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
159
|
+
requirements: []
|
160
|
+
rubyforge_project:
|
161
|
+
rubygems_version: 2.0.3
|
162
|
+
signing_key:
|
163
|
+
specification_version: 4
|
164
|
+
summary: A tool for connecting parts of your application at configuration time.
|
165
|
+
test_files:
|
166
|
+
- spec/lib/glue_gun.rb
|
167
|
+
- spec/lib/glue_gun/config_builder/command_spec.rb
|
168
|
+
- spec/lib/glue_gun/config_builder/commands/after_method_spec.rb
|
169
|
+
- spec/lib/glue_gun/config_builder/commands/before_method_spec.rb
|
170
|
+
- spec/lib/glue_gun/config_builder_spec.rb
|
171
|
+
- spec/spec_helper.rb
|
172
|
+
has_rdoc:
|