nested_string_parser 0.0.1 → 0.0.2

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: e0fd6dba43658f034613dd768a23e82fee6303aa
4
- data.tar.gz: f3a0577e9190dedf881b3ea4808be5c982185baa
3
+ metadata.gz: 7bc979b99001df7bd41db9bcd1755e93d4a520b3
4
+ data.tar.gz: 921e53f32bdcaa6d781eed16804246442263ad55
5
5
  SHA512:
6
- metadata.gz: adf100b54e17ca969da8360aa70cbc0072ddd934a5315c17f2dfffeb8481cd5b6f4bcf9d178c47c41f3ab35e660c3d986e0a57ee8c3f193b1ffe85c4dea64899
7
- data.tar.gz: 46954bed6b8b365c8c10a6b462ae345ac0b89e293e60f8675efc75015072aeb658039f1136245037da1587e7233a3fc94afed96e4c4d7f67f524965a3b741d0a
6
+ metadata.gz: cecb511ad6f63c406884220096aa74e568c78b9d47caaee94666215a7fa60392c7f249039a88da9fdacb3aaf69b73408fae50792aa3949d7c96e5a1b11f9eea0
7
+ data.tar.gz: 3f37047b78246cc086e71080c8cc5d72ed327d6833e577a24473bd3667113000ee7fb6f201146c44d73f02a618c41f1990a3680a95de0006f3dd62f7ff0768da
@@ -7,14 +7,40 @@ module NestedStringParser
7
7
  def initialize s=nil ; @nesting, @value, @children = (s ? s.gsub(/^( *)[^ ].*/, '\1').length : -1), (s && s.strip), [] ; end
8
8
  def add_child? child ; (child.nesting > self.nesting) ? add_child(child) : parent.add_child?(child) ; end
9
9
  def add_child child ; @children << child ; child.parent = self ; child ; end
10
+ def nest_child child ; add_child(child).tap { |c| c.nesting = nesting + 1 } ; end
10
11
  def nb? str ; str && str.strip != "" ; end
11
12
  def accept str=nil, *ss ; nb?(str) ? add_child?(Node.new(str)).accept(*ss) : (ss.size > 0 ? self.accept(*ss) : self) ; end
12
13
  def root ; parent ? parent.root : self ; end
13
- def format indent ; "#{indent}#{value}\n#{children.map { |c| c.format "#{indent} " }.join}" ; end
14
+ def format indent ; %[#{indent}#{value}\n#{children.map { |c| c.format "#{indent} " }.join}] ; end
15
+ def find name ; children.detect { |k| k.value == name } ; end
14
16
  end
15
17
 
16
- def self.parse str ; NestedStringParser::Node.new.accept(*str.split(/\n/)).root ; end
17
- module StringExtension ; def parse_nested_string ; NestedStringParser.parse self ; end ; end
18
+ # rows is an array of arrays
19
+ # | A | B | C |
20
+ # | A | B | D |
21
+ # | A | E | F |
22
+ # | A | E | G |
23
+ # | B | H | J |
24
+ # | B | H | K |
25
+ # same as
26
+ # A
27
+ # B
28
+ # C
29
+ # D
30
+ # E
31
+ # F
32
+ # G
33
+ # B
34
+ # H
35
+ # J
36
+ # K
37
+ #
38
+ def self.from_rows rows, root=new_node
39
+ rows.each { |row| row.inject(root) { |node, name| node.find(name) || node.nest_child(new_node name) } } ; root
40
+ end
18
41
 
19
- def self.patch ; ::String.send :include, StringExtension ; end
42
+ def self.new_node val=nil ; NestedStringParser::Node.new.tap { |n| n.value = val } ; end
43
+ def self.parse str ; new_node.accept(*str.split(/\n/)).root ; end
44
+ module Extension ; def parse_nested_string ; NestedStringParser.parse self.to_s ; end ; end
45
+ def self.patch klass=::String ; klass.send :include, Extension ; end
20
46
  end
@@ -1,3 +1,3 @@
1
1
  module NestedStringParser
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+ require "nested_string_parser"
3
+
4
+ RSpec::describe NestedStringParser do
5
+ it "parses nothing at all" do
6
+ node = NestedStringParser.from_rows []
7
+
8
+ expect(node.value ).to eq nil
9
+ expect(node.nesting ).to eq(-1)
10
+ expect(node.children).to eq []
11
+ end
12
+
13
+ it "parses a single item" do
14
+ node = NestedStringParser.from_rows [["hello"]]
15
+
16
+ expect(node.value ).to eq nil
17
+ expect(node.nesting ).to eq(-1)
18
+ expect(node.children.size).to eq 1
19
+
20
+ child = node.children.first
21
+ expect(child.value ).to eq "hello"
22
+ expect(child.nesting ).to eq 0
23
+ expect(child.children).to eq []
24
+ end
25
+
26
+ QUARKS_IN_ROWS = [
27
+ %w{ quarks G1 up },
28
+ %w{ quarks G1 down },
29
+ %w{ quarks G2 strange },
30
+ %w{ quarks G2 charmed },
31
+ %w{ quarks G3 top },
32
+ %w{ quarks G3 bottom },
33
+ %w{ leptons G1 electron },
34
+ %w{ leptons G1 electron-neutrino },
35
+ %w{ leptons G2 muon },
36
+ %w{ leptons G2 muon-neutrino },
37
+ %w{ leptons G3 tau },
38
+ %w{ leptons G3 tau-neutrino },
39
+ ]
40
+
41
+ it "parses a single item" do
42
+ node = NestedStringParser.from_rows QUARKS_IN_ROWS
43
+
44
+ expect(node.value ).to eq nil
45
+ expect(node.nesting ).to eq(-1)
46
+ expect(node.children.map(&:value)).to eq %w{ quarks leptons }
47
+
48
+ quarks = node.children[0]
49
+ expect(quarks.nesting ).to eq 0
50
+ expect(quarks.children.map(&:value) ).to eq %w{ G1 G2 G3 }
51
+ expect(quarks.children.map(&:nesting)).to eq [1,1,1]
52
+ expect(quarks.children.map { |q| q.children.map(&:nesting) }).to eq [[2,2], [2,2], [2,2]]
53
+ expect(quarks.children.map { |q| q.children.map(&:value) }).to eq [%w{up down}, %w{strange charmed}, %w{top bottom}]
54
+
55
+ leptons = node.children[1]
56
+ expect(leptons.nesting ).to eq 0
57
+ expect(leptons.children.map(&:value) ).to eq %w{ G1 G2 G3 }
58
+ expect(leptons.children.map(&:nesting)).to eq [1,1,1]
59
+ expect(leptons.children.map { |q| q.children.map(&:nesting) }).to eq [[2,2], [2,2], [2,2]]
60
+ expect(leptons.children.map { |q| q.children.map(&:value) }).to eq [%w{electron electron-neutrino}, %w{muon muon-neutrino}, %w{tau tau-neutrino}]
61
+ end
62
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nested_string_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Conan Dalton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-14 00:00:00.000000000 Z
11
+ date: 2017-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -69,6 +69,7 @@ files:
69
69
  - lib/nested_string_parser/version.rb
70
70
  - mit-license.txt
71
71
  - nested_string_parser.gemspec
72
+ - spec/from_rows_spec.rb
72
73
  - spec/parse_spec.rb
73
74
  - spec/spec_helper.rb
74
75
  homepage: http://github.com/conanite/nested_string_parser
@@ -97,5 +98,6 @@ specification_version: 4
97
98
  summary: Parse multi-line string with indentation, return a structure where nesting
98
99
  is based on line indentation
99
100
  test_files:
101
+ - spec/from_rows_spec.rb
100
102
  - spec/parse_spec.rb
101
103
  - spec/spec_helper.rb