transform_tree 0.2.0 → 0.3.1

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: ea776e490e4f4da8fb6d171d3e06e6cc80a5d0e4
4
- data.tar.gz: bc9a3252d87f93c9cb09e806369e4a66e29a44da
3
+ metadata.gz: 46374eef42338587f669090bf5790753a11976fa
4
+ data.tar.gz: 2e363000c69aa87e7618309ee295d3549b744969
5
5
  SHA512:
6
- metadata.gz: afbd58a98e1b4b8e53d5d326dcd3033f3733fd452faf13007b9167a4220e1579a415c9fe918a961c7c18e9a40205b87a22b366dd05fdb1dda409863a92eacad4
7
- data.tar.gz: 57fc60710af2ad006d709b4bf93137e4a2b717443101523294154078fb258640e81339fc7fe975db1f3904161e3786e54a69b36ccbf2ce40241035d68e50d861
6
+ metadata.gz: db86d0882abb82681d438aa89cd13b1bb10d316bdac2fd75b4d9ca8946737a88c14b6fbd0819a02aac472aefb8029decee25b5ffb880cf2b76e331914fc0afda
7
+ data.tar.gz: 4f09d5f42ce6cc22240d0dade8b36dda4d14d0f75e273a598645d12365682fe9a036ee18e3415ab2b55e1d1dd6425732a75b93b4518ce2adcde545522c5faf42
data/README.md CHANGED
@@ -2,10 +2,13 @@ TransformTree
2
2
  ---
3
3
  [![Build Status](https://travis-ci.org/ffleming/transform_tree.svg?branch=master)](https://travis-ci.org/ffleming/transform_tree)
4
4
  [![Code Climate](https://codeclimate.com/github/ffleming/transform_tree/badges/gpa.svg)](https://codeclimate.com/github/ffleming/transform_tree)
5
+ [![Test Coverage](https://codeclimate.com/github/ffleming/transform_tree/badges/coverage.svg)](https://codeclimate.com/github/ffleming/transform_tree/coverage)
5
6
  [![Gem Version](https://badge.fury.io/rb/transform_tree.svg)](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
@@ -3,4 +3,4 @@ require "rspec/core/rake_task"
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- task :default => :spec
6
+ task default: :spec
@@ -1,14 +1,23 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "bundler/setup"
4
- require "transform_tree"
3
+ require 'bundler/setup'
4
+ require 'pry'
5
+ require 'transform_tree'
5
6
 
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
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
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start
18
+ tree.add_transforms(
19
+ ->(str) { str.upcase },
20
+ ->(str) { str.upcase },
21
+ TransformTree::Transforms::null
22
+ )
23
+ Pry.start
@@ -1,16 +1,17 @@
1
1
  require "transform_tree/version"
2
- require "transform_tree/transform_node"
3
- require "transform_tree/transform_root"
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
- ->(o = nil) { arg }
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
@@ -1,5 +1,5 @@
1
1
  module TransformTree
2
- class TransformRoot < TransformNode
2
+ class Root < Node
3
3
  attr_reader :height
4
4
  def initialize
5
5
  super(TransformTree::Transforms.null, 0)
@@ -1,3 +1,3 @@
1
1
  module TransformTree
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.1"
3
3
  end
@@ -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 = "transform_tree"
7
+ spec.name = 'transform_tree'
8
8
  spec.version = TransformTree::VERSION
9
- spec.authors = ["Forrest Fleming"]
10
- spec.email = ["ffleming@gmail.com"]
9
+ spec.authors = ['Forrest Fleming']
10
+ spec.email = ['ffleming@gmail.com']
11
11
 
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 closures on provided input. This allows users to output all possible combinations of their desired transformations. A small library of useful transformations is included."
14
- spec.homepage = "https://github.com/ffleming/transform_tree"
15
- spec.license = "MIT"
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 = "exe"
20
+ spec.bindir = 'exe'
19
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
- spec.require_paths = ["lib"]
22
+ spec.require_paths = ['lib']
21
23
 
22
- spec.add_development_dependency "bundler", "~> 1.12"
23
- spec.add_development_dependency "rake", "~> 10.0"
24
- spec.add_development_dependency "rspec", "~> 3.0"
25
- spec.add_development_dependency 'simplecov', "0.9"
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.2.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-21 00:00:00.000000000 Z
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: simplecov
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.9'
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.9'
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/transform_node.rb
90
- - lib/transform_tree/transform_root.rb
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