typecaster 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.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --fail-fast
2
+ --colour
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in typecaster.gemspec
4
+ gemspec
@@ -0,0 +1,3 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+ RSpec::Core::RakeTask.new('spec')
@@ -0,0 +1,83 @@
1
+ require "active_support"
2
+ require "typecaster/version"
3
+
4
+ module Typecaster
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+ def attribute(name, options={})
9
+ attribute_name = name.to_sym
10
+
11
+ raw_attributes[attribute_name] = options
12
+ attributes[attribute_name] = nil
13
+
14
+ define_method(name) do
15
+ if instance_variable_defined?("@#{name}")
16
+ instance_variable_get("@#{name}")
17
+ elsif raw_attributes[attribute_name].has_key?(:default)
18
+ define_instance_variable(name, raw_attributes[attribute_name][:default])
19
+ else
20
+ define_instance_variable(name, nil)
21
+ end
22
+ end
23
+
24
+ define_method("#{name}=") do |val|
25
+ define_instance_variable(name, val)
26
+ end
27
+ end
28
+
29
+ def attributes
30
+ @attributes ||= Hash.new
31
+ end
32
+
33
+ def raw_attributes
34
+ @raw_attributes ||= Hash.new
35
+ end
36
+ end
37
+
38
+ def initialize(attributes={})
39
+ raw_attributes.each do |name, attributes|
40
+ if attributes.has_key?(:default)
41
+ define_instance_variable(name, attributes[:default])
42
+ end
43
+ end
44
+
45
+ attributes.each do |key, value|
46
+ send "#{key}=", value
47
+ end
48
+ end
49
+
50
+ def attributes
51
+ @attributes ||= self.class.attributes
52
+ end
53
+
54
+ def raw_attributes
55
+ @raw_attributes ||= self.class.raw_attributes
56
+ end
57
+
58
+ def to_row
59
+ attributes.values.join("")
60
+ end
61
+
62
+ private
63
+
64
+ def typecaster
65
+ {}
66
+ end
67
+
68
+ def typecasted_attribute(attribute_name, options)
69
+ type = options[:type]
70
+ typecast_attribute(type).call(options[:value], options)
71
+ end
72
+
73
+ def typecast_attribute(type)
74
+ typecaster[type].new if typecaster
75
+ end
76
+
77
+ def define_instance_variable(name, val)
78
+ raw_attributes[name][:value] = val
79
+ val = typecasted_attribute(name, raw_attributes[name])
80
+ attributes[name] = val
81
+ instance_variable_set("@#{name}", val)
82
+ end
83
+ end
@@ -0,0 +1,3 @@
1
+ module Typecaster
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,2 @@
1
+ require 'rspec'
2
+ require 'typecaster'
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ class StringTypecaster
4
+ def call(value, options)
5
+ value.to_s.ljust(options[:size], " ")
6
+ end
7
+ end
8
+
9
+ class IntegerTypecaster
10
+ def call(value, options)
11
+ value.to_s.rjust(options[:size], "0")
12
+ end
13
+ end
14
+
15
+ class ObjectFormatter
16
+ include Typecaster
17
+
18
+ attribute :name, :type => "string", :size => 10
19
+ attribute :age, :type => "integer", :size => 3
20
+ attribute :identification, :type => "string", :size => 5, :default => "*"
21
+
22
+ def typecaster
23
+ {
24
+ "string" => StringTypecaster,
25
+ "integer" => IntegerTypecaster
26
+ }
27
+ end
28
+ end
29
+
30
+ describe Typecaster do
31
+ context "without values" do
32
+ subject do
33
+ ObjectFormatter.new
34
+ end
35
+
36
+ it "should return row" do
37
+ subject.to_row.should eq "* "
38
+ end
39
+ end
40
+
41
+ context "with values" do
42
+ subject do
43
+ ObjectFormatter.new(:name => "Ricardo", :age => 23, :identification => "R")
44
+ end
45
+
46
+ it "should return formatted name" do
47
+ subject.name.should eq "Ricardo "
48
+ subject.attributes[:name].should eq "Ricardo "
49
+ end
50
+
51
+ it "should return formatted age" do
52
+ subject.age.should eq "023"
53
+ subject.attributes[:age].should eq "023"
54
+ end
55
+
56
+ it "should return identification with default value" do
57
+ subject.identification.should eq "R "
58
+ subject.attributes[:identification].should eq "R "
59
+ end
60
+
61
+ it "should return row" do
62
+ subject.to_row.should eq "Ricardo 023R "
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "typecaster/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "typecaster"
7
+ s.version = Typecaster::VERSION
8
+ s.authors = ["Ricardo H."]
9
+ s.email = ["ricardohsd@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{Ease create plain old ruby object with formatted values}
12
+ s.description = %q{Typecaster make easy the job of create plain old ruby object with formatted values}
13
+
14
+ s.rubyforge_project = "typecaster"
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
+ s.add_dependency "activesupport", ">= 3.2.1"
22
+ s.add_development_dependency "rspec", ">= 2.8.0"
23
+ s.add_development_dependency 'rake', '>= 0.8.7'
24
+ end
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: typecaster
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ricardo H.
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-15 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: &2157487960 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 3.2.1
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2157487960
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ requirement: &2157486980 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 2.8.0
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *2157486980
36
+ - !ruby/object:Gem::Dependency
37
+ name: rake
38
+ requirement: &2157486420 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: 0.8.7
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *2157486420
47
+ description: Typecaster make easy the job of create plain old ruby object with formatted
48
+ values
49
+ email:
50
+ - ricardohsd@gmail.com
51
+ executables: []
52
+ extensions: []
53
+ extra_rdoc_files: []
54
+ files:
55
+ - .gitignore
56
+ - .rspec
57
+ - Gemfile
58
+ - Rakefile
59
+ - lib/typecaster.rb
60
+ - lib/typecaster/version.rb
61
+ - spec/spec_helper.rb
62
+ - spec/typecaster_spec.rb
63
+ - typecaster.gemspec
64
+ homepage: ''
65
+ licenses: []
66
+ post_install_message:
67
+ rdoc_options: []
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ! '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ requirements: []
83
+ rubyforge_project: typecaster
84
+ rubygems_version: 1.8.15
85
+ signing_key:
86
+ specification_version: 3
87
+ summary: Ease create plain old ruby object with formatted values
88
+ test_files:
89
+ - spec/spec_helper.rb
90
+ - spec/typecaster_spec.rb
91
+ has_rdoc: