Class: Exegesis::Design

Inherits:
Object
  • Object
show all
Includes:
Document
Defined in:
lib/exegesis/design.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Document

included

Constructor Details

#initialize(db) ⇒ Design

Returns a new instance of Design.



85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/exegesis/design.rb', line 85

def initialize db
  begin
    super db.get("_design/#{design_name}"), db
  rescue RestClient::ResourceNotFound
    db.put("_design/#{design_name}", self.class.canonical_design)
    retry
  end
  unless self['views'] == self.class.canonical_design['views']
    self['views'].update(self.class.canonical_design['views'])
    save
  end
end

Class Method Details

.canonical_designObject



32
33
34
35
36
37
# File 'lib/exegesis/design.rb', line 32

def self.canonical_design
  @canonical_design ||= {
    '_id' => "_design/#{design_name}",
    'views' => {}
  }
end

.compose_canonicalObject



22
23
24
25
26
27
28
29
30
# File 'lib/exegesis/design.rb', line 22

def self.compose_canonical
  Dir[design_directory + 'views' + '**/*.js'].each do |view_func|
    path = view_func.split('/')
    func = path.pop.sub(/\.js$/,'')
    name = path.pop
    canonical_design['views'][name] ||= {}
    canonical_design['views'][name][func] = File.read(view_func)
  end
end

.design_directoryObject



10
11
12
# File 'lib/exegesis/design.rb', line 10

def self.design_directory
  @design_directory ||= Pathname.new("designs/#{design_name}")
end

.design_directory=(dir) ⇒ Object



6
7
8
# File 'lib/exegesis/design.rb', line 6

def self.design_directory= dir
  @design_directory = Pathname.new(dir)
end

.design_nameObject



18
19
20
# File 'lib/exegesis/design.rb', line 18

def self.design_name
  @design_name ||= name.scan(/^(?:[A-Za-z0-9\:]+::)([A-Za-z0-9]+)Design$/).first.first.downcase
end

.design_name=(n) ⇒ Object



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

def self.design_name= n
  @design_name = n.to_s
end

.docs(name, default_options = {}) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/exegesis/design.rb', line 45

def self.docs name, default_options={}
  default_options = {:include_docs => true, :reduce => false}.merge(default_options)
  define_method name do |*opts|
    key = opts.shift
    options = parse_opts key, opts.first, default_options
    response = call_view name, options
    ids = []
    response.inject([]) do |memo, doc|
      unless ids.include?(doc['id'])
        ids << doc['id']
        memo << Exegesis.instantiate(doc['doc'], database)
      end
      memo
    end
  end
end

.hash(name, default_options = {}) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/exegesis/design.rb', line 62

def self.hash name, default_options={}
  default_options = {:group => true}.merge(default_options)
  view_name = default_options.delete(:view) || name
  define_method name do |*opts|
    key = opts.shift
    options = parse_opts key, opts.first, default_options
    options.delete(:group) if options[:key]
    
    response = call_view view_name, options
    if response.size == 1 && response.first['key'].nil?
      response.first['value']
    else
      response.inject({}) do |memo, row|
        if ! memo.has_key?(row['key'])
          memo[row['key']] = row['value']
        end
        memo
      end
    end
  end
end

.view(name, default_options = {}) ⇒ Object



39
40
41
42
43
# File 'lib/exegesis/design.rb', line 39

def self.view name, default_options={}
  define_method name do |key, *opts|
    view name, key, opts.first, default_options
  end
end

Instance Method Details

#call_view(name, opts = {}) ⇒ Object



102
103
104
105
# File 'lib/exegesis/design.rb', line 102

def call_view name, opts={}
  url = "_design/#{design_name}/_view/#{name}"
  database.raw_get(url, opts)['rows']
end

#design_nameObject



107
108
109
# File 'lib/exegesis/design.rb', line 107

def design_name
  self.class.design_name
end

#parse_opts(key, opts = {}, defaults = {}) ⇒ Object



111
112
113
114
115
116
117
# File 'lib/exegesis/design.rb', line 111

def parse_opts key, opts={}, defaults={}
  opts = straighten_args key, opts, defaults
  parse_key opts
  parse_keys opts
  parse_range opts
  opts
end

#view(name, key = nil, opts = {}) ⇒ Object



98
99
100
# File 'lib/exegesis/design.rb', line 98

def view name, key=nil, opts={}
  call_view name, parse_opts(key, opts)
end