csvdb 1.0.0 → 1.1.0
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 +4 -4
- data/README.md +40 -8
- data/lib/csvdb/errors.rb +2 -0
- data/lib/csvdb/table.rb +45 -4
- data/lib/csvdb/version.rb +1 -1
- metadata +1 -2
- data/csvdb-0.1.0.gem +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c89ea1821aaa5b1728600ac8b404796ac1c4dc93
|
4
|
+
data.tar.gz: 89d7d20acea0bdca8b7ec695ea6bc7897267e761
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a5553377d18108ca657d41a3514fdcf46c405259256f9a5e87aeaaf911826cc6587dc1506154a9cc38680689220e13ecf8c85e04f891187723e9fdff5006031
|
7
|
+
data.tar.gz: cd14b88f02430cdc95dbd71d4c5b0bb0edde4a5c068fbf1438fb2e6499ca927fefe2110bcfe9fb5c864456c0257966c4fdffece39bddfe4848d29ca1b19d3b3e
|
data/README.md
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
# Csvdb
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
3
|
+
Really simple object relational mapping for CSV spreadsheets. Loads all data into a ruby array first so not appropriate for very large datasets. However, it's just as fast as working with a 2d ruby array, so it's very fast for reasonably sized datasets.
|
6
4
|
|
7
5
|
## Installation
|
8
6
|
|
@@ -22,17 +20,51 @@ Or install it yourself as:
|
|
22
20
|
|
23
21
|
## Usage
|
24
22
|
|
25
|
-
|
23
|
+
#### CRUD Functions
|
24
|
+
```ruby
|
25
|
+
table = Csvdb.new(file: 'table.csv')
|
26
|
+
table.cols.keys #=> [:id, :name] The table headings (from row[0] in file)
|
27
|
+
table.create(
|
28
|
+
id: 1, name: 'foobar'
|
29
|
+
) #=> [1, 'foobar'] Newly created row
|
30
|
+
row = table.find(0) #=> [1, 'foobar'] find by index in array
|
31
|
+
row.id #=> 1
|
32
|
+
row.update(id: 2) #=> [2, 'foobar']
|
33
|
+
row.delete
|
34
|
+
row.find(0) #=> nil
|
35
|
+
```
|
36
|
+
|
37
|
+
#### Querying
|
38
|
+
```ruby
|
39
|
+
table = Csvdv.new(file: 'table.csv')
|
40
|
+
table.count #=> 5
|
41
|
+
|
42
|
+
# queries always return new table objects, with the same headings,
|
43
|
+
# just filtered by the block
|
44
|
+
query = table.where { |row| row[table.id] == 1 }
|
45
|
+
query.count #=> 1
|
26
46
|
|
27
|
-
|
47
|
+
# joins also always return table objects.
|
48
|
+
# the join joins on the same column name in each table.
|
49
|
+
joined = table.join(another_table, :column)
|
50
|
+
```
|
28
51
|
|
29
|
-
|
52
|
+
#### Printing
|
53
|
+
```ruby
|
54
|
+
table = Csvdb.new(file: 'table.csv')
|
55
|
+
table.pretty
|
56
|
+
+---------+-------+--------+--------+----------+
|
57
|
+
| version | type | counts | resets | time |
|
58
|
+
+---------+-------+--------+--------+----------+
|
59
|
+
| 1.1.0 | build | 741 | 6 | 0.046694 |
|
60
|
+
...
|
61
|
+
|
62
|
+
```
|
30
63
|
|
31
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
64
|
|
33
65
|
## Contributing
|
34
66
|
|
35
|
-
1. Fork it ( https://github.com/
|
67
|
+
1. Fork it ( https://github.com/ColDog/csvdb/fork )
|
36
68
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
37
69
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
38
70
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/lib/csvdb/errors.rb
CHANGED
data/lib/csvdb/table.rb
CHANGED
@@ -3,10 +3,20 @@ require 'csvdb/row'
|
|
3
3
|
require 'csvdb/errors'
|
4
4
|
|
5
5
|
module Csvdb
|
6
|
+
|
7
|
+
class Join
|
8
|
+
|
9
|
+
end
|
10
|
+
|
6
11
|
class Table
|
7
|
-
attr_accessor :cols, :table
|
12
|
+
attr_accessor :cols, :table, :table_name
|
8
13
|
|
9
14
|
def initialize(opts = {})
|
15
|
+
if opts[:name]
|
16
|
+
@table_name = opts[:name]
|
17
|
+
else
|
18
|
+
raise TableError, 'No name on that table'
|
19
|
+
end
|
10
20
|
|
11
21
|
if opts[:file]
|
12
22
|
@file = opts[:file]
|
@@ -17,7 +27,7 @@ module Csvdb
|
|
17
27
|
table = opts[:ary]
|
18
28
|
@cols = opts[:cols]
|
19
29
|
else
|
20
|
-
raise
|
30
|
+
raise TableError, 'No table or file to parse.'
|
21
31
|
end
|
22
32
|
|
23
33
|
@cols.each do |col, val|
|
@@ -32,6 +42,7 @@ module Csvdb
|
|
32
42
|
end
|
33
43
|
|
34
44
|
def write(file = @file)
|
45
|
+
File.open(file, 'w') unless File.file?(file)
|
35
46
|
CSV.open(file, 'wb') do |csv|
|
36
47
|
csv << @cols.keys
|
37
48
|
@table.each do |row|
|
@@ -56,8 +67,38 @@ module Csvdb
|
|
56
67
|
@table << Row.new(new_row, self, @table.length)
|
57
68
|
end
|
58
69
|
|
59
|
-
def
|
60
|
-
|
70
|
+
def add(attrs)
|
71
|
+
@table << Row.new(attrs, self, @table.length)
|
72
|
+
end
|
73
|
+
|
74
|
+
def where(search_name = 'search')
|
75
|
+
Table.new(
|
76
|
+
ary: @table.select { |row| yield(row) },
|
77
|
+
cols: self.cols,
|
78
|
+
name: search_name
|
79
|
+
)
|
80
|
+
end
|
81
|
+
|
82
|
+
def join(table, opts = {})
|
83
|
+
col1 = opts[:col1] ; idx1 = self.send(col1)
|
84
|
+
col2 = opts[:col2] ; idx2 = self.send(col2)
|
85
|
+
cols = ([col1] + (self.cols.keys - [col1])
|
86
|
+
.map { |k| "#{k}_#{self.table_name}".to_sym } +
|
87
|
+
((table.cols.keys - [col1])
|
88
|
+
.map { |k| "#{k}_#{table.table_name}".to_sym }))
|
89
|
+
.map.with_index {|head,idx| [head.to_sym,idx] }.to_h
|
90
|
+
|
91
|
+
joined = Table.new(ary: [], cols: cols, name: "#{self.table_name}.#{cols[:col1]} join #{table.table_name}.#{cols[:col2]}")
|
92
|
+
ids = (self.pluck(col1) + table.pluck(col2)).uniq
|
93
|
+
ids.each do |id|
|
94
|
+
self.where { |row| row[idx1] == id }.table.each do |outer_row|
|
95
|
+
table.where { |row| row[idx2] == id }.table.each do |inner_row|
|
96
|
+
inner_row.delete_at(idx2)
|
97
|
+
joined.add(outer_row + inner_row)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
return joined
|
61
102
|
end
|
62
103
|
|
63
104
|
def find(idx = nil)
|
data/lib/csvdb/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: csvdb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Colin Walker
|
@@ -81,7 +81,6 @@ files:
|
|
81
81
|
- Rakefile
|
82
82
|
- bin/console
|
83
83
|
- bin/setup
|
84
|
-
- csvdb-0.1.0.gem
|
85
84
|
- csvdb.gemspec
|
86
85
|
- lib/csvdb.rb
|
87
86
|
- lib/csvdb/errors.rb
|
data/csvdb-0.1.0.gem
DELETED
Binary file
|