representative 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -2,10 +2,6 @@ require "rubygems"
2
2
  require "rake"
3
3
  require "rake/clean"
4
4
 
5
- require File.dirname(__FILE__) + "/lib/representative/version.rb"
6
-
7
- task :default => :spec
8
-
9
5
  def with_gem(gem_name, lib = gem_name)
10
6
  begin
11
7
  require(lib)
@@ -16,22 +12,6 @@ def with_gem(gem_name, lib = gem_name)
16
12
  yield
17
13
  end
18
14
 
19
- with_gem "jeweler" do
20
-
21
- Jeweler::Tasks.new do |gem|
22
- gem.name = "representative"
23
- gem.version = Representative::VERSION
24
- gem.summary = "Builds XML representations of your Ruby objects"
25
- gem.email = "mdub@dogbiscuit.org"
26
- gem.homepage = "http://github.com/mdub/representative"
27
- gem.authors = ["Mike Williams"]
28
- gem.add_dependency("activesupport", ">= 2.2.2")
29
- end
30
-
31
- Jeweler::GemcutterTasks.new
32
-
33
- end
34
-
35
15
  require "spec/rake/spectask"
36
16
 
37
17
  Spec::Rake::SpecTask.new(:spec) do |spec|
@@ -39,6 +19,8 @@ Spec::Rake::SpecTask.new(:spec) do |spec|
39
19
  spec.spec_files = FileList['spec/**/*_spec.rb']
40
20
  end
41
21
 
22
+ task :default => :spec
23
+
42
24
  Spec::Rake::SpecTask.new(:rcov) do |spec|
43
25
  spec.libs << 'lib' << 'spec'
44
26
  spec.spec_files = FileList['spec/**/*_spec.rb']
@@ -0,0 +1,15 @@
1
+ module Representative
2
+
3
+ class ObjectInspector
4
+
5
+ def get_value(object, attribute_name)
6
+ object.send(attribute_name)
7
+ end
8
+
9
+ def get_metadata(object, attribute_name)
10
+ {}
11
+ end
12
+
13
+ end
14
+
15
+ end
@@ -1,3 +1,3 @@
1
1
  module Representative
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3".freeze
3
3
  end
@@ -1,14 +1,17 @@
1
+ require "active_support/core_ext/array"
2
+ require "active_support/core_ext/string"
1
3
  require "builder"
2
- require "active_support"
3
4
  require "representative/empty"
5
+ require "representative/object_inspector"
4
6
 
5
7
  module Representative
6
8
 
7
9
  class Xml < BlankSlate
8
10
 
9
- def initialize(xml_builder, subject = nil)
11
+ def initialize(xml_builder, subject = nil, options = {})
10
12
  @xml = xml_builder
11
13
  @subjects = [subject]
14
+ @inspector = options[:inspector] || ObjectInspector.new
12
15
  yield self if block_given?
13
16
  end
14
17
 
@@ -16,7 +19,7 @@ module Representative
16
19
  if name.to_s =~ /!$/
17
20
  super
18
21
  else
19
- property!(name, *args, &block)
22
+ attribute!(name, *args, &block)
20
23
  end
21
24
  end
22
25
 
@@ -24,18 +27,25 @@ module Representative
24
27
  @subjects.last
25
28
  end
26
29
 
27
- def property!(property_name, *args, &block)
30
+ def attribute!(subject_attribute_name, *args, &block)
28
31
 
29
- attributes = args.extract_options!
30
- value_generator = args.empty? ? property_name : args.shift
32
+ element_attributes = args.extract_options!
33
+ value_generator = if args.empty?
34
+ lambda do |subject|
35
+ @inspector.get_value(subject, subject_attribute_name)
36
+ end
37
+ else
38
+ args.shift
39
+ end
31
40
  raise ArgumentError, "too many arguments" unless args.empty?
32
41
 
33
- element_name = property_name.to_s.dasherize
42
+ element_name = subject_attribute_name.to_s.dasherize
34
43
 
35
- value = resolve(value_generator)
36
- resolved_attributes = resolve_attributes(attributes, value)
44
+ value = resolve_value(value_generator)
45
+ resolved_element_attributes = resolve_element_attributes(element_attributes, value)
46
+ resolved_element_attributes.merge!(@inspector.get_metadata(subject!, subject_attribute_name))
37
47
 
38
- element!(element_name, value, resolved_attributes, &block)
48
+ element!(element_name, value, resolved_element_attributes, &block)
39
49
 
40
50
  end
41
51
 
@@ -59,36 +69,40 @@ module Representative
59
69
  @xml.tag!(element_name, *tag_args, &content_generator)
60
70
  end
61
71
 
62
- def list_of!(property_name, *args, &block)
72
+ def list_of!(attribute_name, *args, &block)
63
73
 
64
74
  options = args.extract_options!
65
- value_generator = args.empty? ? property_name : args.shift
75
+ value_generator = args.empty? ? attribute_name : args.shift
66
76
  raise ArgumentError, "too many arguments" unless args.empty?
67
77
 
68
- list_name = property_name.to_s.dasherize
69
- list_attributes = options[:list_attributes] || {}
78
+ list_name = attribute_name.to_s.dasherize
79
+ list_element_attributes = options[:list_attributes] || {}
70
80
  item_name = options[:item_name] || list_name.singularize
71
- item_attributes = options[:item_attributes] || {}
81
+ item_element_attributes = options[:item_attributes] || {}
82
+
83
+ items = resolve_value(value_generator)
84
+ if items.nil?
85
+ return @xml.tag!(list_name)
86
+ end
72
87
 
73
- items = resolve(value_generator)
74
- resolved_list_attributes = resolve_attributes(list_attributes, items)
88
+ resolved_list_element_attributes = resolve_element_attributes(list_element_attributes, items)
75
89
 
76
- @xml.tag!(list_name, resolved_list_attributes.merge(:type => "array")) do
90
+ @xml.tag!(list_name, resolved_list_element_attributes.merge(:type => "array")) do
77
91
  items.each do |item|
78
- resolved_item_attributes = resolve_attributes(item_attributes, item)
79
- element!(item_name, item, resolved_item_attributes, &block)
92
+ resolved_item_element_attributes = resolve_element_attributes(item_element_attributes, item)
93
+ element!(item_name, item, resolved_item_element_attributes, &block)
80
94
  end
81
95
  end
82
96
 
83
97
  end
84
98
 
85
- def empty!(property_name, *args)
86
- property!(property_name, *args, &Representative::EMPTY)
99
+ def empty!(attribute_name, *args)
100
+ attribute!(attribute_name, *args, &Representative::EMPTY)
87
101
  end
88
102
 
89
103
  private
90
104
 
91
- def resolve(value_generator, subject = subject!)
105
+ def resolve_value(value_generator, subject = subject!)
92
106
  if value_generator == :self
93
107
  subject
94
108
  elsif value_generator.respond_to?(:to_proc)
@@ -98,16 +112,16 @@ module Representative
98
112
  end
99
113
  end
100
114
 
101
- def resolve_attributes(attributes, subject)
102
- if attributes
103
- attributes.inject({}) do |resolved, (k,v)|
104
- resolved_value = resolve(v, subject)
105
- resolved[k.to_s.dasherize] = resolved_value unless resolved_value.nil?
115
+ def resolve_element_attributes(element_attributes, subject)
116
+ if element_attributes
117
+ element_attributes.inject({}) do |resolved, (name, value_generator)|
118
+ resolved_value = resolve_value(value_generator, subject)
119
+ resolved[name.to_s.dasherize] = resolved_value unless resolved_value.nil?
106
120
  resolved
107
121
  end
108
122
  end
109
123
  end
110
-
124
+
111
125
  end
112
126
 
113
127
  end
@@ -200,6 +200,15 @@ describe Representative::Xml do
200
200
  end
201
201
  end
202
202
 
203
+ describe "with an argument that resolves to nil" do
204
+
205
+ it "omits the attribute" do
206
+ represent.list_of!(:flags)
207
+ resulting_xml.should == %(<flags/>)
208
+ end
209
+
210
+ end
211
+
203
212
  describe "with a block" do
204
213
 
205
214
  it "generates a nested element for each list element" do
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: representative
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 3
9
+ version: 0.1.3
5
10
  platform: ruby
6
11
  authors:
7
12
  - Mike Williams
@@ -9,72 +14,71 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2009-12-03 00:00:00 +11:00
17
+ date: 2010-06-24 00:00:00 +10:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: activesupport
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
25
  - - ">="
22
26
  - !ruby/object:Gem::Version
27
+ segments:
28
+ - 2
29
+ - 2
30
+ - 2
23
31
  version: 2.2.2
24
- version:
32
+ type: :runtime
33
+ version_requirements: *id001
25
34
  description:
26
35
  email: mdub@dogbiscuit.org
27
36
  executables: []
28
37
 
29
38
  extensions: []
30
39
 
31
- extra_rdoc_files:
32
- - LICENSE
33
- - README.markdown
40
+ extra_rdoc_files: []
41
+
34
42
  files:
35
- - .document
36
- - .gitignore
37
- - LICENSE
38
- - README.markdown
39
- - Rakefile
40
- - examples/xml_demo.rb
41
- - init.rb
42
- - lib/representative.rb
43
43
  - lib/representative/empty.rb
44
+ - lib/representative/object_inspector.rb
44
45
  - lib/representative/version.rb
45
46
  - lib/representative/xml.rb
46
- - representative.gemspec
47
- - spec/representative/xml_spec.rb
48
- - spec/spec_helper.rb
47
+ - lib/representative.rb
48
+ - examples/xml_demo.rb
49
+ - README.markdown
50
+ - LICENSE
49
51
  has_rdoc: true
50
52
  homepage: http://github.com/mdub/representative
51
53
  licenses: []
52
54
 
53
55
  post_install_message:
54
- rdoc_options:
55
- - --charset=UTF-8
56
+ rdoc_options: []
57
+
56
58
  require_paths:
57
59
  - lib
58
60
  required_ruby_version: !ruby/object:Gem::Requirement
59
61
  requirements:
60
62
  - - ">="
61
63
  - !ruby/object:Gem::Version
64
+ segments:
65
+ - 0
62
66
  version: "0"
63
- version:
64
67
  required_rubygems_version: !ruby/object:Gem::Requirement
65
68
  requirements:
66
69
  - - ">="
67
70
  - !ruby/object:Gem::Version
71
+ segments:
72
+ - 0
68
73
  version: "0"
69
- version:
70
74
  requirements: []
71
75
 
72
76
  rubyforge_project:
73
- rubygems_version: 1.3.5
77
+ rubygems_version: 1.3.6
74
78
  signing_key:
75
79
  specification_version: 3
76
80
  summary: Builds XML representations of your Ruby objects
77
81
  test_files:
78
82
  - spec/representative/xml_spec.rb
79
83
  - spec/spec_helper.rb
80
- - examples/xml_demo.rb
84
+ - Rakefile
data/.document DELETED
@@ -1,3 +0,0 @@
1
- README.markdown
2
- LICENSE
3
- lib/**/*.rb
data/.gitignore DELETED
@@ -1,6 +0,0 @@
1
- *.sw?
2
- .DS_Store
3
- .yardoc
4
- coverage
5
- doc
6
- pkg
data/init.rb DELETED
@@ -1 +0,0 @@
1
- require "representative"
@@ -1,58 +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{representative}
8
- s.version = "0.1.2"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Mike Williams"]
12
- s.date = %q{2009-12-03}
13
- s.email = %q{mdub@dogbiscuit.org}
14
- s.extra_rdoc_files = [
15
- "LICENSE",
16
- "README.markdown"
17
- ]
18
- s.files = [
19
- ".document",
20
- ".gitignore",
21
- "LICENSE",
22
- "README.markdown",
23
- "Rakefile",
24
- "examples/xml_demo.rb",
25
- "init.rb",
26
- "lib/representative.rb",
27
- "lib/representative/empty.rb",
28
- "lib/representative/version.rb",
29
- "lib/representative/xml.rb",
30
- "representative.gemspec",
31
- "spec/representative/xml_spec.rb",
32
- "spec/spec_helper.rb"
33
- ]
34
- s.homepage = %q{http://github.com/mdub/representative}
35
- s.rdoc_options = ["--charset=UTF-8"]
36
- s.require_paths = ["lib"]
37
- s.rubygems_version = %q{1.3.5}
38
- s.summary = %q{Builds XML representations of your Ruby objects}
39
- s.test_files = [
40
- "spec/representative/xml_spec.rb",
41
- "spec/spec_helper.rb",
42
- "examples/xml_demo.rb"
43
- ]
44
-
45
- if s.respond_to? :specification_version then
46
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
47
- s.specification_version = 3
48
-
49
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
50
- s.add_runtime_dependency(%q<activesupport>, [">= 2.2.2"])
51
- else
52
- s.add_dependency(%q<activesupport>, [">= 2.2.2"])
53
- end
54
- else
55
- s.add_dependency(%q<activesupport>, [">= 2.2.2"])
56
- end
57
- end
58
-