aboutsummaryrefslogtreecommitdiffstats
path: root/activeresource/lib
diff options
context:
space:
mode:
Diffstat (limited to 'activeresource/lib')
-rw-r--r--activeresource/lib/active_resource.rb38
-rw-r--r--activeresource/lib/active_resource/base.rb99
-rw-r--r--activeresource/lib/active_resource/connection.rb86
-rw-r--r--activeresource/lib/active_resource/struct.rb7
-rw-r--r--activeresource/lib/active_resource/version.rb9
5 files changed, 239 insertions, 0 deletions
diff --git a/activeresource/lib/active_resource.rb b/activeresource/lib/active_resource.rb
new file mode 100644
index 0000000000..529675a59c
--- /dev/null
+++ b/activeresource/lib/active_resource.rb
@@ -0,0 +1,38 @@
+#--
+# Copyright (c) 2006 David Heinemeier Hansson
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#++
+
+$:.unshift(File.dirname(__FILE__)) unless
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
+
+unless defined?(ActiveSupport)
+ begin
+ $:.unshift(File.dirname(__FILE__) + "/../../activesupport/lib")
+ require 'active_support'
+ rescue LoadError
+ require 'rubygems'
+ require_gem 'activesupport'
+ end
+end
+
+require 'active_resource/base'
+require 'active_resource/struct' \ No newline at end of file
diff --git a/activeresource/lib/active_resource/base.rb b/activeresource/lib/active_resource/base.rb
new file mode 100644
index 0000000000..2d4025e5dd
--- /dev/null
+++ b/activeresource/lib/active_resource/base.rb
@@ -0,0 +1,99 @@
+require 'active_resource/connection'
+
+module ActiveResource
+ class Base
+ class << self
+ def site=(site)
+ @@site = URI.parse(site)
+ end
+
+ def site
+ @@site
+ end
+
+ def connection(refresh = false)
+ @connection = Connection.new(site) if refresh || @connection.nil?
+ @connection
+ end
+
+ def element_name
+ self.to_s.underscore
+ end
+
+ def collection_name
+ element_name.pluralize
+ end
+
+ def element_path(id)
+ "/#{collection_name}/#{id}.xml"
+ end
+
+ def collection_path
+ "/#{collection_name}.xml"
+ end
+
+ def find(*arguments)
+ scope = arguments.slice!(0)
+
+ case scope
+ when Fixnum
+ # { :person => person1 }
+ new(connection.get(element_path(scope)).values.first)
+ when :all
+ # { :people => { :person => [ person1, person2 ] } }
+ connection.get(collection_path).values.first.values.first.collect { |element| new(element) }
+ when :first
+ find(:all, *arguments).first
+ end
+ end
+ end
+
+ attr_accessor :attributes
+
+ def initialize(attributes = {})
+ @attributes = attributes
+ end
+
+ def id
+ attributes["id"]
+ end
+
+ def id=(id)
+ attributes["id"] = id
+ end
+
+ def save
+ update
+ end
+
+ def destroy
+ connection.delete(self.class.element_path(id))
+ end
+
+ def to_xml
+ attributes.to_xml(:root => self.class.element_name)
+ end
+
+ protected
+ def connection(refresh = false)
+ self.class.connection(refresh)
+ end
+
+ def update
+ connection.put(self.class.element_path(id), to_xml)
+ end
+
+ def method_missing(method_symbol, *arguments)
+ method_name = method_symbol.to_s
+
+ case method_name.last
+ when "="
+ attributes[method_name.first(-1)] = arguments.first
+ when "?"
+ # TODO
+ else
+ attributes[method_name] || super
+ end
+ end
+ end
+end \ No newline at end of file
diff --git a/activeresource/lib/active_resource/connection.rb b/activeresource/lib/active_resource/connection.rb
new file mode 100644
index 0000000000..7318e7256f
--- /dev/null
+++ b/activeresource/lib/active_resource/connection.rb
@@ -0,0 +1,86 @@
+require 'net/https'
+require 'date'
+require 'time'
+require 'uri'
+
+module ActiveResource
+ class ConnectionError < StandardError
+ attr_reader :response
+
+ def initialize(response, message = nil)
+ @response = response
+ @message = message
+ end
+
+ def to_s
+ "Failed with #{response.code}"
+ end
+ end
+
+ class ClientError < ConnectionError
+ end
+
+ class ServerError < ConnectionError
+ end
+
+ class ResourceNotFound < ClientError
+ end
+
+ class Connection
+ attr_accessor :uri
+
+ class << self
+ def requests
+ @@requests ||= []
+ end
+ end
+
+ def initialize(site)
+ @site = site
+ end
+
+ def get(path)
+ Hash.create_from_xml(request(:get, path).body)
+ end
+
+ def delete(path)
+ request(:delete, path)
+ end
+
+ def put(path, body)
+ request(:put, path, body)
+ end
+
+ def post(path, body)
+ request(:post, path, body)
+ end
+
+ private
+ def request(method, *arguments)
+ response = http.send(method, *arguments)
+
+ case response.code.to_i
+ when 200...300
+ response
+ when 404
+ raise(ResourceNotFound.new(response))
+ when 400...500
+ raise(ClientError.new(response))
+ when 500...600
+ raise(ServerError.new(response))
+ else
+ raise(ConnectionError.new(response, "Unknown response code: #{response.code}"))
+ end
+ end
+
+ def http
+ unless @http
+ @http = Net::HTTP.new(@site.host, @site.port)
+ @http.use_ssl = @site.is_a?(URI::HTTPS)
+ @http.verify_mode = OpenSSL::SSL::VERIFY_NONE if @http.use_ssl
+ end
+
+ @http
+ end
+ end
+end \ No newline at end of file
diff --git a/activeresource/lib/active_resource/struct.rb b/activeresource/lib/active_resource/struct.rb
new file mode 100644
index 0000000000..6f4ffecc20
--- /dev/null
+++ b/activeresource/lib/active_resource/struct.rb
@@ -0,0 +1,7 @@
+module ActiveResource
+ class Struct
+ def self.create
+ Class.new(Base)
+ end
+ end
+end \ No newline at end of file
diff --git a/activeresource/lib/active_resource/version.rb b/activeresource/lib/active_resource/version.rb
new file mode 100644
index 0000000000..f4e3220932
--- /dev/null
+++ b/activeresource/lib/active_resource/version.rb
@@ -0,0 +1,9 @@
+module ActiveResource
+ module VERSION #:nodoc:
+ MAJOR = 0
+ MINOR = 5
+ TINY = 0
+
+ STRING = [MAJOR, MINOR, TINY].join('.')
+ end
+end