postgres-copy 1.3.0 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 54bb0d22042b8b123bbb05b8e8623277ae46341c
4
- data.tar.gz: 3e53876ba09d4fa52fb9f5e1b4621c1ca38032e2
2
+ SHA256:
3
+ metadata.gz: ff5750f062c23bbbaf42c2c4b54e0d10a2a18c45eda5a66e00abd2fa0d3d9cdc
4
+ data.tar.gz: 10920c6056c38c5cc4a83ba0ace5164abf8a9eb6276e5cef7a4c19e39424de11
5
5
  SHA512:
6
- metadata.gz: e29b1d98f3adfaf797271a68f107cc7cbcc7e56e19cb197d3b2fa16e0590bc9c6e5343c0121ae91edac804d44ae67f8bad66362888417f432213fdc55e22d96a
7
- data.tar.gz: 78ba57612286658b71a83e84f71dcbf08525656b42a1b5aceed0c9d6d2ec06ea1fd2631fdede710fe5a90bac29330a9cd5b3a7916b4a655c0ea96ed4d91ed302
6
+ metadata.gz: 25c750eb0da06933151e7707f67fa52b9973e603d2afe3288241acf34dc61f7004179483339e630e245660f4371c9f1ddb086e9e8f3a80b32c8bc5d180a79937
7
+ data.tar.gz: 8e537afc3c20801bcac073f208225d8375cc25b14b40ebbe80f904eef79ffded4c00ed672987094a08691d84dbaf1818d71fbf0ec2aeedba8d9d2a611298b68d
@@ -0,0 +1,53 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
+
8
+ name: Ruby
9
+
10
+ on:
11
+ push:
12
+ branches: [ master ]
13
+ pull_request:
14
+ branches: [ master ]
15
+
16
+ jobs:
17
+ test:
18
+ services:
19
+ # Label used to access the service container
20
+ postgres:
21
+ # Docker Hub image
22
+ image: postgres
23
+ # Provide the password for postgres
24
+ env:
25
+ POSTGRES_PASSWORD: postgres
26
+ ports:
27
+ - 5432:5432
28
+ # Set health checks to wait until postgres has started
29
+ options: >-
30
+ --health-cmd pg_isready
31
+ --health-interval 10s
32
+ --health-timeout 5s
33
+ --health-retries 5
34
+
35
+ runs-on: ubuntu-latest
36
+ name: test (ruby v${{ matrix.ruby }})
37
+ strategy:
38
+ matrix:
39
+ ruby: ["2.7", "3.0", "3.1"]
40
+
41
+ steps:
42
+ - uses: actions/checkout@v2
43
+ - name: Set up Ruby
44
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
45
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
46
+ uses: ruby/setup-ruby@v1
47
+ with:
48
+ ruby-version: ${{ matrix.ruby }}
49
+ bundler-cache: true
50
+ - name: Install dependencies
51
+ run: bundle install
52
+ - name: Run tests
53
+ run: bundle exec rake
data/.gitignore CHANGED
@@ -23,3 +23,7 @@ pkg
23
23
 
24
24
  ## PROJECT::SPECIFIC
25
25
  .project
26
+
27
+ # RVM files
28
+ .ruby-version
29
+ .ruby-gemset
data/Gemfile.lock CHANGED
@@ -1,71 +1,31 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- postgres-copy (1.3.0)
4
+ postgres-copy (1.6.0)
5
5
  activerecord (>= 5.1)
6
6
  pg (>= 0.17)
7
- responders
8
7
 
9
8
  GEM
10
9
  remote: https://rubygems.org/
11
10
  specs:
12
- actionpack (5.1.1)
13
- actionview (= 5.1.1)
14
- activesupport (= 5.1.1)
15
- rack (~> 2.0)
16
- rack-test (~> 0.6.3)
17
- rails-dom-testing (~> 2.0)
18
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
19
- actionview (5.1.1)
20
- activesupport (= 5.1.1)
21
- builder (~> 3.1)
22
- erubi (~> 1.4)
23
- rails-dom-testing (~> 2.0)
24
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
25
- activemodel (5.1.1)
26
- activesupport (= 5.1.1)
27
- activerecord (5.1.1)
28
- activemodel (= 5.1.1)
29
- activesupport (= 5.1.1)
30
- arel (~> 8.0)
31
- activesupport (5.1.1)
11
+ activemodel (7.0.1)
12
+ activesupport (= 7.0.1)
13
+ activerecord (7.0.1)
14
+ activemodel (= 7.0.1)
15
+ activesupport (= 7.0.1)
16
+ activesupport (7.0.1)
32
17
  concurrent-ruby (~> 1.0, >= 1.0.2)
33
- i18n (~> 0.7)
34
- minitest (~> 5.1)
35
- tzinfo (~> 1.1)
36
- arel (8.0.0)
37
- builder (3.2.3)
38
- concurrent-ruby (1.0.5)
39
- diff-lcs (1.3)
40
- erubi (1.6.0)
41
- i18n (0.8.4)
42
- loofah (2.0.3)
43
- nokogiri (>= 1.5.9)
44
- method_source (0.8.2)
45
- mini_portile2 (2.2.0)
46
- minitest (5.10.2)
47
- nokogiri (1.8.0)
48
- mini_portile2 (~> 2.2.0)
49
- pg (0.21.0)
50
- rack (2.0.3)
51
- rack-test (0.6.3)
52
- rack (>= 1.0)
53
- rails-dom-testing (2.0.3)
54
- activesupport (>= 4.2.0)
55
- nokogiri (>= 1.6)
56
- rails-html-sanitizer (1.0.3)
57
- loofah (~> 2.0)
58
- railties (5.1.1)
59
- actionpack (= 5.1.1)
60
- activesupport (= 5.1.1)
61
- method_source
62
- rake (>= 0.8.7)
63
- thor (>= 0.18.1, < 2.0)
18
+ i18n (>= 1.6, < 2)
19
+ minitest (>= 5.1)
20
+ tzinfo (~> 2.0)
21
+ concurrent-ruby (1.1.9)
22
+ diff-lcs (1.4.4)
23
+ i18n (1.9.1)
24
+ concurrent-ruby (~> 1.0)
25
+ minitest (5.15.0)
26
+ pg (1.2.3)
64
27
  rake (11.2.2)
65
- rdoc (5.0.0)
66
- responders (2.4.0)
67
- actionpack (>= 4.2.0, < 5.3)
68
- railties (>= 4.2.0, < 5.3)
28
+ rdoc (6.2.1)
69
29
  rspec (2.99.0)
70
30
  rspec-core (~> 2.99.0)
71
31
  rspec-expectations (~> 2.99.0)
@@ -74,10 +34,8 @@ GEM
74
34
  rspec-expectations (2.99.2)
75
35
  diff-lcs (>= 1.1.3, < 2.0)
76
36
  rspec-mocks (2.99.4)
77
- thor (0.19.4)
78
- thread_safe (0.3.6)
79
- tzinfo (1.2.3)
80
- thread_safe (~> 0.1)
37
+ tzinfo (2.0.4)
38
+ concurrent-ruby (~> 1.0)
81
39
 
82
40
  PLATFORMS
83
41
  ruby
@@ -90,4 +48,4 @@ DEPENDENCIES
90
48
  rspec (~> 2.12)
91
49
 
92
50
  BUNDLED WITH
93
- 1.14.6
51
+ 2.2.22
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
- # postgres-copy [![Build Status](https://travis-ci.org/diogob/postgres-copy.svg?branch=master)](https://travis-ci.org/diogob/postgres-copy) [![Code Climate](https://codeclimate.com/github/diogob/postgres-copy.svg)](https://codeclimate.com/github/diogob/postgres-copy)
1
+ # postgres-copy
2
+
3
+ ![Ruby](https://github.com/diogob/postgres-copy/workflows/Ruby/badge.svg)
2
4
 
3
5
  This Gem will enable your AR models to use the PostgreSQL COPY command to import/export data in CSV format.
4
6
  If you need to tranfer data between a PostgreSQL database and CSV files, the PostgreSQL native CSV parser
@@ -55,8 +57,8 @@ This will execute in the database the command:
55
57
  COPY (SELECT "users".* FROM "users" ) TO '/tmp/users.csv' WITH DELIMITER ',' CSV HEADER
56
58
  ```
57
59
 
58
- Remark that the file will be created in the database server disk.
59
- But what if you want to write the lines in a file on the server that is running Rails, instead of the database?
60
+ Remark that the file will be created in the database server disk.
61
+ But what if you want to write the lines in a file on the server that is running Rails, instead of the database?
60
62
  In this case you can pass a block and retrieve the generated lines and then write them to a file:
61
63
 
62
64
  ```ruby
@@ -97,6 +99,18 @@ Which will generate the following SQL command:
97
99
  COPY (SELECT name FROM "users" WHERE "users"."id" IN (1, 2, 3)) TO '/tmp/users.csv' WITH DELIMITER ',' CSV HEADER
98
100
  ```
99
101
 
102
+ Alternatively, you can supply customized raw SQL query to copy_to instead of scoped relation:
103
+
104
+ ```ruby
105
+ User.copy_to("/tmp/users.csv", query: 'SELECT count(*) as Total FROM users')
106
+ ```
107
+
108
+ Which will generate the following SQL command:
109
+
110
+ ```sql
111
+ COPY (SELECT count(*) as Total FROM users) TO '/tmp/users.csv' WITH DELIMITER ',' CSV HEADER
112
+ ```
113
+
100
114
  The COPY command also supports exporting the data in binary format.
101
115
 
102
116
  ```ruby
@@ -154,6 +168,17 @@ To specify NULL value you can pass the null option parameter.
154
168
  User.copy_from "/tmp/users.csv", :null => 'null'
155
169
  ```
156
170
 
171
+ Match the specified columns' values against the null string, even if it has been quoted, and if a match is found set the value to NULL (Postgres 9.4+ only).
172
+
173
+ ```ruby
174
+ User.copy_from "/tmp/users.csv", :null => '', :force_null => [:name, :city]
175
+ ```
176
+
177
+ To copy from tsv file , you can set format `:tsv`
178
+
179
+ ```ruby
180
+ User.copy_from "/tmp/users.tsv", :format => :tsv
181
+ ```
157
182
 
158
183
  To copy a binary formatted data file or IO object you can specify the format as binary
159
184
 
@@ -175,6 +200,13 @@ Which will generate the following SQL command:
175
200
  COPY users (id, name) FROM '/tmp/users.dat' WITH BINARY
176
201
  ```
177
202
 
203
+ To specify the encoding with which to read the file, set the :encoding option.
204
+ This is useful for removing byte order marks when matching column headers.
205
+
206
+ ```ruby
207
+ User.copy_from "/tmp/users_with_byte_order_mark.csv", :encoding => 'bom|utf-8'
208
+ ```
209
+
178
210
 
179
211
  ### Using the CSV Responder
180
212
  If you want to make the result of a COPY command available to download this gem provides a CSV responder that, in conjunction with [inherited_resources](https://github.com/josevalim/inherited_resources), is a very powerfull tool. BTW, do not try to use the responder without inherited_resources.
@@ -1,5 +1,13 @@
1
1
  require 'csv'
2
2
 
3
+ def get_file_mode mode, encoding = nil
4
+ if encoding
5
+ "#{mode}:#{encoding}"
6
+ else
7
+ mode
8
+ end
9
+ end
10
+
3
11
  module PostgresCopy
4
12
  module ActsAsCopyTarget
5
13
  extend ActiveSupport::Concern
@@ -10,18 +18,19 @@ module PostgresCopy
10
18
  module CopyMethods
11
19
  # Copy data to a file passed as a string (the file path) or to lines that are passed to a block
12
20
  def copy_to path = nil, options = {}
13
- options = {:delimiter => ",", :format => :csv, :header => true}.merge(options)
21
+ options = { delimiter: ",", format: :csv, header: true }.merge(options)
14
22
  options_string = if options[:format] == :binary
15
23
  "BINARY"
16
24
  else
17
25
  "DELIMITER '#{options[:delimiter]}' CSV #{options[:header] ? 'HEADER' : ''}"
18
26
  end
27
+ options_query = options.delete(:query) || self.all.to_sql
19
28
 
20
29
  if path
21
30
  raise "You have to choose between exporting to a file or receiving the lines inside a block" if block_given?
22
- connection.execute "COPY (#{self.all.to_sql}) TO '#{sanitize_sql(path)}' WITH #{options_string}"
31
+ connection.execute "COPY (#{options_query}) TO '#{sanitize_sql(path)}' WITH #{options_string}"
23
32
  else
24
- connection.raw_connection.copy_data "COPY (#{self.all.to_sql}) TO STDOUT WITH #{options_string}" do
33
+ connection.raw_connection.copy_data "COPY (#{options_query}) TO STDOUT WITH #{options_string}" do
25
34
  while line = connection.raw_connection.get_copy_data do
26
35
  yield(line) if block_given?
27
36
  end
@@ -71,15 +80,18 @@ module PostgresCopy
71
80
  # * You can map fields from the file to different fields in the table using a map in the options hash
72
81
  # * For further details on usage take a look at the README.md
73
82
  def copy_from path_or_io, options = {}
74
- options = {:delimiter => ",", :format => :csv, :header => true, :quote => '"'}.merge(options)
83
+ options = { delimiter: ",", format: :csv, header: true, quote: '"' }.merge(options)
84
+ options[:delimiter] = "\t" if options[:format] == :tsv
75
85
  options_string = if options[:format] == :binary
76
86
  "BINARY"
77
87
  else
78
88
  quote = options[:quote] == "'" ? "''" : options[:quote]
79
- null = options.key?(:null) ? "NULL '#{options[:null]}'" : ''
80
- "DELIMITER '#{options[:delimiter]}' QUOTE '#{quote}' #{null} CSV"
89
+ null = options.key?(:null) ? "NULL '#{options[:null]}'" : nil
90
+ force_null = options.key?(:force_null) ? "FORCE_NULL(#{options[:force_null].join(',')})" : nil
91
+ delimiter = options[:format] == :tsv ? "E'\t'" : "'#{options[:delimiter]}'"
92
+ "WITH (" + ["DELIMITER #{delimiter}", "QUOTE '#{quote}'", null, force_null, "FORMAT CSV"].compact.join(', ') + ")"
81
93
  end
82
- io = path_or_io.instance_of?(String) ? File.open(path_or_io, 'r') : path_or_io
94
+ io = path_or_io.instance_of?(String) ? File.open(path_or_io, get_file_mode('r', options[:encoding])) : path_or_io
83
95
 
84
96
  if options[:format] == :binary
85
97
  columns_list = options[:columns] || []
@@ -109,15 +121,31 @@ module PostgresCopy
109
121
  rescue EOFError
110
122
  end
111
123
  else
124
+ line_buffer = ''
125
+
112
126
  while line = io.gets do
113
127
  next if line.strip.size == 0
114
- if block_given?
115
- row = CSV.parse_line(line.strip, {:col_sep => options[:delimiter]})
116
- yield(row)
117
- next if row.all?{|f| f.nil? }
118
- line = CSV.generate_line(row, {:col_sep => options[:delimiter]})
128
+
129
+ line_buffer += line
130
+
131
+ # If line is incomplete, get the next line until it terminates
132
+ if line_buffer =~ /\n$/ || line_buffer =~ /\Z/
133
+ if block_given?
134
+ begin
135
+ row = CSV.parse_line(line_buffer.strip, col_sep: options[:delimiter])
136
+ yield(row)
137
+ next if row.all?(&:nil?)
138
+ line_buffer = CSV.generate_line(row, col_sep: options[:delimiter])
139
+ rescue CSV::MalformedCSVError
140
+ next
141
+ end
142
+ end
143
+
144
+ connection.raw_connection.put_copy_data(line_buffer)
145
+
146
+ # Clear the buffer
147
+ line_buffer = ''
119
148
  end
120
- connection.raw_connection.put_copy_data line
121
149
  end
122
150
  end
123
151
  end
@@ -5,7 +5,7 @@ $:.unshift lib unless $:.include?(lib)
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "postgres-copy"
8
- s.version = "1.3.0"
8
+ s.version = "1.6.0"
9
9
  s.platform = Gem::Platform::RUBY
10
10
  s.required_ruby_version = ">= 1.9.3"
11
11
  s.authors = ["Diogo Biazus"]
@@ -22,7 +22,6 @@ Gem::Specification.new do |s|
22
22
 
23
23
  s.add_dependency "pg", ">= 0.17"
24
24
  s.add_dependency "activerecord", '>= 5.1'
25
- s.add_dependency "responders"
26
25
  s.add_development_dependency "bundler"
27
26
  s.add_development_dependency "rdoc"
28
27
  s.add_development_dependency "rspec", "~> 2.12"
@@ -100,20 +100,20 @@ describe "COPY FROM" do
100
100
  ReservedWordModel.copy_from File.expand_path('spec/fixtures/reserved_words.csv'), :delimiter => "\t"
101
101
  ReservedWordModel.order(:id).map{|r| r.attributes}.should == [{"group"=>"group name", "id"=>1, "select"=>"test select"}]
102
102
  end
103
-
103
+
104
104
  it "should import even last columns have empty values" do
105
105
  TestExtendedModel.copy_from File.expand_path('spec/fixtures/comma_with_header_empty_values_at_the_end.csv')
106
- TestExtendedModel.order(:id).map{|r| r.attributes}.should ==
106
+ TestExtendedModel.order(:id).map{|r| r.attributes}.should ==
107
107
  [{"id"=>1, "data"=>"test data 1", "more_data"=>nil, "other_data"=>nil, "final_data"=>nil},
108
108
  {"id"=>2, "data"=>"test data 2", "more_data"=>"9", "other_data"=>nil, "final_data"=>nil},
109
109
  {"id"=>3, "data"=>"test data 2", "more_data"=>"9", "other_data"=>nil, "final_data"=>"0"}]
110
110
  end
111
-
111
+
112
112
  it "should import even last columns have empty values with block" do
113
113
  TestExtendedModel.copy_from File.expand_path('spec/fixtures/comma_with_header_empty_values_at_the_end.csv') do |row|
114
114
  row[4]="666"
115
115
  end
116
- TestExtendedModel.order(:id).map{|r| r.attributes}.should ==
116
+ TestExtendedModel.order(:id).map{|r| r.attributes}.should ==
117
117
  [{"id"=>1, "data"=>"test data 1", "more_data"=>nil, "other_data"=>nil, "final_data"=>"666"},
118
118
  {"id"=>2, "data"=>"test data 2", "more_data"=>"9", "other_data"=>nil, "final_data"=>"666"},
119
119
  {"id"=>3, "data"=>"test data 2", "more_data"=>"9", "other_data"=>nil, "final_data"=>"666"}]
@@ -150,4 +150,33 @@ describe "COPY FROM" do
150
150
  TestModel.copy_from File.open(File.expand_path('spec/fixtures/special_null_with_header.csv'), 'r'), :null => 'NULL'
151
151
  TestModel.order(:id).map{|r| r.attributes}.should == [{'id' => 1, 'data' => nil}]
152
152
  end
153
+
154
+ it "should import with a carriage return in the value" do
155
+ TestModel.copy_from File.expand_path('spec/fixtures/comma_with_carriage_returns.csv')
156
+ TestModel.order(:id).map{|r| r.attributes}.should == [{'id' => 1, 'data' => "test\ndata 1"}]
157
+ end
158
+
159
+ it "should import custom force null expressions from path" do
160
+ TestModel.copy_from File.expand_path('spec/fixtures/comma_with_empty_string.csv'), :null => '', :force_null => [:data]
161
+ TestModel.order(:id).map{|r| r.attributes}.should == [{'id' => 1, 'data' => nil}]
162
+ end
163
+
164
+ it "should import tsv from path" do
165
+ TestModel.copy_from File.expand_path('spec/fixtures/tab_with_header.tsv'), :format => :tsv
166
+ TestModel.order(:id).map{|r| r.attributes}.should == [{'id' => 1, 'data' => 'test data 1'}]
167
+ end
168
+
169
+ it "should import 2 lines from tsv and allow changes in block" do
170
+ TestModel.copy_from(File.open(File.expand_path('spec/fixtures/tab_with_two_lines.tsv'), 'r'), :format => :tsv) do |row|
171
+ row[1] = 'changed this data'
172
+ end
173
+ TestModel.order(:id).first.attributes.should == {'id' => 1, 'data' => 'changed this data'}
174
+ TestModel.count.should == 2
175
+ end
176
+
177
+ it "should import csv headers with BOM when provided encoding option" do
178
+ TestModel.copy_from File.expand_path("spec/fixtures/comma_with_bom.csv"), :encoding => "bom|utf-8"
179
+ TestModel.order(:id).map{|r| r.attributes}.should == [{'id' => 1, 'data' => 'test data 1'}]
180
+ end
181
+
153
182
  end
@@ -19,15 +19,4 @@ describe "COPY TO BINARY" do
19
19
  it{ should == File.open('spec/fixtures/2_col_binary_data.dat', 'r:ASCII-8BIT').read }
20
20
  end
21
21
  end
22
-
23
- describe "should allow binary output to file" do
24
- it "should copy to disk if block is not given and a path is passed" do
25
- TestModel.copy_to '/tmp/export.dat', :format => :binary
26
- str = File.open('/tmp/export.dat', 'r:ASCII-8BIT').read
27
-
28
- str.should == File.open('spec/fixtures/2_col_binary_data.dat', 'r:ASCII-8BIT').read
29
-
30
- end
31
- end
32
-
33
22
  end
data/spec/copy_to_spec.rb CHANGED
@@ -5,7 +5,7 @@ describe "COPY TO" do
5
5
  ActiveRecord::Base.connection.execute %{
6
6
  TRUNCATE TABLE test_models;
7
7
  SELECT setval('test_models_id_seq', 1, false);
8
- }
8
+ }
9
9
  TestModel.create :data => 'test data 1'
10
10
  end
11
11
 
@@ -64,20 +64,18 @@ describe "COPY TO" do
64
64
  end
65
65
  end
66
66
 
67
- it "should copy to disk if block is not given and a path is passed" do
68
- TestModel.copy_to '/tmp/export.csv'
69
- File.open('spec/fixtures/comma_with_header.csv', 'r') do |fixture|
70
- File.open('/tmp/export.csv', 'r') do |result|
71
- result.read.should == fixture.read
72
- end
73
- end
74
- end
75
-
76
67
  it "should raise exception if I pass a path and a block simultaneously" do
77
68
  lambda do
78
69
  TestModel.copy_to('/tmp/bogus_path') do |row|
79
70
  end
80
71
  end.should raise_error
81
72
  end
73
+
74
+ it "accepts custom sql query to run instead on the current relation" do
75
+ TestModel.copy_to(nil, query: 'SELECT count(*) as "Total" FROM test_models') do |row|
76
+ expect(row).to eq("Total\n")
77
+ break
78
+ end
79
+ end
82
80
  end
83
81
  end
@@ -0,0 +1,2 @@
1
+ id,data
2
+ 1,"test data 1"
@@ -0,0 +1,3 @@
1
+ id,data
2
+ 1,"test
3
+ data 1"
@@ -0,0 +1,2 @@
1
+ id,data
2
+ 1,""
@@ -0,0 +1,2 @@
1
+ id data
2
+ 1 test data 1
@@ -0,0 +1,3 @@
1
+ id data
2
+ 1 test data 1
3
+ 2 test data 2
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: postgres-copy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Diogo Biazus
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-09 00:00:00.000000000 Z
11
+ date: 2022-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pg
@@ -38,20 +38,6 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '5.1'
41
- - !ruby/object:Gem::Dependency
42
- name: responders
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: bundler
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -116,15 +102,14 @@ extensions: []
116
102
  extra_rdoc_files: []
117
103
  files:
118
104
  - ".document"
105
+ - ".github/workflows/ruby.yml"
119
106
  - ".gitignore"
120
107
  - ".rspec"
121
- - ".travis.yml"
122
108
  - Gemfile
123
109
  - Gemfile.lock
124
110
  - LICENSE
125
111
  - README.md
126
112
  - Rakefile
127
- - VERSION
128
113
  - lib/postgres-copy.rb
129
114
  - lib/postgres-copy/acts_as_copy_target.rb
130
115
  - lib/postgres-copy/csv_responder.rb
@@ -135,6 +120,9 @@ files:
135
120
  - spec/copy_to_spec.rb
136
121
  - spec/fixtures/2_col_binary_data.dat
137
122
  - spec/fixtures/comma_inside_field.csv
123
+ - spec/fixtures/comma_with_bom.csv
124
+ - spec/fixtures/comma_with_carriage_returns.csv
125
+ - spec/fixtures/comma_with_empty_string.csv
138
126
  - spec/fixtures/comma_with_header.csv
139
127
  - spec/fixtures/comma_with_header_and_scope.csv
140
128
  - spec/fixtures/comma_with_header_empty_values_at_the_end.csv
@@ -152,8 +140,10 @@ files:
152
140
  - spec/fixtures/tab_with_error.csv
153
141
  - spec/fixtures/tab_with_extra_line.csv
154
142
  - spec/fixtures/tab_with_header.csv
143
+ - spec/fixtures/tab_with_header.tsv
155
144
  - spec/fixtures/tab_with_header_multi.csv
156
145
  - spec/fixtures/tab_with_two_lines.csv
146
+ - spec/fixtures/tab_with_two_lines.tsv
157
147
  - spec/fixtures/test_extended_model.rb
158
148
  - spec/fixtures/test_model.rb
159
149
  - spec/spec.opts
@@ -161,7 +151,7 @@ files:
161
151
  homepage: http://github.com/diogob/postgres-copy
162
152
  licenses: []
163
153
  metadata: {}
164
- post_install_message:
154
+ post_install_message:
165
155
  rdoc_options: []
166
156
  require_paths:
167
157
  - lib
@@ -176,38 +166,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
176
166
  - !ruby/object:Gem::Version
177
167
  version: '0'
178
168
  requirements: []
179
- rubyforge_project:
180
- rubygems_version: 2.6.8
181
- signing_key:
169
+ rubygems_version: 3.2.3
170
+ signing_key:
182
171
  specification_version: 4
183
172
  summary: Put COPY command functionality in ActiveRecord's model class
184
- test_files:
185
- - spec/copy_from_binary_spec.rb
186
- - spec/copy_from_spec.rb
187
- - spec/copy_to_binary_spec.rb
188
- - spec/copy_to_spec.rb
189
- - spec/fixtures/2_col_binary_data.dat
190
- - spec/fixtures/comma_inside_field.csv
191
- - spec/fixtures/comma_with_header.csv
192
- - spec/fixtures/comma_with_header_and_scope.csv
193
- - spec/fixtures/comma_with_header_empty_values_at_the_end.csv
194
- - spec/fixtures/comma_with_header_multi.csv
195
- - spec/fixtures/comma_without_header.csv
196
- - spec/fixtures/extra_field.rb
197
- - spec/fixtures/reserved_word_model.rb
198
- - spec/fixtures/reserved_words.csv
199
- - spec/fixtures/semicolon_with_different_header.csv
200
- - spec/fixtures/semicolon_with_header.csv
201
- - spec/fixtures/semicolon_with_quote.csv
202
- - spec/fixtures/special_null_with_header.csv
203
- - spec/fixtures/tab_only_data.csv
204
- - spec/fixtures/tab_with_different_header.csv
205
- - spec/fixtures/tab_with_error.csv
206
- - spec/fixtures/tab_with_extra_line.csv
207
- - spec/fixtures/tab_with_header.csv
208
- - spec/fixtures/tab_with_header_multi.csv
209
- - spec/fixtures/tab_with_two_lines.csv
210
- - spec/fixtures/test_extended_model.rb
211
- - spec/fixtures/test_model.rb
212
- - spec/spec.opts
213
- - spec/spec_helper.rb
173
+ test_files: []
data/.travis.yml DELETED
@@ -1,7 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.3.1
4
-
5
- branches:
6
- only:
7
- - master
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.5.6