tabla 0.0.1

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