representative 0.1.2 → 0.1.3

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/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
-