transproc 0.3.2 → 0.4.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: 0b2b9e293f1bc88414fb4b5f49380dfc59eb72e9
4
- data.tar.gz: 551725a59dac3558f757aa2c3094fa6085999408
3
+ metadata.gz: 01eecdd5844cf6c0c3b491536ceb189ad6790517
4
+ data.tar.gz: c90ca55ae62ce7c30e182827695a299719725205
5
5
  SHA512:
6
- metadata.gz: 3626b0f8b8198a308bfd19595a9246babe7778d94ccfe75c41ce23bfe595f5ebadbd9c0d0d186c81064b5b0e1137b83d60b28765a091ea29c9ecc69fefd10d09
7
- data.tar.gz: 615eb4a86e3216cc450d5270447998fd80764d1668dc69ba70cb0d95ed364d3775b82a5f37701c36de093947fafd7734a91c40633f45c8ebc5e6f066e4245202
6
+ metadata.gz: bc6de084dda67ce23903aa7f9fc55c070508828759f4a55b324089738a51e9919d2e69598664ee637185293ce8254a93b593b38b17550b57fe5644f2e3c625cd
7
+ data.tar.gz: 4acba367f90300be3aee4dedb910db44ac0eed89efa998094e50d4b716f51c584c9e8db8f362670aad752febd70f1d95decefa107fefc2d5c7a9b0b72020d060
@@ -1,3 +1,15 @@
1
+ ## v0.3.3 to-be-released
2
+
3
+ ## Fixed
4
+
5
+ * `rename_keys` no longer creates new keys (robmiller)
6
+
7
+ ## Deleted
8
+
9
+ * `MalformedInputError` exception. Transproc doesn't catch and re-raise exceptions any longer (nepalez)
10
+
11
+ [Compare v0.3.2...HEAD](https://github.com/solnic/transproc/compare/v0.3.2...HEAD)
12
+
1
13
  ## v0.3.2 2015-08-17
2
14
 
3
15
  ## Changed
data/Gemfile CHANGED
@@ -4,12 +4,16 @@ gemspec
4
4
 
5
5
  group :test do
6
6
  gem 'equalizer'
7
- gem 'anima'
8
7
  gem 'codeclimate-test-reporter', require: nil
9
8
 
10
- platform :mri do
11
- gem 'mutant', github: 'mbj/mutant', branch: 'master'
12
- gem 'mutant-rspec'
9
+ if RUBY_VERSION >= '2.1'
10
+ gem 'anima'
11
+ platform :mri do
12
+ gem 'mutant', github: 'mbj/mutant', branch: 'master'
13
+ gem 'mutant-rspec'
14
+ end
15
+ else
16
+ gem 'anima', '~> 0.2.0'
13
17
  end
14
18
  end
15
19
 
data/README.md CHANGED
@@ -39,20 +39,24 @@ Or install it yourself as:
39
39
  ``` ruby
40
40
  require 'json'
41
41
  require 'transproc/all'
42
- require 'inflecto'
43
42
 
44
43
  # create your own local registry for transformation functions
45
44
  module Functions
46
45
  extend Transproc::Registry
47
46
  end
48
47
 
49
- # import necessary functions from external modules
48
+ # import necessary functions from other transprocs...
50
49
  module Functions
51
- # all transformations available in the imported module
50
+ # import all singleton methods from a module/class
52
51
  import Transproc::HashTransformations
53
52
  import Transproc::ArrayTransformations
53
+ end
54
54
 
55
- # only specific transformation (renamed into the desired local name)
55
+ # ...or from any external library
56
+ require 'inflecto'
57
+ module Functions
58
+ # import only necessary singleton methods from a module/class
59
+ # and rename them locally
56
60
  import :camelize, from: Inflecto, as: :camel_case
57
61
  end
58
62
 
@@ -40,7 +40,7 @@ module Transproc
40
40
  #
41
41
  # @api private
42
42
  def self.[](name, *args)
43
- fn = functions.fetch(name) { raise FunctionNotFoundError.new(name) }
43
+ fn = functions.fetch(name) { raise(FunctionNotFoundError, name) }
44
44
 
45
45
  if args.any?
46
46
  fn.with(*args)
@@ -5,4 +5,5 @@ require 'transproc/coercions'
5
5
  require 'transproc/conditional'
6
6
  require 'transproc/array'
7
7
  require 'transproc/hash'
8
+ require 'transproc/proc'
8
9
  require 'transproc/recursion'
@@ -27,7 +27,7 @@ module Transproc
27
27
  #
28
28
  # @api public
29
29
  def call(value)
30
- right.(left.(value))
30
+ right.call(left.call(value))
31
31
  end
32
32
  alias_method :[], :call
33
33
 
@@ -8,16 +8,4 @@ module Transproc
8
8
  super "No globally registered function for #{function}"
9
9
  end
10
10
  end
11
-
12
- class MalformedInputError < Error
13
- attr_reader :function, :value, :original_error
14
-
15
- def initialize(function, value, error)
16
- @function = function
17
- @value = value
18
- @original_error = error
19
- super "Failed to call_function #{function} with #{value.inspect} - #{error}"
20
- set_backtrace(error.backtrace)
21
- end
22
- end
23
11
  end
@@ -44,9 +44,7 @@ module Transproc
44
44
  #
45
45
  # @api public
46
46
  def call(*value)
47
- fn.(*value, *args)
48
- rescue => e
49
- raise MalformedInputError.new(@name, value, e)
47
+ fn.call(*value, *args)
50
48
  end
51
49
  alias_method :[], :call
52
50
 
@@ -171,7 +171,37 @@ module Transproc
171
171
  #
172
172
  # @api public
173
173
  def self.rename_keys!(hash, mapping)
174
- mapping.each { |k, v| hash[v] = hash.delete(k) }
174
+ mapping.each { |k, v| hash[v] = hash.delete(k) if hash.has_key?(k) }
175
+ hash
176
+ end
177
+
178
+ # Copy all keys in a hash using provided mapping hash
179
+ #
180
+ # @example
181
+ # Transproc(:copy_keys, user_name: :name)[user_name: 'Jane']
182
+ # # => {:user_name => "Jane", :name => "Jane"}
183
+ #
184
+ # @param [Hash] hash The input hash
185
+ # @param [Hash] mapping The key-copy mapping
186
+ #
187
+ # @return [Hash]
188
+ #
189
+ # @api public
190
+ def self.copy_keys(hash, mapping)
191
+ copy_keys!(Hash[hash], mapping)
192
+ end
193
+
194
+ # Same as `:copy_keys` but mutates the hash
195
+ #
196
+ # @see HashTransformations.copy_keys
197
+ #
198
+ # @api public
199
+ def self.copy_keys!(hash, mapping)
200
+ mapping.each do |original_key, new_keys|
201
+ [*new_keys].each do |new_key|
202
+ hash[new_key] = hash[original_key]
203
+ end
204
+ end
175
205
  hash
176
206
  end
177
207
 
@@ -446,8 +476,9 @@ module Transproc
446
476
  #
447
477
  # @api public
448
478
  def self.deep_merge(hash, other)
449
- Hash[hash].merge(other) do |key, original_value, new_value|
450
- if original_value.respond_to?(:to_hash) && new_value.respond_to?(:to_hash)
479
+ Hash[hash].merge(other) do |_, original_value, new_value|
480
+ if original_value.respond_to?(:to_hash) &&
481
+ new_value.respond_to?(:to_hash)
451
482
  deep_merge(Hash[original_value], Hash[new_value])
452
483
  else
453
484
  new_value
@@ -0,0 +1,46 @@
1
+ module Transproc
2
+ # Transformation functions for Procs
3
+ #
4
+ # @example
5
+ # require 'ostruct'
6
+ # require 'transproc/proc'
7
+ #
8
+ # include Transproc::Helper
9
+ #
10
+ # fn = t(
11
+ # :map_value,
12
+ # 'foo_bar',
13
+ # t(:bind, OpenStruct.new(prefix: 'foo'), -> s { [prefix, s].join('_') })
14
+ # )
15
+ #
16
+ # fn["foo_bar" => "bar"]
17
+ # # => {"foo_bar" => "foo_bar"}
18
+ #
19
+ # @api public
20
+ module ProcTransformations
21
+ extend Registry
22
+
23
+ # Change the binding for the given function
24
+ #
25
+ # @example
26
+ # Transproc(
27
+ # :bind,
28
+ # OpenStruct.new(prefix: 'foo'),
29
+ # -> s { [prefix, s].join('_') }
30
+ # )['bar']
31
+ # # => "foo_bar"
32
+ #
33
+ # @param [Proc]
34
+ #
35
+ # @return [Proc]
36
+ #
37
+ # @api public
38
+ def self.bind(value, binding, fn)
39
+ binding.instance_exec(value, &fn)
40
+ end
41
+
42
+ # @deprecated Register methods globally
43
+ (methods - Registry.instance_methods - Registry.methods)
44
+ .each { |name| Transproc.register name, t(name) }
45
+ end
46
+ end
@@ -10,8 +10,8 @@ module Transproc
10
10
  #
11
11
  # fn = t(:hash_recursion, t(:symbolize_keys))
12
12
  #
13
- # fn["name" => "Jane", "address" => { "street" => "Street 1", "zipcode" => "123" }]
14
- # # => {:name=>"Jane", :address=>{:street=>"Street 1", :zipcode=>"123"}}
13
+ # fn["name" => "Jane", "address" => { "street" => "Street 1" }]
14
+ # # => {:name=>"Jane", :address=>{:street=>"Street 1"}}
15
15
  #
16
16
  # @api public
17
17
  module Recursion
@@ -36,7 +36,14 @@ module Transproc
36
36
  # ]
37
37
  # }
38
38
  # ]
39
- # => {:id=>1, :name=>"Jane", :tasks=>[{:id=>1, :description=>"Write some code"}, {:id=>2, :description=>"Write some more code"}]}
39
+ # => {
40
+ # :id=>1,
41
+ # :name=>"Jane",
42
+ # :tasks=>[
43
+ # {:id=>1, :description=>"Write some code"},
44
+ # {:id=>2, :description=>"Write some more code"}
45
+ # ]
46
+ # }
40
47
  #
41
48
  # @param [Enumerable]
42
49
  #
@@ -5,8 +5,15 @@
5
5
  # ==============================================================================
6
6
 
7
7
  shared_context :call_transproc do
8
- let!(:__initial__) { input.dup rescue input }
9
- let!(:__fn__) { described_class[*arguments] }
8
+ let!(:__fn__) { described_class[*arguments] }
9
+ let!(:__initial__) do
10
+ begin
11
+ input.dup
12
+ rescue
13
+ input
14
+ end
15
+ end
16
+
10
17
  subject { __fn__[input] }
11
18
  end
12
19
 
@@ -14,7 +21,7 @@ shared_examples :transforming_data do
14
21
  include_context :call_transproc
15
22
 
16
23
  it '[returns the expected output]' do
17
- expect(subject).to eql(output), <<-REPORT.gsub(/.+\|/, "")
24
+ expect(subject).to eql(output), <<-REPORT.gsub(%r{.+\|}, '')
18
25
  |
19
26
  |fn = #{described_class}#{Array[*arguments]}
20
27
  |
@@ -33,7 +40,7 @@ shared_examples :transforming_immutable_data do
33
40
 
34
41
  it '[keeps input unchanged]' do
35
42
  expect { subject }
36
- .not_to change { input }, <<-REPORT.gsub(/.+\|/, "")
43
+ .not_to change { input }, <<-REPORT.gsub(%r{.+\|}, '')
37
44
  |
38
45
  |fn = #{described_class}#{Array[*arguments]}
39
46
  |
@@ -51,7 +58,7 @@ shared_examples :mutating_input_data do
51
58
  it '[changes input]' do
52
59
  expect { subject }
53
60
  .to change { input }
54
- .to(output), <<-REPORT.gsub(/.+\|/, "")
61
+ .to(output), <<-REPORT.gsub(%r{.+\|}, '')
55
62
  |
56
63
  |fn = #{described_class}#{Array[*arguments]}
57
64
  |
@@ -1,10 +1,10 @@
1
1
  module Transproc
2
2
  module Deprecations
3
3
  def self.announce(name, msg)
4
- warn <<-MSG.gsub(/^\s+/, '')
4
+ warn <<-MSG.gsub(%r{^\s+}, '')
5
5
  #{name} is deprecated and will be removed in 1.0.0.
6
6
  #{msg}
7
- #{caller.detect { |l| !l.include?('lib/transproc')}}
7
+ #{caller.detect { |l| !l.include?('lib/transproc') } }
8
8
  MSG
9
9
  end
10
10
  end
@@ -1,3 +1,3 @@
1
1
  module Transproc
2
- VERSION = '0.3.2'.freeze
2
+ VERSION = '0.4.0'.freeze
3
3
  end
@@ -5,6 +5,7 @@ end
5
5
 
6
6
  require 'equalizer'
7
7
  require 'anima'
8
+ require 'ostruct'
8
9
  require 'transproc/all'
9
10
 
10
11
  begin
@@ -4,8 +4,8 @@ describe Transproc::FunctionNotFoundError do
4
4
  it 'complains that the function not registered globally' do
5
5
  expect { Transproc(:foo) }.to raise_error do |error|
6
6
  expect(error).to be_kind_of described_class
7
- expect(error.message["foo"]).not_to be_nil
8
- expect(error.message["global"]).not_to be_nil
7
+ expect(error.message['foo']).not_to be_nil
8
+ expect(error.message['global']).not_to be_nil
9
9
  end
10
10
  end
11
11
 
@@ -14,7 +14,7 @@ describe Transproc::FunctionNotFoundError do
14
14
 
15
15
  expect { Foo[:foo] }.to raise_error do |error|
16
16
  expect(error).to be_kind_of described_class
17
- expect(error.message["function Foo[:foo]"]).not_to be_nil
17
+ expect(error.message['function Foo[:foo]']).not_to be_nil
18
18
  end
19
19
  end
20
20
  end
@@ -31,7 +31,7 @@ describe Transproc::HashTransformations do
31
31
  symbolize_keys = described_class.t(:symbolize_keys)
32
32
 
33
33
  input = { 1 => 'bar' }
34
- output = { :'1' => 'bar' }
34
+ output = { '1'.to_sym => 'bar' }
35
35
 
36
36
  expect(symbolize_keys[input]).to eql(output)
37
37
  expect { symbolize_keys[input] }.not_to change { input }
@@ -46,7 +46,7 @@ describe Transproc::HashTransformations do
46
46
  output = { foo: 'bar', baz: [{ one: 1 }, 'two'] }
47
47
 
48
48
  expect(symbolize_keys[input]).to eql(output)
49
- expect(input).to eql({ 'foo' => 'bar', 'baz' => [{ 'one' => 1 }, 'two'] })
49
+ expect(input).to eql('foo' => 'bar', 'baz' => [{ 'one' => 1 }, 'two'])
50
50
  end
51
51
  end
52
52
 
@@ -121,6 +121,16 @@ describe Transproc::HashTransformations do
121
121
  expect(map[input]).to eql(output)
122
122
  expect(input).to eql('foo' => 'bar', :bar => 'baz')
123
123
  end
124
+
125
+ it "only renames keys and never creates new ones" do
126
+ map = described_class.t(:rename_keys, 'foo' => :foo, 'bar' => :bar)
127
+
128
+ input = { 'bar' => 'baz' }
129
+ output = { bar: 'baz' }
130
+
131
+ expect(map[input]).to eql(output)
132
+ expect(input).to eql('bar' => 'baz')
133
+ end
124
134
  end
125
135
 
126
136
  describe '.rename_keys!' do
@@ -135,6 +145,59 @@ describe Transproc::HashTransformations do
135
145
  expect(input).to eql(output)
136
146
  end
137
147
  end
148
+ describe '.copy_keys' do
149
+ context 'with single destination key' do
150
+ it 'returns a new hash with applied functions' do
151
+ map = described_class.t(:copy_keys, 'foo' => :foo)
152
+
153
+ input = { 'foo' => 'bar', :bar => 'baz' }
154
+ output = { 'foo' => 'bar', foo: 'bar', bar: 'baz' }
155
+
156
+ expect(map[input]).to eql(output)
157
+ expect(input).to eql('foo' => 'bar', :bar => 'baz')
158
+ end
159
+ end
160
+
161
+ context 'with multiple destination keys' do
162
+ it 'returns a new hash with applied functions' do
163
+ map = described_class.t(:copy_keys, 'foo' => [:foo, :baz])
164
+
165
+ input = { 'foo' => 'bar', :bar => 'baz' }
166
+ output = { 'foo' => 'bar', foo: 'bar', baz: 'bar', bar: 'baz' }
167
+
168
+ expect(map[input]).to eql(output)
169
+ expect(input).to eql('foo' => 'bar', :bar => 'baz')
170
+ end
171
+ end
172
+ end
173
+
174
+ describe '.copy_keys!' do
175
+ context 'with single destination key' do
176
+ it 'returns updated hash with applied functions' do
177
+ map = described_class.t(:copy_keys!, 'foo' => :foo)
178
+
179
+ input = { 'foo' => 'bar', :bar => 'baz' }
180
+ output = { 'foo' => 'bar', foo: 'bar', bar: 'baz' }
181
+
182
+ map[input]
183
+
184
+ expect(input).to eql(output)
185
+ end
186
+ end
187
+
188
+ context 'with multiple destination keys' do
189
+ it 'returns updated hash with applied functions' do
190
+ map = described_class.t(:copy_keys!, 'foo' => [:foo, :baz])
191
+
192
+ input = { 'foo' => 'bar', :bar => 'baz' }
193
+ output = { 'foo' => 'bar', foo: 'bar', baz: 'bar', bar: 'baz' }
194
+
195
+ map[input]
196
+
197
+ expect(input).to eql(output)
198
+ end
199
+ end
200
+ end
138
201
 
139
202
  describe '.map_value' do
140
203
  it 'applies function to value under specified key' do
@@ -178,7 +241,7 @@ describe Transproc::HashTransformations do
178
241
 
179
242
  describe '.nest!' do
180
243
  it 'returns new hash with keys nested under a new key' do
181
- nest = described_class.t(:nest!, :baz, ['one', 'two', 'not-here'])
244
+ nest = described_class.t(:nest!, :baz, %w(one two not-here))
182
245
 
183
246
  input = { 'foo' => 'bar', 'one' => nil, 'two' => false }
184
247
  output = { 'foo' => 'bar', baz: { 'one' => nil, 'two' => false } }
@@ -291,7 +354,7 @@ describe Transproc::HashTransformations do
291
354
  describe 'combining transformations' do
292
355
  it 'applies functions to the hash' do
293
356
  symbolize_keys = described_class.t(:symbolize_keys)
294
- map = described_class.t(:rename_keys, user_name: :name, user_email: :email)
357
+ map = described_class.t :rename_keys, user_name: :name, user_email: :email
295
358
 
296
359
  transformation = symbolize_keys >> map
297
360
 
@@ -477,8 +540,8 @@ describe Transproc::HashTransformations do
477
540
  evaluate = described_class.t(:eval_values, 1)
478
541
 
479
542
  input = {
480
- one: 1, two: -> i { i+1 },
481
- three: -> i { i+2 }, four: 4,
543
+ one: 1, two: -> i { i + 1 },
544
+ three: -> i { i + 2 }, four: 4,
482
545
  more: [{ one: -> i { i }, two: 2 }]
483
546
  }
484
547
 
@@ -495,8 +558,8 @@ describe Transproc::HashTransformations do
495
558
  evaluate = described_class.t(:eval_values, 1, [:one, :two])
496
559
 
497
560
  input = {
498
- one: 1, two: -> i { i+1 },
499
- three: -> i { i+2 }, four: 4,
561
+ one: 1, two: -> i { i + 1 },
562
+ three: -> i { i + 2 }, four: 4,
500
563
  array: [{ one: -> i { i }, two: 2 }],
501
564
  hash: { one: -> i { i } }
502
565
  }
@@ -511,7 +574,7 @@ describe Transproc::HashTransformations do
511
574
  end
512
575
 
513
576
  describe '.deep_merge' do
514
- let(:hash){
577
+ let(:hash) {
515
578
  {
516
579
  name: 'Jane',
517
580
  email: 'jane@doe.org',
@@ -522,7 +585,7 @@ describe Transproc::HashTransformations do
522
585
  }
523
586
  }
524
587
 
525
- let(:update){
588
+ let(:update) {
526
589
  {
527
590
  email: 'jane@example.org',
528
591
  favorites:
@@ -534,7 +597,11 @@ describe Transproc::HashTransformations do
534
597
 
535
598
  it 'recursively merges hash values' do
536
599
  deep_merge = described_class.t(:deep_merge)
537
- output = { name: 'Jane', email: 'jane@example.org', favorites: { food: 'stroopwafel', color: 'orange' } }
600
+ output = {
601
+ name: 'Jane',
602
+ email: 'jane@example.org',
603
+ favorites: { food: 'stroopwafel', color: 'orange' }
604
+ }
538
605
 
539
606
  expect(deep_merge[hash, update]).to eql(output)
540
607
  end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Transproc::ProcTransformations do
4
+ describe '.bind' do
5
+ let(:fn) { described_class.t(:bind, binding, proc) }
6
+ let(:binding) { OpenStruct.new(prefix: prefix) }
7
+ let(:proc) { -> v { [prefix, v].join('_') } }
8
+ let(:prefix) { 'foo' }
9
+ let(:input) { 'bar' }
10
+ let(:output) { 'foo_bar' }
11
+
12
+ subject { fn[input] }
13
+
14
+ it 'binds the given proc to the specified binding' do
15
+ is_expected.to eq(output)
16
+ end
17
+ end
18
+ end
@@ -9,7 +9,7 @@ describe Transproc::Recursion do
9
9
  'foo' => 'bar',
10
10
  'bar' => {
11
11
  'foo' => 'bar',
12
- 'bar' => ['foo', 'bar', 'baz'],
12
+ 'bar' => %w(foo bar baz),
13
13
  'baz' => 'foo'
14
14
  },
15
15
  'baz' => 'bar'
@@ -23,7 +23,7 @@ describe Transproc::Recursion do
23
23
  'foo' => 'bar',
24
24
  'bar' => {
25
25
  'foo' => 'bar',
26
- 'bar' => ['foo', 'bar'],
26
+ 'bar' => %w(foo bar)
27
27
  }
28
28
  }
29
29
  end
@@ -57,20 +57,4 @@ describe Transproc do
57
57
  expect(fn.args).to include(Transproc(:to_string))
58
58
  end
59
59
  end
60
-
61
- describe 'handling malformed input' do
62
- it 'raises a Transproc::MalformedInputError' do
63
- expect {
64
- Transproc(:to_integer)[{}]
65
- }.to raise_error(Transproc::MalformedInputError)
66
-
67
- begin
68
- Transproc(:to_integer)[{}]
69
- rescue Transproc::MalformedInputError => e
70
- expect(e.message).to include('to_integer')
71
- expect(e.message).to include("undefined method `to_i'")
72
- expect(e.backtrace).to eql(e.original_error.backtrace)
73
- end
74
- end
75
- end
76
60
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: transproc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-17 00:00:00.000000000 Z
11
+ date: 2015-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -82,6 +82,7 @@ files:
82
82
  - lib/transproc/function.rb
83
83
  - lib/transproc/functions.rb
84
84
  - lib/transproc/hash.rb
85
+ - lib/transproc/proc.rb
85
86
  - lib/transproc/recursion.rb
86
87
  - lib/transproc/registry.rb
87
88
  - lib/transproc/rspec.rb
@@ -100,6 +101,7 @@ files:
100
101
  - spec/unit/function_not_found_error_spec.rb
101
102
  - spec/unit/function_spec.rb
102
103
  - spec/unit/hash_transformations_spec.rb
104
+ - spec/unit/proc_transformations_spec.rb
103
105
  - spec/unit/recursion_spec.rb
104
106
  - spec/unit/registry_spec.rb
105
107
  - spec/unit/store_spec.rb
@@ -140,7 +142,9 @@ test_files:
140
142
  - spec/unit/function_not_found_error_spec.rb
141
143
  - spec/unit/function_spec.rb
142
144
  - spec/unit/hash_transformations_spec.rb
145
+ - spec/unit/proc_transformations_spec.rb
143
146
  - spec/unit/recursion_spec.rb
144
147
  - spec/unit/registry_spec.rb
145
148
  - spec/unit/store_spec.rb
146
149
  - spec/unit/transproc_spec.rb
150
+ has_rdoc: