ducktrap 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (165) hide show
  1. checksums.yaml +7 -0
  2. data/.circle.yml +6 -0
  3. data/.gitignore +5 -0
  4. data/.rspec +1 -0
  5. data/.travis.yml +16 -0
  6. data/Gemfile +6 -0
  7. data/Gemfile.devtools +59 -0
  8. data/Guardfile +18 -0
  9. data/LICENSE +20 -0
  10. data/README.md +47 -0
  11. data/Rakefile +2 -0
  12. data/TODO +4 -0
  13. data/config/devtools.yml +2 -0
  14. data/config/flay.yml +3 -0
  15. data/config/flog.yml +2 -0
  16. data/config/heckle.yml +3 -0
  17. data/config/mutant.yml +2 -0
  18. data/config/reek.yml +98 -0
  19. data/config/yardstick.yml +2 -0
  20. data/ducktrap.gemspec +23 -0
  21. data/lib/ducktrap.rb +73 -0
  22. data/lib/ducktrap/builder.rb +36 -0
  23. data/lib/ducktrap/error.rb +48 -0
  24. data/lib/ducktrap/evaluator.rb +127 -0
  25. data/lib/ducktrap/evaluator/invalid.rb +30 -0
  26. data/lib/ducktrap/evaluator/static.rb +25 -0
  27. data/lib/ducktrap/formatter.rb +138 -0
  28. data/lib/ducktrap/mapper.rb +59 -0
  29. data/lib/ducktrap/nary.rb +148 -0
  30. data/lib/ducktrap/node.rb +94 -0
  31. data/lib/ducktrap/node/anima.rb +40 -0
  32. data/lib/ducktrap/node/anima/dump.rb +39 -0
  33. data/lib/ducktrap/node/anima/load.rb +39 -0
  34. data/lib/ducktrap/node/block.rb +44 -0
  35. data/lib/ducktrap/node/coercion.rb +7 -0
  36. data/lib/ducktrap/node/custom.rb +121 -0
  37. data/lib/ducktrap/node/disjunction.rb +8 -0
  38. data/lib/ducktrap/node/forward.rb +55 -0
  39. data/lib/ducktrap/node/guard_nil.rb +42 -0
  40. data/lib/ducktrap/node/hash.rb +7 -0
  41. data/lib/ducktrap/node/hash/transform.rb +53 -0
  42. data/lib/ducktrap/node/invalid.rb +29 -0
  43. data/lib/ducktrap/node/inverse.rb +46 -0
  44. data/lib/ducktrap/node/key.rb +61 -0
  45. data/lib/ducktrap/node/key/add.rb +42 -0
  46. data/lib/ducktrap/node/key/delete.rb +44 -0
  47. data/lib/ducktrap/node/key/dump.rb +38 -0
  48. data/lib/ducktrap/node/key/fetch.rb +49 -0
  49. data/lib/ducktrap/node/map.rb +42 -0
  50. data/lib/ducktrap/node/noop.rb +30 -0
  51. data/lib/ducktrap/node/primitive.rb +61 -0
  52. data/lib/ducktrap/node/static.rb +33 -0
  53. data/lib/ducktrap/nullary.rb +41 -0
  54. data/lib/ducktrap/pretty_dump.rb +31 -0
  55. data/lib/ducktrap/registry.rb +60 -0
  56. data/lib/ducktrap/singleton.rb +55 -0
  57. data/lib/ducktrap/unary.rb +153 -0
  58. data/spec/rcov.opts +7 -0
  59. data/spec/shared/inverse_behavior.rb +7 -0
  60. data/spec/spec_helper.rb +20 -0
  61. data/spec/support/ice_nine_config.rb +8 -0
  62. data/spec/support/let_mock_helper.rb +13 -0
  63. data/spec/unit/ducktrap/builder/class_methods/new_spec.rb +41 -0
  64. data/spec/unit/ducktrap/builder/new_spec.rb +41 -0
  65. data/spec/unit/ducktrap/class_methods/build_spec.rb +11 -0
  66. data/spec/unit/ducktrap/error/exception/pretty_inspect_spec.rb +22 -0
  67. data/spec/unit/ducktrap/error/pretty_inspect_spec.rb +19 -0
  68. data/spec/unit/ducktrap/evaluator/assert_successful_spec.rb +38 -0
  69. data/spec/unit/ducktrap/evaluator/invalid/output_spec.rb +14 -0
  70. data/spec/unit/ducktrap/evaluator/noop/output_spec.rb +14 -0
  71. data/spec/unit/ducktrap/evaluator/output_spec.rb +52 -0
  72. data/spec/unit/ducktrap/evaluator/pretty_inspect_spec.rb +63 -0
  73. data/spec/unit/ducktrap/evaluator/successful_predicate_spec.rb +36 -0
  74. data/spec/unit/ducktrap/failed_transformation_error/message_spec.rb +10 -0
  75. data/spec/unit/ducktrap/formatter/attribute_spec.rb +24 -0
  76. data/spec/unit/ducktrap/formatter/body_spec.rb +19 -0
  77. data/spec/unit/ducktrap/formatter/class_methods/new_spec.rb +14 -0
  78. data/spec/unit/ducktrap/formatter/initialize_spec.rb +14 -0
  79. data/spec/unit/ducktrap/formatter/name_spec.rb +25 -0
  80. data/spec/unit/ducktrap/formatter/nest_spec.rb +48 -0
  81. data/spec/unit/ducktrap/formatter/puts_spec.rb +36 -0
  82. data/spec/unit/ducktrap/mapper/builder/dumper_spec.rb +20 -0
  83. data/spec/unit/ducktrap/mapper/builder/loader_spec.rb +20 -0
  84. data/spec/unit/ducktrap/mapper/builder/object_spec.rb +90 -0
  85. data/spec/unit/ducktrap/mapper/class_methods/build_spec.rb +20 -0
  86. data/spec/unit/ducktrap/nary/builder/add_spec.rb +16 -0
  87. data/spec/unit/ducktrap/nary/builder/method_missing_spec.rb +44 -0
  88. data/spec/unit/ducktrap/nary/builder/output_spec.rb +16 -0
  89. data/spec/unit/ducktrap/nary/class_methods/build_spec.rb +22 -0
  90. data/spec/unit/ducktrap/nary/class_methods/included_spec.rb +13 -0
  91. data/spec/unit/ducktrap/nary/evaluator/output_spec.rb +79 -0
  92. data/spec/unit/ducktrap/nary/instance_methods/inverse_spec.rb +24 -0
  93. data/spec/unit/ducktrap/nary/instance_methods/pretty_inspect_spec.rb +31 -0
  94. data/spec/unit/ducktrap/node/anima/dump/evaluator/output_spec.rb +18 -0
  95. data/spec/unit/ducktrap/node/anima/dump/inverse_spec.rb +10 -0
  96. data/spec/unit/ducktrap/node/anima/dump/pretty_inspect_spec.rb +15 -0
  97. data/spec/unit/ducktrap/node/anima/evaluator/output_spec.rb +18 -0
  98. data/spec/unit/ducktrap/node/anima/load/evaluator/output_spec.rb +35 -0
  99. data/spec/unit/ducktrap/node/anima/load/inverse_spec.rb +10 -0
  100. data/spec/unit/ducktrap/node/anima/load/pretty_inspect_spec.rb +15 -0
  101. data/spec/unit/ducktrap/node/anima/pretty_inspect_spec.rb +15 -0
  102. data/spec/unit/ducktrap/node/block/evaluator/output_spec.rb +79 -0
  103. data/spec/unit/ducktrap/node/block/inverse_spec.rb +24 -0
  104. data/spec/unit/ducktrap/node/call_spec.rb +21 -0
  105. data/spec/unit/ducktrap/node/class_methods/build_spec.rb +11 -0
  106. data/spec/unit/ducktrap/node/class_methods/register_spec.rb +16 -0
  107. data/spec/unit/ducktrap/node/custom/builder/forward_spec.rb +54 -0
  108. data/spec/unit/ducktrap/node/custom/builder/inverse_spec.rb +54 -0
  109. data/spec/unit/ducktrap/node/custom/builder/object_spec.rb +54 -0
  110. data/spec/unit/ducktrap/node/custom/call_spec.rb +21 -0
  111. data/spec/unit/ducktrap/node/custom/class_methods/build_spec.rb +20 -0
  112. data/spec/unit/ducktrap/node/custom/inverse_spec.rb +12 -0
  113. data/spec/unit/ducktrap/node/custom/pretty_inspect_spec.rb +15 -0
  114. data/spec/unit/ducktrap/node/forward/evaluator/output_spec.rb +13 -0
  115. data/spec/unit/ducktrap/node/forward/inverse_spec.rb +14 -0
  116. data/spec/unit/ducktrap/node/forward/pretty_inspect_spec.rb +19 -0
  117. data/spec/unit/ducktrap/node/guard_nil/call_spec.rb +21 -0
  118. data/spec/unit/ducktrap/node/guard_nil/evaluator/output_spec.rb +27 -0
  119. data/spec/unit/ducktrap/node/guard_nil/inverse_spec.rb +12 -0
  120. data/spec/unit/ducktrap/node/hash/transform/evaluator/output_spec.rb +51 -0
  121. data/spec/unit/ducktrap/node/hash/transform/inverse_spec.rb +27 -0
  122. data/spec/unit/ducktrap/node/invalid/call_spec.rb +13 -0
  123. data/spec/unit/ducktrap/node/invalid/inverse_spec.rb +11 -0
  124. data/spec/unit/ducktrap/node/inverse/call_spec.rb +11 -0
  125. data/spec/unit/ducktrap/node/inverse/inverse_spec.rb +14 -0
  126. data/spec/unit/ducktrap/node/inverse/pretty_inspect_spec.rb +19 -0
  127. data/spec/unit/ducktrap/node/key/add/call_spec.rb +15 -0
  128. data/spec/unit/ducktrap/node/key/add/evaluator/call_spec.rb +15 -0
  129. data/spec/unit/ducktrap/node/key/add/inverse_spec.rb +14 -0
  130. data/spec/unit/ducktrap/node/key/delete/call_spec.rb +13 -0
  131. data/spec/unit/ducktrap/node/key/delete/evaluator/call_spec.rb +13 -0
  132. data/spec/unit/ducktrap/node/key/delete/inverse_spec.rb +13 -0
  133. data/spec/unit/ducktrap/node/key/dump/evaluator/output_spec.rb +37 -0
  134. data/spec/unit/ducktrap/node/key/dump/inverse_spec.rb +14 -0
  135. data/spec/unit/ducktrap/node/key/evaluator/key_spec.rb +26 -0
  136. data/spec/unit/ducktrap/node/key/fetch/evaluator/output_spec.rb +48 -0
  137. data/spec/unit/ducktrap/node/key/fetch/inverse_spec.rb +14 -0
  138. data/spec/unit/ducktrap/node/key/pretty_inspect_spec.rb +20 -0
  139. data/spec/unit/ducktrap/node/map/evaluator/output_spec.rb +22 -0
  140. data/spec/unit/ducktrap/node/map/inverse_spec.rb +15 -0
  141. data/spec/unit/ducktrap/node/noop/call_spec.rb +11 -0
  142. data/spec/unit/ducktrap/node/noop/inverse_spec.rb +9 -0
  143. data/spec/unit/ducktrap/node/pretty_inspect_spec.rb +17 -0
  144. data/spec/unit/ducktrap/node/primitive/call_spec.rb +19 -0
  145. data/spec/unit/ducktrap/node/primitive/inverse_spec.rb +13 -0
  146. data/spec/unit/ducktrap/node/primitive/pretty_inspect_spec.rb +15 -0
  147. data/spec/unit/ducktrap/node/run_spec.rb +46 -0
  148. data/spec/unit/ducktrap/node/static/call_spec.rb +13 -0
  149. data/spec/unit/ducktrap/node/static/inverse_spec.rb +14 -0
  150. data/spec/unit/ducktrap/nullary/class_methods/build_spec.rb +37 -0
  151. data/spec/unit/ducktrap/nullary/class_methods/included_spec.rb +7 -0
  152. data/spec/unit/ducktrap/pretty_dump/pretty_dump_spec.rb +47 -0
  153. data/spec/unit/ducktrap/pretty_dump/pretty_inspect_spec.rb +22 -0
  154. data/spec/unit/ducktrap/registry/lookup_spec.rb +27 -0
  155. data/spec/unit/ducktrap/registry/register_spec.rb +21 -0
  156. data/spec/unit/ducktrap/singleton/class_methods/included_spec.rb +13 -0
  157. data/spec/unit/ducktrap/singleton/class_methods/instance_spec.rb +19 -0
  158. data/spec/unit/ducktrap/singleton/instance_methods/inspect_spec.rb +19 -0
  159. data/spec/unit/ducktrap/singleton/instance_methods/pretty_inspect_spec.rb +17 -0
  160. data/spec/unit/ducktrap/unary/class_methods/build_spec.rb +18 -0
  161. data/spec/unit/ducktrap/unary/class_methods/included_spec.rb +14 -0
  162. data/spec/unit/ducktrap/unary/evaluator/output2_spec.rb +48 -0
  163. data/spec/unit/ducktrap/unary/evaluator/output_spec.rb +37 -0
  164. data/spec/unit/ducktrap/unary/instance_methods/pretty_inspect_spec.rb +15 -0
  165. metadata +399 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ce1ef7dfbebc6e9566fe5e796951010cfd5df998
4
+ data.tar.gz: 8336cedd94c054c8d3df0605eed5977139a162b6
5
+ SHA512:
6
+ metadata.gz: c3717df9b47329ec0f7fcb8ef2ef6e95d24152410fc66c9b11b17c9f5aeab04a116c79fb472cb12dc390075ea08ddcd5996220a1b4cd861e1dfac7436106b6de
7
+ data.tar.gz: 6838b3609b8f4f3054c8a7dc3b3bf4558fb068b69e5556ec3f113a28d3669280be6ba93579cd84da708012b493cf5d911dedb0c67fd298580933cd6fc7196cfa
@@ -0,0 +1,6 @@
1
+ ---
2
+ ruby:
3
+ version: 1.9.3-p429
4
+ test:
5
+ override:
6
+ - bundle exec rake ci
@@ -0,0 +1,5 @@
1
+ /.rbx
2
+ /Gemfile.lock
3
+ /tmp
4
+ /.bundle
5
+ /vendor
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,16 @@
1
+ language: ruby
2
+ script: 'bundle exec rake ci'
3
+ rvm:
4
+ - 1.9.2
5
+ - 1.9.3
6
+ - 2.0.0
7
+ - ruby-head
8
+ - jruby-19mode
9
+ - jruby-head
10
+ - rbx-19mode
11
+ notifications:
12
+ irc:
13
+ channels:
14
+ - irc.freenode.org#rom-rb
15
+ on_success: never
16
+ on_failure: change
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'devtools', :git => 'https://github.com/rom-rb/devtools.git'
6
+ eval File.read('Gemfile.devtools')
@@ -0,0 +1,59 @@
1
+ # encoding: utf-8
2
+
3
+ group :development do
4
+ gem 'rake', '~> 10.1.0'
5
+ gem 'rspec', '~> 2.13.0'
6
+ gem 'yard', '~> 0.8.6.2'
7
+ end
8
+
9
+ group :yard do
10
+ gem 'kramdown', '~> 1.1.0'
11
+ end
12
+
13
+ group :guard do
14
+ gem 'guard', '~> 1.8.1'
15
+ gem 'guard-bundler', '~> 1.0.0'
16
+ gem 'guard-rspec', '~> 3.0.2'
17
+
18
+ # file system change event handling
19
+ gem 'listen', '~> 1.2.2'
20
+ gem 'rb-fchange', '~> 0.0.6', :require => false
21
+ gem 'rb-fsevent', '~> 0.9.3', :require => false
22
+ gem 'rb-inotify', '~> 0.9.0', :require => false
23
+
24
+ # notification handling
25
+ gem 'libnotify', '~> 0.8.0', :require => false
26
+ gem 'rb-notifu', '~> 0.0.4', :require => false
27
+ gem 'terminal-notifier-guard', '~> 1.5.3', :require => false
28
+ end
29
+
30
+ group :metrics do
31
+ gem 'coveralls', '~> 0.6.7'
32
+ gem 'flay', '~> 2.3.0'
33
+ gem 'flog', '~> 4.1.0'
34
+ gem 'reek', '~> 1.3.1', :git => 'https://github.com/troessner/reek.git'
35
+ gem 'simplecov', '~> 0.7.1'
36
+ gem 'yardstick', '~> 0.9.6'
37
+
38
+ platforms :ruby_19 do
39
+ gem 'yard-spellcheck', '~> 0.1.5'
40
+ end
41
+
42
+ platforms :ruby_19, :ruby_20 do
43
+ gem 'mutant', '~> 0.3.0.beta8'
44
+ end
45
+
46
+ platforms :rbx do
47
+ gem 'pelusa', '~> 0.2.2'
48
+ end
49
+ end
50
+
51
+ group :benchmarks do
52
+ gem 'rbench', '~> 0.2.3'
53
+ end
54
+
55
+ platform :jruby do
56
+ group :jruby do
57
+ gem 'jruby-openssl', '~> 0.8.5'
58
+ end
59
+ end
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ guard :bundler do
4
+ watch('Gemfile')
5
+ end
6
+
7
+ guard :rspec, :all_after_pass => false, :all_on_start => false do
8
+ # run all specs if the spec_helper or supporting files files are modified
9
+ watch('spec/spec_helper.rb') { 'spec' }
10
+ watch(%r{\Aspec/(?:lib|support|shared)/.+\.rb\z}) { 'spec' }
11
+
12
+ # run unit specs if associated lib code is modified
13
+ watch(%r{\Alib/(.+)\.rb\z}) { |m| Dir["spec/unit/#{m[1]}"] }
14
+ watch("lib/#{File.basename(File.expand_path('../', __FILE__))}.rb") { 'spec' }
15
+
16
+ # run a spec if it is modified
17
+ watch(%r{\Aspec/(?:unit|integration)/.+_spec\.rb\z})
18
+ end
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 Markus Schirp
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.
@@ -0,0 +1,47 @@
1
+ ducktrap
2
+ ========
3
+
4
+ [![Build Status](https://secure.travis-ci.org/mbj/ducktrap.png?branch=master)](http://travis-ci.org/mbj/ducktrap)
5
+ [![Dependency Status](https://gemnasium.com/mbj/ducktrap.png)](https://gemnasium.com/mbj/ducktrap)
6
+ [![Code Climate](https://codeclimate.com/github/mbj/ducktrap.png)](https://codeclimate.com/github/mbj/ducktrap)
7
+
8
+ Ducktrap is a spike for a data transformation algebra. The main idea is to define the transformations with
9
+ composable blocks that allow to generate an inverse transformation.
10
+
11
+ It can be used at various places:
12
+
13
+ * Domain to JSON and vice versa, for building rest style APIS
14
+ * Domain to document db and vice versa, for buidling mappers
15
+ * Form processing
16
+ * ...
17
+
18
+ Installation
19
+ ------------
20
+
21
+ There is no gem release.
22
+
23
+ Examples
24
+ --------
25
+
26
+ Sorry, API is stupid, so no examples for now. See specs.
27
+
28
+ Credits
29
+ -------
30
+
31
+ * [mbj](https://github.com/mbj)
32
+
33
+ Contributing
34
+ ------------
35
+
36
+ * Fork the project.
37
+ * Make your feature addition or bug fix.
38
+ * Add tests for it. This is important so I don't break it in a
39
+ future version unintentionally.
40
+ * Commit, do not mess with Rakefile or version
41
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
42
+ * Send me a pull request. Bonus points for topic branches.
43
+
44
+ License
45
+ -------
46
+
47
+ See LICENSE file.
@@ -0,0 +1,2 @@
1
+ require 'devtools'
2
+ Devtools.init_rake_tasks
data/TODO ADDED
@@ -0,0 +1,4 @@
1
+ * Remove input attr in Ducktrap::Error?
2
+ * Remove Node.build
3
+ * Finally stop spiking
4
+ * Implement Node::GuardNil via XOR node.
@@ -0,0 +1,2 @@
1
+ ---
2
+ unit_test_timeout: 1.0
@@ -0,0 +1,3 @@
1
+ ---
2
+ threshold: 20
3
+ total_score: 275
@@ -0,0 +1,2 @@
1
+ ---
2
+ threshold: 12.2 # TODO: decrease to ~ 10
@@ -0,0 +1,3 @@
1
+ ---
2
+ library: adamantium
3
+ namespace: Adamantium
@@ -0,0 +1,2 @@
1
+ name: ducktrap
2
+ namespace: Ducktrap
@@ -0,0 +1,98 @@
1
+ ---
2
+ UncommunicativeParameterName:
3
+ accept: []
4
+ exclude: []
5
+ enabled: true
6
+ reject:
7
+ - !ruby/regexp /^.$/
8
+ - !ruby/regexp /[0-9]$/
9
+ - !ruby/regexp /[A-Z]/
10
+ TooManyMethods:
11
+ max_methods: 10
12
+ exclude: []
13
+ enabled: true
14
+ max_instance_variables: 2
15
+ UncommunicativeMethodName:
16
+ accept: []
17
+ exclude: []
18
+ enabled: true
19
+ reject:
20
+ - !ruby/regexp /^[a-z]$/
21
+ - !ruby/regexp /[0-9]$/
22
+ - !ruby/regexp /[A-Z]/
23
+ LongParameterList:
24
+ max_params: 3 # TODO: decrease max_params to 2
25
+ exclude: []
26
+ enabled: true
27
+ overrides: {}
28
+ FeatureEnvy:
29
+ exclude:
30
+ - Ducktrap::PrettyDump#pretty_inspect
31
+ - Ducktrap::Node#run
32
+ - Ducktrap::Error#dump
33
+ - Ducktrap::Error::Exception#dump
34
+ enabled: true
35
+ ClassVariable:
36
+ exclude: []
37
+ enabled: true
38
+ BooleanParameter:
39
+ exclude: []
40
+ enabled: true
41
+ IrresponsibleModule:
42
+ exclude: []
43
+ enabled: true
44
+ UncommunicativeModuleName:
45
+ accept: []
46
+ exclude: []
47
+ enabled: true
48
+ reject:
49
+ - !ruby/regexp /^.$/
50
+ - !ruby/regexp /[0-9]$/
51
+ NestedIterators:
52
+ ignore_iterators: []
53
+ exclude: []
54
+ enabled: true
55
+ max_allowed_nesting: 2
56
+ TooManyStatements:
57
+ max_statements: 7 # TODO: decrease max_statements to 5 or less
58
+ exclude: []
59
+ enabled: true
60
+ DuplicateMethodCall:
61
+ allow_calls: []
62
+ exclude: []
63
+ enabled: false # TOOD enable
64
+ max_calls: 1
65
+ UtilityFunction:
66
+ max_helper_calls: 1
67
+ exclude: []
68
+ enabled: true
69
+ Attribute:
70
+ exclude: []
71
+ enabled: false
72
+ UncommunicativeVariableName:
73
+ accept: []
74
+ exclude: []
75
+ enabled: true
76
+ reject:
77
+ - !ruby/regexp /^.$/
78
+ - !ruby/regexp /[0-9]$/
79
+ - !ruby/regexp /[A-Z]/
80
+ RepeatedConditional:
81
+ exclude: []
82
+ enabled: true
83
+ max_ifs: 2
84
+ DataClump:
85
+ exclude: []
86
+ enabled: true
87
+ max_copies: 1
88
+ min_clump_size: 3
89
+ ControlParameter:
90
+ exclude: []
91
+ enabled: true
92
+ LongYieldList:
93
+ max_params: 1
94
+ exclude: []
95
+ enabled: true
96
+ NilCheck:
97
+ exclude:
98
+ - Ducktrap::Node::GuardNil::Evaluator#process
@@ -0,0 +1,2 @@
1
+ ---
2
+ threshold: 100
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |gem|
4
+ gem.name = 'ducktrap'
5
+ gem.version = '0.0.1'
6
+ gem.authors = [ 'Markus Schirp' ]
7
+ gem.email = [ 'mbj@schir-dso.com' ]
8
+ gem.description = 'Invertible data filter/mutator on data structures'
9
+ gem.summary = gem.description
10
+ gem.homepage = 'https://github.com/mbj/ducktrap'
11
+
12
+ gem.require_paths = [ 'lib' ]
13
+ gem.files = `git ls-files`.split("\n")
14
+ gem.test_files = `git ls-files -- spec`.split("\n")
15
+ gem.extra_rdoc_files = %w[TODO]
16
+
17
+ gem.add_runtime_dependency('adamantium', '~> 0.0.10')
18
+ gem.add_runtime_dependency('equalizer', '~> 0.0.5')
19
+ gem.add_runtime_dependency('abstract_type', '~> 0.0.5')
20
+ gem.add_runtime_dependency('anima', '~> 0.0.6')
21
+ gem.add_runtime_dependency('addressable', '~> 2.3.2')
22
+ gem.add_runtime_dependency('concord', '~> 0.1.1')
23
+ end
@@ -0,0 +1,73 @@
1
+ require 'abstract_type'
2
+ require 'equalizer'
3
+ require 'concord'
4
+ require 'adamantium'
5
+ require 'addressable/uri'
6
+ require 'anima'
7
+
8
+ # Library namespace
9
+ module Ducktrap
10
+
11
+ # Error raised on failed transformation
12
+ class FailedTransformationError < RuntimeError
13
+ include Adamantium::Flat, Concord::Public.new(:evaluator)
14
+
15
+ # Return error message
16
+ #
17
+ # @return [String]
18
+ #
19
+ # @api private
20
+ #
21
+ def message
22
+ evaluator.pretty_inspect
23
+ end
24
+ memoize :message
25
+
26
+ end
27
+
28
+ # Build ducktrap
29
+ #
30
+ # @return [Node]
31
+ #
32
+ # @api private
33
+ #
34
+ def self.build(&block)
35
+ Node::Block.build(&block)
36
+ end
37
+ end
38
+
39
+ require 'ducktrap/pretty_dump'
40
+ require 'ducktrap/formatter'
41
+ require 'ducktrap/error'
42
+ require 'ducktrap/evaluator'
43
+ require 'ducktrap/evaluator/static'
44
+ require 'ducktrap/evaluator/invalid'
45
+ require 'ducktrap/builder'
46
+ require 'ducktrap/registry'
47
+ require 'ducktrap/nullary'
48
+ require 'ducktrap/unary'
49
+ require 'ducktrap/singleton'
50
+ require 'ducktrap/nary'
51
+ require 'ducktrap/mapper'
52
+ require 'ducktrap/node'
53
+ require 'ducktrap/node/key'
54
+ require 'ducktrap/node/key/fetch'
55
+ require 'ducktrap/node/key/dump'
56
+ require 'ducktrap/node/key/delete'
57
+ require 'ducktrap/node/key/add'
58
+ require 'ducktrap/node/guard_nil'
59
+ require 'ducktrap/node/noop'
60
+ require 'ducktrap/node/invalid'
61
+ require 'ducktrap/node/block'
62
+ require 'ducktrap/node/map'
63
+ require 'ducktrap/node/disjunction'
64
+ require 'ducktrap/node/anima'
65
+ require 'ducktrap/node/anima/load'
66
+ require 'ducktrap/node/anima/dump'
67
+ require 'ducktrap/node/primitive'
68
+ require 'ducktrap/node/inverse'
69
+ require 'ducktrap/node/forward'
70
+ require 'ducktrap/node/static'
71
+ require 'ducktrap/node/custom'
72
+ require 'ducktrap/node/hash'
73
+ require 'ducktrap/node/hash/transform'
@@ -0,0 +1,36 @@
1
+ module Ducktrap
2
+ # Abstract base class for builders
3
+ class Builder
4
+ include Adamantium::Flat, AbstractType, Equalizer.new(:klass)
5
+
6
+ # Return class to build
7
+ #
8
+ # @return [Class:Ducktrap]
9
+ #
10
+ # @api private
11
+ #
12
+ attr_reader :klass
13
+
14
+ private
15
+
16
+ # Initialize object
17
+ #
18
+ # @param [Class:Ducktrap] klass
19
+ #
20
+ # @return [undefined]
21
+ #
22
+ # @api private
23
+ #
24
+ def initialize(klass, &block)
25
+ @klass = klass
26
+ return unless block
27
+
28
+ if block.arity.zero?
29
+ instance_eval(&block)
30
+ else
31
+ block.call(self)
32
+ end
33
+ end
34
+
35
+ end # Builder
36
+ end # Ducktrap