Class: TenderImport::Archive

Inherits:
Object
  • Object
show all
Includes:
FileUtils
Defined in:
lib/tender_import/archive.rb

Defined Under Namespace

Classes: Error

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(site_name, options = {}) ⇒ Archive

Options:

buffer

When true, don’t flush to disk until the end. Defaults to false.



50
51
52
53
54
55
56
57
58
# File 'lib/tender_import/archive.rb', line 50

def initialize site_name, options = {}
  @site = site_name
  @export_dir = ".#{site_name}-export-#{$$}"
  @report = []
  @import = {}
  @stats = {}
  @buffer = options.key?(:buffer) ? !!options[:buffer] : false
  @category_counter = Hash.new(0)
end

Instance Attribute Details

#bufferObject (readonly)

Returns the value of attribute buffer.



44
45
46
# File 'lib/tender_import/archive.rb', line 44

def buffer
  @buffer
end

#reportObject (readonly)

Returns the value of attribute report.



44
45
46
# File 'lib/tender_import/archive.rb', line 44

def report
  @report
end

#siteObject (readonly)

Returns the value of attribute site.



44
45
46
# File 'lib/tender_import/archive.rb', line 44

def site
  @site
end

#statsObject (readonly)

Returns the value of attribute stats.



44
45
46
# File 'lib/tender_import/archive.rb', line 44

def stats
  @stats
end

Instance Method Details

#add_category(params) ⇒ Object

Returns a handle needed for adding discussions



66
67
68
69
# File 'lib/tender_import/archive.rb', line 66

def add_category params
  cat = validate_and_store :category, params
  cat ? category_key(cat) : nil
end

#add_discussion(category_key, params) ⇒ Object

Raises:



71
72
73
74
# File 'lib/tender_import/archive.rb', line 71

def add_discussion category_key, params
  raise Error, "add_discussion: missing category key" if category_key.nil?
  validate_and_store :discussion, params, :key => category_key
end

#add_user(params) ⇒ Object

Returns the params on success, nil on failure



61
62
63
# File 'lib/tender_import/archive.rb', line 61

def add_user params
  validate_and_store :user, {:state => 'user'}.merge(params)
end

#categoriesObject



84
85
86
# File 'lib/tender_import/archive.rb', line 84

def categories
  @import[:category]
end

#category_id(cat) ⇒ Object



80
81
82
# File 'lib/tender_import/archive.rb', line 80

def category_id cat
  cat[:name].gsub(/\W+/,'_').downcase
end

#category_key(cat) ⇒ Object



76
77
78
# File 'lib/tender_import/archive.rb', line 76

def category_key cat
  "category:#{category_id cat}".downcase
end

#discussions(category_key) ⇒ Object

Raises:



88
89
90
91
# File 'lib/tender_import/archive.rb', line 88

def discussions category_key
  raise Error, "discussions: missing category key" if category_key.nil?
  @import[category_key] || []
end

#usersObject



93
94
95
# File 'lib/tender_import/archive.rb', line 93

def users
  @import[:user]
end

#write_archiveObject



97
98
99
100
101
102
103
104
# File 'lib/tender_import/archive.rb', line 97

def write_archive
  write_users if users
  write_categories_and_discussions if categories
  export_file = "export_#{site}.tgz"
  system "tar -zcf #{export_file} -C #{export_dir} ."
  system "rm -rf #{export_dir}"
  return export_file
end

#write_categories_and_discussionsObject



127
128
129
130
131
132
# File 'lib/tender_import/archive.rb', line 127

def write_categories_and_discussions
  categories.each do |c|
    write_category c
    write_discussions c
  end
end

#write_category(c) ⇒ Object



120
121
122
123
124
125
# File 'lib/tender_import/archive.rb', line 120

def write_category c
  mkdir_p export_dir('categories')
  File.open(File.join(export_dir('categories'), "#{category_id(c)}.json"), "w") do |file|
    file.puts Yajl::Encoder.encode(c)
  end
end

#write_discussion(category_id, discussion) ⇒ Object



134
135
136
137
138
139
140
141
# File 'lib/tender_import/archive.rb', line 134

def write_discussion category_id, discussion
  @category_counter[category_id] += 1
  dir = File.join(export_dir('categories'), category_id)
  mkdir_p dir
  File.open(File.join(dir, "#{@category_counter[category_id]}.json"), "w") do |file|
    file.puts Yajl::Encoder.encode(discussion)
  end
end

#write_discussions(category) ⇒ Object



143
144
145
146
147
# File 'lib/tender_import/archive.rb', line 143

def write_discussions category
  discussions(category_key(category)).each do |d|
    write_discussion category_id(category), d
  end
end

#write_user(user) ⇒ Object



106
107
108
109
110
111
112
# File 'lib/tender_import/archive.rb', line 106

def write_user user
  return unless user
  mkdir_p export_dir('users')
  File.open(File.join(export_dir('users'), "#{user[:email].gsub(/\W+/,'_')}.json"), "w") do |file|
    file.puts Yajl::Encoder.encode(user)
  end
end

#write_usersObject



114
115
116
117
118
# File 'lib/tender_import/archive.rb', line 114

def write_users
  users.each do |u|
    write_user u
  end
end