Module: CouchRestRails::Views

Extended by:
Views
Included in:
Views
Defined in:
lib/couch_rest_rails/views.rb

Instance Method Summary collapse

Instance Method Details

#assemble_views(design_doc_path) ⇒ Object

Assemble views from file-system path design_doc_path



57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/couch_rest_rails/views.rb', line 57

def assemble_views(design_doc_path)
  views = {}

  Dir.glob(File.join(design_doc_path, '*')).each do |view_folder|
    view = {}
    map_file    = File.join(view_folder, 'map.js')
    reduce_file = File.join(view_folder, 'reduce.js')

    view[:map]    = IO.read(map_file)    if File.exist?(map_file)
    view[:reduce] = IO.read(reduce_file) if File.exist?(reduce_file) && File.size(reduce_file) > 0
    views[File.basename(view_folder)] = view if view[:map]
  end
  views
end

#push(database, design_doc) ⇒ Object

Push views to couchdb



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/couch_rest_rails/views.rb', line 6

def push(database, design_doc)
  result = []
  result << "database = #{database} :: design_doc = #{design_doc}"
  db_dir = File.join(RAILS_ROOT, CouchRestRails.setup_path, database)
  return "Database directory '#{database}' does not exist" unless (database == "*" || File.exist?(db_dir))

  Dir[db_dir].each do |db|
    return "Views directory '#{db}/views' does not exist"  unless File.exist?("#{db}/views")

    # CouchDB checks
    db_name = COUCHDB_CONFIG[:db_prefix] + File.basename(db) + COUCHDB_CONFIG[:db_suffix]
    begin
      CouchRest.get("#{COUCHDB_CONFIG[:host_path]}/#{db_name}")
    rescue => err
      return "CouchDB database '#{db_name}' does not exist. Create it first. (#{err})"
    end

    db_con = CouchRest.database("#{COUCHDB_CONFIG[:host_path]}/#{db_name}")
    Dir.glob(File.join(db, "views", design_doc)).each do |doc|
      design_doc_name = File.basename(doc)

      # Load views from filesystem & CouchDB
      views = assemble_views(doc)
      couchdb_design = db_con.get("_design/#{design_doc_name}") rescue nil

      # Update CouchDB's freshly-fetched views, but don't destroy
      # any view not referenced on the FS. Not sure about that part:
      # should we synchronize aggressively?
      views = couchdb_design['views'].merge(views) unless couchdb_design.nil?

      if views.empty?
        result << "No updatable views in #{doc}/#{File.basename(doc)}"
      else

        # Create or update the design, then set its views
        if couchdb_design.nil?
          couchdb_design = { '_id'      => "_design/#{design_doc_name}",
                             'language' => 'javascript' }
        end
        couchdb_design['views'] = views

        db_con.save_doc(couchdb_design)
        result << "Added views to #{design_doc_name}: #{views.keys.join(', ')}"
      end
    end
    result << "No views were found in '#{File.join(db, "views", design_doc)}'" if result.empty?
  end
  result.join("\n")
end