fixed-width-structures 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ *.swp
6
+ vendor/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in fixed-width-structures.gemspec
4
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require 'bundler/setup'
2
+
3
+ require 'bundler'
4
+ Bundler::GemHelper.install_tasks
5
+
6
+ task :default => :test
7
+
8
+ desc "unit tests"
9
+ task :test do
10
+ exec 'bundle exec rspec test/**/*.rb'
11
+ end
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "fixed-width-structures/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "fixed-width-structures"
7
+ s.version = FixedWidthStructure::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Clive Crous"]
10
+ s.email = ["clive@crous.co.za"]
11
+ s.homepage = "http://www.darkarts.co.za/fixed-width-structures"
12
+ s.summary = %q{Simplify usage of fixed width text based data structures}
13
+ s.description = %q{Simplify usage of fixed width text based data structures as one generally finds used in older apps written in languages like COBOL}
14
+
15
+ s.add_development_dependency "bundler", ">= 1.0.0"
16
+ s.add_development_dependency "rake", [">= 0.8.7","< 0.9.0"]
17
+ s.add_development_dependency "rspec", ">= 1.3.0"
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
+ s.require_paths = ["lib"]
23
+ end
@@ -0,0 +1,3 @@
1
+ class FixedWidthStructure
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,49 @@
1
+ class FixedWidthStructure
2
+
3
+ def self.add_attribute( attribute, type, size )
4
+ @attributes ||= {}
5
+ @attributes[ attribute.to_sym ] = {
6
+ :type => type,
7
+ :size => size,
8
+ :position => self.size
9
+ }
10
+ increment_size( size )
11
+ attr_accessor attribute.to_sym
12
+ end
13
+
14
+ def self.attributes
15
+ @attributes ||= {}
16
+ end
17
+
18
+ def self.size
19
+ @size ||= 0
20
+ end
21
+
22
+ def self.increment_size( increment )
23
+ @size = self.size + increment
24
+ end
25
+
26
+ def self.alphabetic( attribute, length )
27
+ add_attribute( attribute, "%-#{length}.#{length}s", length )
28
+ define_method attribute do
29
+ value = instance_variable_get( "@#{attribute}" )
30
+ value ? value : ''
31
+ end
32
+ end
33
+
34
+ def self.numeric( attribute, length )
35
+ add_attribute( attribute, "%#{length}.#{length}d", length )
36
+ define_method attribute do
37
+ value = instance_variable_get( "@#{attribute}" )
38
+ value ? value : 0
39
+ end
40
+ end
41
+
42
+ def to_s
43
+ self.class.attributes.to_a.sort{|a,b|a.last[:position]<=>b.last[:position]}.inject('') do |result,current|
44
+ this = current.last[ :type ]%send(current.first)
45
+ result << "%-#{current.last[:size]}.#{current.last[:size]}s"%this
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,30 @@
1
+ require 'fixed-width-structures'
2
+
3
+ describe 'Alphabetics' do
4
+
5
+ before do
6
+ @alphabetic_class = Class.new( FixedWidthStructure )
7
+ end
8
+
9
+ it 'should increment the position' do
10
+ @alphabetic_class.size.should == 0
11
+ @alphabetic_class.alphabetic( :name, 20 )
12
+ @alphabetic_class.size.should == 20
13
+ FixedWidthStructure.size.should == 0
14
+ end
15
+
16
+ it 'should pad with space' do
17
+ @alphabetic_class.alphabetic( :name, 10 )
18
+ alphabetic = @alphabetic_class.new
19
+ alphabetic.name = "Clive"
20
+ alphabetic.to_s.should == "Clive "
21
+ end
22
+
23
+ it 'should cut fields that are too long' do
24
+ @alphabetic_class.alphabetic( :name, 3 )
25
+ alphabetic = @alphabetic_class.new
26
+ alphabetic.name = "Clive"
27
+ alphabetic.to_s.should == "Cli"
28
+ end
29
+
30
+ end
@@ -0,0 +1,42 @@
1
+ require 'fixed-width-structures'
2
+
3
+ describe 'Combinations' do
4
+
5
+ before do
6
+ @my_class = Class.new( FixedWidthStructure )
7
+ end
8
+
9
+ it 'should combine the whole lot' do
10
+ @my_class.alphabetic( :name, 10 )
11
+ @my_class.alphabetic( :surname, 15 )
12
+ @my_class.numeric( :age, 3 )
13
+ @my_class.numeric( :account_number, 11 )
14
+ @my_class.alphabetic( :gender, 1 )
15
+ @my_class.numeric( :date, 8 )
16
+
17
+ clive = @my_class.new
18
+ clive.name = "Clive"
19
+ clive.surname = "Crous"
20
+ clive.age = 36
21
+ clive.account_number = 12345678901
22
+ clive.gender = 'M'
23
+ clive.date = 20110213
24
+
25
+ clive.to_s.should == 'Clive Crous 03612345678901M20110213'
26
+
27
+ bob = @my_class.new
28
+ bob.name = "Bobamalithoniasyner"
29
+ bob.age = 13
30
+ bob.surname = "Yes"
31
+
32
+ bob.to_s.should == 'BobamalithYes 01300000000000 00000000'
33
+
34
+ mary = @my_class.new
35
+ mary.age = 12345
36
+
37
+ mary.to_s.should == ' 12300000000000 00000000'
38
+
39
+ end
40
+
41
+ end
42
+
data/test/numeric.rb ADDED
@@ -0,0 +1,30 @@
1
+ require 'fixed-width-structures'
2
+
3
+ describe 'Numerics' do
4
+
5
+ before do
6
+ @numeric_class = Class.new( FixedWidthStructure )
7
+ end
8
+
9
+ it 'should increment the position' do
10
+ @numeric_class.size.should == 0
11
+ @numeric_class.numeric( :age, 20 )
12
+ @numeric_class.size.should == 20
13
+ FixedWidthStructure.size.should == 0
14
+ end
15
+
16
+ it 'should pad with zeros' do
17
+ @numeric_class.numeric( :age, 10 )
18
+ numeric = @numeric_class.new
19
+ numeric.age = 37
20
+ numeric.to_s.should == "0000000037"
21
+ end
22
+
23
+ it 'should cut fields that are too long' do
24
+ @numeric_class.numeric( :age, 2 )
25
+ numeric = @numeric_class.new
26
+ numeric.age = 127
27
+ numeric.to_s.should == "12"
28
+ end
29
+
30
+ end
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fixed-width-structures
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Clive Crous
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-05-30 00:00:00 +02:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: bundler
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 1
29
+ - 0
30
+ - 0
31
+ version: 1.0.0
32
+ type: :development
33
+ prerelease: false
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: rake
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ segments:
43
+ - 0
44
+ - 8
45
+ - 7
46
+ version: 0.8.7
47
+ - - <
48
+ - !ruby/object:Gem::Version
49
+ segments:
50
+ - 0
51
+ - 9
52
+ - 0
53
+ version: 0.9.0
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: *id002
57
+ - !ruby/object:Gem::Dependency
58
+ name: rspec
59
+ requirement: &id003 !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ segments:
65
+ - 1
66
+ - 3
67
+ - 0
68
+ version: 1.3.0
69
+ type: :development
70
+ prerelease: false
71
+ version_requirements: *id003
72
+ description: Simplify usage of fixed width text based data structures as one generally finds used in older apps written in languages like COBOL
73
+ email:
74
+ - clive@crous.co.za
75
+ executables: []
76
+
77
+ extensions: []
78
+
79
+ extra_rdoc_files: []
80
+
81
+ files:
82
+ - .gitignore
83
+ - Gemfile
84
+ - Rakefile
85
+ - fixed-width-structures.gemspec
86
+ - lib/fixed-width-structures.rb
87
+ - lib/fixed-width-structures/version.rb
88
+ - test/alphabetic.rb
89
+ - test/combinations.rb
90
+ - test/numeric.rb
91
+ has_rdoc: true
92
+ homepage: http://www.darkarts.co.za/fixed-width-structures
93
+ licenses: []
94
+
95
+ post_install_message:
96
+ rdoc_options: []
97
+
98
+ require_paths:
99
+ - lib
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ hash: 3481926565919442266
106
+ segments:
107
+ - 0
108
+ version: "0"
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ none: false
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ hash: 3481926565919442266
115
+ segments:
116
+ - 0
117
+ version: "0"
118
+ requirements: []
119
+
120
+ rubyforge_project:
121
+ rubygems_version: 1.3.7
122
+ signing_key:
123
+ specification_version: 3
124
+ summary: Simplify usage of fixed width text based data structures
125
+ test_files: []
126
+