diff options
Diffstat (limited to 'activeresource/lib')
-rw-r--r-- | activeresource/lib/active_resource.rb | 38 | ||||
-rw-r--r-- | activeresource/lib/active_resource/base.rb | 99 | ||||
-rw-r--r-- | activeresource/lib/active_resource/connection.rb | 86 | ||||
-rw-r--r-- | activeresource/lib/active_resource/struct.rb | 7 | ||||
-rw-r--r-- | activeresource/lib/active_resource/version.rb | 9 |
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 |