docile 1.1.5 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4df64881f4215d866d038e00f55d5b1ca2a45cb2
4
- data.tar.gz: 26a8de33f8bf657873666a2754bf09f605334e9d
3
+ metadata.gz: efc3f0539f1c253fdc8487bcc23f671e8c74fab5
4
+ data.tar.gz: 4a6ff57d636604f406e6d19ca27b6fce30110d9f
5
5
  SHA512:
6
- metadata.gz: 75669d4f578d70ba4c8be7dd6c19676041506e0f9408ba26ea0b1ad7931cf59636ccf36a4363ae709a1476464caba5ca1c429b07233dda7d797d5007f3c0af10
7
- data.tar.gz: e0e0e7364436ce92f4ab5efc52c2782e5da098d302652ca8698d74bcccc27c695b269c04ced3d224eec1a5b3833ba91c44232a2cc4c55fe061504246a715ef49
6
+ metadata.gz: 410b86373972c31e31811dad9dc257501be169d43484023f98a54f63ff1a9c61cc5ac5974aaea384e4373a93eeab763f1f5d7db80803f2d605581963f19c9f4c
7
+ data.tar.gz: 84dd464b50e7d368c198570370233e8ea1c2fef17e1d114a0b1798a302c0bf7126ff38bfe1a53d6a2e1609f524e689ae6b9233af7c9b5bca6978f0f68fd817e0
data/.gitignore CHANGED
@@ -6,4 +6,6 @@ pkg
6
6
  doc
7
7
  .yardoc
8
8
  coverage
9
- vendor
9
+ vendor
10
+ .ruby-gemset
11
+ .ruby-version
@@ -1,21 +1,37 @@
1
1
  language: ruby
2
- cache: bundler
2
+
3
+ # Apparently sudo is required to test on Rubinius and JRuby-head
4
+ sudo: required
5
+
6
+ # See https://docs.travis-ci.com/user/languages/ruby/#Rubinius
7
+ dist: trusty
8
+
3
9
  rvm:
10
+ # MRI
4
11
  - ruby-head
5
- - 2.1.2
6
- - 2.1.1
7
- - 2.1.0
8
- - 2.0.0
12
+ - 2.4
13
+ - 2.3
14
+ - 2.2
15
+ - 2.1
16
+ - 2.0
17
+ - 1.9.2 # allowed to fail until Travis binary for this is fixed
9
18
  - 1.9.3
10
- - 1.9.2
11
19
  - 1.8.7
12
20
  - ree
21
+ # JRuby
13
22
  - jruby-head
23
+ - jruby-9.1 # allowed to fail due to https://github.com/travis-ci/travis-ci/issues/9049
24
+ - jruby-9.0
14
25
  - jruby-19mode
15
26
  - jruby-18mode
16
- - rbx-2
27
+ # Rubinius
28
+ - rubinius-3
29
+
17
30
  matrix:
18
31
  allow_failures:
19
32
  - rvm: ruby-head
33
+ - rvm: 1.9.2 # See build error https://travis-ci.org/tcrayford/Values/jobs/202728857
20
34
  - rvm: jruby-head
35
+ - rvm: jruby-9.1 # See build error https://travis-ci.org/ms-ati/docile/jobs/327830706
36
+ - rvm: rubinius-3
21
37
  fast_finish: true
data/Gemfile CHANGED
@@ -1,4 +1,12 @@
1
+ require File.expand_path('on_what', File.dirname(__FILE__))
1
2
  source 'https://rubygems.org'
2
3
 
4
+ # Travis-only dependencies go here
5
+ if on_travis? && !on_1_8?
6
+ group :test do
7
+ gem 'codecov', '>= 0.0.9', :require => false
8
+ end
9
+ end
10
+
3
11
  # Specify gem's dependencies in docile.gemspec
4
12
  gemspec
data/HISTORY.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # HISTORY
2
2
 
3
+ ## [Unreleased changes](http://github.com/ms-ati/docile/compare/v1.2.0...master)
4
+
5
+ ## [v1.2.0 (Jan 11, 2018)](http://github.com/ms-ati/docile/compare/v1.1.5...v1.2.0)
6
+
7
+ - Special thanks to Christina Koller (@cmkoller)
8
+ - add DSL evaluation returning *return value of the block* (see `.dsl_eval_with_block_return`)
9
+ - add an example to README
10
+ - keep travis builds passing on old ruby versions
11
+
3
12
  ## [v1.1.5 (Jun 15, 2014)](http://github.com/ms-ati/docile/compare/v1.1.4...v1.1.5)
4
13
 
5
14
  - as much as possible, loosen version restrictions on development dependencies
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2012-2014 Marc Siegel
3
+ Copyright (c) 2012-2018 Marc Siegel
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,11 +1,16 @@
1
1
  # Docile
2
- [![Gem Version](https://badge.fury.io/rb/docile.png)](http://badge.fury.io/rb/docile)
3
- [![Build Status](https://travis-ci.org/ms-ati/docile.png)](https://travis-ci.org/ms-ati/docile)
4
- [![Dependency Status](https://gemnasium.com/ms-ati/docile.png)](https://gemnasium.com/ms-ati/docile)
5
- [![Code Climate](https://codeclimate.com/github/ms-ati/docile.png)](https://codeclimate.com/github/ms-ati/docile)
6
- [![Coverage Status](https://coveralls.io/repos/ms-ati/docile/badge.png)](https://coveralls.io/r/ms-ati/docile)
7
- [![Inline docs](http://inch-ci.org/github/ms-ati/docile.png)](http://inch-ci.org/github/ms-ati/docile)
8
- [![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/ms-ati/docile/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
2
+
3
+ [![Gem Version](https://img.shields.io/gem/v/docile.svg)](https://rubygems.org/gems/docile)
4
+ [![Gem Downloads](https://img.shields.io/gem/dt/docile.svg)](https://rubygems.org/gems/docile)
5
+
6
+ [![Join the chat at https://gitter.im/ms-ati/docile](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ms-ati/docile?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
7
+ [![Yard Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://rubydoc.info/github/ms-ati/docile)
8
+ [![Docs Coverage](http://inch-ci.org/github/ms-ati/docile.png)](http://inch-ci.org/github/ms-ati/docile)
9
+
10
+ [![Build Status](https://img.shields.io/travis/ms-ati/docile/master.svg)](https://travis-ci.org/ms-ati/docile)
11
+ [![Dependency Status](https://gemnasium.com/ms-ati/docile.svg)](https://gemnasium.com/ms-ati/docile)
12
+ [![Code Climate](https://img.shields.io/codeclimate/github/ms-ati/docile.svg)](https://codeclimate.com/github/ms-ati/docile)
13
+ [![Code Coverage](https://img.shields.io/codecov/c/github/ms-ati/docile.svg)](https://codecov.io/github/ms-ati/docile)
9
14
 
10
15
  Ruby makes it possible to create very expressive **Domain Specific
11
16
  Languages**, or **DSL**'s for short. However, it requires some deep knowledge and
@@ -20,7 +25,7 @@ coding a bit more docile...
20
25
 
21
26
  ## Usage
22
27
 
23
- ### Basic
28
+ ### Basic: Ruby [Array](http://ruby-doc.org/core-2.2.2/Array.html) as DSL
24
29
 
25
30
  Let's say that we want to make a DSL for modifying Array objects.
26
31
  Wouldn't it be great if we could just treat the methods of Array as a DSL?
@@ -43,9 +48,54 @@ def with_array(arr=[], &block)
43
48
  end
44
49
  ```
45
50
 
46
- Easy!
51
+ **Easy!**
52
+
53
+ ### Wait! Can't I do that with just `instance_eval` or `instance_exec`?
54
+
55
+ Good question!
56
+
57
+ Let's be very specific. Docile internally uses `instance_exec` (see [execution.rb#25](lib/docile/execution.rb#L25)), adding a small layer to support referencing *local variables*, *instance variables*, and *methods* from the _block's context_ **or** the target _object's context_, interchangeably. This is "the **hard part**", where most folks making a DSL in Ruby throw up their hands.
58
+
59
+ For example:
60
+
61
+ ```ruby
62
+ class ContextOfBlock
63
+ def example_of_contexts
64
+ @block_instance_var = 1
65
+ block_local_var = 2
66
+
67
+ with_array do
68
+ push @block_instance_var
69
+ push block_local_var
70
+ pop
71
+ push block_sees_this_method
72
+ end
73
+ end
74
+
75
+ def block_sees_this_method
76
+ 3
77
+ end
78
+
79
+ def with_array(&block)
80
+ {
81
+ docile: Docile.dsl_eval([], &block),
82
+ instance_eval: ([].instance_eval(&block) rescue $!),
83
+ instance_exec: ([].instance_exec(&block) rescue $!)
84
+ }
85
+ end
86
+ end
87
+
88
+ ContextOfBlock.new.example_of_contexts
89
+ #=> {
90
+ :docile=>[1, 3],
91
+ :instance_eval=>#<NameError: undefined local variable or method `block_sees_this_method' for [nil]:Array>,
92
+ :instance_exec=>#<NameError: undefined local variable or method `block_sees_this_method' for [nil]:Array>
93
+ }
94
+ ```
95
+
96
+ As you can see, it won't be possible to call methods or access instance variables defined in the block's context using just the raw `instance_eval` or `instance_exec` methods. And in fact, Docile goes further, making it easy to maintain this support even in multi-layered DSLs.
47
97
 
48
- ### Advanced
98
+ ### Build a Pizza
49
99
 
50
100
  Mutating (changing) an Array instance is fine, but what usually makes a good DSL is a [Builder Pattern][2].
51
101
 
@@ -83,7 +133,7 @@ PizzaBuilder.new.cheese.pepperoni.sauce(:extra).build
83
133
 
84
134
  Then implement your DSL like this:
85
135
 
86
- ``` ruby
136
+ ```ruby
87
137
  def pizza(&block)
88
138
  Docile.dsl_eval(PizzaBuilder.new, &block).build
89
139
  end
@@ -93,6 +143,38 @@ It's just that easy!
93
143
 
94
144
  [2]: http://stackoverflow.com/questions/328496/when-would-you-use-the-builder-pattern "Builder Pattern"
95
145
 
146
+ ### Multi-level and Recursive DSLs
147
+
148
+ Docile is a very easy way to write a multi-level DSL in Ruby, even for
149
+ a [recursive data structure such as a tree][4]:
150
+
151
+ ```ruby
152
+ Person = Struct.new(:name, :mother, :father)
153
+
154
+ person {
155
+ name 'John Smith'
156
+ mother {
157
+ name 'Mary Smith'
158
+ }
159
+ father {
160
+ name 'Tom Smith'
161
+ mother {
162
+ name 'Jane Smith'
163
+ }
164
+ }
165
+ }
166
+
167
+ #=> #<struct Person name="John Smith",
168
+ # mother=#<struct Person name="Mary Smith", mother=nil, father=nil>,
169
+ # father=#<struct Person name="Tom Smith",
170
+ # mother=#<struct Person name="Jane Smith", mother=nil, father=nil>,
171
+ # father=nil>>
172
+ ```
173
+
174
+ See the full [person tree example][4] for details.
175
+
176
+ [4]: https://gist.github.com/ms-ati/2bb17bdf10a430faba98
177
+
96
178
  ### Block parameters
97
179
 
98
180
  Parameters can be passed to the DSL block.
@@ -153,7 +235,7 @@ end
153
235
 
154
236
  [3]: http://www.sinatrarb.com "Sinatra"
155
237
 
156
- ### Functional-Style DSL Objects
238
+ ### Functional-Style Immutable DSL Objects
157
239
 
158
240
  Sometimes, you want to use an object as a DSL, but it doesn't quite fit the
159
241
  [imperative](http://en.wikipedia.org/wiki/Imperative_programming) pattern shown
@@ -192,6 +274,33 @@ end
192
274
 
193
275
  All set!
194
276
 
277
+ ### Accessing the block's return value
278
+
279
+ Sometimes you might want to access the return value of your provided block,
280
+ as opposed to the DSL object itself. In these cases, use
281
+ `dsl_eval_with_block_return`. It behaves exactly like `dsl_eval`, but returns
282
+ the output from executing the block, rather than the DSL object.
283
+
284
+ ```ruby
285
+ arr = []
286
+ with_array(arr) do
287
+ push "a"
288
+ push "b"
289
+ push "c"
290
+ length
291
+ end
292
+ #=> 3
293
+
294
+ arr
295
+ #=> ["a", "b", "c"]
296
+ ```
297
+
298
+ ```ruby
299
+ def with_array(arr=[], &block)
300
+ Docile.dsl_eval_with_block_return(arr, &block)
301
+ end
302
+ ```
303
+
195
304
  ## Features
196
305
 
197
306
  1. Method lookup falls back from the DSL object to the block's context
@@ -234,7 +343,7 @@ Used by some pretty cool gems to implement their DSLs, notably including [Simple
234
343
 
235
344
  ## Copyright & License
236
345
 
237
- Copyright (c) 2012-2014 Marc Siegel.
346
+ Copyright (c) 2012-2018 Marc Siegel.
238
347
 
239
348
  Licensed under the [MIT License](http://choosealicense.com/licenses/mit/), see [LICENSE](LICENSE) for details.
240
349
 
data/Rakefile CHANGED
@@ -13,8 +13,8 @@ RSpec::Core::RakeTask.new
13
13
  CLOBBER.include('pkg', 'doc', 'coverage')
14
14
 
15
15
  # To limit needed compatibility with versions of dependencies, only configure
16
- # yard doc generation when *not* on Travis, JRuby, or 1.8
17
- if !on_travis? && !on_jruby? && !on_1_8?
16
+ # yard doc generation when *not* on Travis, JRuby, or < 2.0
17
+ if !on_travis? && !on_jruby? && !on_less_than_2_0?
18
18
  require 'github/markup'
19
19
  require 'redcarpet'
20
20
  require 'yard'
@@ -22,22 +22,24 @@ Gem::Specification.new do |s|
22
22
  s.required_ruby_version = '>= 1.8.7'
23
23
 
24
24
  # Run rspec tests from rake
25
- s.add_development_dependency 'rake'
25
+ s.add_development_dependency 'rake', '~> 10.5.0' if on_less_than_1_9_3? # Pin compatible rake on old rubies, see: https://github.com/travis-ci/travis.rb/issues/380
26
+ s.add_development_dependency 'rake', '< 11.0' unless on_less_than_1_9_3? # See http://stackoverflow.com/questions/35893584/nomethoderror-undefined-method-last-comment-after-upgrading-to-rake-11
26
27
  s.add_development_dependency 'rspec', '~> 3.0.0'
27
28
 
28
- # NOTE: needed for Travis builds on 1.8, but can't yet reproduce failure locally
29
- s.add_development_dependency 'mime-types', '~> 1.25.1' if on_1_8?
29
+ # Pin versions for Travis builds on 1.9
30
+ s.add_development_dependency 'json', '< 2.0' if on_less_than_2_0?
31
+
32
+ # Pin versions for Travis builds on 1.8
33
+ s.add_development_dependency 'mime-types' , '~> 1.25.1' if on_1_8?
34
+ s.add_development_dependency 'rest-client', '~> 1.6.8' if on_1_8?
30
35
 
31
36
  # To limit needed compatibility with versions of dependencies, only configure
32
- # yard doc generation when *not* on Travis, JRuby, or 1.8
33
- if !on_travis? && !on_jruby? && !on_1_8?
37
+ # yard doc generation when *not* on Travis, JRuby, or < 2.0
38
+ if !on_travis? && !on_jruby? && !on_less_than_2_0?
34
39
  # Github flavored markdown in YARD documentation
35
40
  # http://blog.nikosd.com/2011/11/github-flavored-markdown-in-yard.html
36
41
  s.add_development_dependency 'yard'
37
42
  s.add_development_dependency 'redcarpet'
38
43
  s.add_development_dependency 'github-markup'
39
44
  end
40
-
41
- # Coveralls test coverage tool, basically hosted SimpleCov
42
- s.add_development_dependency 'coveralls'
43
45
  end
@@ -45,6 +45,45 @@ module Docile
45
45
  end
46
46
  module_function :dsl_eval
47
47
 
48
+ # Execute a block in the context of an object whose methods represent the
49
+ # commands in a DSL, and return *the block's return value*.
50
+ #
51
+ # @note Use with an *imperative* DSL (commands modify the context object)
52
+ #
53
+ # Use this method to execute an *imperative* DSL, which means that:
54
+ #
55
+ # 1. Each command mutates the state of the DSL context object
56
+ # 2. The return value of each command is ignored
57
+ # 3. The final return value is the original context object
58
+ #
59
+ # @example Use a String as a DSL
60
+ # Docile.dsl_eval_with_block_return("Hello, world!") do
61
+ # reverse!
62
+ # upcase!
63
+ # first
64
+ # end
65
+ # #=> "!"
66
+ #
67
+ # @example Use an Array as a DSL
68
+ # Docile.dsl_eval_with_block_return([]) do
69
+ # push "a"
70
+ # push "b"
71
+ # pop
72
+ # push "c"
73
+ # length
74
+ # end
75
+ # #=> 2
76
+ #
77
+ # @param dsl [Object] context object whose methods make up the DSL
78
+ # @param args [Array] arguments to be passed to the block
79
+ # @param block [Proc] the block of DSL commands to be executed against the
80
+ # `dsl` context object
81
+ # @return [Object] the return value from executing the block
82
+ def dsl_eval_with_block_return(dsl, *args, &block)
83
+ exec_in_proxy_context(dsl, FallbackContextProxy, *args, &block)
84
+ end
85
+ module_function :dsl_eval_with_block_return
86
+
48
87
  # Execute a block in the context of an immutable object whose methods,
49
88
  # and the methods of their return values, represent the commands in a DSL.
50
89
  #
@@ -1,4 +1,4 @@
1
1
  module Docile
2
2
  # The current version of this library
3
- VERSION = '1.1.5'
3
+ VERSION = '1.2.0'
4
4
  end
data/on_what.rb CHANGED
@@ -6,9 +6,17 @@ def on_travis?
6
6
  end
7
7
 
8
8
  def on_jruby?
9
- (defined?(RUBY_ENGINE) && 'jruby' == RUBY_ENGINE)
9
+ defined?(RUBY_ENGINE) && 'jruby' == RUBY_ENGINE
10
10
  end
11
11
 
12
12
  def on_1_8?
13
13
  RUBY_VERSION.start_with? '1.8'
14
- end
14
+ end
15
+
16
+ def on_less_than_1_9_3?
17
+ RUBY_VERSION < '1.9.3'
18
+ end
19
+
20
+ def on_less_than_2_0?
21
+ RUBY_VERSION < '2.0.0'
22
+ end
@@ -263,6 +263,29 @@ describe Docile do
263
263
 
264
264
  end
265
265
 
266
+ describe '.dsl_eval_with_block_return' do
267
+ let(:array) { [] }
268
+ let!(:result) { execute_dsl_against_array }
269
+
270
+ def execute_dsl_against_array
271
+ Docile.dsl_eval_with_block_return(array) do
272
+ push 1
273
+ push 2
274
+ pop
275
+ push 3
276
+ 'Return me!'
277
+ end
278
+ end
279
+
280
+ it 'executes the block against the DSL context object' do
281
+ expect(array).to eq([1, 3])
282
+ end
283
+
284
+ it "returns the block's return value" do
285
+ expect(result).to eq('Return me!')
286
+ end
287
+ end
288
+
266
289
  describe '.dsl_eval_immutable' do
267
290
 
268
291
  context 'when DSL context object is a frozen String' do
@@ -1,26 +1,27 @@
1
1
  require File.expand_path('on_what', File.dirname(File.dirname(__FILE__)))
2
2
 
3
- begin
4
- require 'simplecov'
5
- require 'coveralls'
6
-
7
- # On Ruby 1.9+ use SimpleCov and publish to Coveralls.io
8
- if !on_1_8?
9
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
10
- SimpleCov::Formatter::HTMLFormatter,
11
- Coveralls::SimpleCov::Formatter
12
- ]
3
+ # Code coverage (via SimpleCov) on Ruby 1.9+
4
+ unless on_1_8?
5
+ begin
6
+ require 'simplecov'
13
7
  SimpleCov.start do
14
- add_filter '/spec/' # exclude test code
15
- add_filter '/vendor/' # exclude gems which are vendored on Travis CI
8
+ add_filter '/spec/' # exclude test code
9
+ add_filter '/vendor/' # exclude gems which are vendored on Travis CI
10
+ add_filter '/on_what.rb' # exclude help used only in gemspec
11
+ end
12
+
13
+ # On CI we publish simplecov results to codecov.io
14
+ if on_travis?
15
+ require 'codecov'
16
+ SimpleCov.formatter = SimpleCov::Formatter::Codecov
16
17
  end
17
18
 
18
- # Remove Docile, which was required by SimpleCov, to require again later
19
+ # Due to circular dependency (simplecov depends on docile), remove docile and require again below
19
20
  Object.send(:remove_const, :Docile)
20
21
  $LOADED_FEATURES.reject! { |f| f =~ /\/docile\// }
22
+ rescue LoadError
23
+ warn 'warning: simplecov or codecov gems not found; skipping coverage'
21
24
  end
22
- rescue LoadError
23
- warn 'warning: simplecov/coveralls gems not found; skipping coverage'
24
25
  end
25
26
 
26
27
  lib_dir = File.join(File.dirname(File.dirname(__FILE__)), 'lib')
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: docile
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.5
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marc Siegel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-15 00:00:00.000000000 Z
11
+ date: 2018-01-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "<"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '11.0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "<"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '11.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -80,20 +80,6 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: coveralls
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
83
  description: Docile turns any Ruby object into a DSL. Especially useful with the Builder
98
84
  pattern.
99
85
  email: marc@usainnov.com
@@ -103,8 +89,6 @@ extra_rdoc_files: []
103
89
  files:
104
90
  - ".gitignore"
105
91
  - ".rspec"
106
- - ".ruby-gemset"
107
- - ".ruby-version"
108
92
  - ".travis.yml"
109
93
  - ".yardopts"
110
94
  - Gemfile
@@ -141,11 +125,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
125
  version: '0'
142
126
  requirements: []
143
127
  rubyforge_project:
144
- rubygems_version: 2.2.2
128
+ rubygems_version: 2.6.13
145
129
  signing_key:
146
130
  specification_version: 4
147
131
  summary: Docile keeps your Ruby DSLs tame and well-behaved
148
132
  test_files:
149
133
  - spec/docile_spec.rb
150
134
  - spec/spec_helper.rb
151
- has_rdoc:
@@ -1 +0,0 @@
1
- docile
@@ -1 +0,0 @@
1
- ruby-2.1.0