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 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
+