sequel-from_csv 0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2828e85c1caf38af3b32a722a4973f5eb7c5ae94
4
+ data.tar.gz: c1590dbd1f44605cf34d1898a1c331b041e26466
5
+ SHA512:
6
+ metadata.gz: 88da935334c894c73f53378bb2f78fc551944e55dcb176df5e767e72b7695580ef1ad73200319542cab444a3ecb74f89bc8ecb6c0b1a2f660c117909cafcd26c
7
+ data.tar.gz: 9af9c728634971508cf77c282a0c19bd611d0413d447da827197b248b17a075c4fa13d2f2351e04483f96d29beb0fed809f8431b282e2996e083a4f022274f58
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in sequel-from_csv.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,55 @@
1
+ # Sequel - From CSV
2
+
3
+ Provides a simple way to seed and synchronize table data using CSV files.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ $ gem install sequel-from_csv
9
+ ```
10
+
11
+ Or add this line to your application's Gemfile then execute `bundle install`:
12
+
13
+ ```ruby
14
+ gem 'sequel-from_csv'
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ To seed data for an individual model:
20
+
21
+ ```ruby
22
+ # Load the plugin
23
+ Sequel::Model.plugin :from_csv
24
+
25
+ # Sync an individual model
26
+ class Country < Sequel::Model; end;
27
+ Country.seed_from_csv "app/models/country.csv"
28
+ ```
29
+
30
+ To seed all models with CSV files present:
31
+
32
+ ```ruby
33
+ # Load the extension
34
+ Sequel::Database.extension :from_csv
35
+
36
+ # Sync all models with CSV files recursively
37
+ DB.seed_from_csv "app/models/"
38
+ ```
39
+ ## To Do
40
+
41
+ - [ ] Add tests
42
+ - [ ] Remove the `activesupport` dependency
43
+ - [ ] Allow custom primary key field names
44
+ - [ ] Remove PostgreSQL-specific code
45
+ - [ ] Document optional arguments
46
+
47
+ ## Development
48
+
49
+ After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
50
+
51
+ 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`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
52
+
53
+ ## Contributing
54
+
55
+ Bug reports and pull requests are welcome on GitHub at https://github.com/kenaniah/sequel-from_csv.
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
@@ -0,0 +1,28 @@
1
+ module Sequel
2
+ module Extensions
3
+ module FromCsv
4
+
5
+ # Finds all CSV files in a directory and synchronizes with their respective DB tables
6
+ def seed_from_csv directory, **opts
7
+
8
+ Dir.glob("#{directory}/**/*.csv").each do |filename|
9
+
10
+ klass = filename.sub "#{directory}", ""
11
+ klass = klass[1..-1] if klass.starts_with? "/"
12
+ klass = klass.split(".")[0]
13
+
14
+ model = klass.classify.constantize
15
+ model.plugin :from_csv
16
+ model.seed_from_csv filename, **opts
17
+
18
+ end
19
+
20
+ nil
21
+
22
+ end
23
+
24
+ end
25
+
26
+ end
27
+ Database.register_extension(:from_csv, Extensions::FromCsv)
28
+ end
@@ -0,0 +1,50 @@
1
+ require 'csv'
2
+
3
+ module Sequel
4
+ module Plugins
5
+ module FromCsv
6
+
7
+ module ClassMethods
8
+
9
+ # Synchronizes a table's data with a CSV file
10
+ def seed_from_csv csv_path, delete: false
11
+
12
+ # Read the source CSV file
13
+ data = CSV.table csv_path
14
+
15
+ # Ensure the ID column exists
16
+ unless data.first[:id]
17
+ raise "CSV file #{csv_path} must contain an id column"
18
+ end
19
+
20
+ self.db.transaction do
21
+
22
+ # UPSERT
23
+ data.each do |row|
24
+ row = row.to_h # Convert CSV::Row to Hash
25
+ self.dataset.insert_conflict(target: :id, update: row).insert row
26
+ end
27
+
28
+ # DELETE old rows
29
+ if delete
30
+ self.exclude("id IN ?", data.map{|row| row[:id]}).delete
31
+ end
32
+
33
+ # Update the table's sequence
34
+ self.db.run <<~SQL
35
+ SELECT
36
+ setval(pg_get_serial_sequence('#{self.simple_table}', 'id'), coalesce(max(id), 1), true)
37
+ FROM
38
+ #{self.simple_table}
39
+ SQL
40
+
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ # lib = File.expand_path('../lib', __FILE__)
3
+ # $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "sequel-from_csv"
7
+ s.version = "0.1.0"
8
+ s.authors = ["Kenaniah Cerny"]
9
+ s.email = ["kenaniah@gmail.com"]
10
+
11
+ s.summary = "A simple way to seed and synchronize table data using CSV files"
12
+ s.homepage = "https://github.com/kenaniah/sequel-from_csv"
13
+
14
+ s.files = `git ls-files -z`.split("\x0").reject do |f|
15
+ f.match(%r{^(test|spec|bin)/})
16
+ end
17
+ s.require_paths = ["lib"]
18
+
19
+ s.add_dependency "activesupport" # For String#classify and String#constantize
20
+ s.add_dependency "sequel"
21
+
22
+ s.add_development_dependency "bundler", "~> 1.13"
23
+ s.add_development_dependency "rake", "~> 10.0"
24
+ end
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sequel-from_csv
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Kenaniah Cerny
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-01-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: sequel
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.13'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.13'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ description:
70
+ email:
71
+ - kenaniah@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - Gemfile
78
+ - README.md
79
+ - Rakefile
80
+ - lib/sequel/extensions/from_csv.rb
81
+ - lib/sequel/plugins/from_csv.rb
82
+ - sequel-from_csv.gemspec
83
+ homepage: https://github.com/kenaniah/sequel-from_csv
84
+ licenses: []
85
+ metadata: {}
86
+ post_install_message:
87
+ rdoc_options: []
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubyforge_project:
102
+ rubygems_version: 2.6.8
103
+ signing_key:
104
+ specification_version: 4
105
+ summary: A simple way to seed and synchronize table data using CSV files
106
+ test_files: []