tabla 0.0.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 +7 -0
- data/README.md +21 -0
- data/lib/tabla.rb +49 -0
- data/tabla.gemspec +13 -0
- data/test/tabla_test.rb +114 -0
- metadata +50 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f565b51ba83b71107f138f2d76c34d9a2de0b37019832ee6734ba40b3446df52
|
4
|
+
data.tar.gz: cc35102fa5b92b7b9e5bbbf6e512de2163701514c8dc67a2d079f7af5bd218a8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b2a5cee36bb38558c4a4ef5ed62c9d555ceaf23edc2ca5de145602cfc6756faaf757023c6909e4f9b52fcf37cf268c363916ed8981989e799bd45200eb51c256
|
7
|
+
data.tar.gz: 99b48345d98d12f332d5f217da2f63a8849bb8219723e10ab52ad6afb8956dafecd2bbe071f5d6f4f54aec1b3203b41b6b4fa206a5ec547b2e0c77d74d5934b1
|
data/README.md
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# Tabla
|
2
|
+
|
3
|
+
A plain text human-readable tabular data format inspired in tablatal (https://wiki.xxiivv.com/#tablatal)"
|
4
|
+
|
5
|
+
## Usage
|
6
|
+
|
7
|
+
a file looks like:
|
8
|
+
|
9
|
+
```
|
10
|
+
date | desc | amount | notes
|
11
|
+
2019-01-01 | Something that worths a lot storing | 20 | reference: 1237987
|
12
|
+
2019-01-01 | Something that worths a lot | 10 | reference: 1237987
|
13
|
+
2019-01-01 | Something that worths | 5 | reference: 1237987
|
14
|
+
2019-01-01 | Something that | 2.5 | reference: 1237987
|
15
|
+
2019-01-01 | Something | 1.25 | reference: 1237987
|
16
|
+
2019-01-01 | | | reference: 1237987
|
17
|
+
```
|
18
|
+
|
19
|
+
the separator
|
20
|
+
|
21
|
+
Implements the `Enumerable` interface
|
data/lib/tabla.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
class Tabla
|
2
|
+
include Enumerable
|
3
|
+
|
4
|
+
attr_reader :data, :fields, :mapper
|
5
|
+
|
6
|
+
class << self
|
7
|
+
attr_accessor :separator
|
8
|
+
end
|
9
|
+
|
10
|
+
self.separator ||= "|"
|
11
|
+
|
12
|
+
def self.dump(hashes)
|
13
|
+
lines = [hashes.first.keys.join(" #{Tabla.separator} ")]
|
14
|
+
lines += hashes.map { |i| i.values.join " #{Tabla.separator} " }
|
15
|
+
lines.join("\n") << "\n"
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.load(string)
|
19
|
+
new(string).parse
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.load_file(path)
|
23
|
+
load File.read path
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize(data, &block)
|
27
|
+
@lines = data.split("\n")
|
28
|
+
@fields = split @lines.shift
|
29
|
+
@mapper = block
|
30
|
+
end
|
31
|
+
|
32
|
+
def parse
|
33
|
+
@data = @lines.map do |line|
|
34
|
+
item = fields.zip(split(line)).to_h
|
35
|
+
item = mapper.call(item) if mapper
|
36
|
+
item
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def each(&block)
|
41
|
+
block ? data.each(&block) : data.each
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def split(line)
|
47
|
+
line.split(self.class.separator).map(&:strip)
|
48
|
+
end
|
49
|
+
end
|
data/tabla.gemspec
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'tabla'
|
3
|
+
s.version = "0.0.1"
|
4
|
+
s.date = '2019-05-16'
|
5
|
+
s.summary = "A plain text human-readable tabular data format inspired in @neauorie's tablatal (https://wiki.xxiivv.com/#tablatal)"
|
6
|
+
s.description = "A plain text human-readable tabular data format inspired in @neauorie's tablatal (https://wiki.xxiivv.com/#tablatal)"
|
7
|
+
s.authors = ["F-3r"]
|
8
|
+
s.email = "fernando@templ.co"
|
9
|
+
s.files = Dir["lib/**/*.rb", "LICENSE", "README.md", "*.gemspec"]
|
10
|
+
s.test_files = Dir["test/**/*.rb"]
|
11
|
+
s.homepage = 'https://rubygems.org/gems/tabla'
|
12
|
+
s.license = 'AGPLv3'
|
13
|
+
end
|
data/test/tabla_test.rb
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "pp"
|
3
|
+
require "byebug"
|
4
|
+
|
5
|
+
require_relative "../lib/tabla"
|
6
|
+
|
7
|
+
TABLA = <<-TABLA
|
8
|
+
date | desc | amount | notes
|
9
|
+
2019-01-01 | Something that worths a lot storing | 20 | reference: 1237987
|
10
|
+
2019-01-01 | Something that worths a lot | 10 | reference: 1237987
|
11
|
+
2019-01-01 | Something that worths | 5 | reference: 1237987
|
12
|
+
2019-01-01 | Something that | 2.5 | reference: 1237987
|
13
|
+
2019-01-01 | Something | 1.25 | reference: 1237987
|
14
|
+
2019-01-01 | | | reference: 1237987
|
15
|
+
TABLA
|
16
|
+
|
17
|
+
class ValidString < Minitest::Test
|
18
|
+
def setup
|
19
|
+
@tabla = Tabla.new TABLA
|
20
|
+
@tabla.parse
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_that_each_items_has_correct_keys
|
24
|
+
@tabla.data.each { |row| assert_equal ["date", "desc", "amount", "notes"], row.keys }
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_that_each_item_has_correct_value
|
28
|
+
result = @tabla.data
|
29
|
+
|
30
|
+
result.each { |row| assert_equal row["date"], "2019-01-01" }
|
31
|
+
result.each { |row| assert_equal row["notes"], "reference: 1237987" }
|
32
|
+
assert_equal ["20", "10", "5", "2.5", "1.25", ""], result.map { |row| row["amount"] }
|
33
|
+
assert_empty result.last["desc"]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class InvalidFieldCountInRow < Minitest::Test
|
38
|
+
def setup
|
39
|
+
@tabla = Tabla.new <<-EOF
|
40
|
+
date | name
|
41
|
+
2019-01-01 | Something | | | | |
|
42
|
+
EOF
|
43
|
+
@tabla.parse
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_it_ignores_extra_elements
|
47
|
+
assert_equal({ "date" => "2019-01-01", "name" => "Something"}, @tabla.parse.first)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class DumpTest < Minitest::Test
|
52
|
+
def setup
|
53
|
+
@data = <<-EOF
|
54
|
+
date | name | number
|
55
|
+
2019-01-01 | Something | 1234
|
56
|
+
2019-01-02 | Other | 5678
|
57
|
+
EOF
|
58
|
+
@parsed_data = [
|
59
|
+
{
|
60
|
+
"date" => "2019-01-01",
|
61
|
+
"name" => "Something",
|
62
|
+
"number" => "1234",
|
63
|
+
},
|
64
|
+
{
|
65
|
+
"date" => "2019-01-02",
|
66
|
+
"name" => "Other",
|
67
|
+
"number" => "5678",
|
68
|
+
},
|
69
|
+
]
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_it_ignores_extra_elements
|
73
|
+
assert_equal @data, Tabla.dump(@parsed_data)
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_it_can_load_what_it_dumps
|
77
|
+
assert_equal @parsed_data, Tabla.load(Tabla.dump(@parsed_data))
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_it_can_dump_what_it_loads
|
81
|
+
assert_equal @data, Tabla.dump(Tabla.load(@data))
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
class EnumerableAPIImplementation < Minitest::Test
|
86
|
+
def setup
|
87
|
+
@tabla = Tabla.new TABLA
|
88
|
+
@tabla.parse
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_it_returns_an_enumerator_if_no_block_given
|
92
|
+
assert_equal Enumerator, @tabla.each.class
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_it_evaluates_the_block_for_each_element
|
96
|
+
@tabla.each { |item| assert_equal "2019-01-01", item["date"] }
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_it_selects
|
100
|
+
expected = [{"date"=>"2019-01-01", "desc"=>"Something", "amount"=>"1.25", "notes"=>"reference: 1237987"}]
|
101
|
+
assert_equal expected, @tabla.select { |i| i["desc"] == "Something"}
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
class MapperBlockTest < Minitest::Test
|
106
|
+
def setup
|
107
|
+
@tabla = Tabla.new(TABLA) { |item| 1 }
|
108
|
+
@tabla.parse
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_it_maps_all_the_items_through_the_mapper_block
|
112
|
+
@tabla.data.each { |item| assert_equal 1, item }
|
113
|
+
end
|
114
|
+
end
|
metadata
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tabla
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- F-3r
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-05-16 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: A plain text human-readable tabular data format inspired in @neauorie's
|
14
|
+
tablatal (https://wiki.xxiivv.com/#tablatal)
|
15
|
+
email: fernando@templ.co
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- README.md
|
21
|
+
- lib/tabla.rb
|
22
|
+
- tabla.gemspec
|
23
|
+
- test/tabla_test.rb
|
24
|
+
homepage: https://rubygems.org/gems/tabla
|
25
|
+
licenses:
|
26
|
+
- AGPLv3
|
27
|
+
metadata: {}
|
28
|
+
post_install_message:
|
29
|
+
rdoc_options: []
|
30
|
+
require_paths:
|
31
|
+
- lib
|
32
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '0'
|
37
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
requirements: []
|
43
|
+
rubyforge_project:
|
44
|
+
rubygems_version: 2.7.6
|
45
|
+
signing_key:
|
46
|
+
specification_version: 4
|
47
|
+
summary: A plain text human-readable tabular data format inspired in @neauorie's tablatal
|
48
|
+
(https://wiki.xxiivv.com/#tablatal)
|
49
|
+
test_files:
|
50
|
+
- test/tabla_test.rb
|