file_generator 0.0.1
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/.gitignore +17 -0
- data/Gemfile +4 -0
- data/README.md +47 -0
- data/Rakefile +1 -0
- data/file_generator.gemspec +24 -0
- data/lib/file_generator/base.rb +91 -0
- data/lib/file_generator/version.rb +3 -0
- data/lib/file_generator.rb +6 -0
- data/spec/formats.yml +5 -0
- data/spec/lib/file_generator_spec.rb +41 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/support/helpers.rb +19 -0
- metadata +61 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# file_generator
|
2
|
+
|
3
|
+
## Description
|
4
|
+
|
5
|
+
Every time we need to generate text files for our applications, we are
|
6
|
+
writing code for every format we need to generate.
|
7
|
+
|
8
|
+
FileGenerator tries to minimize the ammount of code needed to perform
|
9
|
+
this task.
|
10
|
+
|
11
|
+
# How does it work?
|
12
|
+
|
13
|
+
FileGenerator takes the header, body, and footer file formats as input
|
14
|
+
and additionally a hash with the data we want to export.
|
15
|
+
|
16
|
+
The format is expressed as string as follows:
|
17
|
+
|
18
|
+
0 => nombre
|
19
|
+
1 => longitud
|
20
|
+
2 => valor
|
21
|
+
3 => relleno
|
22
|
+
4 => alineado
|
23
|
+
|
24
|
+
|
25
|
+
as for instance:
|
26
|
+
|
27
|
+
body format "id:3:0:0:D,name:30:: :I,region_id:3:0:0:D"
|
28
|
+
|
29
|
+
|
30
|
+
and the data we want to export is:
|
31
|
+
|
32
|
+
[{"id"=>1, "region_id"=>7, "name"=>"les Escaldes"},{"id"=>2, "region_id"=>7, "name"=>"Lima"}]
|
33
|
+
|
34
|
+
FileGenerator will try to match the attribute names with the format
|
35
|
+
names, if they dont match, it will assign the value to the line of the
|
36
|
+
file to export, otherwise it will take the default value defined in the
|
37
|
+
format.
|
38
|
+
|
39
|
+
It also has names for the format which stablishes a special field as for
|
40
|
+
instance:
|
41
|
+
|
42
|
+
time: puts the current date with the format "·$"·$"·
|
43
|
+
|
44
|
+
nreg : put the ammount of records in the file in the body
|
45
|
+
|
46
|
+
## Usage
|
47
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "file_generator/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "file_generator"
|
7
|
+
s.version = FileGenerator::VERSION
|
8
|
+
s.authors = ["Martin Aceto"]
|
9
|
+
s.email = ["martin.aceto@gmail.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{Generator of files using a format description}
|
12
|
+
s.description = %q{Generator of files using a format description}
|
13
|
+
|
14
|
+
s.rubyforge_project = "file_generator"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
# s.add_development_dependency "rspec"
|
23
|
+
# s.add_runtime_dependency "rest-client"
|
24
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module FileGenerator
|
2
|
+
class Base
|
3
|
+
|
4
|
+
def initialize()
|
5
|
+
end
|
6
|
+
|
7
|
+
def generate_file(records, headerformat, bodyformat, footerformat)
|
8
|
+
file = []
|
9
|
+
fh = process_hf(headerformat, records)
|
10
|
+
file << fh
|
11
|
+
records.each do |record|
|
12
|
+
fb = process_body(bodyformat, record)
|
13
|
+
file << fb
|
14
|
+
end
|
15
|
+
ff = process_hf(footerformat, records)
|
16
|
+
file << ff
|
17
|
+
file = file.join("\n")
|
18
|
+
file
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def process_hf(format, records)
|
24
|
+
row = ''
|
25
|
+
attributes = split_format(format)
|
26
|
+
attributes.each do |attrib|
|
27
|
+
behaviors = split_behaviors(attrib) # 0=>nombre, 1=>longitud, 2=> valor, 3=> relleno, 4 => alineado
|
28
|
+
value = ''
|
29
|
+
case behaviors[0]
|
30
|
+
when 'nreg' then
|
31
|
+
value = records.size.to_s
|
32
|
+
when 'time' then
|
33
|
+
value = Time.now.strftime("%Y%m%d")
|
34
|
+
else
|
35
|
+
value = behaviors[2]
|
36
|
+
end
|
37
|
+
if (behaviors[3] != '')
|
38
|
+
if (behaviors[4] == 'I')
|
39
|
+
row << value.ljust(behaviors[1].to_i, behaviors[3])
|
40
|
+
else
|
41
|
+
row << value.rjust(behaviors[1].to_i, behaviors[3])
|
42
|
+
end
|
43
|
+
else
|
44
|
+
row << value
|
45
|
+
end
|
46
|
+
end
|
47
|
+
row
|
48
|
+
end
|
49
|
+
|
50
|
+
def process_body(format, record)
|
51
|
+
row = ''
|
52
|
+
attributes = split_format(format)
|
53
|
+
attributes.each do |attrib|
|
54
|
+
behaviors = split_behaviors(attrib) # 0=>nombre, 1=>longitud, 2=> valor, 3=> relleno, 4 => alineado
|
55
|
+
value = ''
|
56
|
+
if record.has_key?(behaviors[0])
|
57
|
+
value = record["#{behaviors[0]}"].to_s
|
58
|
+
else
|
59
|
+
case behaviors[0]
|
60
|
+
when 'time' then
|
61
|
+
value = Time.now.strftime("%Y%m%d")
|
62
|
+
else
|
63
|
+
value = behaviors[2]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
if (behaviors[3] != '')
|
67
|
+
if (behaviors[4] == 'I')
|
68
|
+
row << value.ljust(behaviors[1].to_i, behaviors[3])
|
69
|
+
else
|
70
|
+
row << value.rjust(behaviors[1].to_i, behaviors[3])
|
71
|
+
end
|
72
|
+
else
|
73
|
+
row << value
|
74
|
+
end
|
75
|
+
end
|
76
|
+
row
|
77
|
+
end
|
78
|
+
|
79
|
+
# split the format in each behaviors
|
80
|
+
def split_format(format)
|
81
|
+
format.split(',')
|
82
|
+
end
|
83
|
+
|
84
|
+
# split the line pased
|
85
|
+
# 0=>nombre, 1=>longitud, 2=> valor, 3=> relleno, 4 => alineado
|
86
|
+
def split_behaviors(behavior)
|
87
|
+
behavior.split(':')
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
data/spec/formats.yml
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe FileGenerator do
|
4
|
+
context "generating file" do
|
5
|
+
|
6
|
+
let(:file_generator) do
|
7
|
+
records = [{"id"=>1, "region_id"=>7, "name"=>"les Escaldes"},{"id"=>2, "region_id"=>7, "name"=>"Lima"}]
|
8
|
+
format = load_formats.formats
|
9
|
+
f = FileGenerator::Base.new
|
10
|
+
f.generate_file(records,format['headerformat'],format['bodyformat'],format['footerformat'])
|
11
|
+
#raise f.generate_file(records,format['headerformat'],format['bodyformat'],format['footerformat']).inspect
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should not be empty string" do
|
15
|
+
file_generator.should_not be_empty
|
16
|
+
end
|
17
|
+
|
18
|
+
it "header should be match the format" do
|
19
|
+
header = file_generator.split("\n")[0]
|
20
|
+
header.should match "CC193" + Time.now.strftime("%Y%m%d").to_s
|
21
|
+
end
|
22
|
+
|
23
|
+
it "footer should be match the format" do
|
24
|
+
footer = file_generator.split("\n")[3]
|
25
|
+
footer.should match "CC1930000000002"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "first line body should be match format" do
|
29
|
+
body = file_generator.split("\n")[1]
|
30
|
+
body.should match "001les Escaldes 007"
|
31
|
+
end
|
32
|
+
|
33
|
+
it "second line body should be match format" do
|
34
|
+
body = file_generator.split("\n")[2]
|
35
|
+
body.should match "002Lima 007"
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require "ostruct"
|
2
|
+
require "yaml"
|
3
|
+
|
4
|
+
module Helpers
|
5
|
+
|
6
|
+
def load_formats
|
7
|
+
formats_file = File.join(Dir.pwd, "/spec/formats.yml")
|
8
|
+
if File.exists?(formats_file)
|
9
|
+
conf = YAML.load(File.read("#{Dir.pwd}/spec/formats.yml"))
|
10
|
+
OpenStruct.new(conf)
|
11
|
+
else
|
12
|
+
raise "missing formats file. "
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
RSpec.configuration.include Helpers
|
19
|
+
|
metadata
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: file_generator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Martin Aceto
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-02-06 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: Generator of files using a format description
|
15
|
+
email:
|
16
|
+
- martin.aceto@gmail.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- .gitignore
|
22
|
+
- Gemfile
|
23
|
+
- README.md
|
24
|
+
- Rakefile
|
25
|
+
- file_generator.gemspec
|
26
|
+
- lib/file_generator.rb
|
27
|
+
- lib/file_generator/base.rb
|
28
|
+
- lib/file_generator/version.rb
|
29
|
+
- spec/formats.yml
|
30
|
+
- spec/lib/file_generator_spec.rb
|
31
|
+
- spec/spec_helper.rb
|
32
|
+
- spec/support/helpers.rb
|
33
|
+
homepage: ''
|
34
|
+
licenses: []
|
35
|
+
post_install_message:
|
36
|
+
rdoc_options: []
|
37
|
+
require_paths:
|
38
|
+
- lib
|
39
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
46
|
+
none: false
|
47
|
+
requirements:
|
48
|
+
- - ! '>='
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0'
|
51
|
+
requirements: []
|
52
|
+
rubyforge_project: file_generator
|
53
|
+
rubygems_version: 1.8.10
|
54
|
+
signing_key:
|
55
|
+
specification_version: 3
|
56
|
+
summary: Generator of files using a format description
|
57
|
+
test_files:
|
58
|
+
- spec/formats.yml
|
59
|
+
- spec/lib/file_generator_spec.rb
|
60
|
+
- spec/spec_helper.rb
|
61
|
+
- spec/support/helpers.rb
|