csv_find 0.0.1 → 1.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: fad9ba988bfb458d1f4cf9d27d4b3b6ff1fa97ef
4
- data.tar.gz: e648ecab510c2f0c439ce25d8ba05ab7831b4ec6
2
+ SHA256:
3
+ metadata.gz: 2b108651a75a452e5eb1cd0baf8ea4b3203d1de7c5c1481f2cb8a5b6a872a775
4
+ data.tar.gz: 91b761d46c8d1d633db45e34e79b3d97258aa56c4664e7e6406d49015b64bf0c
5
5
  SHA512:
6
- metadata.gz: ecb6a2486aa3c178e583914a02930d31b5cbd1656791fccaf2aa1536db80620129184320ab26dc979e70f012e1a60060b239e57052cb7b7154da4a7a2424fa8a
7
- data.tar.gz: 08689bf0756703c741e416f5f5174851959300cd47849b5c1c3ecececbf891b97b5551e159392cc8a9257ef7079cdfa769e4dc2e7c4b6a3735f65d0c4a0e9c26
6
+ metadata.gz: 8c394b06f9316d894e2b025265212efde56bcaa1a4a016b0fc0f296f96b0c05d925b43d209c7e305ccc8482e53de179295806c3f57643621105f56d0e5ae58d4
7
+ data.tar.gz: e85c5055eed62026a762f36cf5c1b956c774c06e54157d27530fa1b88c94e6809655522c7913f1cfd4baa86737c40a7fb49b830f800435253809116c02a0a099
@@ -1,10 +1,14 @@
1
- module CsvFind
1
+ # frozen_string_literal: true
2
+
3
+ require 'English'
4
+
5
+ module CsvFind #:nodoc:
2
6
  require 'csv'
3
7
 
4
8
  VERSION = {
5
- major: '0',
9
+ major: '1',
6
10
  minor: '0',
7
- patch: '1'
11
+ patch: '0'
8
12
  }.values.join('.')
9
13
 
10
14
  def self.included(base)
@@ -12,17 +16,17 @@ module CsvFind
12
16
  base.send :prepend, InstanceMethods
13
17
  end
14
18
 
15
- module InstanceMethods
19
+ module InstanceMethods #:nodoc:
16
20
  attr_accessor :line_number
17
21
 
18
22
  def initialize(hash = {})
19
- hash.each { |k,v| send("#{k}=".to_sym, v) }
23
+ hash.each { |k, v| send("#{k}=".to_sym, v) }
20
24
  end
21
25
 
22
- def ==(other_instance)
26
+ def ==(other)
23
27
  instance_variables.map do |instance_variable|
24
28
  instance_variable_get(instance_variable) ==
25
- other_instance.instance_variable_get(instance_variable)
29
+ other.instance_variable_get(instance_variable)
26
30
  end
27
31
  end
28
32
 
@@ -31,7 +35,7 @@ module CsvFind
31
35
  attr_reader :hash
32
36
  end
33
37
 
34
- module ClassMethods
38
+ module ClassMethods #:nodoc:
35
39
  include Enumerable
36
40
 
37
41
  attr_reader :headers, :file, :file_options,
@@ -39,10 +43,10 @@ module CsvFind
39
43
 
40
44
  def csv_file(file_name, options = {})
41
45
  @file_options = default_options.merge(options)
42
- @file = CSV.new(File.open(file_name, 'r'), @file_options)
46
+ @file = CSV.new(File.open(file_name, 'r'), **@file_options)
43
47
  @first_line = 2
44
48
  @last_line = `wc -l #{file_name}`.split(' ').first.to_i
45
- @middle_line = (@last_line/2) + 1
49
+ @middle_line = (@last_line / 2) + 1
46
50
  @line_number = nil
47
51
  @headers = extract_headers(file_name, file_options)
48
52
 
@@ -65,22 +69,21 @@ module CsvFind
65
69
  end
66
70
 
67
71
  def find_by(key_val_pair)
68
- warn DEPRECATION_MESSAGE
69
72
  row = search(key_val_pair).last
70
73
  row.nil? ? nil : build_instance(row, row[:line_number])
71
74
  end
72
75
 
73
76
  def find_all_by(key_val_pair)
74
- warn DEPRECATION_MESSAGE
75
77
  where(key_val_pair)
76
78
  end
77
79
 
78
80
  def find(line_number)
79
- row = if (first_line..middle_line).include?(line_number)
80
- front_find(line_number, file.path)
81
- else
82
- back_find(line_number, file.path)
83
- end
81
+ row =
82
+ if (first_line..middle_line).include?(line_number)
83
+ front_find(line_number, file.path)
84
+ else
85
+ back_find(line_number, file.path)
86
+ end
84
87
 
85
88
  row.nil? ? row : build_instance(row, line_number)
86
89
  end
@@ -92,7 +95,7 @@ module CsvFind
92
95
 
93
96
  def last
94
97
  command = `head -n 1 #{file.path} && tail -n 1 #{file.path}`
95
- last_row = CSV.new(command, file_options).first
98
+ last_row = CSV.new(command, **file_options).first
96
99
  build_instance(last_row, last_line)
97
100
  end
98
101
 
@@ -105,10 +108,6 @@ module CsvFind
105
108
 
106
109
  private
107
110
 
108
- DEPRECATION_MESSAGE =
109
- '[DEPRECATION] This method is deprecated and will be removed in v2.' <<
110
- 'Please user #where.'
111
-
112
111
  def default_options
113
112
  {
114
113
  headers: true,
@@ -118,8 +117,8 @@ module CsvFind
118
117
  end
119
118
 
120
119
  def extract_headers(file_name, options)
121
- csv_file = File.open(file_name,'r')
122
- CSV.new(csv_file, options).first.headers
120
+ csv_file = File.open(file_name, 'r')
121
+ CSV.new(csv_file, **options).first.headers
123
122
  end
124
123
 
125
124
  def build_instance(row, line)
@@ -147,19 +146,24 @@ module CsvFind
147
146
  def dig(hash_pair, rows)
148
147
  rows.select do |row|
149
148
  if row[hash_pair.first] == hash_pair.last
150
- $. != last_line ? row.push(line_number: $.) : row
149
+ $NR != last_line ? row.push(line_number: $NR) : row
151
150
  end
152
151
  end
153
152
  end
154
153
 
155
- def front_find(line_number, file_path)
156
- command = `head -n 1 #{file_path} && head -n #{line_number} #{file_path} | tail -n 1`
157
- CSV.new(command, file_options).first
154
+ def front_find(line_number, path)
155
+ command =
156
+ `head -n 1 #{path} && head -n #{line_number} #{path} | tail -n 1`
157
+
158
+ CSV.new(command, **file_options).first
158
159
  end
159
160
 
160
- def back_find(line_number, file_path)
161
- command = `head -n 1 #{file_path} && tail -n #{(last_line + 1) - line_number} #{file_path} | head -n 1`
162
- CSV.new(command, file_options).first
161
+ def back_find(line_number, path)
162
+ mid = (last_line + 1) - line_number
163
+ command =
164
+ `head -n 1 #{path} && tail -n #{mid} #{path} | head -n 1`
165
+
166
+ CSV.new(command, **file_options).first
163
167
  end
164
168
  end
165
169
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require './lib/csv_find'
2
4
 
3
5
  class People
@@ -6,98 +8,125 @@ class People
6
8
  end
7
9
 
8
10
  describe People do
9
- before(:all){
10
- @person1 = People.new(first: 'Mark', last: 'Platt', nickname: 'JCool', line_number: 2)
11
- @person2 = People.new(first: 'Longinus', last: 'Smith', nickname: 'Pebbles', line_number: 3)
12
- @person3 = People.new(first: 'Johnny', last: 'Radiation', nickname: 'Pebbles', line_number: 4)
13
- @person4 = People.new(first: 'Charlie', last: 'Mansfield', nickname: 'Sammykins', line_number: 5)
14
- }
11
+ before(:all) do
12
+ @person1 = People.new(
13
+ first: 'Mark',
14
+ last: 'Platt',
15
+ nickname: 'JCool',
16
+ line_number: 2
17
+ )
18
+
19
+ @person2 = People.new(
20
+ first: 'Longinus',
21
+ last: 'Smith',
22
+ nickname: 'Pebbles',
23
+ line_number: 3
24
+ )
25
+
26
+ @person3 = People.new(
27
+ first: 'Johnny',
28
+ last: 'Radiation',
29
+ nickname: 'Pebbles',
30
+ line_number: 4
31
+ )
32
+
33
+ @person4 = People.new(
34
+ first: 'Charlie',
35
+ last: 'Mansfield',
36
+ nickname: 'Sammykins',
37
+ line_number: 5
38
+ )
39
+ end
15
40
 
16
41
  context 'class methods' do
17
- it "responds to .first" do
18
- (People).should respond_to(:first)
42
+ it 'responds to .first' do
43
+ expect(People).to respond_to(:first)
19
44
  end
20
45
 
21
- it ".first returns correctly" do
46
+ it '.first returns correctly' do
22
47
  expect(People.first).to eq @person1
23
48
  end
24
49
 
25
- it "responds to .last" do
26
- (People).should respond_to(:last)
50
+ it 'responds to .last' do
51
+ expect(People).to respond_to(:last)
27
52
  end
28
53
 
29
- it ".last returns correctly" do
54
+ it '.last returns correctly' do
30
55
  expect(People.last).to eq @person4
31
56
  end
32
57
 
33
- it "responds to .find" do
34
- (People).should respond_to(:find)
58
+ it 'responds to .find' do
59
+ expect(People).to respond_to(:find)
35
60
  end
36
61
 
37
- it ".find returns correctly" do
62
+ it '.find returns correctly' do
38
63
  expect(People.find(2)).to eq @person1
39
64
  expect(People.find(3)).to eq @person2
40
65
  expect(People.find(4)).to eq @person3
41
66
  expect(People.find(5)).to eq @person4
42
67
  end
43
68
 
44
- it "[DEPRECATED] responds to .find_by" do
45
- (People).should respond_to(:find_by)
69
+ it '[DEPRECATED] responds to .find_by' do
70
+ expect(People).to respond_to(:find_by)
46
71
  end
47
72
 
48
- it "[DEPRECATED] .find_by returns correctly" do
73
+ it '[DEPRECATED] .find_by returns correctly' do
49
74
  expect(People.find_by(nickname: 'Pebbles')).to eq @person3
50
75
  expect(People.find_by(nickname: 'Pebbles', last: 'Smith')).to eq @person2
51
76
  end
52
77
 
53
- it ".find_by returns an nil if there are no results" do
78
+ it '.find_by returns an nil if there are no results' do
54
79
  expect(People.find_by(nickname: 'Beastmode')).to eq nil
55
80
  end
56
81
 
57
-
58
- it "responds to .where" do
59
- (People).should respond_to(:where)
82
+ it 'responds to .where' do
83
+ expect(People).to respond_to(:where)
60
84
  end
61
85
 
62
- it ".where returns correctly" do
86
+ it '.where returns correctly' do
63
87
  expect(People.where(nickname: 'Pebbles')).to eq [@person2, @person3]
64
- expect(People.where(nickname: 'Pebbles', last: 'Radiation')).to eq [@person3]
88
+ expect(People.where(nickname: 'Pebbles', last: 'Radiation'))
89
+ .to eq [@person3]
65
90
  end
66
91
 
67
- it ".where returns an empty array if there are no results" do
92
+ it '.where returns an empty array if there are no results' do
68
93
  expect(People.where(nickname: 'Beastmode')).to eq []
69
94
  end
70
95
 
71
- it "[DEPRECATED] responds to .find_all_by" do
72
- (People).should respond_to(:find_all_by)
96
+ it '[DEPRECATED] responds to .find_all_by' do
97
+ expect(People).to respond_to(:find_all_by)
73
98
  end
74
99
 
75
- it "[DEPRECATED] .find_all_by returns correctly" do
76
- expect(People.find_all_by(nickname: 'Pebbles')).to eq [@person2, @person3]
77
- expect(People.find_all_by(nickname: 'Pebbles', last: 'Radiation')).to eq [@person3]
100
+ it '[DEPRECATED] .find_all_by returns correctly' do
101
+ expect(People.find_all_by(nickname: 'Pebbles'))
102
+ .to eq [@person2, @person3]
103
+
104
+ expect(People.find_all_by(nickname: 'Pebbles', last: 'Radiation'))
105
+ .to eq [@person3]
78
106
  end
79
107
 
80
- it "responds to .each" do
81
- (People).should respond_to(:each)
108
+ it 'responds to .each' do
109
+ expect(People).to respond_to(:each)
82
110
  end
83
111
 
84
- it ".each line yields" do
112
+ it '.each line yields' do
85
113
  @output = []
86
- People.each{ |person| @output << person.first }
87
- expect(@output).to eq ['Mark', 'Longinus', 'Johnny', 'Charlie']
114
+ People.each { |person| @output << person.first }
115
+ expect(@output).to eq %w[Mark Longinus Johnny Charlie]
88
116
  end
89
117
  end
118
+
90
119
  context 'instance methods' do
91
- it "responds to .first as defined in the csv" do
92
- (People.new).should respond_to(:first)
120
+ it 'responds to .first as defined in the csv' do
121
+ expect(People.new).to respond_to(:first)
93
122
  end
94
123
 
95
- it "responds to .last as defined in the csv" do
96
- (People.new).should respond_to(:last)
124
+ it 'responds to .last as defined in the csv' do
125
+ expect(People.new).to respond_to(:last)
97
126
  end
98
127
 
99
- it "responds to .nickname as defined in the csv" do
100
- (People.new).should respond_to(:nickname)
128
+ it 'responds to .nickname as defined in the csv' do
129
+ expect(People.new).to respond_to(:nickname)
101
130
  end
102
131
  end
103
132
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: csv_find
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Platt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-22 00:00:00.000000000 Z
11
+ date: 2020-04-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -16,15 +16,29 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 2.14.1
19
+ version: 3.9.0
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 2.14.1
27
- description: "'csv_find will blah blah blah'"
26
+ version: 3.9.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubocop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.82.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.82.0
41
+ description: csv_find quickly finds rows and creates an instance with that data
28
42
  email: mplatt@mrkplt.com
29
43
  executables: []
30
44
  extensions: []
@@ -44,17 +58,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - ">="
46
60
  - !ruby/object:Gem::Version
47
- version: 2.0.0
61
+ version: 2.5.0
48
62
  required_rubygems_version: !ruby/object:Gem::Requirement
49
63
  requirements:
50
64
  - - ">="
51
65
  - !ruby/object:Gem::Version
52
66
  version: '0'
53
67
  requirements: []
54
- rubyforge_project:
55
- rubygems_version: 2.2.2
68
+ rubygems_version: 3.1.2
56
69
  signing_key:
57
70
  specification_version: 4
58
- summary: "'blah'"
71
+ summary: This uses some command line tools to take CSV's apart and put them together
72
+ to quickly find specific rows in a csv.
59
73
  test_files:
60
74
  - spec/csv_find_spec.rb