tabla 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|