file_text_delimiter 0.0.2
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/Rakefile +6 -0
- data/file_text_delimiter.gemspec +10 -0
- data/lib/file_text_delimiter/class_delimiter.rb +75 -0
- data/lib/file_text_delimiter/document.rb +29 -0
- data/lib/file_text_delimiter/version.rb +4 -0
- data/lib/file_text_delimiter.rb +3 -0
- data/test/file_text_delimiter_test.rb +43 -0
- metadata +73 -0
data/Rakefile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "file_text_delimiter"
|
3
|
+
s.homepage = "https://github.com/marlesson/file_text_delimiter"
|
4
|
+
s.version = "0.0.2"
|
5
|
+
s.description = "The gem does parse a text file generating objects"
|
6
|
+
s.summary = "Having a text file with its formatting is possible to create objects defined with classes set"
|
7
|
+
s.author = "Marlesson R. O. de Santana"
|
8
|
+
s.email = "marlessonsa@gmail.com"
|
9
|
+
s.files = Dir["{lib/**/*.rb,README.rdoc,test/**/*.rb,Rakefile,*.gemspec}"]
|
10
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module FileTextDelimiter
|
2
|
+
class SizeTextNotSuporte < Exception; end
|
3
|
+
|
4
|
+
class ClassDelimiter
|
5
|
+
|
6
|
+
class << self; attr_accessor :columns, :formats_get, :formats_set; end
|
7
|
+
|
8
|
+
def initialize(attributes = {})
|
9
|
+
attributes.each do |column, value|
|
10
|
+
self.send("#{column.to_s}=", value)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.attr_delimiter(column, params = {})
|
15
|
+
attr_accessor column
|
16
|
+
|
17
|
+
self.columns ||= []
|
18
|
+
self.formats_get ||= {}
|
19
|
+
self.formats_set ||= {}
|
20
|
+
|
21
|
+
raise ArgumentNotFound, "Argument :delimiter not found" if params[:delimiter].nil?
|
22
|
+
|
23
|
+
self.columns << [column, params[:delimiter]]
|
24
|
+
self.formats_get[column] = params[:format_get] if not params[:format_get].nil?
|
25
|
+
self.formats_set[column] = params[:format_set] if not params[:format_set].nil?
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.parse_text(line)
|
29
|
+
x = 0
|
30
|
+
object = self.new
|
31
|
+
self.columns.each do |column_value|
|
32
|
+
|
33
|
+
column = column_value[0]
|
34
|
+
size = column_value[1]
|
35
|
+
value = line[x...(x+size)]
|
36
|
+
|
37
|
+
raise SizeTextNotSuporte, "Size text not suporte for range(#{x},#{x+size})" if value.nil?
|
38
|
+
|
39
|
+
if not self.formats_get[column].nil? and self.formats_get[column].instance_of? Proc
|
40
|
+
value = self.formats_get[column].call(value)
|
41
|
+
end
|
42
|
+
|
43
|
+
object.send("#{column.to_s}=", value)
|
44
|
+
|
45
|
+
x+=size
|
46
|
+
end
|
47
|
+
object
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_text
|
51
|
+
text = ""
|
52
|
+
self.class.columns.each do |column_value|
|
53
|
+
|
54
|
+
column = column_value[0]
|
55
|
+
size = column_value[1]
|
56
|
+
value = self.send(column.to_s)
|
57
|
+
|
58
|
+
if not self.class.formats_set[column].nil? and self.class.formats_set[column].instance_of? Proc
|
59
|
+
value = self.class.formats_set[column].call(value)
|
60
|
+
end
|
61
|
+
|
62
|
+
text << value[0...size].to_s.ljust(size)
|
63
|
+
end
|
64
|
+
text
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.line_match(line)
|
68
|
+
true
|
69
|
+
end
|
70
|
+
|
71
|
+
def to_s
|
72
|
+
puts "#{self.inspect}"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module FileTextDelimiter
|
2
|
+
|
3
|
+
class NotFindClassMatch < Exception; end
|
4
|
+
class MultipleFindClassMatch < Exception; end
|
5
|
+
|
6
|
+
class Document
|
7
|
+
|
8
|
+
def self.parse_file(file, klasses)
|
9
|
+
file = File.open(file, "r")
|
10
|
+
|
11
|
+
klasses = [*klasses]
|
12
|
+
objects = []
|
13
|
+
file.each_line do |line|
|
14
|
+
objects << parse_text(line, klasses)
|
15
|
+
end
|
16
|
+
objects
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.parse_text(text, klasses)
|
20
|
+
klass = [*klasses].select{|k| k.line_match(text)}
|
21
|
+
|
22
|
+
raise NotFindClassMatch, "Not find class match in line '#{text}'" if klass.empty?
|
23
|
+
raise MultipleFindClassMatch, "Find many class match in line '#{text}', #{klass.inspect}" if klass.size > 1
|
24
|
+
|
25
|
+
klass.first.parse_text(text)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "file_text_delimiter" # Added
|
3
|
+
|
4
|
+
|
5
|
+
class Teste01 < FileTextDelimiter::ClassDelimiter
|
6
|
+
attr_delimiter :prontuario, :delimiter => 10
|
7
|
+
attr_delimiter :nome, :delimiter => 40, :format_get => Proc.new{|n| n.strip}
|
8
|
+
attr_delimiter :data_coleta, :delimiter => 10, :format_get => Proc.new{|data| d, m, a = data.split("/"); Time.local(a,m,d)}
|
9
|
+
attr_delimiter :codigo_exame, :delimiter => 20, :format_get => Proc.new{|n| n.strip}
|
10
|
+
attr_delimiter :cpf, :delimiter => 11
|
11
|
+
attr_delimiter :data_nascimento, :delimiter => 10
|
12
|
+
attr_delimiter :sexo, :delimiter => 1, :format_get => Proc.new{|s| (s == "M") ? 1 : 2}
|
13
|
+
end
|
14
|
+
|
15
|
+
class ExportList < FileTextDelimiter::ClassDelimiter
|
16
|
+
|
17
|
+
attr_delimiter :name, :delimiter => 10
|
18
|
+
attr_delimiter :description, :delimiter => 50
|
19
|
+
attr_delimiter :value, :delimiter => 10, :format_set => Proc.new{|v| v.to_s.rjust(10,"0")}
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
class FileTextDelimiterTest < Test::Unit::TestCase
|
24
|
+
def test_parse_in_file01
|
25
|
+
objects = FileTextDelimiter::Document.parse_file("test/files_test/teste_01.txt", Teste01)
|
26
|
+
obj_first = objects.first
|
27
|
+
|
28
|
+
assert_equal "0000125889", obj_first.prontuario
|
29
|
+
assert_equal "JOAO DA SILVA", obj_first.nome
|
30
|
+
assert_equal Time.local(2009,12,15), obj_first.data_coleta
|
31
|
+
assert_equal "001", obj_first.codigo_exame
|
32
|
+
assert_equal "14044170606", obj_first.cpf
|
33
|
+
assert_equal "13/02/1949", obj_first.data_nascimento
|
34
|
+
assert_equal 1, obj_first.sexo
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
def test_export_file_text
|
39
|
+
export_list = ExportList.new(:name => "banana ", :description => "12 size", :value => 25.0)
|
40
|
+
assert_equal "banana 12 size 00000025.0", export_list.to_text
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
metadata
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: file_text_delimiter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Marlesson R. O. de Santana
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-04-12 00:00:00 -03:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: The gem does parse a text file generating objects
|
23
|
+
email: marlessonsa@gmail.com
|
24
|
+
executables: []
|
25
|
+
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files: []
|
29
|
+
|
30
|
+
files:
|
31
|
+
- lib/file_text_delimiter/class_delimiter.rb
|
32
|
+
- lib/file_text_delimiter/document.rb
|
33
|
+
- lib/file_text_delimiter/version.rb
|
34
|
+
- lib/file_text_delimiter.rb
|
35
|
+
- test/file_text_delimiter_test.rb
|
36
|
+
- Rakefile
|
37
|
+
- file_text_delimiter.gemspec
|
38
|
+
has_rdoc: true
|
39
|
+
homepage: https://github.com/marlesson/file_text_delimiter
|
40
|
+
licenses: []
|
41
|
+
|
42
|
+
post_install_message:
|
43
|
+
rdoc_options: []
|
44
|
+
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
none: false
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
hash: 3
|
53
|
+
segments:
|
54
|
+
- 0
|
55
|
+
version: "0"
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 3
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
version: "0"
|
65
|
+
requirements: []
|
66
|
+
|
67
|
+
rubyforge_project:
|
68
|
+
rubygems_version: 1.3.7
|
69
|
+
signing_key:
|
70
|
+
specification_version: 3
|
71
|
+
summary: Having a text file with its formatting is possible to create objects defined with classes set
|
72
|
+
test_files: []
|
73
|
+
|