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.
Files changed (6) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +21 -0
  3. data/lib/tabla.rb +49 -0
  4. data/tabla.gemspec +13 -0
  5. data/test/tabla_test.rb +114 -0
  6. 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
@@ -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