arbolobra 0.3.0 → 1.0.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: 0a7d8757dacdbea1f3bd516605a4fa635b3761dc
4
- data.tar.gz: f30750650c66f8d727a2232e8ac907efe903ab7c
3
+ metadata.gz: 18869c79acefcad19ab23b03fb60631b791a6c0c
4
+ data.tar.gz: 8300a503605354e94d6ff232b869bc37553caa0f
5
5
  SHA512:
6
- metadata.gz: d09963fc27a25a29662a4477b7fe524013e64b6bb13aa3474f47ef286f3f200d5bbbb987d10c36a966b81a288def7166faa5762e38194572d6d7c80260f72536
7
- data.tar.gz: f4ff880e0e3f04557033d7896b5f311de51ed0357ee264f5ace9857519330903529476c15b02791a5fb11154343b07e0837482eeee69d3f41f08a08cb2b792d9
6
+ metadata.gz: 806746df05318376da007008cb30c3afc60a7354a302f1a7cf7e5d86a28aea6e515b21f49cc0a8addf5742120dcaeb13eca95358824510439b5605a772269709
7
+ data.tar.gz: cfebe7bf871c8e0e95b664beee6247125f4d52bcc4444e9d6dc0faa75778f92fb581936bf07a043797e1b7f88b101f5619e2070de2b3e792aa673815e72a0d01
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # Arbolobra
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up
4
- your Ruby library into a gem. Put your Ruby code in the file `lib/arbolobra`. To experiment with
5
- that code, run `bin/console` for an interactive prompt.
3
+ Arbolobra is for reading and writing a hierarchical set of data, i.e., a tree. ("Arbol" is Spanish
4
+ for "tree", so the palindrome "arbolobra" means a tree, backward and forward.)
6
5
 
7
- TODO: Delete this and the text above, and describe your gem
6
+ Arbolobra makes it simple to take a flat set of data (such as a list of files of the form
7
+ /path/to/filename) and write that as a tree, and the inverse.
8
8
 
9
9
  ## Installation
10
10
 
@@ -26,9 +26,14 @@ Or install it yourself as:
26
26
 
27
27
  Arbolobra is for reading and writing a hierarchical set of data, i.e., a tree.
28
28
 
29
- For example, a simple viewer of files and directories, as a tree:
29
+ ### Generating from Data
30
+
31
+ For example, a simple viewer (a rough equivalent of "find") of files and directories, as a tree:
30
32
 
31
33
  ```ruby
34
+ require 'arbolobra/node'
35
+ require 'pathname'
36
+
32
37
  def build pn
33
38
  children = pn.directory? ? pn.children.sort : Array.new
34
39
  Arbolobra::Node.new pn.basename, children.collect { |child| build child }
@@ -39,49 +44,90 @@ args = ARGV.empty? ? %w{ . } : ARGV
39
44
  args.each do |arg|
40
45
  pn = Pathname.new arg
41
46
  node = build pn
42
-
43
47
  node.print
44
48
  end
45
49
  ```
46
50
 
47
- And to change output, such as from a list of files, from flat to hierarchical:
51
+ The output of running the above in the Arbolobra project for the arguments [ "lib", "test" ]:
52
+
53
+ ```text
54
+ lib
55
+ +---arbolobra
56
+ | +---chars.rb
57
+ | +---node.rb
58
+ | +---tree.rb
59
+ | \---version.rb
60
+ \---arbolobra.rb
61
+ test
62
+ +---arbolobra
63
+ | +---chars_test.rb
64
+ | +---node_test.rb
65
+ | \---tree_test.rb
66
+ +---arbolobra_test.rb
67
+ \---test_helper.rb
68
+ ```
69
+
70
+ ### Generating from Strings (Lines)
71
+
72
+ To convert strings, such as from a list of files, from flat to hierarchical:
48
73
 
49
74
  ```ruby
75
+ require 'arbolobra/tree
76
+
50
77
  tree = Arbolobra::Tree.new $stdin.readlines, "/"
51
78
  tree.root.print
52
79
  ```
53
80
 
81
+ In raw form:
82
+
54
83
  ```shell
55
- % git diff-index --name-only --no-commit-id <commit> | <above script>
84
+ % git diff-index --name-only --no-commit-id c2ef
56
85
  ```
57
86
 
87
+ The output:
88
+
58
89
  ```text
90
+ README.md
91
+ arbolobra.gemspec
92
+ lib/arbolobra/chars.rb
93
+ lib/arbolobra/formatter.rb
94
+ lib/arbolobra/node.rb
95
+ lib/arbolobra/tree.rb
96
+ test/arbolobra/chars_test.rb
97
+ test/arbolobra/formatter_test.rb
98
+ test/arbolobra/node_test.rb
99
+ test/arbolobra/tc.rb
100
+ test/arbolobra/tree_test.rb
101
+ ```
102
+
103
+ Using the above script, converting Git output to a tree:
104
+
105
+ ```shell
106
+ % git diff-index --name-only --no-commit-id c2ef |
107
+ ruby -I lib -rarbolobra/tree -e 'tree = Arbolobra::Tree.new $stdin.readlines, "/"; tree.root.print'
108
+ ```
59
109
 
60
- +---.gitignore
110
+ Output:
111
+
112
+ ```text
113
+ .
61
114
  +---README.md
115
+ +---arbolobra.gemspec
62
116
  +---lib
63
117
  | \---arbolobra
64
118
  | +---chars.rb
119
+ | +---formatter.rb
65
120
  | +---node.rb
66
121
  | \---tree.rb
67
122
  \---test
68
123
  \---arbolobra
69
124
  +---chars_test.rb
125
+ +---formatter_test.rb
70
126
  +---node_test.rb
127
+ +---tc.rb
71
128
  \---tree_test.rb
72
129
  ```
73
130
 
74
- ## Development
75
-
76
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run
77
- the tests. You can also run `bin/console` for an interactive prompt that will allow you to
78
- experiment.
79
-
80
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new
81
- version, update the version number in `version.rb`, and then run `bundle exec rake release`, which
82
- will create a git tag for the version, push git commits and tags, and push the `.gem` file to
83
- [rubygems.org](https://rubygems.org).
84
-
85
131
  ## Contributing
86
132
 
87
133
  Bug reports and pull requests are welcome on GitHub at https://github.com/jpace/arbolobra.
@@ -30,9 +30,9 @@ Gem::Specification.new do |spec|
30
30
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
31
  spec.require_paths = ["lib"]
32
32
 
33
- spec.add_development_dependency "bundler", "~> 1.15"
33
+ spec.add_development_dependency "bundler", "~> 2.0"
34
34
  spec.add_development_dependency "rake", "~> 10.0"
35
- spec.add_development_dependency "test-unit", "~> 3.1"
35
+ spec.add_development_dependency "test-unit", "~> 3.1.5"
36
36
  spec.add_development_dependency "paramesan", "~> 0.1.1"
37
37
  spec.add_development_dependency "logue", "~> 1.0"
38
38
  end
@@ -25,7 +25,6 @@ end
25
25
  # x +---arbolobra_test.rb
26
26
  # x \---test_helper.rb
27
27
 
28
-
29
28
  # this is the "intro" (i) and the "lead" (l):
30
29
  # <iiiiii><ll>
31
30
  # x | +---node_test.rb
@@ -60,7 +59,7 @@ class Arbolobra::CharList
60
59
  end
61
60
 
62
61
  def expand is_last
63
- leftchr = @chars[is_last ? 0 : 1]
62
+ leftchr = @chars[is_last ? 0 : 1]
64
63
  repeatchr = @chars[2]
65
64
  leftchr + repeatchr * (@width - 1)
66
65
  end
@@ -75,7 +74,7 @@ class Arbolobra::CharSet
75
74
 
76
75
  def initialize intro, lead
77
76
  @intro = intro
78
- @lead = lead
77
+ @lead = lead
79
78
  end
80
79
 
81
80
  DEFAULT = new Arbolobra::CharList::DEFAULT_INTRO, Arbolobra::CharList::DEFAULT_LEAD
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'arbolobra/chars'
5
+
6
+ module Arbolobra
7
+ end
8
+
9
+ class Arbolobra::Formatter
10
+ def initialize charset: Arbolobra::CharSet::DEFAULT, output: $stdout
11
+ @charset = charset
12
+ @output = output
13
+ end
14
+
15
+ def print node, intro = "", lead = ""
16
+ @output.print lead, node.value.to_s, "\n"
17
+ children = node.children
18
+ children.each_with_index do |child, idx|
19
+ print_child child, intro, idx == children.size - 1
20
+ end
21
+ end
22
+
23
+ def print_child child, intro, is_last
24
+ nextintro = intro + @charset.intro.expand(is_last)
25
+ nextlead = intro + @charset.lead.expand(is_last)
26
+ print child, nextintro, nextlead
27
+ end
28
+ end
@@ -2,40 +2,39 @@
2
2
  # -*- ruby -*-
3
3
 
4
4
  require 'arbolobra/chars'
5
+ require 'arbolobra/formatter'
5
6
 
6
7
  module Arbolobra
7
- end
8
-
9
- class Arbolobra::Node
10
- include Comparable
11
-
12
- attr_reader :value
13
- attr_reader :children
14
-
15
- def initialize value, children = Array.new
16
- @value = value
17
- @children = children
18
- end
19
-
20
- def print intro: "", lead: "", output: $stdout, chars: Arbolobra::CharSet::DEFAULT
21
- output.print lead, @value.to_s, "\n"
22
- childargs = { intro: intro, output: output, chars: chars }
23
- @children.each_with_index do |child, idx|
24
- print_child child, childargs.merge({ is_last: idx == @children.size - 1 })
8
+ class Node
9
+ include Comparable
10
+
11
+ attr_reader :value
12
+ attr_reader :children
13
+
14
+ def initialize value, *children
15
+ @children = if children.size == 1 && children.first.class == Array
16
+ children.first
17
+ else
18
+ children
19
+ end
20
+ @value = value
25
21
  end
26
- end
27
22
 
28
- def print_child child, intro: "", is_last: false, output: $stdout, chars: Arbolobra::CharSet::DEFAULT
29
- nextintro = intro + chars.intro.expand(is_last)
30
- nextlead = intro + chars.lead.expand(is_last)
31
- child.print intro: nextintro, lead: nextlead, output: output, chars: chars
32
- end
23
+ def print intro: "", lead: "", output: $stdout, charset: Arbolobra::CharSet::DEFAULT
24
+ fmt = Formatter.new charset: charset, output: output
25
+ fmt.print self, intro, lead
26
+ end
33
27
 
34
- def to_s
35
- @value
36
- end
28
+ def to_s
29
+ "value: #{@value}, #{@children && @children.size}"
30
+ end
37
31
 
38
- def <=> other
39
- value <=> other.value && children <=> other.children
32
+ def <=> other
33
+ cmp = value <=> other.value
34
+ if cmp == 0
35
+ cmp = children <=> other.children
36
+ end
37
+ cmp
38
+ end
40
39
  end
41
40
  end
@@ -3,20 +3,18 @@
3
3
 
4
4
  require 'arbolobra/node'
5
5
 
6
- module Arbolobra
7
- end
8
-
9
6
  class Arbolobra::Tree
10
7
  attr_reader :root
11
8
  attr_reader :nodes
12
9
 
13
- def initialize lines, separator
14
- raise "lines argument requires a separator" unless separator
15
- @root = Arbolobra::Node.new nil
16
-
17
- lines.each do |line|
18
- elements = line.chomp.split separator
19
- create_nodes elements
10
+ def initialize lines, separator = "/"
11
+ if lines
12
+ @root = Arbolobra::Node.new "."
13
+
14
+ lines.each do |line|
15
+ elements = line.chomp.split separator
16
+ create_nodes elements
17
+ end
20
18
  end
21
19
  end
22
20
 
@@ -1,3 +1,3 @@
1
1
  module Arbolobra
2
- VERSION = "0.3.0"
2
+ VERSION = "1.0.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arbolobra
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Pace
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-10-17 00:00:00.000000000 Z
11
+ date: 2020-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.15'
19
+ version: '2.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: '1.15'
26
+ version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3.1'
47
+ version: 3.1.5
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '3.1'
54
+ version: 3.1.5
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: paramesan
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -99,6 +99,7 @@ files:
99
99
  - bin/setup
100
100
  - lib/arbolobra.rb
101
101
  - lib/arbolobra/chars.rb
102
+ - lib/arbolobra/formatter.rb
102
103
  - lib/arbolobra/node.rb
103
104
  - lib/arbolobra/tree.rb
104
105
  - lib/arbolobra/version.rb