file_text_delimiter 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "rake/testtask"
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << "lib"
5
+ t.test_files = Dir["test/**/*_test.rb"]
6
+ end
@@ -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,4 @@
1
+ module FileTextDelimiter
2
+ # Current library version
3
+ VERSION = '0.0.2'
4
+ end
@@ -0,0 +1,3 @@
1
+ require 'file_text_delimiter/class_delimiter'
2
+ require 'file_text_delimiter/document'
3
+ require 'file_text_delimiter/version'
@@ -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
+