Skip to content

Commit

Permalink
Payload map
Browse files Browse the repository at this point in the history
  • Loading branch information
DanielVartanov committed May 20, 2010
1 parent c062776 commit eecbdcc
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 0 deletions.
44 changes: 44 additions & 0 deletions lib/payload_map.rb
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,44 @@
module SData
module PayloadMap
def define_payload_map(map)
cattr_accessor :payload_map
cattr_accessor :payload

self.payload_map = map
self.payload = payload_fields_proxy
end

protected

module PayloadFieldsProxy
module ClassMethods
def define_readers(readers)
readers.each { |reader| attr_reader reader }
end
end

module InstanceMethods
def set_values(values)
values.each_pair do |key, value|
ivar_sym = "@#{key.to_s}".to_sym
instance_variable_set ivar_sym, value
end
end
end
end

def payload_fields_proxy
proxy_class = Class.new
proxy_class.extend PayloadFieldsProxy::ClassMethods
proxy_class.__send__ :include, PayloadFieldsProxy::InstanceMethods
proxy_class.define_readers(self.payload_map.keys)

returning proxy_class.new do |proxy|
field_values = self.payload_map.merge(self.payload_map) { |key, value| value[:static_value] }
proxy.set_values(field_values)
end
end
end
end

VirtualBase.extend SData::PayloadMap
37 changes: 37 additions & 0 deletions test/unit/payload_map_spec.rb
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,37 @@
require File.join(File.dirname(__FILE__), 'spec_helper')

describe SData::PayloadMap do
context "given a VirtualBase class extended by SData::PayloadMap" do
before :all do
VirtualBase.extend SData::PayloadMap
end

it "should respond to #payload_map class method" do
VirtualBase.should respond_to(:define_payload_map)
end

describe "#define_payload_map" do
context "when mapping leads to static value" do
before :all do
VirtualBase.define_payload_map :tax_reference => { :static_value => 'Some static tax reference' }
end

subject { VirtualBase.new(Object) }

it { should respond_to(:payload) }

context "when correspondent field method is called" do
it "should return given static value" do
subject.payload.tax_reference.should == 'Some static tax reference'
end
end

describe "#payload_map" do
subject { VirtualBase.new(Object).payload_map }

it { should == { :tax_reference => { :static_value => 'Some static tax reference' } } }
end
end
end
end
end

0 comments on commit eecbdcc

Please sign in to comment.