dockly-util 0.0.4

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.
data/.cane ADDED
@@ -0,0 +1,3 @@
1
+ --no-doc
2
+ --abc-max 30
3
+ --style-measure 120
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ Gemfile.lock
2
+ *.swp
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --profile
3
+ --format documentation
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 Swipely, Inc.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,18 @@
1
+ # Copyright Swipely, Inc. All rights reserved.
2
+
3
+ $LOAD_PATH.unshift( File.join( File.dirname(__FILE__), 'lib' ) )
4
+
5
+ require 'rake'
6
+ require 'dockly/util'
7
+ require 'rspec/core/rake_task'
8
+ require 'cane/rake_task'
9
+
10
+ task :default => [:spec, :quality]
11
+
12
+ RSpec::Core::RakeTask.new do |t|
13
+ t.pattern = 'spec/**/*_spec.rb'
14
+ end
15
+
16
+ Cane::RakeTask.new(:quality) do |cane|
17
+ cane.canefile = '.cane'
18
+ end
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/dockly/util/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Swipely, Inc."]
6
+ gem.email = %w{tomhulihan@swipely.com bright@swipely.com toddlunter@swipely.com}
7
+ gem.description = %q{DSL made easy}
8
+ gem.summary = %q{DSL made easy}
9
+ gem.homepage = "https://github.com/swipely/dockly-util"
10
+ gem.files = `git ls-files`.split($\)
11
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
12
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
13
+ gem.name = "dockly-util"
14
+ gem.require_paths = %w{lib}
15
+ gem.version = Dockly::Util::VERSION
16
+ gem.add_development_dependency 'rake'
17
+ gem.add_development_dependency 'rspec'
18
+ gem.add_development_dependency 'cane'
19
+ gem.add_development_dependency 'pry'
20
+ end
data/lib/dockly.rb ADDED
@@ -0,0 +1,4 @@
1
+ module Dockly
2
+ end
3
+
4
+ require 'dockly/util'
@@ -0,0 +1,8 @@
1
+ module Dockly
2
+ module Util
3
+ end
4
+ end
5
+
6
+ require 'dockly/util/delegate'
7
+ require 'dockly/util/logger'
8
+ require 'dockly/util/dsl'
@@ -0,0 +1,6 @@
1
+ module Dockly::Util::Delegate
2
+ def delegate(*syms, options)
3
+ target = options[:to]
4
+ syms.each { |sym| define_method(sym) { |*args, &block| send(target).send(sym, *args, &block) } }
5
+ end
6
+ end
@@ -0,0 +1,118 @@
1
+ module Dockly::Util::DSL
2
+ def self.included(base)
3
+ base.instance_eval do
4
+ extend ClassMethods
5
+ dsl_attribute :name
6
+ end
7
+ end
8
+
9
+ module ClassMethods
10
+ def new!(options = {}, &block)
11
+ inst = new(options, &block)
12
+ instances[inst.name] = inst
13
+ end
14
+
15
+ def dsl_attribute(*names)
16
+ names.each do |name|
17
+ define_method(name) do |val = nil|
18
+ val.nil? ? instance_variable_get(:"@#{name}")
19
+ : instance_variable_set(:"@#{name}", val)
20
+ end
21
+ end
22
+ end
23
+ private :dsl_attribute
24
+
25
+ def dsl_class_attribute(name, klass)
26
+ unless klass.ancestors.include?(Dockly::Util::DSL)
27
+ raise "#{self.class}.dsl_class_attribute requires a class that includes DSL"
28
+ end
29
+ define_method(name) do |sym = nil, &block|
30
+ new_value = case
31
+ when !block.nil? && !sym.nil? then klass.new!(:name => sym, &block)
32
+ when block.nil? then klass.instances[sym]
33
+ when sym.nil? then klass.new!(:name => :"#{self.name}_#{klass}", &block)
34
+ end
35
+ instance_variable_set(:"@#{name}", new_value) unless new_value.nil?
36
+ instance_variable_get(:"@#{name}")
37
+ end
38
+ end
39
+ private :dsl_class_attribute
40
+
41
+ def default_value(name, val = nil)
42
+ default_values[name] = block_given? ? yield : val
43
+ end
44
+ private :default_value
45
+
46
+ def default_values
47
+ @default_values ||= {}
48
+ end
49
+
50
+ def instances
51
+ @instances ||= {}
52
+ end
53
+
54
+ def demodulize(path)
55
+ if i = path.rindex('::')
56
+ path[(i+2)..-1]
57
+ else
58
+ path
59
+ end
60
+ end
61
+
62
+ def generate_unique_name
63
+ name = nil
64
+ (0..(1.0 / 0.0)).each do |n|
65
+ name = :"#{demodulize(self.name)}_#{n}"
66
+ break unless instances.has_key?(name)
67
+ end
68
+ name
69
+ end
70
+
71
+ def [](sym)
72
+ instances[sym]
73
+ end
74
+ end
75
+
76
+ def to_s
77
+ "#{self.class.name} (#{
78
+ instance_variables.map { |var|
79
+ "#{var} = #{instance_variable_get(var)}"
80
+ }.join(', ')
81
+ })"
82
+ end
83
+
84
+ def [](var)
85
+ instance_variable_get(:"@#{var}")
86
+ end
87
+
88
+ def []=(var, val)
89
+ instance_variable_set(:"@#{var}", val)
90
+ end
91
+
92
+ def ==(other_dsl)
93
+ (other_dsl.class == self.class) && (other_dsl.name == self.name)
94
+ end
95
+ def initialize(options = {}, &block)
96
+ self.class.default_values.merge(options).each do |k, v|
97
+ v = v.dup rescue v unless v.class.ancestors.include?(Dockly::Util::DSL)
98
+ public_send(k, v)
99
+ end
100
+ instance_eval(&block) unless block.nil?
101
+ name(self.class.generate_unique_name) if name.nil?
102
+ self.instance_variable_get(:@name).freeze
103
+ end
104
+
105
+ def to_hash
106
+ Hash[instance_variables.map { |ivar| [ivar.to_s[1..-1].to_sym, instance_variable_get(ivar)] }]
107
+ end
108
+
109
+ def ensure_present!(*syms)
110
+ syms.each do |sym|
111
+ if instance_variable_get(:"@#{sym}").nil?
112
+ method_name = /.*`(?<method_name>.+)'$/.match(caller[2])[:method_name]
113
+ raise "The following must be present to use #{self.class}##{method_name}: #{sym}"
114
+ end
115
+ end
116
+ end
117
+ private :ensure_present!
118
+ end
@@ -0,0 +1,96 @@
1
+ class Dockly::Util::Logger
2
+ attr_accessor :prefix, :print_method, :output
3
+ alias_method :print_method?, :print_method
4
+
5
+ LEVELS = [:debug, :info, :warn, :error, :fatal, :unknown].freeze
6
+
7
+ def initialize(prefix = "", output = Dockly::Util::Logger.output, print_method = Dockly::Util::Logger.print_method)
8
+ @prefix = prefix
9
+ @print_method = print_method
10
+ @output = output
11
+ end
12
+
13
+ def log(level, message)
14
+ output.puts(format_message(level, message)) if self.class.enabled?
15
+ end
16
+
17
+ LEVELS.each do |level|
18
+ define_method(level) { |message| log(level, message) }
19
+ end
20
+
21
+ def format_message(level, message)
22
+ [
23
+ format_level(level),
24
+ Thread.current[:rake_task].to_s,
25
+ prefix,
26
+ get_last_method,
27
+ message
28
+ ].compact.reject(&:empty?).join(' ')
29
+ end
30
+
31
+ def format_level(level)
32
+ (char = level.to_s[0]) ? char.upcase : nil
33
+ end
34
+
35
+ def get_last_method
36
+ if print_method?
37
+ file_and_method = caller.reject { |trace| trace =~ /deployz\/logger\.rb|block \(\d+ levels\)/ }.first
38
+ file_and_method.match(/:in `(.+)'$/)[1]
39
+ end
40
+ end
41
+
42
+ def with_prefix(new_prefix = "", output = nil, print_method = nil)
43
+ output ||= self.output
44
+ print_method ||= self.print_method
45
+ yield(self.class.new([prefix, new_prefix].compact.reject(&:empty?).join(' '), output, print_method))
46
+ end
47
+
48
+ module Mixin
49
+ extend Dockly::Util::Delegate
50
+
51
+ def self.included(base)
52
+ base.extend(ClassMethods)
53
+ end
54
+
55
+ def logger
56
+ @logger ||= Dockly::Util::Logger.new(self.class.logger_prefix)
57
+ end
58
+
59
+ delegate(*(LEVELS + [:log, :with_prefix]), :to => :logger)
60
+
61
+ module ClassMethods
62
+ def logger_prefix(val = nil)
63
+ val.nil? ? (@logger_prefix ||= self.name) : (@logger_prefix = val)
64
+ end
65
+ end
66
+ end
67
+
68
+
69
+ class << self
70
+ include Mixin
71
+
72
+ alias_method :default, :logger
73
+ attr_writer :print_method, :output
74
+
75
+ def disable!
76
+ @logger_enabled = false
77
+ end
78
+
79
+ def enable!
80
+ @logger_enabled = true
81
+ end
82
+
83
+ def enabled?
84
+ enable! if @logger_enabled.nil?
85
+ @logger_enabled
86
+ end
87
+
88
+ def print_method
89
+ (@print_method == false) ? false : true
90
+ end
91
+
92
+ def output
93
+ @output ||= STDOUT
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,5 @@
1
+ module Dockly
2
+ module Util
3
+ VERSION = '0.0.4'
4
+ end
5
+ end
@@ -0,0 +1,171 @@
1
+ require 'spec_helper'
2
+
3
+ describe Dockly::Util::DSL do
4
+ let(:included_class) do
5
+ Class.new do
6
+ include Dockly::Util::DSL
7
+
8
+ dsl_attribute :ocean
9
+ end
10
+ end
11
+
12
+ let(:test_class) do
13
+ klass = included_class
14
+ Class.new do
15
+ include Dockly::Util::DSL
16
+
17
+ dsl_attribute :chips
18
+ dsl_class_attribute :meta, klass
19
+ end
20
+ end
21
+
22
+ subject { test_class.new!(:name => 'Tony') }
23
+
24
+ describe '.dsl_attribute' do
25
+ it 'defines a method for each name given' do
26
+ subject.should respond_to :chips
27
+ end
28
+
29
+ context 'the defined method(s)' do
30
+ context 'with 0 arguments' do
31
+ let(:test_val) { 'lays' }
32
+ before { subject.instance_variable_set(:@chips, test_val) }
33
+
34
+ it 'returns the value of the instance variable with a matching name' do
35
+ subject.chips.should == test_val
36
+ end
37
+ end
38
+
39
+ context 'with one argument' do
40
+ it 'sets the corresponding instance variable to the passed-in value' do
41
+ expect { subject.chips('bbq') }
42
+ .to change { subject.instance_variable_get(:@chips) }
43
+ .to 'bbq'
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ describe '.dsl_class_attribute' do
50
+ context 'when the sceond argument is not a DSL' do
51
+ it 'raises an error' do
52
+ expect do
53
+ Class.new do
54
+ include Dockly::Util::DSL
55
+
56
+ dsl_class_attribute :test, Array
57
+ end
58
+ end.to raise_error
59
+ end
60
+ end
61
+
62
+ context 'when the second argument is a DSL' do
63
+ it 'defines a new method with the name of the first argument' do
64
+ subject.should respond_to :meta
65
+ end
66
+
67
+ context 'the method' do
68
+ let(:meta) { subject.instance_variable_get(:@meta) }
69
+
70
+ context 'when a symbol is given' do
71
+ context 'and a block is given' do
72
+ before { subject.meta(:yolo) { ocean 'Indian' } }
73
+
74
+ it 'creates a new instance of the specified Class with the name set' do
75
+ meta.name.should == :yolo
76
+ meta.ocean.should == 'Indian'
77
+ end
78
+ end
79
+
80
+ context 'and a block is not given' do
81
+ before { included_class.new!(:name => :test_name) { ocean 'Pacific' } }
82
+
83
+ it 'looks up the instance in its Class\'s .instances hash' do
84
+ subject.meta(:test_name).ocean.should == 'Pacific'
85
+ end
86
+ end
87
+ end
88
+
89
+ context 'when a symbol is not given' do
90
+ context 'and a block is given' do
91
+ before { subject.meta { ocean 'Atlantic' } }
92
+
93
+ it 'creates a new instance of the specified Class' do
94
+ meta.ocean.should == 'Atlantic'
95
+ end
96
+
97
+ it 'generates a name' do
98
+ meta.name.should == :"#{subject.name}_#{meta.class}"
99
+ end
100
+ end
101
+
102
+ context 'and a block is not given' do
103
+ before { subject.meta(:test) { ocean 'Artic' } }
104
+
105
+ it 'returns the corresponding instance variable' do
106
+ subject.meta.should == meta
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ describe '#ensure_present!' do
115
+ context 'when at least one of the symbols is nil' do
116
+ it 'raises an error' do
117
+ expect { subject.send(:ensure_present!, :meta) }.to raise_error
118
+ end
119
+ end
120
+
121
+ context 'when each symbol is present' do
122
+ it 'does nothing' do
123
+ expect { subject.send(:ensure_present!, :name) }.to_not raise_error
124
+ end
125
+ end
126
+ end
127
+
128
+ describe '.default_value' do
129
+ context 'when a block is given' do
130
+ it 'calls the block and adds it to he default_values hash' do
131
+ test_class.send(:default_value, :meta) { included_class.new!(:name => :joey) }
132
+ test_class.default_values[:meta].name.should == :joey
133
+ end
134
+ end
135
+
136
+ context 'when a value is given' do
137
+ it 'adds the pair to the default_values hash' do
138
+ test_class.send(:default_value, :chips, 'Cool Ranch')
139
+ test_class.default_values[:chips].should == 'Cool Ranch'
140
+ end
141
+ end
142
+ end
143
+
144
+ describe '#initialize' do
145
+ context 'when a block is given' do
146
+ it 'is instance evaluated' do
147
+ test_class.new! { name :timmy }.name.should == :timmy
148
+ end
149
+ end
150
+
151
+ context 'when a hash is given' do
152
+ it 'sends each key value pair to the object as a message' do
153
+ test_class.new!(:name => :tommy).name.should == :tommy
154
+ end
155
+ end
156
+
157
+ context 'when there is no name' do
158
+ it 'raises an error' do
159
+ expect { test_class.new! { chips 'Tortilla' } }.to raise_error
160
+ end
161
+ end
162
+
163
+ context 'when there is a name' do
164
+ it 'adds the current instance to the class\'s instances hash' do
165
+ test_class.instances[:jillian].should be_nil
166
+ test_class.new! { name :jillian }
167
+ test_class.instances[:jillian].name.should == :jillian
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,193 @@
1
+ require 'spec_helper'
2
+
3
+ describe Dockly::Util::Logger do
4
+ before(:all) { Dockly::Util::Logger.enable! }
5
+ after(:all) { Dockly::Util::Logger.disable! unless ENV['ENABLE_LOGGER'] == 'true' }
6
+
7
+ describe '#initialize' do
8
+ its(:prefix) { should be_empty }
9
+ its(:print_method?) { should be_true }
10
+ its(:output) { should == STDOUT }
11
+ end
12
+
13
+ describe '#log' do
14
+ context 'when the logger is enabled' do
15
+ let(:level) { :debug }
16
+ let(:message) { 'hey mom' }
17
+ let(:formatted) { 'T hey mom' }
18
+
19
+ before { subject.stub(:format_message).with(level, message).and_return(formatted) }
20
+
21
+ it 'sends a formatted level and message to the output' do
22
+ subject.output.should_receive(:puts).with(formatted)
23
+ subject.log(level, message)
24
+ end
25
+ end
26
+
27
+ context 'when the logger is disabled' do
28
+ before(:all) { Dockly::Util::Logger.disable! }
29
+ after(:all) { Dockly::Util::Logger.enable! }
30
+
31
+ it 'does nothing' do
32
+ subject.output.should_not_receive(:puts)
33
+ subject.log(:debug, 'this wont be printed')
34
+ end
35
+ end
36
+ end
37
+
38
+ Dockly::Util::Logger::LEVELS.each do |level|
39
+ describe "##{level}" do
40
+ let(:message) { "message for #{level}" }
41
+
42
+ it "sends the message to #log with #{level} as the level" do
43
+ subject.should_receive(:log).with(level, message)
44
+ subject.public_send(level, message)
45
+ end
46
+ end
47
+ end
48
+
49
+ describe '#format message' do
50
+ before do
51
+ subject.stub(:prefix).and_return(prefix)
52
+ subject.stub(:get_last_method).and_return(method)
53
+ subject.stub(:format_level).with(level).and_return(formatted_level)
54
+ end
55
+
56
+ context 'when all of the fields are present' do
57
+ let(:level) { :debug }
58
+ let(:formatted_level) { 'D' }
59
+ let(:prefix) { '[deployz logger]' }
60
+ let(:method) { 'test' }
61
+ let(:message) { 'here i am' }
62
+
63
+ it 'returns each of them with a space in the middle' do
64
+ subject.format_message(level, message).should == "#{formatted_level} #{prefix} #{method} #{message}"
65
+ end
66
+ end
67
+
68
+ context 'when one of the fields returns nil' do
69
+ let(:level) { :info }
70
+ let(:formatted_level) { 'I' }
71
+ let(:prefix) { '[deployz logger]' }
72
+ let(:method) { nil }
73
+ let(:message) { 'there you are' }
74
+
75
+ it 'does not insert an extra space' do
76
+ subject.format_message(level, message).should == "#{formatted_level} #{prefix} #{message}"
77
+ end
78
+ end
79
+ end
80
+
81
+ describe '#format_level' do
82
+ context 'when the level is nil or empty' do
83
+ it 'returns nil' do
84
+ [nil, '', :''].should be_all { |level| subject.format_level(level).nil? }
85
+ end
86
+ end
87
+
88
+ context 'when the level is present' do
89
+ it 'returns the first character upper-cased' do
90
+ { :info => 'I',
91
+ :debug => 'D',
92
+ '>>=' => '>'
93
+ }.should be_all { |level, formatted|
94
+ subject.format_level(level) == formatted
95
+ }
96
+ end
97
+ end
98
+ end
99
+
100
+ describe '#get_last_method' do
101
+ def test_get_last_method
102
+ subject.get_last_method
103
+ end
104
+
105
+ context 'when calls are not nested' do
106
+ it 'returns the calling method' do
107
+ test_get_last_method.should == 'test_get_last_method'
108
+ end
109
+ end
110
+
111
+ context 'when calls are nested' do
112
+ def outer_method
113
+ test_get_last_method
114
+ end
115
+
116
+ it 'still returns the calling method' do
117
+ outer_method.should == 'test_get_last_method'
118
+ end
119
+ end
120
+ end
121
+
122
+ describe '#with_prefix' do
123
+ context 'when the new prefix is empty' do
124
+ context 'and the old prefix is empty' do
125
+ it 'yields a new logger with an empty prefix' do
126
+ subject.with_prefix(nil) { |logger| logger.prefix.should be_empty }
127
+ end
128
+ end
129
+
130
+ context 'and the old prefix is present' do
131
+ let(:prefix) { 'hello' }
132
+ subject { described_class.new(prefix) }
133
+
134
+ it 'yields a new logger with the old prefix' do
135
+ subject.with_prefix(nil) { |logger| logger.prefix.should == prefix }
136
+ end
137
+ end
138
+ end
139
+
140
+ context 'when the new prefix is present' do
141
+ context 'and the old prefix is empty' do
142
+ let(:prefix) { 'hola' }
143
+
144
+ it 'yields a new logger with the new prefix' do
145
+ subject.with_prefix(prefix) { |logger| logger.prefix.should == prefix }
146
+ end
147
+ end
148
+
149
+ context 'and the old prefix is present' do
150
+ let(:old_prefix) { 'hello' }
151
+ let(:new_prefix) { 'hola' }
152
+ let(:prefix) { "#{old_prefix} #{new_prefix}" }
153
+
154
+ subject { described_class.new(old_prefix) }
155
+
156
+ it 'yields a new logger with the old prefix' do
157
+ subject.with_prefix(new_prefix) { |logger| logger.prefix.should == prefix }
158
+ end
159
+ end
160
+ end
161
+ end
162
+
163
+ describe 'the meta class' do
164
+ subject { described_class }
165
+
166
+ (Dockly::Util::Logger::LEVELS + [:default, :logger, :log, :with_prefix]).each do |method|
167
+ it { should respond_to method }
168
+ end
169
+ end
170
+
171
+ describe Dockly::Util::Logger::Mixin do
172
+ let(:test_class) { Class.new { include Dockly::Util::Logger::Mixin } }
173
+
174
+ subject { test_class.new }
175
+
176
+ describe '#logger' do
177
+ its(:logger) { should be_a Dockly::Util::Logger }
178
+
179
+ it 'has the class name as the prefix' do
180
+ subject.logger.prefix.should == test_class.name
181
+ end
182
+ end
183
+
184
+ (Dockly::Util::Logger::LEVELS + [:log, :with_prefix]).each do |method|
185
+ describe "##{method}" do
186
+ it "sends ##{method} to #logger" do
187
+ subject.logger.should_receive(method)
188
+ subject.public_send(method)
189
+ end
190
+ end
191
+ end
192
+ end
193
+ end
@@ -0,0 +1,11 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+
4
+ require 'rspec'
5
+ require 'dockly/util'
6
+
7
+ RSpec.configure do |config|
8
+ config.mock_with :rspec
9
+ config.treat_symbols_as_metadata_keys_with_true_values = true
10
+ config.tty = true
11
+ end
metadata ADDED
@@ -0,0 +1,131 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dockly-util
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Swipely, Inc.
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-11-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: cane
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: pry
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description: DSL made easy
79
+ email:
80
+ - tomhulihan@swipely.com
81
+ - bright@swipely.com
82
+ - toddlunter@swipely.com
83
+ executables: []
84
+ extensions: []
85
+ extra_rdoc_files: []
86
+ files:
87
+ - .cane
88
+ - .gitignore
89
+ - .rspec
90
+ - Gemfile
91
+ - LICENSE.txt
92
+ - Rakefile
93
+ - dockly-util.gemspec
94
+ - lib/dockly.rb
95
+ - lib/dockly/util.rb
96
+ - lib/dockly/util/delegate.rb
97
+ - lib/dockly/util/dsl.rb
98
+ - lib/dockly/util/logger.rb
99
+ - lib/dockly/util/version.rb
100
+ - spec/dockl/util/dsl_spec.rb
101
+ - spec/dockl/util/logger_spec.rb
102
+ - spec/spec_helper.rb
103
+ homepage: https://github.com/swipely/dockly-util
104
+ licenses: []
105
+ post_install_message:
106
+ rdoc_options: []
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ none: false
111
+ requirements:
112
+ - - ! '>='
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ required_rubygems_version: !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ requirements: []
122
+ rubyforge_project:
123
+ rubygems_version: 1.8.23
124
+ signing_key:
125
+ specification_version: 3
126
+ summary: DSL made easy
127
+ test_files:
128
+ - spec/dockl/util/dsl_spec.rb
129
+ - spec/dockl/util/logger_spec.rb
130
+ - spec/spec_helper.rb
131
+ has_rdoc: