fixed_width-multibyte 0.2.2 → 0.2.3
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.markdown +157 -148
- data/VERSION +1 -1
- data/fixed_width-multibyte.gemspec +9 -16
- data/lib/fixed_width-multibyte.rb +1 -0
- data/lib/fixed_width.rb +0 -1
- metadata +41 -44
- data/fixed_width.gemspec +0 -76
data/README.markdown
CHANGED
@@ -1,149 +1,158 @@
|
|
1
|
-
|
2
|
-
============
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
1
|
+
SPECIAL NOTE
|
2
|
+
============
|
3
|
+
|
4
|
+
Gem name: fixed_width-multibyte (as opposed to fixed_width)
|
5
|
+
|
6
|
+
Forked from https://github.com/timonk/fixed_width to provide multibyte support. Uses ActiveSupport::Multibyte::Chars instead of String#unpack. Tested in Ruby 1.8.7 and 1.9.2.
|
7
|
+
|
8
|
+
Per https://github.com/timonk/fixed_width/pull/1, this fork will not be reintegrated into the fixed_width because it adds the ActiveSupport dependency.
|
9
|
+
|
10
|
+
DESCRIPTION:
|
11
|
+
============
|
12
|
+
|
13
|
+
A simple, clean DSL for describing, writing, and parsing fixed-width text files.
|
14
|
+
|
15
|
+
FEATURES:
|
16
|
+
=========
|
17
|
+
|
18
|
+
* Easy DSL syntax
|
19
|
+
* Can parse and format fixed width files
|
20
|
+
* Templated sections for reuse
|
21
|
+
|
22
|
+
SYNOPSIS:
|
23
|
+
=========
|
24
|
+
|
25
|
+
##Creating a definition (Quick 'n Dirty)
|
26
|
+
|
27
|
+
Hopefully this will cover 90% of use cases.
|
28
|
+
|
29
|
+
# Create a FixedWidth::Defintion to describe a file format
|
30
|
+
FixedWidth.define :simple do |d|
|
31
|
+
# This is a template section that can be reused in other sections
|
32
|
+
d.template :boundary do |t|
|
33
|
+
t.column :record_type, 4
|
34
|
+
t.column :company_id, 12
|
35
|
+
end
|
36
|
+
|
37
|
+
# Create a section named :header
|
38
|
+
d.header(:align => :left) do |header|
|
39
|
+
# The trap tells FixedWidth which lines should fall into this section
|
40
|
+
header.trap { |line| line[0,4] == 'HEAD' }
|
41
|
+
# Use the boundary template for the columns
|
42
|
+
header.template :boundary
|
43
|
+
end
|
44
|
+
|
45
|
+
d.body do |body|
|
46
|
+
body.trap { |line| line[0,4] =~ /[^(HEAD|FOOT)]/ }
|
47
|
+
body.column :id, 10, :parser => :to_i
|
48
|
+
body.column :first, 10, :align => :left, :group => :name
|
49
|
+
body.column :last, 10, :align => :left, :group => :name
|
50
|
+
body.spacer 3
|
51
|
+
body.column :city, 20 , :group => :address
|
52
|
+
body.column :state, 2 , :group => :address
|
53
|
+
body.column :country, 3, :group => :address
|
54
|
+
end
|
55
|
+
|
56
|
+
d.footer do |footer|
|
57
|
+
footer.trap { |line| line[0,4] == 'FOOT' }
|
58
|
+
footer.template :boundary
|
59
|
+
footer.column :record_count, 10, :parser => :to_i
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
This definition would output a parsed file something like this:
|
64
|
+
|
65
|
+
{
|
66
|
+
:body => [
|
67
|
+
{ :id => 12,
|
68
|
+
:name => { :first => "Ryan", :last => "Wood" },
|
69
|
+
:address => { :city => "Foo", :state => 'SC', :country => "USA" }
|
70
|
+
},
|
71
|
+
{ :id => 13,
|
72
|
+
:name => { :first => "Jo", :last => "Schmo" },
|
73
|
+
:address => { :city => "Bar", :state => "CA", :country => "USA" }
|
74
|
+
}
|
75
|
+
],
|
76
|
+
:header => [{ :record_type => 'HEAD', :company_id => 'ABC' }],
|
77
|
+
:footer => [{ :record_type => 'FOOT', :company_id => 'ABC', :record_count => 2 }]
|
78
|
+
}
|
79
|
+
|
80
|
+
##Sections
|
81
|
+
###Declaring a section
|
82
|
+
|
83
|
+
Sections can have any name, however duplicates are not allowed. (A `DuplicateSectionNameError` will be thrown.) We use the standard `method_missing` trick. So if you see any unusual behavior, that's probably the first spot to look.
|
84
|
+
|
85
|
+
FixedWidth.define :simple do |d|
|
86
|
+
d.a_section_name do |s|
|
87
|
+
...
|
88
|
+
end
|
89
|
+
d.another_section_name do |s|
|
90
|
+
...
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
### Section options:
|
95
|
+
|
96
|
+
* `:singular` (default `false`) indicates that the section will only have a single record, and that it should not be returned nested in an array.
|
97
|
+
|
98
|
+
* `:optional` (default `false`) indicates that the section is optional. (An otherwise-specified section will raise a `RequiredSectionNotFoundError` if the trap block doesn't match the row after the last one of the previous section.)
|
99
|
+
|
100
|
+
##Columns
|
101
|
+
###Declaring a column
|
102
|
+
|
103
|
+
Columns can have any name, except for `:spacer` which is reserved. Also, duplicate column names within groupings are not allowed, and a column cannot share the same name as a group. (A `DuplicateColumnNameError` will be thrown for a duplicate column name within a grouping. A `DuplicateGroupNameError` will be thrown if you try to declare a column with the same name as an existing group or vice versa.) Again, basic `method_missing` trickery here, so be warned. You can declare columns either with the `method_missing` thing or by calling `Section#column`.
|
104
|
+
|
105
|
+
FixedWidth.define :simple do |d|
|
106
|
+
d.a_section_name do |s|
|
107
|
+
s.a_column_name 12
|
108
|
+
s.column :another_column_name, 14
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
###Column Options:
|
113
|
+
|
114
|
+
* `:align` can be set to `:left` or `:right`, to indicate which side the values should be/are justified to. By default, all columns are aligned `:right`.
|
115
|
+
|
116
|
+
* `:group` can be set to a `Symbol` indicating the name of the nested hash which the value should be parsed to when reading/the name of the nested hash the value should be extracted from when writing.
|
117
|
+
|
118
|
+
* `:parser` and `:formatter` options are symbols (to be proc-ified) or procs. By default, parsing and formatting assume that we're expecting/writing right-aligned strings, padded with spaces.
|
119
|
+
|
120
|
+
* `:nil_blank` set to true will cause whitespace-only fields to be parsed to nil, regardless of `:parser`.
|
121
|
+
|
122
|
+
* `:padding` can be set to a single character that will be used to pad formatted values, when writing fixed-width files.
|
123
|
+
|
124
|
+
* `:truncate` can be set to true to truncate any value that exceeds the `length` property of a column. If unset or set to `false`, a `FixedWidth::FormattedStringExceedsLengthError` exception will be thrown.
|
125
|
+
|
126
|
+
##Writing out fixed-width records
|
127
|
+
|
128
|
+
Then either feed it a nested struct with data values to create the file in the defined format:
|
129
|
+
|
130
|
+
test_data = {
|
131
|
+
:body => [
|
132
|
+
{ :id => 12,
|
133
|
+
:name => { :first => "Ryan", :last => "Wood" },
|
134
|
+
:address => { :city => "Foo", :state => 'SC', :country => "USA" }
|
135
|
+
},
|
136
|
+
{ :id => 13,
|
137
|
+
:name => { :first => "Jo", :last => "Schmo" },
|
138
|
+
:address => { :city => "Bar", :state => "CA", :country => "USA" }
|
139
|
+
}
|
140
|
+
],
|
141
|
+
:header => [{ :record_type => 'HEAD', :company_id => 'ABC' }],
|
142
|
+
:footer => [{ :record_type => 'FOOT', :company_id => 'ABC', :record_count => 2 }]
|
143
|
+
}
|
144
|
+
|
145
|
+
# Generates the file as a string
|
146
|
+
puts FixedWidth.generate(:simple, test_data)
|
147
|
+
|
148
|
+
# Writes the file
|
149
|
+
FixedWidth.write(file_instance, :simple, test_data)
|
150
|
+
|
151
|
+
Or parse files already in that format into a nested hash:
|
152
|
+
|
153
|
+
parsed_data = FixedWidth.parse(file_instance, :test).inspect
|
154
|
+
|
155
|
+
INSTALL:
|
156
|
+
========
|
157
|
+
|
149
158
|
sudo gem install fixed_width
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.3
|
@@ -4,21 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "0.2.
|
7
|
+
s.name = "fixed_width-multibyte"
|
8
|
+
s.version = "0.2.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Timon Karnezos"]
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
|
15
|
-
Multibyte support added while Timon is on vacation.
|
16
|
-
|
17
|
-
Shamelessly forked from ryanwood/slither [http://github.com/ryanwood/slither].
|
18
|
-
|
19
|
-
Renamed the gem to be a little clearer as to its purpose. Hate that 'nokogiri' nonsense.
|
20
|
-
}
|
21
|
-
s.email = %q{timon.karnezos@gmail.com}
|
12
|
+
s.date = "2012-01-27"
|
13
|
+
s.description = "A gem that provides a DSL for parsing and writing files of fixed-width records.\n\nMultibyte support added while Timon is on vacation.\n\nShamelessly forked from ryanwood/slither [http://github.com/ryanwood/slither].\n\nRenamed the gem to be a little clearer as to its purpose. Hate that 'nokogiri' nonsense.\n"
|
14
|
+
s.email = "timon.karnezos@gmail.com"
|
22
15
|
s.extra_rdoc_files = [
|
23
16
|
"README.markdown",
|
24
17
|
"TODO"
|
@@ -32,7 +25,7 @@ Renamed the gem to be a little clearer as to its purpose. Hate that 'nokogiri' n
|
|
32
25
|
"VERSION",
|
33
26
|
"examples/readme_example.rb",
|
34
27
|
"fixed_width-multibyte.gemspec",
|
35
|
-
"fixed_width.
|
28
|
+
"lib/fixed_width-multibyte.rb",
|
36
29
|
"lib/fixed_width.rb",
|
37
30
|
"lib/fixed_width/column.rb",
|
38
31
|
"lib/fixed_width/core_ext/symbol.rb",
|
@@ -49,10 +42,10 @@ Renamed the gem to be a little clearer as to its purpose. Hate that 'nokogiri' n
|
|
49
42
|
"spec/section_spec.rb",
|
50
43
|
"spec/spec_helper.rb"
|
51
44
|
]
|
52
|
-
s.homepage =
|
45
|
+
s.homepage = "http://github.com/timonk/fixed_width"
|
53
46
|
s.require_paths = ["lib"]
|
54
|
-
s.rubygems_version =
|
55
|
-
s.summary =
|
47
|
+
s.rubygems_version = "1.8.10"
|
48
|
+
s.summary = "A gem that provides a DSL for parsing and writing files of fixed-width records."
|
56
49
|
|
57
50
|
if s.respond_to? :specification_version then
|
58
51
|
s.specification_version = 3
|
@@ -0,0 +1 @@
|
|
1
|
+
require File.expand_path('../fixed_width', __FILE__)
|
data/lib/fixed_width.rb
CHANGED
metadata
CHANGED
@@ -1,47 +1,48 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: fixed_width-multibyte
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.3
|
4
5
|
prerelease:
|
5
|
-
version: 0.2.2
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Timon Karnezos
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
dependencies:
|
16
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-01-27 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
17
15
|
name: activesupport
|
18
|
-
|
19
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &2177839880 !ruby/object:Gem::Requirement
|
20
17
|
none: false
|
21
|
-
requirements:
|
22
|
-
- -
|
23
|
-
- !ruby/object:Gem::Version
|
24
|
-
version:
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
25
22
|
type: :runtime
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2177839880
|
25
|
+
description: ! 'A gem that provides a DSL for parsing and writing files of fixed-width
|
26
|
+
records.
|
27
|
+
|
28
|
+
|
30
29
|
Multibyte support added while Timon is on vacation.
|
31
|
-
|
30
|
+
|
31
|
+
|
32
32
|
Shamelessly forked from ryanwood/slither [http://github.com/ryanwood/slither].
|
33
|
-
|
34
|
-
Renamed the gem to be a little clearer as to its purpose. Hate that 'nokogiri' nonsense.
|
35
33
|
|
34
|
+
|
35
|
+
Renamed the gem to be a little clearer as to its purpose. Hate that ''nokogiri''
|
36
|
+
nonsense.
|
37
|
+
|
38
|
+
'
|
36
39
|
email: timon.karnezos@gmail.com
|
37
40
|
executables: []
|
38
|
-
|
39
41
|
extensions: []
|
40
|
-
|
41
|
-
extra_rdoc_files:
|
42
|
+
extra_rdoc_files:
|
42
43
|
- README.markdown
|
43
44
|
- TODO
|
44
|
-
files:
|
45
|
+
files:
|
45
46
|
- COPYING
|
46
47
|
- HISTORY
|
47
48
|
- README.markdown
|
@@ -50,7 +51,7 @@ files:
|
|
50
51
|
- VERSION
|
51
52
|
- examples/readme_example.rb
|
52
53
|
- fixed_width-multibyte.gemspec
|
53
|
-
- fixed_width.
|
54
|
+
- lib/fixed_width-multibyte.rb
|
54
55
|
- lib/fixed_width.rb
|
55
56
|
- lib/fixed_width/column.rb
|
56
57
|
- lib/fixed_width/core_ext/symbol.rb
|
@@ -66,33 +67,29 @@ files:
|
|
66
67
|
- spec/parser_spec.rb
|
67
68
|
- spec/section_spec.rb
|
68
69
|
- spec/spec_helper.rb
|
69
|
-
has_rdoc: true
|
70
70
|
homepage: http://github.com/timonk/fixed_width
|
71
71
|
licenses: []
|
72
|
-
|
73
72
|
post_install_message:
|
74
73
|
rdoc_options: []
|
75
|
-
|
76
|
-
require_paths:
|
74
|
+
require_paths:
|
77
75
|
- lib
|
78
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
77
|
none: false
|
80
|
-
requirements:
|
81
|
-
- -
|
82
|
-
- !ruby/object:Gem::Version
|
83
|
-
version:
|
84
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ! '>='
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
83
|
none: false
|
86
|
-
requirements:
|
87
|
-
- -
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version:
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
90
88
|
requirements: []
|
91
|
-
|
92
89
|
rubyforge_project:
|
93
|
-
rubygems_version: 1.
|
90
|
+
rubygems_version: 1.8.10
|
94
91
|
signing_key:
|
95
92
|
specification_version: 3
|
96
93
|
summary: A gem that provides a DSL for parsing and writing files of fixed-width records.
|
97
94
|
test_files: []
|
98
|
-
|
95
|
+
has_rdoc:
|
data/fixed_width.gemspec
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
-
# -*- encoding: utf-8 -*-
|
5
|
-
|
6
|
-
Gem::Specification.new do |s|
|
7
|
-
s.name = %q{fixed_width}
|
8
|
-
s.version = "0.2.1"
|
9
|
-
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["Timon Karnezos"]
|
12
|
-
s.date = %q{2010-05-31}
|
13
|
-
s.description = %q{A gem that provides a DSL for parsing and writing files of fixed-width records.
|
14
|
-
|
15
|
-
Shamelessly forked from ryanwood/slither [http://github.com/ryanwood/slither].
|
16
|
-
|
17
|
-
Renamed the gem to be a little clearer as to its purpose. Hate that 'nokogiri' nonsense.
|
18
|
-
}
|
19
|
-
s.email = %q{timon.karnezos@gmail.com}
|
20
|
-
s.extra_rdoc_files = [
|
21
|
-
"README.markdown",
|
22
|
-
"TODO"
|
23
|
-
]
|
24
|
-
s.files = [
|
25
|
-
".gitignore",
|
26
|
-
"COPYING",
|
27
|
-
"HISTORY",
|
28
|
-
"README.markdown",
|
29
|
-
"Rakefile",
|
30
|
-
"TODO",
|
31
|
-
"VERSION",
|
32
|
-
"examples/readme_example.rb",
|
33
|
-
"fixed_width.gemspec",
|
34
|
-
"lib/fixed_width.rb",
|
35
|
-
"lib/fixed_width/column.rb",
|
36
|
-
"lib/fixed_width/core_ext/symbol.rb",
|
37
|
-
"lib/fixed_width/definition.rb",
|
38
|
-
"lib/fixed_width/fixed_width.rb",
|
39
|
-
"lib/fixed_width/generator.rb",
|
40
|
-
"lib/fixed_width/parser.rb",
|
41
|
-
"lib/fixed_width/section.rb",
|
42
|
-
"spec/column_spec.rb",
|
43
|
-
"spec/definition_spec.rb",
|
44
|
-
"spec/fixed_width_spec.rb",
|
45
|
-
"spec/generator_spec.rb",
|
46
|
-
"spec/parser_spec.rb",
|
47
|
-
"spec/section_spec.rb",
|
48
|
-
"spec/spec_helper.rb"
|
49
|
-
]
|
50
|
-
s.homepage = %q{http://github.com/timonk/fixed_width}
|
51
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
52
|
-
s.require_paths = ["lib"]
|
53
|
-
s.rubygems_version = %q{1.3.6}
|
54
|
-
s.summary = %q{A gem that provides a DSL for parsing and writing files of fixed-width records.}
|
55
|
-
s.test_files = [
|
56
|
-
"spec/column_spec.rb",
|
57
|
-
"spec/definition_spec.rb",
|
58
|
-
"spec/fixed_width_spec.rb",
|
59
|
-
"spec/generator_spec.rb",
|
60
|
-
"spec/parser_spec.rb",
|
61
|
-
"spec/section_spec.rb",
|
62
|
-
"spec/spec_helper.rb",
|
63
|
-
"examples/readme_example.rb"
|
64
|
-
]
|
65
|
-
|
66
|
-
if s.respond_to? :specification_version then
|
67
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
68
|
-
s.specification_version = 3
|
69
|
-
|
70
|
-
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
71
|
-
else
|
72
|
-
end
|
73
|
-
else
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|