data_resurrection 0.1.3 → 0.2.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/README.rdoc +7 -2
- data/lib/data_resurrection.rb +4 -2
- data/lib/data_resurrection/adapter.rb +8 -0
- data/lib/data_resurrection/{adapters.rb → adapter/dbf.rb} +22 -5
- data/lib/data_resurrection/{reserved_words → adapter/dbf_reserved_words} +0 -0
- data/lib/data_resurrection/resuscitator.rb +19 -0
- metadata +7 -6
- data/lib/data_resurrection/resurrector.rb +0 -21
data/README.rdoc
CHANGED
@@ -28,11 +28,16 @@ In some cases, field types in original tables are not compatible with ones in th
|
|
28
28
|
|
29
29
|
@data_resurrection.resurrect(@dbf_file_path, :target => 'nationality',
|
30
30
|
:from => ['WINDOWS-1252', 'CP850'], :to => 'UTF-8',
|
31
|
-
:field_types => {:nr => :string }
|
31
|
+
:field_types => {:nr => :string },
|
32
|
+
:replacement => { '╟' => 'Ã' })
|
32
33
|
|
33
34
|
The option :field_types is a hash in which each key is the field name and the value is the field type in the target table.
|
34
35
|
|
35
|
-
|
36
|
+
The option :replacement allows defining arbitrary character replacement, *after*
|
37
|
+
running all encodings. In the example, all existing weird "╟" in all strings
|
38
|
+
will be replaced by "Ã".
|
39
|
+
|
40
|
+
If a field name equals to SQL reserved words or core Ruby methods like "class", the field name is appended with an underscore in the new table.
|
36
41
|
|
37
42
|
|
38
43
|
== But gem dbf does this work!
|
data/lib/data_resurrection.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'active_record'
|
2
|
-
data_resurrection_folder = File.join(File.dirname(__FILE__), 'data_resurrection', '*.rb')
|
3
|
-
Dir.glob(data_resurrection_folder).each {|f| require f }
|
4
2
|
|
3
|
+
module DataResurrection
|
4
|
+
autoload :Resuscitator, 'data_resurrection/resuscitator'
|
5
|
+
autoload :Adapter, 'data_resurrection/adapter'
|
6
|
+
end
|
@@ -4,7 +4,7 @@ require 'dbf'
|
|
4
4
|
require 'iconv'
|
5
5
|
|
6
6
|
module DataResurrection
|
7
|
-
module
|
7
|
+
module Adapter
|
8
8
|
module DBF
|
9
9
|
def resurrect(origin_table, options)
|
10
10
|
target_table_name = options[:target]
|
@@ -12,14 +12,15 @@ module DataResurrection
|
|
12
12
|
field_types = options[:field_types]
|
13
13
|
table = ::DBF::Table.new(origin_table)
|
14
14
|
encodings = from.present? ? {from: from, to: to} : nil
|
15
|
-
data = get_data(table, encodings, reserved_words)
|
15
|
+
data = get_data(table, encodings, reserved_words, options[:replacement])
|
16
16
|
create_table(table, target_table_name, data, field_types)
|
17
17
|
copy_data(target_table_name, data)
|
18
18
|
end
|
19
19
|
|
20
|
-
def get_data(table, encodings=nil, reserved_words=[])
|
20
|
+
def get_data(table, encodings=nil, reserved_words=[], replacement = {})
|
21
21
|
result = get_raw_data(table, reserved_words)
|
22
22
|
result = handle_encodings(result, encodings) if encodings.present?
|
23
|
+
result = apply_replacements(result, replacement) if replacement
|
23
24
|
result
|
24
25
|
end
|
25
26
|
|
@@ -76,6 +77,18 @@ module DataResurrection
|
|
76
77
|
end
|
77
78
|
end
|
78
79
|
|
80
|
+
def apply_replacements(data, replacements)
|
81
|
+
data.each do |record|
|
82
|
+
record.each do |k, v|
|
83
|
+
replacements.each do |source, target|
|
84
|
+
if v.kind_of? String
|
85
|
+
record[k] = v.gsub(source, target) if v.include?(source)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
79
92
|
def mark_name_clashed_fields(schema, field_names)
|
80
93
|
field_names.each do |field|
|
81
94
|
if !schema.include?('column "%s"' % field)
|
@@ -116,6 +129,11 @@ module DataResurrection
|
|
116
129
|
reserved_words.include?(field_name.upcase) ? "#{field_name}_" : field_name
|
117
130
|
end
|
118
131
|
|
132
|
+
def reserved_words
|
133
|
+
@reserved_words ||= File.read(File.expand_path(File.join(File.dirname(__FILE__), 'dbf_reserved_words'))).
|
134
|
+
each_line.map(&:chomp)
|
135
|
+
end
|
136
|
+
|
119
137
|
class ARObject < ActiveRecord::Base
|
120
138
|
end
|
121
139
|
|
@@ -126,5 +144,4 @@ module DataResurrection
|
|
126
144
|
VALID_CHARS = [REGULAR_LETTERS, DIGITS, ACCENTED_LETTERS, SYMBOLS].join
|
127
145
|
end
|
128
146
|
end
|
129
|
-
end
|
130
|
-
|
147
|
+
end
|
File without changes
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module DataResurrection
|
2
|
+
class Resuscitator
|
3
|
+
def initialize(adapter_key, active_record_settings)
|
4
|
+
extend find_adapter(adapter_key)
|
5
|
+
ActiveRecord::Base.establish_connection(active_record_settings)
|
6
|
+
@connection = ActiveRecord::Base.connection
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def find_adapter(adapter_key)
|
12
|
+
adapter = DataResurrection::Adapter
|
13
|
+
adapter.const_get(adapter.constants.
|
14
|
+
select {|const_name| adapter.const_get(const_name).is_a? Module }.
|
15
|
+
find {|a| a.to_s.underscore.to_sym == adapter_key })
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: data_resurrection
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-04-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -81,12 +81,13 @@ executables: []
|
|
81
81
|
extensions: []
|
82
82
|
extra_rdoc_files: []
|
83
83
|
files:
|
84
|
-
- lib/data_resurrection/
|
85
|
-
- lib/data_resurrection/
|
84
|
+
- lib/data_resurrection/adapter.rb
|
85
|
+
- lib/data_resurrection/resuscitator.rb
|
86
|
+
- lib/data_resurrection/adapter/dbf.rb
|
86
87
|
- lib/data_resurrection.rb
|
87
88
|
- README.rdoc
|
88
89
|
- LICENSE.txt
|
89
|
-
- lib/data_resurrection/
|
90
|
+
- lib/data_resurrection/adapter/dbf_reserved_words
|
90
91
|
homepage: https://github.com/rodrigomanhaes/data_resurrection
|
91
92
|
licenses: []
|
92
93
|
post_install_message:
|
@@ -108,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
109
|
version: '0'
|
109
110
|
requirements: []
|
110
111
|
rubyforge_project:
|
111
|
-
rubygems_version: 1.8.
|
112
|
+
rubygems_version: 1.8.23
|
112
113
|
signing_key:
|
113
114
|
specification_version: 3
|
114
115
|
summary: Bring your data, buried in decrepit formats, back to life! Convert data from
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module DataResurrection
|
2
|
-
class Resuscitator
|
3
|
-
def initialize(adapter, active_record_settings)
|
4
|
-
extend adapters[adapter]
|
5
|
-
ActiveRecord::Base.establish_connection(active_record_settings)
|
6
|
-
@connection = ActiveRecord::Base.connection
|
7
|
-
end
|
8
|
-
|
9
|
-
private
|
10
|
-
|
11
|
-
def adapters
|
12
|
-
@adapters ||= {:dbf => DataResurrection::Adapters::DBF }
|
13
|
-
end
|
14
|
-
|
15
|
-
def reserved_words
|
16
|
-
@reserved_words ||= File.read(File.expand_path(File.join(File.dirname(__FILE__), 'reserved_words'))).
|
17
|
-
each_line.map(&:chomp)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|