dynarex-blog 0.6.19 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/dynarex-blog.rb +99 -85
  2. metadata +2 -2
data/lib/dynarex-blog.rb CHANGED
@@ -2,14 +2,14 @@
2
2
 
3
3
  # file: dynarex-blog.rb
4
4
 
5
- require 'rexml/document'
6
5
  require 'polyrex'
7
6
  require 'dynarex'
8
7
  require 'hashcache'
9
8
 
10
9
  class DynarexBlog
11
- include REXML
12
-
10
+
11
+
12
+ ENTITIES = 'entities.xml'
13
13
  attr_accessor :id
14
14
 
15
15
  def initialize(file_path='./')
@@ -17,48 +17,53 @@ class DynarexBlog
17
17
  if File.exists? (@file_path + 'index.xml') then open(@file_path) else fresh_start() end
18
18
  @current_lookup = '_entry_lookup.xml'
19
19
  @hc_lookup = HashCache.new(size: 15)
20
- @hc_lookup.read(@current_lookup) { Document.new File.open(@file_path + @current_lookup,'r').read }
20
+
21
+ @hc_lookup.read(@current_lookup) { Rexle.new File.open(@file_path + @current_lookup,'r').read }
21
22
 
22
23
  @hc_result = HashCache.new(size: 10)
23
24
  @hc_entry_file = HashCache.new(size: 10)
24
25
  @hc_lookup_a = HashCache.new(size: 10)
25
26
 
26
- raw_tags = @entities.xpath "records/section[summary/name='tags']/records"
27
- @tags = XPath.match(raw_tags, 'entity/summary').map{|tag| %w(name entry_count).map {|x| tag.text(x).to_s} }
27
+ xpath = "records/section[summary/name='tags']/records/entity/summary"
28
+ @tags = @entities.xpath(xpath){|e| [e.text('name'), e.text('count')]}
28
29
  super()
29
30
  end
30
31
 
31
32
  def create_entry(record={})
32
-
33
33
  @hc_result.reset
34
34
  @id += 1
35
35
  # create a new record
36
36
  @index.create record, @id
37
-
37
+
38
38
  # if there is more than 10 records shift the 1st record.
39
- if @index.records.length > 10 then
39
+ if @index.flat_records.length > 10 then
40
40
  # '+++ deleting the 1st index record +++'
41
- @index.delete @index.records.to_a[0][-1][:id]
41
+ @index.to_doc.delete('records/*[1]')
42
42
  end
43
- @index.save @file_path + 'index.xml'
43
+
44
+ @index.save
44
45
 
45
46
  create_record(record, @id.to_s, name='_entry', type='main')
47
+
46
48
  if record[:tags] then
47
49
  record[:tags].split(/\s/).each do |tag|
48
50
  create_record(record, @id.to_s, name=tag, type='tags')
49
51
  end
50
52
  end
51
-
53
+
52
54
  end
53
55
 
54
56
  def entry(id)
55
- doc_lookup = @hc_lookup.read(@current_lookup) { Document.new File.open(@file_path + @current_lookup,'r').read }
56
- file = XPath.first(doc_lookup.root, "records/entry[id='#{id}']/file/text()").to_s
57
- doc_entries = Document.new(@hc_entry_file.read(file) { File.open(@file_path + file,'r').read })
58
- XPath.first(doc_entries.root, "records/entry[@id='#{id}']")
57
+
58
+ doc_lookup = @hc_lookup.read(@current_lookup) { Rexle.new File.open(@file_path + @current_lookup,'r').read }
59
+ file = doc_lookup.text("records/entry[id='#{id}']/file")
60
+ doc_entries = Rexle.new(@hc_entry_file.read(file) { File.open(@file_path + file,'r').read })
61
+
62
+ doc_entries.element("records/entry[@id='#{id}']")
59
63
  end
60
64
 
61
65
  def update(id, h)
66
+
62
67
  lookup = Dynarex.new @file_path + @current_lookup
63
68
  lookup_id = lookup.records[id][:id]
64
69
  file = lookup.records[id][:body][:file]
@@ -75,25 +80,25 @@ class DynarexBlog
75
80
 
76
81
  if prev_tags and prev_tags.length > 0 then
77
82
 
78
- b = prev_tags.split(/\s/)
79
- old_list = a - b # tags to be deleted
80
- new_list = b - a # tags to be inserted
81
-
82
- old_list.each {|x| delete_entry(tag_name, id) }
83
- common = a.to_set.intersection(b).to_a # tags to be updated
84
- common.each {|name| update_entry(name, id, h) }
83
+ b = prev_tags.split(/\s/)
84
+ old_list = a - b # tags to be deleted
85
+ new_list = b - a # tags to be inserted
86
+
87
+ old_list.each {|x| delete_entry(tag_name, id) }
88
+ common = a.to_set.intersection(b).to_a # tags to be updated
89
+ common.each {|name| update_entry(name, id, h) }
85
90
  else
86
- new_list = a
91
+ new_list = a
87
92
  end
88
93
 
89
94
  new_list.each {|tag| create_record(h, id, name=tag, type='tags') }
90
-
91
95
  dynarex.update(id, h)
92
96
  dynarex.save
93
97
  end
94
98
 
95
99
  lookup.update(lookup_id, uri: h[:title].gsub(/\s/,'-')).save
96
- @hc_lookup.write(@current_lookup) { Document.new File.open(@file_path + @current_lookup,'r').read }
100
+
101
+ @hc_lookup.write(@current_lookup) { Rexle.new File.open(@file_path + @current_lookup,'r').read }
97
102
 
98
103
  refresh_index if index_include? id
99
104
 
@@ -120,8 +125,18 @@ class DynarexBlog
120
125
  end
121
126
 
122
127
  # start of reindexing
123
- refresh_index if index_include? id
124
-
128
+
129
+ if index_include? id then
130
+
131
+ count = @index.xpath('count(records/entry)')
132
+
133
+ if count < 10 then
134
+ @index.delete(id)
135
+ @index.save
136
+ else
137
+ refresh_index
138
+ end
139
+ end
125
140
  end
126
141
 
127
142
  def fresh_start()
@@ -131,11 +146,13 @@ class DynarexBlog
131
146
  @index = new_blog_file 'index.xml'
132
147
 
133
148
  @entities = Polyrex.new('entities/section[name]/entity[name,count,entry_count]')
134
- @entities.create.section({name: 'main'}, id='main')
135
- @entities.id('main').create.entity(name: '_entry', count: '1')
136
- @entities.create.section({name: 'tags'}, id='tags')
137
- @entities.save @file_path + 'entities.xml'
138
149
 
150
+ @entities.create.section({name: 'main'}, id='main') do |create|
151
+ create.entity(name: '_entry', count: '1')
152
+ end
153
+
154
+ @entities.create.section({name: 'tags'}, id='tags')
155
+ @entities.save @file_path + ENTITIES
139
156
  @lookup = new_lookup_file '_entry_lookup.xml'
140
157
  end
141
158
 
@@ -147,24 +164,26 @@ class DynarexBlog
147
164
  @index = Dynarex.new @file_path + 'index.xml'
148
165
  @id = @index.records ? @index.records.to_a[-1][-1][:id].to_i : 0
149
166
  }
150
- threads << Thread.new{@entities = Polyrex.new @file_path + 'entities.xml'}
167
+ threads << Thread.new{@entities = Polyrex.new @file_path + ENTITIES}
151
168
  threads.each {|thread| thread.join}
152
169
 
153
170
  end
154
171
 
155
- def page(number=0)
172
+ def page(number='1')
156
173
  lookup = @current_lookup
157
174
 
158
175
  result = nil
159
176
 
160
177
  result = @hc_result.read(lookup + number.to_s) do
161
178
 
162
- if (number == 1) and (lookup == '_entry_lookup.xml') and (@index.records.length == 10) then
179
+ if (number.to_s == '1') and (lookup == '_entry_lookup.xml') and (@index.records.length <= 10) then
180
+
163
181
  doc = @hc_lookup.refresh(lookup)
164
- r = Document.new(File.open(@file_path + 'index.xml','r').read)
182
+ r = @index.to_doc
165
183
  else
166
- doc = @hc_lookup.read(lookup) { Document.new File.open(@file_path + lookup,'r').read }
167
- r = select_page(doc, number)
184
+
185
+ doc = @hc_lookup.read(lookup) { Rexle.new File.open(@file_path + lookup,'r').read }
186
+ r = select_page(doc, number.to_i)
168
187
  @current_lookup = '_entry_lookup.xml'
169
188
 
170
189
  # refresh to maintain _entry_lookup in the cache
@@ -172,7 +191,9 @@ class DynarexBlog
172
191
  @hc_lookup_a.refresh(@current_lookup)
173
192
  end
174
193
 
175
- total_records = XPath.first(doc.root, 'count(records/entry)')
194
+ total_records = doc.xpath('count(records/entry)')
195
+ return nil if total_records.nil?
196
+
176
197
  total_pages, remainder = %w(/ %).map {|x| total_records.send x, 10}
177
198
  total_pages += 1 if remainder > 0
178
199
 
@@ -183,7 +204,7 @@ class DynarexBlog
183
204
  }
184
205
 
185
206
  summary.each do |name, text|
186
- r.root.elements['summary'].add Element.new(name.to_s).add_text(text.to_s)
207
+ r.element('summary').add Rexle::Element.new(name.to_s).add_text(text.to_s)
187
208
  end
188
209
 
189
210
  r
@@ -248,7 +269,7 @@ class DynarexBlog
248
269
 
249
270
  @hc_lookup.delete(lookup_filename)
250
271
  end
251
-
272
+
252
273
  def reset_cache_entry(lookup_filename, file)
253
274
 
254
275
  @hc_entry_file.delete(file)
@@ -260,30 +281,26 @@ class DynarexBlog
260
281
 
261
282
  def select_page(doc, number)
262
283
 
263
- #doc = Document.new File.open(@file_path + lookup,'r').read
264
-
265
284
  x1 = (number - 1) * 10
266
285
  x2 = x1 + 9
267
286
 
268
- lookup_a = @hc_lookup_a.read(@current_lookup + number.to_s) {XPath.match(doc.root,'records/entry')}
269
- a = lookup_a.reverse[x1..x2]
270
-
271
-
272
- xpath_ids = "entry[%s]" % a.map{|x| x.text('id').to_s}.map{|x| "@id='%s'" % x}.join(' or ')
287
+ lookup_a = doc.xpath('records/entry') do |entry|
288
+ %w(file id).map{|x| entry.text(x)}
289
+ end
273
290
 
274
- temp_doc = Document.new '<root/>'
275
- a.map{|x| x.text('file').to_s}.uniq.each do |file|
276
- doc_entryx = Document.new( @hc_entry_file.read(file) {File.open(@file_path + file,'r').read})
277
- XPath.each(doc_entryx.root,'records/entry') do |entry|
278
- temp_doc.root.add entry
291
+ threads = lookup_a.reverse[x1..x2].group_by(&:first).map do |filename,raw_ids|
292
+ Thread.new do
293
+ xpath = raw_ids.map{|x| "@id='%s'" % x[-1]}.join(' or ')
294
+ Thread.current[:records] = Rexle.new(File.open(filename,'r').read)\
295
+ .xpath("records/entry[#{xpath}]")
279
296
  end
280
297
  end
281
298
 
282
- result = Document.new '<result><summary/><records/></result>'
283
- records = XPath.first(result.root, 'records')
284
- XPath.each(temp_doc.root, xpath_ids) do |record|
285
- records.add record
286
- end
299
+ records = threads.map{|x| x.join; x[:records]}.flatten(1)
300
+
301
+ result = Rexle.new(Dynarex.new('entries/entry(title,body,tags,user)').to_xml)
302
+ records_node = result.element('records')
303
+ records.each{|record| records_node.add_element record}
287
304
 
288
305
  result
289
306
 
@@ -302,18 +319,18 @@ class DynarexBlog
302
319
  lookup
303
320
  end
304
321
 
305
- def create_record(record, id, name, type)
322
+ def create_record(record={}, id, name, type)
306
323
 
307
- entry_count = @entities.xpath "records/section[summary/name='#{type}']/records/entity/summary[name='#{name}']/count"
324
+ xpath = "records/section[summary/name='#{type}']/records/entity/summary[name='#{name}']/count"
325
+ entry_count = @entities.element xpath
308
326
  lookup_file = "%s_lookup.xml" % name
309
327
 
310
328
  if entry_count.nil?
311
- @entities.id('tags').create.entity(name: name, count: '1', entry_count: '1')
312
- @entities.save @file_path + 'entities.xml'
313
- @entities = Polyrex.new @file_path + 'entities.xml'
314
- entry_count = @entities.xpath "records/section[summary/name='#{type}']/records/entity/summary[name='#{name}']/count"
315
329
 
330
+ @entities.id('tags').create.entity(name: name, count: '1', entry_count: '1')
331
+ entry_count = @entities.element "records/section[summary/name='#{type}']/records/entity/summary[name='#{name}']/count"
316
332
  dynarex = Dynarex.new('entries/entry(title,body,tags,user)')
333
+
317
334
  dynarex.summary[:format_mask].gsub!(/\s/,'; ')
318
335
  dynarex_path = @file_path + name + '1.xml'
319
336
  dynarex.save dynarex_path
@@ -325,48 +342,45 @@ class DynarexBlog
325
342
  entry_file = "%s%s.xml" % [name, entry_count.text]
326
343
  dynarex_path = "%s%s" % [@file_path, entry_file]
327
344
  dynarex = Dynarex.new dynarex_path
328
-
345
+
329
346
  dynarex.create record, id
330
347
  dynarex.save dynarex_path
331
-
332
348
  delete_cache_entry(lookup_file, entry_file)
349
+
333
350
  # add the record to lookup
334
351
 
335
352
  lookup = Dynarex.new @file_path + lookup_file
336
- lookup.create id: id, file: entry_file, year: Time.now.strftime("%Y"), month: Time.now.strftime("%m"), uri: record[:title].gsub(/\s/,'-')
337
- lookup.save @file_path + lookup_file
338
- @hc_lookup.write(lookup_file) { Document.new File.open(@file_path + lookup_file,'r').read }
339
-
353
+ h = {id: id, file: entry_file, year: Time.now.strftime("%Y"), month: Time.now.strftime("%m"), uri: record[:title].gsub(/\s/,'-')}
354
+
355
+ lookup.create h
356
+ lookup.save
357
+ @hc_lookup.write(lookup_file) { Rexle.new File.open(@file_path + lookup_file,'r').read }
358
+
340
359
  # if there is 15 items create a new entries file
341
- if dynarex.records.length >= 15 then
360
+ if dynarex.flat_records.length >= 15 then
342
361
 
343
362
  entry_count.text = (entry_count.text.to_i + 1).to_s
344
- @entities.save @file_path + 'entities.xml'
345
-
363
+ @entities.save @file_path + ENTITIES
346
364
  dynarex = new_blog_file "%s%s.xml" % [name, entry_count.text]
347
-
348
365
  end
366
+
349
367
  end
350
368
 
351
369
  def refresh_index()
352
- doc_index = Document.new File.open(@file_path + 'index.xml','r').read
353
370
 
354
- node_records = XPath.first(doc_index.root, 'records')
355
- node_records.parent.delete node_records
371
+ @index.delete('records')
356
372
 
357
373
  lookup = '_entry_lookup.xml'
358
- doc = Document.new File.open(@file_path + lookup,'r').read
374
+ doc = Rexle.new File.open(@file_path + lookup,'r').read
359
375
  @hc_lookup_a.delete(lookup + '1')
360
- page = select_page(doc, 1)
361
- doc_index.root.add XPath.first(page.root, 'records')
362
376
 
363
- File.open(@file_path + 'index.xml', 'w'){|f| doc_index.write f}
364
- @index = Dynarex.new @file_path + 'index.xml'
377
+ page = select_page(doc, 1)
378
+ @index.add page.element('records')
379
+ @index.save
365
380
  end
366
381
 
367
382
  def index_include?(id)
368
- doc = Document.new File.open(@file_path + 'index.xml','r').read
369
- XPath.first(doc.root, "records/entry[@id='#{id}']")
383
+ @index.element("records/entry[@id='#{id}']")
370
384
  end
371
385
 
372
- end
386
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynarex-blog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.19
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors: []
7
7
 
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-10-04 00:00:00 +01:00
12
+ date: 2011-01-11 00:00:00 +00:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency