Module: BluxIndexer

Included in:
BlogManager, DraftManager
Defined in:
lib/indexer.rb

Overview

Copyright 2010 Louis-Philippe Salin de l’Etoile, aka Louis Salin email: [email protected]

This file is part of Blux.

Blux is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

Blux is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with Blux. If not, see <www.gnu.org/licenses/>.

Instance Method Summary collapse

Instance Method Details

#check_countObject



99
100
101
102
103
104
105
106
107
# File 'lib/indexer.rb', line 99

def check_count
  index = load_index
  if index.keys.length > 0
    yield
  else
    msg = "there is currently no saved index"
    raise RuntimeError, msg
  end
end

#check_filename(filename) ⇒ Object



28
29
30
31
32
33
34
35
36
37
# File 'lib/indexer.rb', line 28

def check_filename(filename)
  draft_filename = "#{self.draft_dir}/#{filename}"

  if (File.exists?(draft_filename))
    yield draft_filename
  else
    msg = "draft filename #{filename} does not exist"
    raise RuntimeError, msg
  end
end

#check_index(filename) ⇒ Object



20
21
22
23
24
25
26
# File 'lib/indexer.rb', line 20

def check_index(filename)
  check_filename(filename) do
    full_index = load_index
    full_index[filename] ||= {}
    yield full_index, full_index[filename]
  end
end

#delete_attribute(filename, attr_name) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/indexer.rb', line 65

def delete_attribute(filename, attr_name)
  check_index(filename) do |full_index, index|
    case attr_name
    when "categories"
      if block_given?
        categories = yield 
        categories_to_remove = categories.split(',')

        values = index[attr_name.to_s].split(',')

        new_values = values.reject{|i| categories_to_remove.include?(i)}.join(',')
        
        if new_values.length > 0
          index[attr_name.to_s] = new_values
        else
          index.delete(attr_name.to_s)
        end
      else
        index.delete(attr_name.to_s)
      end
    else
      index.delete(attr_name.to_s)
    end

    save_index(full_index)
  end
end

#delete_index(filename) ⇒ Object



109
110
111
112
# File 'lib/indexer.rb', line 109

def delete_index(filename)
  index = load_index
  save_index if index.delete filename
end

#ensure_not_deleted(filename) ⇒ Object



136
137
138
139
140
141
# File 'lib/indexer.rb', line 136

def ensure_not_deleted(filename) 
  check_index(filename) do |full_index, index|
    msg = "draft filename #{filename} has been deleted"
    raise RuntimeError, msg if index["deleted"] 
  end
end

#get_attribute(filename, attribute) ⇒ Object



93
94
95
96
97
# File 'lib/indexer.rb', line 93

def get_attribute(filename, attribute)
  check_index(filename) do |full_index, index|
    index[attribute]
  end
end

#load_indexObject



114
115
116
117
118
119
120
121
122
123
# File 'lib/indexer.rb', line 114

def load_index
  system "touch #{@index_file}" unless File.exists? @index_file

  str = ''
  File.open(@index_file, 'r') do |f| 
    f.each_line {|l| str += l}
  end
    
  return str.length > 0 ? JSON.parse(str) : {}
end


131
132
133
134
# File 'lib/indexer.rb', line 131

def print_index
  index = load_index
  puts index.to_json + "\n" if @verbose
end

#save_index(index) ⇒ Object



125
126
127
128
129
# File 'lib/indexer.rb', line 125

def save_index(index)
  File.open(@index_file, 'w') do |f| 
    f.write(index.to_json) if index
  end
end

#set_attribute(filename, key, val) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/indexer.rb', line 39

def set_attribute(filename, key, val)
  check_index(filename) do |full_index, index|
    case key
    when "title"
      unique_title = true
      full_index.keys.reject{|k| k == filename}.each do |other_key|
        unique_title = false if (full_index[other_key.to_s][key] == val)
      end

      STDERR << "warning: title '#{val}' is not unique\n" unless unique_title 

      index[key.to_s] = val 
    when "categories"
      values = Array.new
      values << index[key.to_s] unless index[key.to_s] == nil
      values << val

      index[key.to_s] = values.join(',')
    else
      index[key.to_s] = val 
    end

    save_index(full_index)
  end
end