Module: CsvFind::ClassMethods

Includes:
Enumerable
Defined in:
lib/csv_find/csv_find.rb

Overview

:nodoc:

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#fileObject (readonly)

Returns the value of attribute file.



41
42
43
# File 'lib/csv_find/csv_find.rb', line 41

def file
  @file
end

#file_optionsObject (readonly)

Returns the value of attribute file_options.



41
42
43
# File 'lib/csv_find/csv_find.rb', line 41

def file_options
  @file_options
end

#first_lineObject (readonly)

Returns the value of attribute first_line.



41
42
43
# File 'lib/csv_find/csv_find.rb', line 41

def first_line
  @first_line
end

#headersObject (readonly)

Returns the value of attribute headers.



41
42
43
# File 'lib/csv_find/csv_find.rb', line 41

def headers
  @headers
end

#last_lineObject (readonly)

Returns the value of attribute last_line.



41
42
43
# File 'lib/csv_find/csv_find.rb', line 41

def last_line
  @last_line
end

#middle_lineObject (readonly)

Returns the value of attribute middle_line.



41
42
43
# File 'lib/csv_find/csv_find.rb', line 41

def middle_line
  @middle_line
end

Instance Method Details

#allObject



62
63
64
65
# File 'lib/csv_find/csv_find.rb', line 62

def all
  rewind
  file.map { |row| build_instance(row, file.lineno) }
end

#csv_file(file_name, options = {}) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
# File 'lib/csv_find/csv_find.rb', line 44

def csv_file(file_name, options = {})
  @file_options = default_options.merge(options)
  @file = CSV.new(File.open(file_name, 'r'), **@file_options)
  @first_line = 2
  @last_line = `wc -l #{file_name}`.split(' ').first.to_i
  @middle_line = (@last_line / 2) + 1
  @line_number = nil
  @headers = extract_headers(file_name, file_options)

  define_accessors
end

#define_accessorsObject



56
57
58
59
60
# File 'lib/csv_find/csv_find.rb', line 56

def define_accessors
  headers.each do |header|
    send(:attr_accessor, header)
  end
end

#eachObject



102
103
104
105
106
107
# File 'lib/csv_find/csv_find.rb', line 102

def each
  rewind
  (first_line..last_line).each do |line_number|
    yield find(line_number) if block_given?
  end
end

#find(line_number) ⇒ Object



80
81
82
83
84
85
86
87
88
89
# File 'lib/csv_find/csv_find.rb', line 80

def find(line_number)
  row =
    if (first_line..middle_line).include?(line_number)
      front_find(line_number, file.path)
    else
      back_find(line_number, file.path)
    end

  row.nil? ? row : build_instance(row, line_number)
end

#find_all_by(key_val_pair) ⇒ Object



76
77
78
# File 'lib/csv_find/csv_find.rb', line 76

def find_all_by(key_val_pair)
  where(key_val_pair)
end

#find_by(key_val_pair) ⇒ Object



71
72
73
74
# File 'lib/csv_find/csv_find.rb', line 71

def find_by(key_val_pair)
  row = search(key_val_pair).last
  row.nil? ? nil : build_instance(row, row[:line_number])
end

#firstObject



91
92
93
94
# File 'lib/csv_find/csv_find.rb', line 91

def first
  rewind
  build_instance(file.first, first_line)
end

#lastObject



96
97
98
99
100
# File 'lib/csv_find/csv_find.rb', line 96

def last
  command = `head -n 1 #{file.path} && tail -n 1 #{file.path}`
  last_row = CSV.new(command, **file_options).first
  build_instance(last_row, last_line)
end

#where(key_val_pair) ⇒ Object



67
68
69
# File 'lib/csv_find/csv_find.rb', line 67

def where(key_val_pair)
  search(key_val_pair).map { |row| build_instance(row, row[:line_number]) }
end