diff options
Diffstat (limited to 'activeresource/lib/active_resource')
-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 |
4 files changed, 201 insertions, 0 deletions
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 |