dpickett-resource_factory 0.5.0

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/README.textile ADDED
@@ -0,0 +1,3 @@
1
+ h1. Resource Factory
2
+
3
+ A utility for generating xml results for active resource
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :minor: 5
3
+ :patch: 0
4
+ :major: 0
@@ -0,0 +1,16 @@
1
+ class ResourceCollection < Array
2
+ class << self
3
+ def build(collection)
4
+ new(collection)
5
+ end
6
+ end
7
+
8
+ def to_xml
9
+ if self.size > 0
10
+ resource_name = "#{self[0].factory_name.pluralize.dasherize}"
11
+ "<#{resource_name} type=\"array\">" +
12
+ self.collect{|i| i.to_xml}.join("\r\n") +
13
+ "</#{resource_name}>"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,63 @@
1
+ class ResourceFactory
2
+ class << self
3
+ attr_accessor :definitions
4
+
5
+ def define(factory_name)
6
+ default_instance = ResourceFactory.new(factory_name.to_sym)
7
+ yield(default_instance)
8
+ self.definitions ||= {}
9
+ self.definitions[factory_name.to_sym] = default_instance
10
+ end
11
+
12
+ def build(factory_name, attrs = {})
13
+ ResourceFactory.new(factory_name, attrs)
14
+ end
15
+
16
+
17
+ end
18
+
19
+ attr_accessor :attributes
20
+ attr_accessor :factory_name
21
+
22
+ self.definitions = {}
23
+
24
+ def initialize(factory_name, attributes = {})
25
+ self.attributes = {}
26
+ self.factory_name = factory_name.to_s
27
+
28
+ if self.class.definitions.has_key?(factory_name)
29
+ self.attributes =
30
+ self.class.definitions[factory_name].attributes.merge(attributes)
31
+ else
32
+ self.attributes = attributes
33
+ end
34
+ end
35
+
36
+ def method_missing(possible_name, *args, &block)
37
+ if args.size == 1 && !block_given?
38
+ self.attributes.merge!({possible_name => args[0]})
39
+ end
40
+ end
41
+
42
+ def to_h
43
+ self.attributes
44
+ end
45
+
46
+ def to_xml
47
+ element_name = self.factory_name.dasherize
48
+ "<#{element_name}>" +
49
+ self.attributes.keys.collect{|a| get_attribute_xml(a)}.join("\r\n") +
50
+ "</#{element_name}>"
51
+ end
52
+
53
+ private
54
+ def get_attribute_xml(attribute)
55
+ if self.attributes[attribute]
56
+ element_name = attribute.to_s.dasherize
57
+ "<#{element_name}>" + self.attributes[attribute] + "</#{element_name}>"
58
+ else
59
+ ""
60
+ end
61
+ end
62
+
63
+ end
@@ -0,0 +1,5 @@
1
+ Dir.glob(
2
+ File.join(File.dirname(__FILE__), 'resource_factory', '**/*.rb')
3
+ ).each do |f|
4
+ require f
5
+ end
@@ -0,0 +1,24 @@
1
+ require File.join(File.dirname(__FILE__), "..", "test_helper")
2
+
3
+ class ResourceCollectionTest < Test::Unit::TestCase
4
+ context "collections" do
5
+ setup do
6
+ @books = [
7
+ ResourceFactory.build(:nonfiction_book),
8
+ ResourceFactory.build(:nonfiction_book)
9
+ ]
10
+
11
+ @collection = ResourceCollection.build(@books)
12
+ end
13
+
14
+ should "have a header that reflects the pluralized resource type" do
15
+ assert_match(/<nonfiction-books>/, @collection.to_xml)
16
+ end
17
+
18
+ should "contain each items' xml" do
19
+ @books.each do |b|
20
+ assert_match(/#{b.to_xml}/, @collection.to_xml)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,30 @@
1
+ require File.join(File.dirname(__FILE__), "..", "test_helper")
2
+
3
+ class ResourceFactoryTest < Test::Unit::TestCase
4
+ class PetResource < ActiveResource::Base
5
+
6
+ end
7
+
8
+ ResourceFactory.define(:nonfiction_book) do |p|
9
+ p.name "The Pragmatic Programmer"
10
+ p.author "David Thomas"
11
+ end
12
+
13
+ context "building with resource factory" do
14
+ should "have default attributes" do
15
+ book = ResourceFactory.build(:nonfiction_book)
16
+ assert_not_nil book.attributes[:name]
17
+ end
18
+
19
+ should "have a header that reflects the resource type" do
20
+ book = ResourceFactory.build(:nonfiction_book)
21
+ assert_match /<nonfiction-book>/, book.to_xml
22
+ end
23
+
24
+ should "contain the attributes inside the root" do
25
+ book = ResourceFactory.build(:nonfiction_book)
26
+ assert_match /<name>#{book.attributes[:name]}<\/name>/, book.to_xml
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,9 @@
1
+ require "rubygems"
2
+ require "test/unit"
3
+ require "activeresource"
4
+ require "active_resource/http_mock"
5
+
6
+ require "hpricot"
7
+ require "shoulda"
8
+
9
+ require File.join(File.dirname(__FILE__), "..", "lib", "resource_factory")
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dpickett-resource_factory
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
5
+ platform: ruby
6
+ authors:
7
+ - Dan Pickett
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-01-21 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: ""
17
+ email: josh@technicalpickles.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - README.textile
26
+ - VERSION.yml
27
+ - lib/resource_factory
28
+ - lib/resource_factory/resource_collection.rb
29
+ - lib/resource_factory/resource_factory.rb
30
+ - lib/resource_factory.rb
31
+ - test/lib
32
+ - test/lib/resource_collection_test.rb
33
+ - test/lib/resource_factory_test.rb
34
+ - test/test_helper.rb
35
+ has_rdoc: false
36
+ homepage: http://github.com/dpickett/resource_factory
37
+ post_install_message:
38
+ rdoc_options: []
39
+
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ version:
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: "0"
53
+ version:
54
+ requirements: []
55
+
56
+ rubyforge_project:
57
+ rubygems_version: 1.2.0
58
+ signing_key:
59
+ specification_version: 2
60
+ summary: Easily create ActiveResource XML responses
61
+ test_files: []
62
+