transform_tree 0.2.0 → 0.3.1
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 +4 -4
- data/README.md +3 -0
- data/Rakefile +1 -1
- data/bin/console +19 -10
- data/lib/transform_tree.rb +5 -4
- data/lib/transform_tree/node.rb +56 -0
- data/lib/transform_tree/{transform_root.rb → root.rb} +1 -1
- data/lib/transform_tree/version.rb +1 -1
- data/transform_tree.gemspec +17 -13
- metadata +37 -9
- data/lib/transform_tree/transform_node.rb +0 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46374eef42338587f669090bf5790753a11976fa
|
4
|
+
data.tar.gz: 2e363000c69aa87e7618309ee295d3549b744969
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db86d0882abb82681d438aa89cd13b1bb10d316bdac2fd75b4d9ca8946737a88c14b6fbd0819a02aac472aefb8029decee25b5ffb880cf2b76e331914fc0afda
|
7
|
+
data.tar.gz: 4f09d5f42ce6cc22240d0dade8b36dda4d14d0f75e273a598645d12365682fe9a036ee18e3415ab2b55e1d1dd6425732a75b93b4518ce2adcde545522c5faf42
|
data/README.md
CHANGED
@@ -2,10 +2,13 @@ TransformTree
|
|
2
2
|
---
|
3
3
|
[](https://travis-ci.org/ffleming/transform_tree)
|
4
4
|
[](https://codeclimate.com/github/ffleming/transform_tree)
|
5
|
+
[](https://codeclimate.com/github/ffleming/transform_tree/coverage)
|
5
6
|
[](https://badge.fury.io/rb/transform_tree)
|
6
7
|
|
7
8
|
TransformTree provides an API for buildng trees of closures and executing those closures on provided input. This allows users to output all possible combinations of their desired transformations. A small library of useful transformations is included.
|
8
9
|
|
10
|
+
Until 1.0, minor versions contain breaking changes while patch versions are
|
11
|
+
backwards compatible with respect to the API.
|
9
12
|
## Installation
|
10
13
|
|
11
14
|
Add this line to your application's Gemfile:
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,14 +1,23 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'pry'
|
5
|
+
require 'transform_tree'
|
5
6
|
|
6
|
-
|
7
|
-
|
7
|
+
tree = TransformTree::Root.new
|
8
|
+
tree.add_transforms(
|
9
|
+
TransformTree::Transforms::ret('woof'),
|
10
|
+
TransformTree::Transforms::ret('arf')
|
11
|
+
)
|
12
|
+
tree.add_transforms(
|
13
|
+
->(str) { str.upcase },
|
14
|
+
->(str) { str.upcase },
|
15
|
+
TransformTree::Transforms::null
|
16
|
+
)
|
8
17
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
18
|
+
tree.add_transforms(
|
19
|
+
->(str) { str.upcase },
|
20
|
+
->(str) { str.upcase },
|
21
|
+
TransformTree::Transforms::null
|
22
|
+
)
|
23
|
+
Pry.start
|
data/lib/transform_tree.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
require "transform_tree/version"
|
2
|
-
require "transform_tree/
|
3
|
-
require "transform_tree/
|
2
|
+
require "transform_tree/node"
|
3
|
+
require "transform_tree/root"
|
4
4
|
|
5
5
|
module TransformTree
|
6
6
|
module Transforms
|
7
7
|
class << self
|
8
8
|
def null
|
9
|
-
->(o = nil){ o }
|
9
|
+
@null ||= ->(o = nil) { o }
|
10
10
|
end
|
11
11
|
|
12
12
|
def ret(arg)
|
13
|
-
|
13
|
+
@ret ||= {}
|
14
|
+
@ret[arg] ||= ->(_ = nil) { arg }
|
14
15
|
end
|
15
16
|
end
|
16
17
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
class TransformTree::Node
|
2
|
+
protected
|
3
|
+
attr_reader :children, :closure, :level
|
4
|
+
|
5
|
+
def initialize(closure, level = 0)
|
6
|
+
@closure = closure
|
7
|
+
@level = level
|
8
|
+
@children = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def add_transform(*closures)
|
12
|
+
leaves.each do |leaf|
|
13
|
+
closures.each do |closure|
|
14
|
+
leaf.children << TransformTree::Node.new(closure, leaf.level + 1)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
self
|
18
|
+
end
|
19
|
+
|
20
|
+
def execute(obj, ret = [])
|
21
|
+
children.each { |child| child.execute(closure.call(obj), ret) }
|
22
|
+
ret << closure.call(obj) if children.empty?
|
23
|
+
ret
|
24
|
+
end
|
25
|
+
|
26
|
+
def report(built='', padding = [])
|
27
|
+
built << report_line(padding)
|
28
|
+
children.each {|child| child.report(built, padding + [child != children.last]) }
|
29
|
+
built
|
30
|
+
end
|
31
|
+
|
32
|
+
def leaves(ret=[])
|
33
|
+
(ret << self) if children.empty?
|
34
|
+
children.each {|child| child.leaves(ret) }
|
35
|
+
ret
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
# padding is an array of booleans. an elements index in the array is the level of the tree; an element's
|
41
|
+
# value is true iff that level is 'live' (ie it has more elements to display)
|
42
|
+
# marker in the column corresponding to that boolean's index in the array
|
43
|
+
def report_line(padding)
|
44
|
+
return "#{closure_info}\n" if padding.empty?
|
45
|
+
padding_chars = padding.each_with_index.with_object('') do |(el, i), acc|
|
46
|
+
acc << " " unless i == 0 # align first branch under root (mimic Unix `tree`)
|
47
|
+
next if (i+1) >= padding.count # don't display | for the final item, as we'll use ├ or └
|
48
|
+
acc << (el ? '|' : ' ') # display | if corresponding level is still 'live'
|
49
|
+
end
|
50
|
+
"#{padding_chars }#{ padding.last ? '├' : '└' }──#{closure_info}\n"
|
51
|
+
end
|
52
|
+
|
53
|
+
def closure_info
|
54
|
+
"#{File.basename closure.source_location.first}:#{closure.source_location.last}"
|
55
|
+
end
|
56
|
+
end
|
data/transform_tree.gemspec
CHANGED
@@ -4,23 +4,27 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'transform_tree/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'transform_tree'
|
8
8
|
spec.version = TransformTree::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Forrest Fleming']
|
10
|
+
spec.email = ['ffleming@gmail.com']
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
|
15
|
-
|
12
|
+
spec.summary = 'TransformTree is a library for combining arbitrary transformations on objects.'
|
13
|
+
spec.description = 'TransformTree provides an API for buildng trees of closures and executing those '\
|
14
|
+
'closures on provided input. This allows users to output all possible combinations of their desired '\
|
15
|
+
'transformations. A small library of useful transformations is included.'
|
16
|
+
spec.homepage = 'https://github.com/ffleming/transform_tree'
|
17
|
+
spec.license = 'MIT'
|
16
18
|
|
17
19
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
-
spec.bindir =
|
20
|
+
spec.bindir = 'exe'
|
19
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
-
spec.require_paths = [
|
22
|
+
spec.require_paths = ['lib']
|
21
23
|
|
22
|
-
spec.add_development_dependency
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency
|
25
|
-
spec.add_development_dependency '
|
24
|
+
spec.add_development_dependency 'bundler', '~> 1.12'
|
25
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
26
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
27
|
+
spec.add_development_dependency 'byebug', '~> 3.0'
|
28
|
+
spec.add_development_dependency 'pry-byebug', '~> 3.0'
|
29
|
+
spec.add_development_dependency 'codeclimate-test-reporter', '~> 0.5'
|
26
30
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: transform_tree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Forrest Fleming
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -53,19 +53,47 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: byebug
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry-byebug
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0
|
75
|
+
version: '3.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: codeclimate-test-reporter
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.5'
|
62
90
|
type: :development
|
63
91
|
prerelease: false
|
64
92
|
version_requirements: !ruby/object:Gem::Requirement
|
65
93
|
requirements:
|
66
|
-
- -
|
94
|
+
- - "~>"
|
67
95
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0.
|
96
|
+
version: '0.5'
|
69
97
|
description: TransformTree provides an API for buildng trees of closures and executing
|
70
98
|
those closures on provided input. This allows users to output all possible combinations
|
71
99
|
of their desired transformations. A small library of useful transformations is
|
@@ -86,8 +114,8 @@ files:
|
|
86
114
|
- bin/console
|
87
115
|
- bin/setup
|
88
116
|
- lib/transform_tree.rb
|
89
|
-
- lib/transform_tree/
|
90
|
-
- lib/transform_tree/
|
117
|
+
- lib/transform_tree/node.rb
|
118
|
+
- lib/transform_tree/root.rb
|
91
119
|
- lib/transform_tree/version.rb
|
92
120
|
- transform_tree.gemspec
|
93
121
|
homepage: https://github.com/ffleming/transform_tree
|
@@ -1,37 +0,0 @@
|
|
1
|
-
class TransformTree::TransformNode
|
2
|
-
protected
|
3
|
-
attr_reader :children, :closure, :level
|
4
|
-
|
5
|
-
def initialize(closure, level = 0)
|
6
|
-
@closure = closure
|
7
|
-
@level = level
|
8
|
-
@children = []
|
9
|
-
end
|
10
|
-
|
11
|
-
def add_transform(*closures)
|
12
|
-
leaves.each do |leaf|
|
13
|
-
closures.each do |closure|
|
14
|
-
leaf.children << TransformTree::TransformNode.new(closure, leaf.level + 1)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
self
|
18
|
-
end
|
19
|
-
|
20
|
-
def execute(obj, ret = [])
|
21
|
-
children.each { |child| child.execute(closure.call(obj), ret) }
|
22
|
-
ret << closure.call(obj) if children.empty?
|
23
|
-
ret
|
24
|
-
end
|
25
|
-
|
26
|
-
def report(built='')
|
27
|
-
built << "#{' ' * level}#{level}\n"
|
28
|
-
children.each {|child| child.report(built) }
|
29
|
-
built
|
30
|
-
end
|
31
|
-
|
32
|
-
def leaves(ret=[])
|
33
|
-
(ret << self) if children.empty?
|
34
|
-
children.each {|child| child.leaves(ret) }
|
35
|
-
ret
|
36
|
-
end
|
37
|
-
end
|