pixxxer 0.1.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2011 Guy Royse & Alyssa Diaz
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
@@ -0,0 +1,52 @@
1
+ Pixxxer
2
+ =======
3
+
4
+ Installation
5
+ ------------
6
+ Installation is super easy. Gems works like that.
7
+
8
+ gem install pixxxer
9
+
10
+ Usage
11
+ -----
12
+
13
+ Pixxxer provide a simple DSL for defining fixed with data and then extensions to String and Hash to build and parse
14
+ those records. It can handle floats, integers, and strings.
15
+
16
+ Assuming a record like this:
17
+
18
+ Title Author Qty Price
19
+ ----- ------ --- -----
20
+ Dune Herbert 0012001295
21
+ 012345678901234567890123456789
22
+ 1 2
23
+
24
+ You can define the follwing template:
25
+
26
+ define_pixxx_template(:book)
27
+ .add_field(:title).as_string.at_position(0).with_width(10).and
28
+ .add_field(:author).as_string.at_position(10).with_width(10).and
29
+ .add_field(:quantity).as_integer.at_position(20).with_width(5).and
30
+ .add_field(:price).as_float.at_position(25).with_width(5).with_precision(2)
31
+
32
+ To use the template to parse:
33
+
34
+ record = 'Dune Herbert 0012001295'.pixxxit(:book)
35
+ record[:title].should == 'Dune '
36
+ record[:author].should == 'Herbert '
37
+ record[:quantity].should == 120
38
+ record[:price].should == 12.95
39
+
40
+ To use the template to build a record:
41
+
42
+ s = record.depixxxit(:book)
43
+ s.should == 'Dune Herbert 0012001295'
44
+
45
+ Note:
46
+ - Most things default to zero
47
+ - Fields default to strings
48
+ - at_position is zero-based
49
+
50
+ Copyright
51
+ ---------
52
+ Copyright(c) 2011 Guy Royse & Alyssa Diaz. See LICENSE for further details.
@@ -0,0 +1 @@
1
+ require 'pixxxer/pixxxer'
@@ -0,0 +1,47 @@
1
+ require 'pixxxer/field_pixxxitter'
2
+ require 'pixxxer/field_depixxxitter'
3
+
4
+ class PixxxerField
5
+ attr_reader :width, :name, :position, :type, :precision
6
+ def initialize(field_name, template)
7
+ @template = template
8
+ @name = field_name
9
+ @position = 0
10
+ @precision = 0
11
+ @pixxxitter = FieldPixxxitter.new self
12
+ @depixxxitter = FieldDepixxxitter.new self
13
+ end
14
+ def with_width(width)
15
+ @width = width
16
+ self
17
+ end
18
+ def at_position(position)
19
+ @position = position
20
+ self
21
+ end
22
+ def as_string
23
+ self
24
+ end
25
+ def as_integer
26
+ @type = Integer
27
+ self
28
+ end
29
+ def as_float
30
+ @type = Float
31
+ self
32
+ end
33
+ def with_precision(precision)
34
+ @precision = precision
35
+ self
36
+ end
37
+ def and
38
+ @template
39
+ end
40
+ def pixxxit(hash, record)
41
+ @pixxxitter.pixxxit hash, record
42
+ end
43
+ def depixxxit(record)
44
+ @depixxxitter.depixxxit record
45
+ end
46
+ end
47
+
@@ -0,0 +1,22 @@
1
+ class FieldDepixxxitter
2
+ def initialize(field)
3
+ @field = field
4
+ end
5
+ def depixxxit(record)
6
+ field = extract_field record
7
+ coerce_field field
8
+ end
9
+ def extract_field(record)
10
+ return record[@field.position...record.length] if @field.width.nil?
11
+ record[@field.position, @field.width]
12
+ end
13
+ def coerce_field(field)
14
+ return field.to_i if @field.type == Integer
15
+ return adjust_float(field.to_f) if @field.type == Float
16
+ field
17
+ end
18
+ def adjust_float(field)
19
+ field / 10 ** @field.precision
20
+ end
21
+ end
22
+
@@ -0,0 +1,45 @@
1
+ class FieldPixxxitter
2
+ def initialize(field)
3
+ @field = field
4
+ end
5
+ def pixxxit(hash, record)
6
+ field = fetch_field hash
7
+ add_to_record record, field
8
+ end
9
+ def add_to_record(record, field)
10
+ record = widen_record record
11
+ inject_field record, field
12
+ end
13
+ def widen_record(record)
14
+ record.ljust @field.position
15
+ end
16
+ def inject_field(record, field)
17
+ record[@field.position, field.length] = field
18
+ record
19
+ end
20
+ def fetch_field(hash)
21
+ field = coerce_field hash[@field.name].to_s
22
+ field = pad_field field
23
+ shorten_field field
24
+ end
25
+ def coerce_field(field)
26
+ field = (field.to_f * 10 ** @field.precision).to_i if @field.type == Float
27
+ field.to_s
28
+ end
29
+ def shorten_field(field)
30
+ if @field.type == Integer || @field.type == Float
31
+ return field[field.length - @field.width, @field.width] unless @field.width.nil?
32
+ else
33
+ return field[0, @field.width] unless @field.width.nil?
34
+ end
35
+ field
36
+ end
37
+ def pad_field(field)
38
+ if @field.type == Integer || @field.type == Float
39
+ return field.rjust(@field.width, '0') unless @field.width.nil?
40
+ else
41
+ return field.ljust(@field.width, ' ') unless @field.width.nil?
42
+ end
43
+ field
44
+ end
45
+ end
@@ -0,0 +1,46 @@
1
+ class FieldPixxxitter
2
+ def initialize(field)
3
+ @field = field
4
+ end
5
+ def pixxxit(hash, record)
6
+ field = fetch_field hash
7
+ add_to_record record, field
8
+ end
9
+ def add_to_record(record, field)
10
+ record = widen_record record
11
+ inject_field record, field
12
+ end
13
+ def widen_record(record)
14
+ record.ljust @field.position
15
+ end
16
+ def inject_field(record, field)
17
+ record[@field.position, field.length] = field
18
+ record
19
+ end
20
+ def fetch_field(hash)
21
+ field = coerce_field hash[@field.name].to_s
22
+ field = pad_field field
23
+ field = shorten_field field
24
+ field
25
+ end
26
+ def coerce_field(field)
27
+ field = (field.to_f * 10 ** @field.precision).to_i if @field.type == Float
28
+ field.to_s
29
+ end
30
+ def shorten_field(field)
31
+ if @field.type == Integer || @field.type == Float
32
+ return field[field.length - @field.width, @field.width] unless @field.width.nil?
33
+ else
34
+ return field[0, @field.width] unless @field.width.nil?
35
+ end
36
+ field
37
+ end
38
+ def pad_field(field)
39
+ if @field.type == Integer || @field.type == Float
40
+ return field.rjust(@field.width, '0') unless @field.width.nil?
41
+ else
42
+ return field.ljust(@field.width, ' ') unless @field.width.nil?
43
+ end
44
+ field
45
+ end
46
+ end
@@ -0,0 +1,19 @@
1
+ require 'pixxxer/template'
2
+
3
+ $pixxxer_templates = {}
4
+
5
+ def define_pixxx_template(template_name)
6
+ $pixxxer_templates[template_name] = PixxxerTemplate.new
7
+ end
8
+
9
+ class String
10
+ def depixxxit(template_name)
11
+ $pixxxer_templates[template_name].depixxxit self
12
+ end
13
+ end
14
+
15
+ class Hash
16
+ def pixxxit(template_name)
17
+ $pixxxer_templates[template_name].pixxxit self
18
+ end
19
+ end
@@ -0,0 +1,26 @@
1
+ require 'pixxxer/field'
2
+
3
+ class PixxxerTemplate
4
+ def initialize
5
+ @fields = {}
6
+ end
7
+ def add_field(field_name)
8
+ @fields[field_name] = PixxxerField.new(field_name, self)
9
+ @fields[field_name]
10
+ end
11
+ def depixxxit(string)
12
+ record = {}
13
+ @fields.each do |field_name, field|
14
+ record[field_name] = field.depixxxit string
15
+ end
16
+ record
17
+ end
18
+ def pixxxit(hash)
19
+ string = ''
20
+ @fields.each do |field_name, field|
21
+ string = field.pixxxit hash, string
22
+ end
23
+ string
24
+ end
25
+ end
26
+
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pixxxer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Guy Royse
9
+ - Alyssa Diaz
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2011-05-12 00:00:00.000000000 -04:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rspec
18
+ requirement: &10736808 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ! '>='
22
+ - !ruby/object:Gem::Version
23
+ version: 2.5.0
24
+ type: :development
25
+ prerelease: false
26
+ version_requirements: *10736808
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec-core
29
+ requirement: &10736532 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: 2.5.1
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: *10736532
38
+ - !ruby/object:Gem::Dependency
39
+ name: rspec-expectations
40
+ requirement: &10736256 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 2.5.0
46
+ type: :development
47
+ prerelease: false
48
+ version_requirements: *10736256
49
+ description: Simple interface for dealing with the fixed width records that are commong
50
+ required when working with legacy COBOL systems.
51
+ email:
52
+ - guy@guyroyse.com
53
+ executables: []
54
+ extensions: []
55
+ extra_rdoc_files: []
56
+ files:
57
+ - lib/pixxxer/field.rb
58
+ - lib/pixxxer/field_depixxxitter.rb
59
+ - lib/pixxxer/field_pixxxitter.rb
60
+ - lib/pixxxer/field_pixxxitter.rb~
61
+ - lib/pixxxer/pixxxer.rb
62
+ - lib/pixxxer/template.rb
63
+ - lib/pixxxer.rb
64
+ - LICENSE
65
+ - README.md
66
+ has_rdoc: true
67
+ homepage: http://github.com/guyroyse/pixxxer
68
+ licenses:
69
+ - MIT
70
+ post_install_message:
71
+ rdoc_options: []
72
+ require_paths:
73
+ - lib
74
+ required_ruby_version: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: 1.5.2
86
+ requirements: []
87
+ rubyforge_project:
88
+ rubygems_version: 1.5.2
89
+ signing_key:
90
+ specification_version: 3
91
+ summary: DSL for building and parsing fixed with records
92
+ test_files: []