csv_class_maker 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: 3decd1df13f382a8a4e45b80e04b1754edb935d0
4
+ data.tar.gz: 025dab04fab3222f4dd6440b7af9ab06fc940b0d
5
+ SHA512:
6
+ metadata.gz: b7f9d0a74aa622f4acb7013f106c161c7d420e7c2f5cab088fd277fe356ceb21a635c214079d3d07738990813e5f3a5f19c3e93f69b94a2dc51fbb8c8660989d
7
+ data.tar.gz: 1fb2d38a2412e57e915fed493172a345fd7a66c4999f2a1e9a9990243b67fed0bc37ededc43efa84ee77e2fdf642b8c6e379c554d9b9c18cd4b2a0d5624035dd
@@ -0,0 +1 @@
1
+ require 'csv_class_maker/csv_class_maker'
@@ -0,0 +1,46 @@
1
+ # Usage:
2
+ #
3
+ # require './csv_class_maker'
4
+ # CsvClassMaker::generate_class 'Batting', '/Users/mplatt/Desktop/Batting.csv'
5
+
6
+ module CsvClassMaker
7
+ require 'csv'
8
+ def self.generate_class(class_name, file_name)
9
+ Object.const_set class_name, Struct.new(*extract_headers(file_name)){
10
+
11
+ # Class definition for dynamically generated classes.
12
+ require './lib/csv_class_maker/csv_find'
13
+ extend CsvFind
14
+
15
+ def initialize(hash=nil)
16
+ if hash
17
+ hash.each { |k,v| send "#{k}=".to_sym, v }
18
+ end
19
+ end
20
+
21
+ @@file = CSV.new(File.open(file_name,'r'), headers: true, header_converters: :symbol, return_headers: false)
22
+ @@first_line = 2
23
+ @@last_line = `wc -l #{file_name}`.split(' ').first.to_i
24
+ @line_number = nil
25
+
26
+ attr_accessor :line_number
27
+
28
+ def self.file; return @@file; end
29
+ def self.first_line; return @@first_line; end
30
+ def self.last_line; return @@last_line; end
31
+
32
+ # End of class definition.
33
+
34
+ }
35
+ end
36
+
37
+ private
38
+
39
+ def self.extract_headers(file_name)
40
+ @csv_headers = []
41
+ CSV.new(File.open(file_name,'r'), headers: true, header_converters: :symbol, return_headers: true).first.each do |headers, values|
42
+ @csv_headers << headers
43
+ end
44
+ @csv_headers
45
+ end
46
+ end
@@ -0,0 +1,89 @@
1
+ module CsvClassMaker::CsvFind
2
+
3
+ def all
4
+ rewind
5
+ object_array = []
6
+ file.each {|row| object_array << build_instance(row, file.lineno) }
7
+ object_array
8
+ end
9
+
10
+ def find_by(key_val_pair)
11
+ row = search(key_val_pair).last
12
+ build_instance(row, row[:line_number])
13
+ end
14
+
15
+ def find_all_by(key_val_pair)
16
+ rows = search(key_val_pair)
17
+ output_objects = []
18
+ rows.each { |row|
19
+ output_objects << build_instance(row, row[:line_number])
20
+ }
21
+ output_objects
22
+ end
23
+
24
+ def find(line_number)
25
+ if (first_line..last_line).include? line_number
26
+ row = CSV.new(`head -n 1 #{file.path} && head -n #{line_number} #{file.path} | tail -n 1`, headers: true, header_converters: :symbol, return_headers: false).first
27
+ build_instance row, line_number
28
+ # elsif ((last_line/2)..last_line).include? line_number
29
+ # row = CSV.new(`head -n 1 #{file.path} && tail -n #{last_line+2 - line_number} #{file.path} | head -n 1`, headers: true, header_converters: :symbol, return_headers: false).first
30
+ # build_instance row, line_number
31
+ else
32
+ nil
33
+ end
34
+ end
35
+
36
+ def first
37
+ rewind
38
+ build_instance file.first, first_line
39
+ end
40
+
41
+ def last
42
+ last_row = CSV.new(`head -n 1 #{file.path} && tail -n 1 #{file.path}`, headers: true, header_converters: :symbol, return_headers: false).first
43
+ build_instance last_row, last_line
44
+ end
45
+
46
+ private
47
+
48
+ def build_instance(row, line)
49
+ new_instance = self.new
50
+ row.each { |key, value| new_instance.send "#{key}=".to_sym, value }
51
+ new_instance.line_number = line
52
+ return new_instance
53
+ end
54
+
55
+ def rewind
56
+ file.rewind
57
+ end
58
+
59
+ def search(key_val_pair)
60
+ rewind
61
+ @results = file
62
+ @pairs = key_val_pair
63
+
64
+ @pairs.each { |pair|
65
+ @results = dig(pair, @results)
66
+ }
67
+
68
+ @results
69
+ end
70
+
71
+ def dig(hash_pair, rows)
72
+ @key = hash_pair.first
73
+ @value = hash_pair.last
74
+ @accumulator = []
75
+
76
+ rows.each { |row|
77
+ if row[@key] == @value
78
+ if $. != last_line
79
+ @accumulator << row.push(line_number: $.) if $. != last_line
80
+ else
81
+ @accumulator << row
82
+ end
83
+ end
84
+ }
85
+
86
+ @accumulator
87
+ end
88
+
89
+ end
@@ -0,0 +1,67 @@
1
+ require './lib/csv_class_maker'
2
+
3
+ describe CsvClassMaker do
4
+ context 'class methods' do
5
+ describe 'generate_class' do
6
+ it 'makes a new class object from a file' do
7
+ CsvClassMaker::generate_class 'People', 'spec/support/demo.csv'
8
+ Object.constants.include? :People
9
+ end
10
+ end
11
+ end
12
+ end
13
+
14
+ describe Object do
15
+ before(:all){
16
+ @person1 = People.new(first: 'Mark', last: 'Platt', nickname: 'JCool')
17
+ @person2 = People.new(first: 'Longinus', last: 'Smith', nickname: 'Pebbles')
18
+ @person3 = People.new(first: 'Johnny', last: 'Radiation', nickname: 'Pebbles')
19
+ @person4 = People.new(first: 'Charlie', last: 'Mansfield', nickname: 'Sammykins')
20
+ }
21
+
22
+ context 'class methods' do
23
+ it "responds to .first" do
24
+ (People).should respond_to(:first)
25
+ end
26
+ it ".first returns correctly" do
27
+ expect(People.first).to eq @person1
28
+ end
29
+ it "responds to .last" do
30
+ (People).should respond_to(:last)
31
+ end
32
+ it ".last returns correctly" do
33
+ expect(People.last).to eq @person4
34
+ end
35
+ it "responds to .find" do
36
+ (People).should respond_to(:find)
37
+ end
38
+ it ".find returns correctly" do
39
+ expect(People.find(3)).to eq @person2
40
+ end
41
+ it "responds to .find_by" do
42
+ (People).should respond_to(:find_by)
43
+ end
44
+ it ".find_by returns correctly" do
45
+ expect(People.find_by(nickname: 'Pebbles')).to eq @person3
46
+ expect(People.find_by(nickname: 'Pebbles', last: 'Smith')).to eq @person2
47
+ end
48
+ it "responds to .find_all_by" do
49
+ (People).should respond_to(:find_all_by)
50
+ end
51
+ it ".find_all_by returns correctly" do
52
+ expect(People.find_all_by(nickname: 'Pebbles')).to eq [@person2, @person3]
53
+ expect(People.find_all_by(nickname: 'Pebbles', last: 'Radiation')).to eq [@person3]
54
+ end
55
+ end
56
+ context 'instance methods' do
57
+ it "responds to .first as defined in the csv" do
58
+ (People.new).should respond_to(:first)
59
+ end
60
+ it "responds to .last as defined in the csv" do
61
+ (People.new).should respond_to(:last)
62
+ end
63
+ it "responds to .nickname as defined in the csv" do
64
+ (People.new).should respond_to(:nickname)
65
+ end
66
+ end
67
+ end
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: csv_class_maker
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Mark Platt
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: "'csv_class_maker will create a class out of your csv's headers, and
28
+ provide some methods for finding data in the CSV'"
29
+ email: mplatt@mrkplt.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - lib/csv_class_maker.rb
35
+ - lib/csv_class_maker/csv_class_maker.rb
36
+ - lib/csv_class_maker/csv_find.rb
37
+ - spec/csv_class_maker_spec.rb
38
+ homepage: http://mrkplt.com
39
+ licenses:
40
+ - MIT
41
+ metadata: {}
42
+ post_install_message:
43
+ rdoc_options: []
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 1.9.3
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ requirements: []
57
+ rubyforge_project:
58
+ rubygems_version: 2.2.0
59
+ signing_key:
60
+ specification_version: 4
61
+ summary: "'Object oriented CSV reading'"
62
+ test_files:
63
+ - spec/csv_class_maker_spec.rb