Class: CouchModel::Design

Inherits:
Object
  • Object
show all
Defined in:
lib/couch_model/design.rb

Overview

The Design class acts as a wrapper for CouchDB design documents.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(database, model_class, attributes = { }) ⇒ Design

Returns a new instance of Design.



19
20
21
22
23
24
25
26
27
28
29
# File 'lib/couch_model/design.rb', line 19

def initialize(database, model_class, attributes = { })
  @database     = database
  @model_class  = model_class
  @language     = "javascript"
  @views        = [ ]

  load_file
  self.id       = attributes[:id]       if attributes.has_key?(:id)
  self.language = attributes[:language] if attributes.has_key?(:language)
  self.views    = attributes[:views]    if attributes.has_key?(:views)
end

Instance Attribute Details

#databaseObject (readonly)

Returns the value of attribute database.



12
13
14
# File 'lib/couch_model/design.rb', line 12

def database
  @database
end

#idObject

Returns the value of attribute id.



14
15
16
# File 'lib/couch_model/design.rb', line 14

def id
  @id
end

#languageObject

Returns the value of attribute language.



16
17
18
# File 'lib/couch_model/design.rb', line 16

def language
  @language
end

#model_classObject (readonly)

Returns the value of attribute model_class.



13
14
15
# File 'lib/couch_model/design.rb', line 13

def model_class
  @model_class
end

#revObject

Returns the value of attribute rev.



15
16
17
# File 'lib/couch_model/design.rb', line 15

def rev
  @rev
end

#viewsObject

Returns the value of attribute views.



17
18
19
# File 'lib/couch_model/design.rb', line 17

def views
  @views
end

Instance Method Details

#exists?Boolean

Returns:

  • (Boolean)


69
70
71
72
73
74
# File 'lib/couch_model/design.rb', line 69

def exists?
  Transport::JSON.request :get, self.url, :expected_status_code => 200
  true
rescue Transport::JSON::UnexpectedStatusCodeError
  false
end

#filenameObject



31
32
33
# File 'lib/couch_model/design.rb', line 31

def filename
  @filename ||= File.join(CouchModel::Configuration.design_directory, "#{@model_class.to_s.underscore}.design")
end

#generate_view(name, options = { }) ⇒ Object



51
52
53
54
55
# File 'lib/couch_model/design.rb', line 51

def generate_view(name, options = { })
  view = View.new self, options.merge(:name => name.to_s)
  @views.insert 0, view
  view
end

#load_fileObject



35
36
37
38
39
40
41
42
# File 'lib/couch_model/design.rb', line 35

def load_file
  hash = YAML::load_file self.filename
  self.class.symbolize_hash_keys hash
  self.id, self.language, self.views = hash.values_at(:id, :language, :views)
  true
rescue Errno::ENOENT
  false
end

#pushObject



76
77
78
79
80
81
82
# File 'lib/couch_model/design.rb', line 76

def push
  url = self.url
  evaluate Transport::JSON.request(:get, url)

  Transport::JSON.request :put, url, :body => self.to_hash, :expected_status_code => 201
  true
end

#to_hashObject



57
58
59
60
61
62
63
64
65
66
67
# File 'lib/couch_model/design.rb', line 57

def to_hash
  rev = self.rev
  hash = {
    "_id"       => "_design/#{self.id}",
    "language"  => self.language,
    "views"     => { }
  }
  hash.merge! "_rev" => rev if rev
  @views.each { |view| hash["views"].merge! view.to_hash }
  hash
end

#urlObject



84
85
86
# File 'lib/couch_model/design.rb', line 84

def url
  "#{@database.url}/_design/#{self.id}"
end