ascii_tree 1.0.3 → 2.0.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b628af28efd7c35a442d17fcf4ad6e8793956f5a
4
- data.tar.gz: 6d112ae59e9dc1a4cba3efefdbd25565a1a7264b
3
+ metadata.gz: 727377cc812889ffd5a12fe02510d31fd8c60046
4
+ data.tar.gz: 51e1abce380f5c8a587be253e0494d973faecb76
5
5
  SHA512:
6
- metadata.gz: 05a255d5eb10bbda6fe338e37b6d69a445407fa5db5b020c2bc3ed4baa609da7748f77f81074a3b3d2e53c394e1d91594e837151b836d7857fb44bc4629caa15
7
- data.tar.gz: de5fa39ee27988af7eae21d64c6159be886b3b202e581f6b52a659136c9508a4ff80975c9cee9c7db4c6940cf632dfe8188ba0b487b7b4c1bf0799193c42f21c
6
+ metadata.gz: 6b7032761679fa3c2c9f63647da68e1d284e5b576b99c88539509f715061c012157ff3ed677b02948bd6bbf7e2f3e00a451ebd4cb8cd855d708c97a1d581bd17
7
+ data.tar.gz: 9d19f645ed89eaa27ad43ad89c7ba550211c2de2cf4da9d561c547620f996af5bd9039bd5b84bbd35af971045b9ce2cdaacf00e8cb3316ea3541fcd390a15b22
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  ## Ascii Tree
2
2
 
3
+ [![Build Status](https://travis-ci.org/tuzz/ascii_tree.svg?branch=master)](https://travis-ci.org/tuzz/ascii_tree)
4
+
3
5
  Parses a usable tree from ASCII art.
4
6
 
5
7
  Ascii Tree turns something humans understand into something computers
@@ -24,14 +26,14 @@ root = AsciiTree.parse('
24
26
 
25
27
  ')
26
28
 
27
- root.id
29
+ root.identity
28
30
  #=> "chestnuts"
29
31
 
30
32
  root.parent
31
33
  #=> nil
32
34
 
33
35
  root.children
34
- #=> [#<AsciiTree::Node @id="roasting">, ...]
36
+ #=> [#<AsciiTree::Node @identity="roasting">, ...]
35
37
  ```
36
38
 
37
39
  ## Multiple words
@@ -47,7 +49,7 @@ root = AsciiTree.parse('
47
49
 
48
50
  ')
49
51
 
50
- root.id
52
+ root.identity
51
53
  #=> "single node"
52
54
  ```
53
55
 
@@ -1,9 +1,7 @@
1
1
  module AsciiTree
2
2
  module CommentStripper
3
-
4
3
  def self.strip(string)
5
4
  string.gsub(/#[^\n]*/, "").gsub(/\s+\n/, "\n")
6
5
  end
7
-
8
6
  end
9
7
  end
@@ -1,13 +1,14 @@
1
- class AsciiTree::Coordinate
2
-
3
- attr_reader :x, :y
4
-
5
- def initialize(x:, y:)
6
- @x, @y = x, y
1
+ module AsciiTree
2
+ class Coordinate
3
+ attr_reader :x, :y
4
+
5
+ def initialize(x:, y:)
6
+ @x = x
7
+ @y = y
8
+ end
9
+
10
+ def ==(other)
11
+ x == other.x && y == other.y
12
+ end
7
13
  end
8
-
9
- def ==(other)
10
- x == other.x && y == other.y
11
- end
12
-
13
14
  end
@@ -1,19 +1,19 @@
1
- class AsciiTree::Edge
1
+ module AsciiTree
2
+ class Edge
3
+ attr_reader :character, :coordinate, :parent_coordinate, :child_coordinate
2
4
 
3
- attr_reader :character, :coordinate, :parent_coordinate, :child_coordinate
5
+ def initialize(character:, coordinate:, parent_coordinate:, child_coordinate:)
6
+ @character = character
7
+ @coordinate = coordinate
8
+ @parent_coordinate = parent_coordinate
9
+ @child_coordinate = child_coordinate
10
+ end
4
11
 
5
- def initialize(character:, coordinate:, parent_coordinate:, child_coordinate:)
6
- @character = character
7
- @coordinate = coordinate
8
- @parent_coordinate = parent_coordinate
9
- @child_coordinate = child_coordinate
12
+ def ==(other)
13
+ character == other.character &&
14
+ coordinate == other.coordinate &&
15
+ parent_coordinate == other.parent_coordinate &&
16
+ child_coordinate == other.child_coordinate
17
+ end
10
18
  end
11
-
12
- def ==(other)
13
- character == other.character &&
14
- coordinate == other.coordinate &&
15
- parent_coordinate == other.parent_coordinate &&
16
- child_coordinate == other.child_coordinate
17
- end
18
-
19
19
  end
@@ -1,7 +1,6 @@
1
1
  module AsciiTree
2
2
  module EdgeParser
3
3
  class << self
4
-
5
4
  def parse(string)
6
5
  edge_chars_with_coordinates(string).map do |char, coordinate|
7
6
  offsets = edge_offsets[char]
@@ -36,7 +35,6 @@ module AsciiTree
36
35
  edge_offsets.keys.include?(char)
37
36
  end
38
37
  end
39
-
40
38
  end
41
39
  end
42
40
  end
@@ -1,21 +1,19 @@
1
1
  module AsciiTree
2
2
  class Node
3
+ attr_reader :identity, :value, :parent, :children
3
4
 
4
- attr_reader :id, :value, :parent, :children
5
-
6
- def initialize(id:, value:, parent:, children:)
7
- @id = id
5
+ def initialize(identity:, value:, parent:, children:)
6
+ @identity = identity
8
7
  @value = value
9
8
  @parent = parent
10
9
  @children = children
11
10
  end
12
11
 
13
12
  def ==(other)
14
- id == other.id &&
13
+ identity == other.identity &&
15
14
  value == other.value &&
16
15
  parent == other.parent &&
17
16
  children == other.children
18
17
  end
19
-
20
18
  end
21
19
  end
@@ -1,6 +1,5 @@
1
1
  module AsciiTree
2
2
  class NodeBuilder
3
-
4
3
  def self.build(*args)
5
4
  new(*args).build
6
5
  end
@@ -10,11 +9,7 @@ module AsciiTree
10
9
  end
11
10
 
12
11
  def build
13
- if relationships.any?
14
- build_for(root_word, nil)
15
- else
16
- nil
17
- end
12
+ build_for(root_word, nil) if relationships.any?
18
13
  end
19
14
 
20
15
  private
@@ -31,7 +26,7 @@ module AsciiTree
31
26
 
32
27
  def build_for(word, parent)
33
28
  node = Node.new(
34
- id: word.id,
29
+ identity: word.identity,
35
30
  value: word.value,
36
31
  parent: parent,
37
32
  children: []
@@ -53,6 +48,5 @@ module AsciiTree
53
48
  build_for(r.child_word, parent)
54
49
  end
55
50
  end
56
-
57
51
  end
58
52
  end
@@ -1,8 +1,8 @@
1
1
  module AsciiTree
2
2
  class ParenthesisToggle
3
-
4
3
  def initialize
5
- @on, @count = false, 0
4
+ @on = false
5
+ @count = 0
6
6
  end
7
7
 
8
8
  def read(char)
@@ -33,6 +33,5 @@ module AsciiTree
33
33
  private
34
34
 
35
35
  attr_reader :on
36
-
37
36
  end
38
37
  end
@@ -1,6 +1,5 @@
1
1
  module AsciiTree
2
2
  class Relationship
3
-
4
3
  attr_reader :parent_word, :edge, :child_word
5
4
 
6
5
  def initialize(parent_word:, edge:, child_word:)
@@ -14,6 +13,5 @@ module AsciiTree
14
13
  edge == other.edge &&
15
14
  child_word == other.child_word
16
15
  end
17
-
18
16
  end
19
17
  end
@@ -1,7 +1,6 @@
1
1
  module AsciiTree
2
2
  module RelationshipsBuilder
3
3
  class << self
4
-
5
4
  def build(words, edges)
6
5
  relationships = []
7
6
 
@@ -24,27 +23,26 @@ module AsciiTree
24
23
  private
25
24
 
26
25
  def root_relationship(words)
27
- root_word = words.first
26
+ return unless words.any?
28
27
 
29
- if root_word
30
- Relationship.new(parent_word: nil, edge: nil, child_word: root_word)
31
- end
28
+ root_word = words.first
29
+ Relationship.new(parent_word: nil, edge: nil, child_word: root_word)
32
30
  end
33
31
 
34
32
  def validate_presence(parent, child, edge)
35
33
  if parent.nil? && child.nil?
36
34
  error = "No parent or child"
37
35
  elsif parent.nil?
38
- error = "No parent for child '#{child.id}'"
36
+ error = "No parent for child '#{child.identity}'"
39
37
  elsif child.nil?
40
- error = "No child for parent '#{parent.id}'"
38
+ error = "No child for parent '#{parent.identity}'"
41
39
  end
42
40
 
43
- if error
44
- c = edge.coordinate
45
- error += " for edge '#{edge.character}' at line #{c.y}, column #{c.x}"
46
- raise ::AsciiTree::RelationshipError, error
47
- end
41
+ return unless error
42
+
43
+ c = edge.coordinate
44
+ error += " for edge '#{edge.character}' at line #{c.y}, column #{c.x}"
45
+ fail ::AsciiTree::RelationshipError, error
48
46
  end
49
47
 
50
48
  def validate_one_parent(relationships)
@@ -56,11 +54,11 @@ module AsciiTree
56
54
  count > 1
57
55
  end
58
56
 
59
- groups = multiple_parents.group_by { |r| r.child_word }
57
+ groups = multiple_parents.group_by(&:child_word)
60
58
 
61
- maps = groups.map do |child_word, relationships|
62
- parent_words = relationships.map(&:parent_word)
63
- [child_word.id, parent_words.map(&:id)]
59
+ maps = groups.map do |child_word, rels|
60
+ parent_words = rels.map(&:parent_word)
61
+ [child_word.identity, parent_words.map(&:identity)]
64
62
  end
65
63
 
66
64
  if maps.any?
@@ -72,10 +70,10 @@ module AsciiTree
72
70
  end
73
71
  end
74
72
 
75
- raise ::AsciiTree::RelationshipError, error if error
73
+ fail ::AsciiTree::RelationshipError, error if error
76
74
  end
77
-
78
- class ::AsciiTree::RelationshipError < StandardError; end
79
75
  end
80
76
  end
77
+
78
+ class RelationshipError < StandardError; end
81
79
  end
@@ -1,7 +1,6 @@
1
1
  module AsciiTree
2
2
  module Scanner
3
3
  class << self
4
-
5
4
  def scan(string)
6
5
  Enumerator.new do |yielder|
7
6
  indexed_lines(string).each do |line, y|
@@ -29,7 +28,6 @@ module AsciiTree
29
28
  def chars(line)
30
29
  line.split("")
31
30
  end
32
-
33
31
  end
34
32
  end
35
33
  end
@@ -1,17 +1,16 @@
1
1
  module AsciiTree
2
2
  class Word
3
+ attr_reader :identity, :value, :start_coordinate, :end_coordinate
3
4
 
4
- attr_reader :id, :value, :start_coordinate, :end_coordinate
5
-
6
- def initialize(id:, value:, start_coordinate:, end_coordinate:)
7
- @id = id
5
+ def initialize(identity:, value:, start_coordinate:, end_coordinate:)
6
+ @identity = identity
8
7
  @value = value
9
8
  @start_coordinate = start_coordinate
10
9
  @end_coordinate = end_coordinate
11
10
  end
12
11
 
13
12
  def ==(other)
14
- id == other.id &&
13
+ identity == other.identity &&
15
14
  value == other.value &&
16
15
  start_coordinate == other.start_coordinate &&
17
16
  end_coordinate == other.end_coordinate
@@ -30,6 +29,5 @@ module AsciiTree
30
29
  def inside?(x)
31
30
  (start_coordinate.x..end_coordinate.x).include?(x)
32
31
  end
33
-
34
32
  end
35
33
  end
@@ -1,14 +1,13 @@
1
1
  module AsciiTree
2
2
  module WordParser
3
3
  class << self
4
-
5
4
  def parse(string)
6
5
  chars = word_chars_with_coordinates(string)
7
6
  group_contiguous(chars).map do |word_with_coords|
8
- id, value = id_value(word_with_coords)
7
+ identity, value = identity_value(word_with_coords)
9
8
 
10
9
  Word.new(
11
- id: id.strip,
10
+ identity: identity.strip,
12
11
  value: value,
13
12
  start_coordinate: word_with_coords.first.last,
14
13
  end_coordinate: word_with_coords.last.last
@@ -21,7 +20,7 @@ module AsciiTree
21
20
  def word_chars_with_coordinates(string)
22
21
  toggle = ParenthesisToggle.new
23
22
 
24
- Scanner.scan(string).reject do |char, coordinate|
23
+ Scanner.scan(string).reject do |char, _coordinate|
25
24
  toggle.read(char)
26
25
  toggle.off? && (edge?(char) || whitespace?(char))
27
26
  end
@@ -35,7 +34,7 @@ module AsciiTree
35
34
  char.match(/\s/)
36
35
  end
37
36
 
38
- def id_value(word_with_coords)
37
+ def identity_value(word_with_coords)
39
38
  chars = word_with_coords.map(&:first)
40
39
  chars = remove_parentheses(chars)
41
40
 
@@ -43,10 +42,10 @@ module AsciiTree
43
42
  word.strip!
44
43
 
45
44
  if word.end_with?("}")
46
- id, tail = word.split("{", 2)
45
+ identity, tail = word.split("{", 2)
47
46
  expression = tail[0..-2]
48
47
  value = eval(expression)
49
- [id, value]
48
+ [identity, value]
50
49
  else
51
50
  [word, nil]
52
51
  end
@@ -61,7 +60,7 @@ module AsciiTree
61
60
  end
62
61
 
63
62
  def group_contiguous(chars)
64
- chars.inject([]) do |array, (char, coord)|
63
+ chars.each_with_object([]) do |(char, coord), array|
65
64
  prev = previous_coordinate(array)
66
65
 
67
66
  if contigous?(prev, coord)
@@ -69,8 +68,6 @@ module AsciiTree
69
68
  else
70
69
  array << [[char, coord]]
71
70
  end
72
-
73
- array
74
71
  end
75
72
  end
76
73
 
@@ -85,7 +82,6 @@ module AsciiTree
85
82
  previous_coordinate.y == coordinate.y &&
86
83
  previous_coordinate.x == coordinate.x - 1
87
84
  end
88
-
89
85
  end
90
86
  end
91
87
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ascii_tree
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Patuzzo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-12 00:00:00.000000000 Z
11
+ date: 2015-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.4'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.4'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.31'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.31'
27
55
  description: Parses a usable tree from ASCII art.
28
56
  email: chris@patuzzo.co.uk
29
57
  executables: []