lib/exegesis/database.rb in mattly-exegesis-0.2.6 vs lib/exegesis/database.rb in mattly-exegesis-0.2.8

- old
+ new

@@ -1,68 +1,35 @@ require 'pathname' module Exegesis module Database + autoload :Designs, 'exegesis/database/designs' + autoload :Documents, 'exegesis/database/documents' + autoload :Singleton, 'exegesis/database/singleton' + autoload :Rest, 'exegesis/database/rest' VALID_NAME_PATTERN = '[-a-z0-9_\$\(\)\+\/]+' + URI_PATTERN = /\A(https?:\/\/[-0-9a-z\.]+(?::\d+))\/(#{Exegesis::Database::VALID_NAME_PATTERN})\Z/ + NAME_PATTERN = /\A#{Exegesis::Database::VALID_NAME_PATTERN}\Z/ def self.included base base.send :attr_accessor, :server, :uri base.send :include, InstanceMethods - base.extend ClassMethods + base.extend Exegesis::Database::Designs + base.extend Exegesis::Database::Documents end - module ClassMethods - def designs_directory dir=nil - if dir - @designs_directory = Pathname.new(dir) - else - @designs_directory ||= Pathname.new('designs') - end - end - - # declare a design document for this database. Creates a new class and yields a given block to the class to - # configure the design document and declare views; See Class methods for Exegesis::Design - def design design_name, opts={}, &block - klass_name = "#{design_name.to_s.capitalize}Design" - klass = const_set(klass_name, Class.new(Exegesis::Design)) - klass.design_directory = opts[:directory] || self.designs_directory + design_name.to_s - klass.design_name = opts[:name] || design_name.to_s - klass.compose_canonical - klass.class_eval &block - define_method design_name do - @exegesis_designs ||= {} - @exegesis_designs[design_name] ||= klass.new(self) - end - end - - def named_document document_name, opts={}, &block - klass_name = document_name.to_s.capitalize.gsub(/_(\w)/) { $1.capitalize } - klass = const_set(klass_name, Class.new(Exegesis::GenericDocument)) - klass.unique_id { document_name.to_s } - klass.class_eval &block if block - define_method document_name do - @exegesis_named_documents ||= {} - @exegesis_named_documents[document_name] ||= begin - get(document_name.to_s) - rescue RestClient::ResourceNotFound - doc = klass.new({}, self) - doc.save - doc - end - end - end - end - module InstanceMethods + include Exegesis::Database::Rest + # Create a Database adapter for the given server and database name. Will raise # RestClient::ResourceNotFound if the database does not exist. def initialize server, database_name=nil if database_name.nil? - if server.match(/\A(https?:\/\/[-0-9a-z\.]+(?::\d+))\/(#{Exegesis::Database::VALID_NAME_PATTERN})\Z/) + if server.match(URI_PATTERN) @server = Exegesis::Server.new($1) database_name = $2 - elsif server.match(/\A#{Exegesis::Database::VALID_NAME_PATTERN}\Z/) + elsif server.match(NAME_PATTERN) @server = Exegesis::Server.new #localhost database_name = server else raise "Not a valid database url or name" end @@ -76,58 +43,8 @@ def to_s "#<#{self.class.name}(Exegesis::Database):#{self.object_id} uri=#{uri}>" end alias :inspect :to_s - # performs a raw GET request against the database - def raw_get id, options={} - keys = options.delete(:keys) - id = Exegesis::Http.escape_id id - url = Exegesis::Http.format_url "#{@uri}/#{id}", options - if id.match(%r{^_design/.*/_view/.*$}) && keys - Exegesis::Http.post url, {:keys => keys}.to_json - else - Exegesis::Http.get url - end - end - - # GETs a document with the given id from the database - def get id, opts={} - if id.kind_of?(Array) - collection = opts.delete(:collection) # nil or true for yes, false for no - r = post '_all_docs?include_docs=true', {"keys"=>id} - r['rows'].map {|d| Exegesis.instantiate d['doc'], self } - else - Exegesis.instantiate raw_get(id), self - end - end - - # saves a document or collection thereof - def save docs - if docs.is_a?(Array) - post "_bulk_docs", { 'docs' => docs } - else - result = docs['_id'].nil? ? post(docs) : put(docs['_id'], docs) - if result['ok'] - docs['_id'] = result['id'] - docs['_rev'] = result['rev'] - end - docs - end - end - - # PUTs the body to the given id in the database - def put id, body, headers={} - Exegesis::Http.put "#{@uri}/#{id}", (body || '').to_json, headers - end - - # POSTs the body to the database - def post url, body={}, headers={} - if body.is_a?(Hash) && body.empty? - body = url - url = '' - end - Exegesis::Http.post "#{@uri}/#{url}", (body || '').to_json, headers - end end end end \ No newline at end of file