csv-machine 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.
- data/lib/csv-machine/field.rb +20 -0
- data/lib/csv-machine/version.rb +3 -0
- data/lib/csv-machine.rb +65 -0
- metadata +47 -0
@@ -0,0 +1,20 @@
|
|
1
|
+
module CSVMachine
|
2
|
+
|
3
|
+
class Field
|
4
|
+
|
5
|
+
attr_reader :name
|
6
|
+
attr_reader :options
|
7
|
+
|
8
|
+
VALID_OPTIONS = [ :column, :type ] # TODO: :convert
|
9
|
+
|
10
|
+
def initialize(name, options={})
|
11
|
+
@name, @options = name.to_sym, options
|
12
|
+
end
|
13
|
+
|
14
|
+
def column
|
15
|
+
@options[:column]
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
data/lib/csv-machine.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'csv'
|
2
|
+
require 'csv-machine/field'
|
3
|
+
|
4
|
+
module CSVMachine
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
base.extend ClassMethods
|
8
|
+
end
|
9
|
+
|
10
|
+
# TODO: def self.map(klass, &block)
|
11
|
+
# end
|
12
|
+
|
13
|
+
module ClassMethods
|
14
|
+
attr_reader :csv_fields
|
15
|
+
attr_reader :csv_options
|
16
|
+
|
17
|
+
def csv_fields
|
18
|
+
@csv_fields ||= {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def csv_options
|
22
|
+
@csv_options ||= CSV::DEFAULT_OPTIONS
|
23
|
+
end
|
24
|
+
|
25
|
+
# @param [Symbol] name
|
26
|
+
# @param [] value
|
27
|
+
def set_csv_option(name, value)
|
28
|
+
raise "Unknown csv option `#{name}'" unless csv_options.key?(name)
|
29
|
+
end
|
30
|
+
|
31
|
+
# @param [Symbol, #to_sym] name
|
32
|
+
# @param [Hash] options
|
33
|
+
def field(name, options={})
|
34
|
+
#options.clone do |hash|
|
35
|
+
#hash[(key.to_sym rescue key) || key] = options.delete(key)
|
36
|
+
#end
|
37
|
+
|
38
|
+
options[:column] ||= begin
|
39
|
+
csv_fields.empty? ? 0 : ( csv_fields.values.last.options[:column] + 1 )
|
40
|
+
end
|
41
|
+
|
42
|
+
_field = Field.new(name, options)
|
43
|
+
create_attribute(_field.name)
|
44
|
+
csv_fields[_field.name] = _field
|
45
|
+
end
|
46
|
+
|
47
|
+
# @param [Array] row Parsed csv row
|
48
|
+
def from_csv(row)
|
49
|
+
new.tap do |obj|
|
50
|
+
csv_fields.each { |n, f| obj.__send__(:"#{n}=", row[f.column]) }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def create_attribute(name)
|
55
|
+
attr_reader name unless method_defined?(name)
|
56
|
+
attr_writer name unless method_defined?(:"#{name}=")
|
57
|
+
end
|
58
|
+
|
59
|
+
def parse(data)
|
60
|
+
CSV.new(data, csv_options).collect { |row| from_csv(row) }
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
metadata
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: csv-machine
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Daniel Johnston
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-07-10 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: A machine for csv parsing
|
15
|
+
email: dan@dj-agiledev.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/csv-machine/field.rb
|
21
|
+
- lib/csv-machine/version.rb
|
22
|
+
- lib/csv-machine.rb
|
23
|
+
homepage: https://github.com/drfeelngood/csv-machine
|
24
|
+
licenses: []
|
25
|
+
post_install_message:
|
26
|
+
rdoc_options: []
|
27
|
+
require_paths:
|
28
|
+
- lib
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
+
none: false
|
31
|
+
requirements:
|
32
|
+
- - ! '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
36
|
+
none: false
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
requirements: []
|
42
|
+
rubyforge_project:
|
43
|
+
rubygems_version: 1.8.25
|
44
|
+
signing_key:
|
45
|
+
specification_version: 3
|
46
|
+
summary: Small library used to transform csv data to Ruby objects
|
47
|
+
test_files: []
|