Replace docquery to note-watcher, which supports lunr search index loading

NoteWatcher holds NoteCache, which caches recent notes and file modified time to help search index recovery.
This commit is contained in:
Seongjae Lee
2016-07-02 23:20:41 -07:00
parent 1f005a3025
commit f0b1fcd075
6 changed files with 606 additions and 14 deletions
+188
View File
@@ -0,0 +1,188 @@
fs = require 'fs'
path = require 'path'
temp = require 'temp'
NoteCache = require '../lib/note-cache'
temp.track()
String::repeat = (n) -> Array(n+1).join(this)
describe 'note cache', ->
cache = null
directoryPath = null
beforeEach ->
directoryPath = temp.mkdirSync()
fs.writeFileSync(path.join(directoryPath, 'foo.md'), 'foo'.repeat(100))
fs.utimesSync(path.join(directoryPath, 'foo.md'), 0, 1)
fs.writeFileSync(path.join(directoryPath, 'bar.md'), 'bar'.repeat(100))
fs.utimesSync(path.join(directoryPath, 'bar.md'), 0, 2)
fs.mkdirSync(path.join(directoryPath, 'baz'))
fs.writeFileSync(path.join(directoryPath, 'baz', 'baz.md'), 'baz'.repeat(100))
fs.utimesSync(path.join(directoryPath, 'baz', 'baz.md'), 0, 3)
cache = new NoteCache(directoryPath, 2, 100)
.upsert('foo.md', fs.statSync(path.join(directoryPath, 'foo.md')).mtime)
.upsert(path.join('baz', 'baz.md'), fs.statSync(path.join(directoryPath, 'baz/baz.md')).mtime)
.upsert('bar.md', fs.statSync(path.join(directoryPath, 'bar.md')).mtime)
.ready()
it 'getNoteIds', ->
noteIds = cache.getNoteIds()
for noteId in ['foo.md', 'bar.md', 'baz/baz.md']
expect(noteIds).toContain(noteId)
expect(cache.length()).toBe(3)
it 'getRecentNotes', ->
notes = cache.getRecentNotes()
expect(notes.length).toBe(2)
expect(notes[0].title).toBe('baz')
expect(notes[1].title).toBe('bar')
it 'getNote', ->
expect(cache.getNote('baz/baz.md').title).toBe('baz')
expect(cache.getNote('bar.md').title).toBe('bar')
expect(cache.getNote('foo.md').title).toBe('foo')
it 'hasNoteId', ->
expect(cache.hasNoteId('baz/baz.md')).toBe(true)
expect(cache.hasNoteId('bar.md')).toBe(true)
expect(cache.hasNoteId('foo.md')).toBe(true)
expect(cache.hasNoteId('baz.md')).toBe(false)
it 'getModifiedAt', ->
expect(cache.getModifiedAt('baz/baz.md')).toBe(3000)
expect(cache.getModifiedAt('bar.md')).toBe(2000)
expect(cache.getModifiedAt('foo.md')).toBe(1000)
it 'adds a new note', ->
fs.writeFileSync(path.join(directoryPath, 'moo.md'), 'moo'.repeat(100))
fs.utimesSync(path.join(directoryPath, 'moo.md'), 0, 4)
cache.upsert('moo.md', fs.statSync(path.join(directoryPath, 'moo.md')).mtime)
expect(cache.length()).toBe(4)
expect(cache.hasNoteId('moo.md')).toBe(true)
expect(cache.getModifiedAt('moo.md')).toBe(4000)
expect(cache.getRecentNotes().length).toBe(2)
expect(cache.getRecentNotes()[0].title).toBe('moo')
expect(cache.getNote('moo.md').title).toBe('moo')
it 'updates a note not in the recent notes', ->
fs.writeFileSync(path.join(directoryPath, 'foo.md'), 'foo'.repeat(2))
fs.utimesSync(path.join(directoryPath, 'foo.md'), 0, 4)
cache.upsert('foo.md', fs.statSync(path.join(directoryPath, 'foo.md')).mtime)
expect(cache.length()).toBe(3)
expect(cache.hasNoteId('foo.md')).toBe(true)
expect(cache.getModifiedAt('foo.md')).toBe(4000)
expect(cache.getRecentNotes().length).toBe(2)
expect(cache.getRecentNotes()[0].title).toBe('foo')
expect(cache.getNote('foo.md').title).toBe('foo')
it 'updates a note in the recent notes', ->
fs.writeFileSync(path.join(directoryPath, 'bar.md'), 'bar'.repeat(2))
fs.utimesSync(path.join(directoryPath, 'bar.md'), 0, 4)
cache.upsert('bar.md', fs.statSync(path.join(directoryPath, 'bar.md')).mtime)
expect(cache.length()).toBe(3)
expect(cache.hasNoteId('bar.md')).toBe(true)
expect(cache.getModifiedAt('bar.md')).toBe(4000)
expect(cache.getRecentNotes().length).toBe(2)
expect(cache.getRecentNotes()[0].title).toBe('bar')
expect(cache.getNote('bar.md').title).toBe('bar')
it 'deletes a note not in the recent notes', ->
fs.unlinkSync(path.join(directoryPath, 'foo.md'))
cache.remove('foo.md')
expect(cache.length()).toBe(2)
expect(cache.hasNoteId('foo.md')).toBe(false)
expect(cache.getRecentNotes().length).toBe(2)
expect(cache.getRecentNotes()[0].title).toBe('baz')
expect(cache.getRecentNotes()[1].title).toBe('bar')
it 'deletes a note in the recent notes', ->
cache.remove('bar.md')
expect(cache.length()).toBe(2)
expect(cache.hasNoteId('bar.md')).toBe(false)
expect(cache.getRecentNotes().length).toBe(2)
expect(cache.getRecentNotes()[0].title).toBe('baz')
expect(cache.getRecentNotes()[1].title).toBe('foo')
it 'deletes two notes', ->
cache.remove('bar.md')
cache.remove('foo.md')
expect(cache.length()).toBe(1)
expect(cache.hasNoteId('foo.md')).toBe(false)
expect(cache.hasNoteId('bar.md')).toBe(false)
expect(cache.getRecentNotes().length).toBe(1)
expect(cache.getRecentNotes()[0].title).toBe('baz')
# describe 'note cache', ->
# cache = null
# directoryPath = null
#
# beforeEach ->
# directoryPath = temp.mkdirSync()
#
# it 'handles cyclic symlink directories', ->
# fs.symlinkSync(directoryPath, path.join(directoryPath, 'foo'))
# fs.writeFileSync(path.join(directoryPath, 'foo.md'), 'foo'.repeat(100))
# cache = new NoteCache(directoryPath, ['.md'], 2, 100)
# expect(cache.length()).toBe(1)
#
# it 'handles symlink notes', ->
# # TODO: this behavior should be same for chokidar.
# anotherDirectoryPath = temp.mkdirSync()
# fs.writeFileSync(path.join(anotherDirectoryPath, 'foo.md'), 'foo'.repeat(100))
# fs.symlinkSync(path.join(anotherDirectoryPath, 'foo.md'), path.join(directoryPath, 'foo.md'))
# fs.symlinkSync(path.join(anotherDirectoryPath, 'foo.md'), path.join(directoryPath, 'bar.md'))
# fs.symlinkSync(anotherDirectoryPath, path.join(directoryPath, 'bar'))
# cache = new NoteCache(directoryPath, ['.md'], 2, 100)
# # foo.md, bar.md, bar/foo.md
# expect(cache.length()).toBe(3)
describe 'note cache', ->
cache = null
directoryPath = null
beforeEach ->
directoryPath = temp.mkdirSync()
cache = new NoteCache(directoryPath, 2, 100)
.ready()
fs.writeFileSync(path.join(directoryPath, 'foo.md'), 'foo'.repeat(100))
fs.utimesSync(path.join(directoryPath, 'foo.md'), 0, 1)
fs.writeFileSync(path.join(directoryPath, 'bar.md'), 'bar'.repeat(100))
fs.utimesSync(path.join(directoryPath, 'bar.md'), 0, 2)
fs.mkdirSync(path.join(directoryPath, 'baz'))
fs.writeFileSync(path.join(directoryPath, 'baz', 'baz.md'), 'baz'.repeat(100))
fs.utimesSync(path.join(directoryPath, 'baz', 'baz.md'), 0, 3)
cache
.upsert('foo.md', fs.statSync(path.join(directoryPath, 'foo.md')).mtime)
.upsert('bar.md', fs.statSync(path.join(directoryPath, 'bar.md')).mtime)
.upsert(path.join('baz', 'baz.md'), fs.statSync(path.join(directoryPath, 'baz', 'baz.md')).mtime)
it 'has all note ids', ->
noteIds = cache.getNoteIds()
for noteId in ['foo.md', 'bar.md', 'baz/baz.md']
expect(noteIds).toContain(noteId)
expect(cache.length()).toBe(3)
it 'getRecentNotes', ->
notes = cache.getRecentNotes()
expect(notes.length).toBe(2)
expect(notes[0].title).toBe('baz')
expect(notes[1].title).toBe('bar')
it 'getNote', ->
expect(cache.getNote('baz/baz.md').title).toBe('baz')
expect(cache.getNote('bar.md').title).toBe('bar')
expect(cache.getNote('foo.md').title).toBe('foo')
it 'getModifiedAt', ->
expect(cache.getModifiedAt('baz/baz.md')).toBe(3000)
expect(cache.getModifiedAt('bar.md')).toBe(2000)
expect(cache.getModifiedAt('foo.md')).toBe(1000)