stream_lines 0.1.0 → 0.2.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
2
  SHA256:
3
- metadata.gz: f0c2fd50863a37c75523351cac80ccecf777bd54a06c72544558ffa825b63531
4
- data.tar.gz: cda429e3f9e80828196874ea92834043e4bc4d87835aa16b8464a4b10061af4d
3
+ metadata.gz: e013c9cf1743dc898ba15674efbd7580f8adb5c6a9e9c51f809aa909396d757c
4
+ data.tar.gz: fc035c2bf4443ff31ad72c0b4b49fa12c49249a9ac69dd497d5e693fa3e59c26
5
5
  SHA512:
6
- metadata.gz: 1176bdabbc7a563b23fcbe14cd7edee5ab1070c7e3b8949eea51ec087c04504acb58ffecff33387a0e00f67ee83df449aa84a90debf2629dd829e76fcf3112e3
7
- data.tar.gz: d98cbf64f7fd4ccd10f7f2ba183f5316a9e704dd8572ba5c79d21653e6045a304d5f229d86cf437b38db9ef1c31e7ab390d0eb3befcba8e06af7a615c8a854cd
6
+ metadata.gz: 1b90ff2f6d5e448a860acb2239d502c65bbbe5e42cf172b05ab13fb33dbbbe9128ddac072fffda287713d858d34723f2a210e741ce283d3978183ac9392dba24
7
+ data.tar.gz: 2fe851b3093d5c64b78f7e0112f132310f53ae2b6a254ec46d0bbdd35187dd1a4f26cd532fd51146fecfd88e11b8e33d1e0e4c817307b7e8c8a34aceed6d5362
@@ -7,7 +7,7 @@ Metrics/BlockLength:
7
7
  Exclude:
8
8
  - 'spec/**/*.rb'
9
9
 
10
- Metrics/LineLength:
10
+ Layout/LineLength:
11
11
  Max: 99
12
12
 
13
13
  Style/Documentation:
@@ -1 +1 @@
1
- ruby-2.6.4
1
+ ruby-2.7.0
@@ -2,6 +2,7 @@
2
2
  language: ruby
3
3
  cache: bundler
4
4
  rvm:
5
+ - 2.7.0
5
6
  - 2.6.0
6
7
  - 2.5.0
7
8
  before_install: gem install bundler -v 2.0.2
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- stream_lines (0.1.0)
4
+ stream_lines (0.2.0)
5
5
  httparty (~> 0.14)
6
6
 
7
7
  GEM
@@ -16,7 +16,7 @@ GEM
16
16
  bundler (>= 1.2.0, < 3)
17
17
  thor (~> 0.18)
18
18
  bundler-gem_version_tasks (0.2.1)
19
- byebug (11.0.1)
19
+ byebug (11.1.1)
20
20
  crack (0.4.3)
21
21
  safe_yaml (~> 1.0.0)
22
22
  diff-lcs (1.3)
@@ -25,24 +25,24 @@ GEM
25
25
  get_process_mem (0.2.5)
26
26
  ffi (~> 1.0)
27
27
  hashdiff (1.0.0)
28
- httparty (0.17.1)
28
+ httparty (0.17.3)
29
29
  mime-types (~> 3.0)
30
30
  multi_xml (>= 0.5.2)
31
31
  jaro_winkler (1.5.4)
32
- json (2.2.0)
33
32
  memory_profiler (0.9.14)
34
- mime-types (3.3)
33
+ mime-types (3.3.1)
35
34
  mime-types-data (~> 3.2015)
36
35
  mime-types-data (3.2019.1009)
37
36
  multi_json (1.14.1)
38
37
  multi_xml (0.6.0)
39
- mustermann (1.0.3)
38
+ mustermann (1.1.1)
39
+ ruby2_keywords (~> 0.0.1)
40
40
  parallel (1.19.1)
41
- parser (2.6.5.0)
41
+ parser (2.7.0.2)
42
42
  ast (~> 2.4.0)
43
- public_suffix (4.0.1)
44
- rack (2.0.7)
45
- rack-protection (2.0.7)
43
+ public_suffix (4.0.3)
44
+ rack (2.0.8)
45
+ rack-protection (2.0.8.1)
46
46
  rack
47
47
  rainbow (3.0.0)
48
48
  rake (13.0.1)
@@ -50,45 +50,45 @@ GEM
50
50
  rspec-core (~> 3.9.0)
51
51
  rspec-expectations (~> 3.9.0)
52
52
  rspec-mocks (~> 3.9.0)
53
- rspec-core (3.9.0)
54
- rspec-support (~> 3.9.0)
53
+ rspec-core (3.9.1)
54
+ rspec-support (~> 3.9.1)
55
55
  rspec-expectations (3.9.0)
56
56
  diff-lcs (>= 1.2.0, < 2.0)
57
57
  rspec-support (~> 3.9.0)
58
- rspec-mocks (3.9.0)
58
+ rspec-mocks (3.9.1)
59
59
  diff-lcs (>= 1.2.0, < 2.0)
60
60
  rspec-support (~> 3.9.0)
61
- rspec-support (3.9.0)
62
- rubocop (0.77.0)
61
+ rspec-support (3.9.2)
62
+ rubocop (0.79.0)
63
63
  jaro_winkler (~> 1.5.1)
64
64
  parallel (~> 1.10)
65
- parser (>= 2.6)
65
+ parser (>= 2.7.0.1)
66
66
  rainbow (>= 2.2.2, < 4.0)
67
67
  ruby-progressbar (~> 1.7)
68
68
  unicode-display_width (>= 1.4.0, < 1.7)
69
69
  ruby-progressbar (1.10.1)
70
+ ruby2_keywords (0.0.2)
70
71
  safe_yaml (1.0.5)
71
- simplecov (0.17.1)
72
+ simplecov (0.18.1)
72
73
  docile (~> 1.1)
73
- json (>= 1.8, < 3)
74
- simplecov-html (~> 0.10.0)
75
- simplecov-html (0.10.2)
76
- sinatra (2.0.7)
74
+ simplecov-html (~> 0.11.0)
75
+ simplecov-html (0.11.0)
76
+ sinatra (2.0.8.1)
77
77
  mustermann (~> 1.0)
78
78
  rack (~> 2.0)
79
- rack-protection (= 2.0.7)
79
+ rack-protection (= 2.0.8.1)
80
80
  tilt (~> 2.0)
81
- sinatra-contrib (2.0.7)
81
+ sinatra-contrib (2.0.8.1)
82
82
  backports (>= 2.8.2)
83
83
  multi_json
84
84
  mustermann (~> 1.0)
85
- rack-protection (= 2.0.7)
86
- sinatra (= 2.0.7)
85
+ rack-protection (= 2.0.8.1)
86
+ sinatra (= 2.0.8.1)
87
87
  tilt (~> 2.0)
88
88
  thor (0.20.3)
89
89
  tilt (2.0.10)
90
90
  unicode-display_width (1.6.0)
91
- webmock (3.7.6)
91
+ webmock (3.8.1)
92
92
  addressable (>= 2.3.6)
93
93
  crack (>= 0.3.2)
94
94
  hashdiff (>= 0.4.0, < 2.0.0)
@@ -106,7 +106,7 @@ DEPENDENCIES
106
106
  memory_profiler
107
107
  rake (~> 13.0)
108
108
  rspec (~> 3.0)
109
- rubocop (~> 0.77.0)
109
+ rubocop (~> 0.79.0)
110
110
  simplecov (~> 0.17)
111
111
  sinatra (~> 2.0)
112
112
  sinatra-contrib (~> 2.0)
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # StreamLines
2
2
 
3
+ [![Build Status](https://travis-ci.com/jdlubrano/stream_lines.svg?branch=master)](https://travis-ci.com/jdlubrano/stream_lines)
4
+
3
5
  An API for streaming files from remote locations one line at a time.
4
6
 
5
7
  ## Background
@@ -50,6 +52,39 @@ stream.each_slice(100) do |lines|
50
52
  end
51
53
  ```
52
54
 
55
+ ##### CSVs
56
+
57
+ This gem provides first-class support for streaming CSVs from a remote URL.
58
+
59
+ ```ruby
60
+ url = 'https://my.remote.file/file.csv'
61
+ stream = StreamLines::Reading::CSV.new(url)
62
+
63
+ stream.each do |row|
64
+ # each row will be an array
65
+ end
66
+
67
+ # Supports most Ruby CSV options (see ignored options below)
68
+ stream = StreamLines::Reading::CSV.new(url, headers: true)
69
+
70
+ stream.each do |row|
71
+ # each row is a CSV::Row object that you can access like row['column_name']
72
+ end
73
+ ```
74
+
75
+ Most options that you can pass to
76
+ [Ruby's CSV library](https://ruby-doc.org/stdlib-2.6.1/libdoc/csv/rdoc/CSV.html#method-c-new)
77
+ are supported; however, the following options are explicitly ignored:
78
+
79
+ * `return_headers`
80
+ * `header_converters`
81
+ * `skip_lines`
82
+
83
+ I suspect that these options are not used terribly frequently, and each would
84
+ require additional logic in the `StreamLines::Reading::CSV#each` method.
85
+ Rather than attempting to implement sensible solutions for these options, I am
86
+ choosing to explicitly ignore them until there is enough outcry to support them.
87
+
53
88
  ## Development
54
89
 
55
90
  After checking out the repo, run `bin/setup` to install dependencies.
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'csv'
4
+ require 'stream_lines/error'
5
+ require 'stream_lines/reading/stream'
6
+
7
+ module StreamLines
8
+ module Reading
9
+ class CSV
10
+ # NOTE: (jdlubrano)
11
+ # I suspect that these options are not used terribly frequently, and each
12
+ # would require additional logic in the #each method. Rather than
13
+ # attempting to implement sensible solutions for these options, I am
14
+ # choosing to explicitly ignore them until there is enough outcry to
15
+ # support them.
16
+ IGNORED_CSV_OPTIONS = %i[
17
+ return_headers
18
+ header_converters
19
+ skip_lines
20
+ ].freeze
21
+
22
+ include Enumerable
23
+
24
+ def initialize(url, **csv_options)
25
+ @url = url
26
+ @csv_options = accepted_csv_options(csv_options)
27
+ @stream = Stream.new(url)
28
+ end
29
+
30
+ def each(&block)
31
+ @stream.each_with_index do |line, i|
32
+ next assign_first_row_headers(line) if i.zero? && first_row_headers?
33
+
34
+ block.call(::CSV.parse_line(line, **@csv_options))
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ attr_reader :url
41
+
42
+ def first_row_headers?
43
+ @csv_options[:headers] == true
44
+ end
45
+
46
+ def assign_first_row_headers(first_line)
47
+ header_row = ::CSV.parse_line(first_line)
48
+ @csv_options[:headers] = header_row
49
+ end
50
+
51
+ def accepted_csv_options(csv_options)
52
+ csv_options.transform_keys(&:to_sym)
53
+ .delete_if { |key, _value| IGNORED_CSV_OPTIONS.include?(key) }
54
+ end
55
+ end
56
+ end
57
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module StreamLines
4
- VERSION = '0.1.0'
4
+ VERSION='0.2.0'
5
5
  end
@@ -37,7 +37,7 @@ Gem::Specification.new do |spec|
37
37
  spec.add_development_dependency 'memory_profiler'
38
38
  spec.add_development_dependency 'rake', '~> 13.0'
39
39
  spec.add_development_dependency 'rspec', '~> 3.0'
40
- spec.add_development_dependency 'rubocop', '~> 0.77.0'
40
+ spec.add_development_dependency 'rubocop', '~> 0.79.0'
41
41
  spec.add_development_dependency 'simplecov', '~> 0.17'
42
42
  spec.add_development_dependency 'sinatra', '~> 2.0'
43
43
  spec.add_development_dependency 'sinatra-contrib', '~> 2.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stream_lines
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel Lubrano
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-30 00:00:00.000000000 Z
11
+ date: 2020-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -156,14 +156,14 @@ dependencies:
156
156
  requirements:
157
157
  - - "~>"
158
158
  - !ruby/object:Gem::Version
159
- version: 0.77.0
159
+ version: 0.79.0
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
- version: 0.77.0
166
+ version: 0.79.0
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: simplecov
169
169
  requirement: !ruby/object:Gem::Requirement
@@ -244,6 +244,7 @@ files:
244
244
  - lib/stream_lines.rb
245
245
  - lib/stream_lines/error.rb
246
246
  - lib/stream_lines/reading.rb
247
+ - lib/stream_lines/reading/csv.rb
247
248
  - lib/stream_lines/reading/stream.rb
248
249
  - lib/stream_lines/version.rb
249
250
  - stream_lines.gemspec
@@ -269,7 +270,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
269
270
  - !ruby/object:Gem::Version
270
271
  version: '0'
271
272
  requirements: []
272
- rubygems_version: 3.0.3
273
+ rubygems_version: 3.1.2
273
274
  signing_key:
274
275
  specification_version: 4
275
276
  summary: A utility to stream lines of a file over HTTP