def test_notebooks(fake_storage):
    test_notebooks = [
        Notebook(
            guid="id1",
            name="name1",
            stack="stack1",
        ),
        Notebook(
            guid="id2",
            name="name2",
            stack="stack2",
        ),
    ]

    expected_notebooks = [
        Notebook(
            guid="id1",
            name="name1",
            stack="stack1",
        ),
        Notebook(
            guid="id2",
            name="name2",
            stack="stack2",
        ),
    ]

    fake_storage.notebooks.add_notebooks(test_notebooks)

    # Output without updated timestamp
    result_notebooks = list(fake_storage.notebooks.iter_notebooks())

    assert result_notebooks == expected_notebooks
def test_linked_notebook(fake_storage):
    test_notebooks = [
        Notebook(
            guid="id1",
            name="name1",
            stack="stack1",
        ),
        Notebook(
            guid="id2",
            name="name2",
            stack="stack2",
        ),
    ]

    test_l_notebook = LinkedNotebook(guid="id3")

    expected_notebook = test_notebooks[0]

    fake_storage.notebooks.add_notebooks(test_notebooks)
    fake_storage.notebooks.add_linked_notebook(test_l_notebook, test_notebooks[0])

    result_notebook = fake_storage.notebooks.get_notebook_by_linked_guid(
        test_l_notebook.guid
    )

    assert result_notebook == expected_notebook
Esempio n. 3
0
def test_sync_expunge_notebooks(cli_invoker, mock_evernote_client,
                                fake_storage):
    test_notebooks = [
        Notebook(
            guid="id1",
            name="name1",
            stack="stack1",
        ),
        Notebook(
            guid="id2",
            name="name1",
            stack="stack1",
        ),
        Notebook(
            guid="id3",
            name="name1",
            stack="stack1",
        ),
    ]

    fake_storage.notebooks.add_notebooks(test_notebooks)
    fake_storage.config.set_config_value("USN", "1")

    mock_evernote_client.fake_expunged_notebooks = ["id1", "id3"]

    cli_invoker("sync", "--database", "fake_db")

    result_notebooks = list(fake_storage.notebooks.iter_notebooks())

    assert len(result_notebooks) == 1
    assert result_notebooks[0].guid == "id2"
    def get(self, file_id):
        client = self.get_authorized_client()
        if not client:
            return self.redirect('/auth-evernote?next={0}'.format(self.request.path))

        try:
            file = self.get_file(file_id)
        except webapp2.HTTPException as http_ex:
            if http_ex.code == 401:
                return self.redirect('/auth?next={0}'.format(self.request.path))

        base_url = self.request.host_url + '/edit/{0}'.format(file['id'])
        extension_loaded = bool(int(self.request.get('extensionLoaded', 1)))

        # Look for the VideoNot.es Notebook
        notestore = client.get_note_store()
        notesbooks = notestore.listNotebooks()
        notebook = None

        for a_notesbook in notesbooks:
            if a_notesbook.name == 'VideoNot.es':
                notebook = a_notesbook
                break

        if not notebook:
            notebook = Notebook()
            notebook.name = 'VideoNot.es'
            notebook = notestore.createNotebook(notebook)

        # Formatting the note in ENML
        content_enml = FileUtils.to_ENML(file, base_url)
        content_enml.append('<br></br><br></br>')

        content_enml.append('<a href="{0}">View in VideoNot.es</a>'.format(base_url))
        if not extension_loaded:
            content_enml.append('<br/>')
            content_enml.append('(Tip: you can add snapshots of the video to your export by installing our <a href="https://chrome.google.com/webstore/detail/kmbcnighpdagelfjmlbakfnciogcelgi">Chrome Extension</a>)')

        # Saving the note in Evernote
        note = Note()
        note.title = file['title']
        note_content = ''.join(content_enml).encode('utf-8')
        note.content = '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"><en-note>{0}</en-note>'.format(note_content)
        note.content = note.content.replace('&', '&amp;')
        if notebook:
            note.notebookGuid = notebook.guid
        note = notestore.createNote(note)

        logging.debug('VideoNot.es %s exported to Evernote: %s', file_id, note_content)
        logging.info('VideoNot.es %s exported to Evernote with id: %s', file_id, note.guid)

        # Returning to the new note in Evernote
        user_store = client.get_user_store()
        notestore_url = '/'.join(user_store.getNoteStoreUrl().split('/')[0:5])
        return self.redirect(notestore_url + '/view/notebook/{0}'.format(note.guid))
Esempio n. 5
0
def test_export_single_notes_over_existing_overwrite(cli_invoker, fake_storage,
                                                     tmp_path):
    test_out_path = tmp_path / "test_out"

    test_notebooks = [
        Notebook(guid="nbid1", name="name1", stack="stack1"),
        Notebook(guid="nbid2", name="name2", stack=None),
    ]

    test_notes = [
        Note(
            guid="id1",
            title="title1",
            content="test",
            notebookGuid="nbid1",
            active=True,
        ),
        Note(
            guid="id2",
            title="title2",
            content="test",
            notebookGuid="nbid2",
            active=True,
        ),
    ]

    fake_storage.notebooks.add_notebooks(test_notebooks)

    for note in test_notes:
        fake_storage.notes.add_note(note)

    book1_existing_path = test_out_path / "stack1" / "name1" / "title1.enex"
    book2_existing_path = test_out_path / "name2" / "title2.enex"

    book1_existing_path.parent.mkdir(parents=True, exist_ok=True)
    book2_existing_path.parent.mkdir(parents=True, exist_ok=True)

    book1_existing_path.touch()
    book2_existing_path.touch()

    cli_invoker(
        "export",
        "--database",
        "fake_db",
        "--single-notes",
        "--overwrite",
        str(test_out_path),
    )

    assert book1_existing_path.stat().st_size > 0
    assert book2_existing_path.stat().st_size > 0
Esempio n. 6
0
def tset_notebook(store, name):
    """Return notebook with specific name.
    Create a new notebook if there isn't an existing one.
    """
    notebooks = store.listNotebooks()
    notebook = [nb for nb in notebooks if nb.name == name]
    if notebook:
        log('Found notebook {}'.format(name))
        return notebook[0]
    else:
        notebook = Notebook()
        notebook.name = name
        notebook.defaultNotebook = False
        log('Create new notebook {}'.format(name))
        return store.createNotebook(dev_token, notebook)
Esempio n. 7
0
def tset_notebook(store, name):
    """Return notebook with specific name.
    Create a new notebook if there isn't an existing one.
    """
    notebooks = store.listNotebooks()
    notebook = [nb for nb in notebooks if nb.name == name]
    if notebook:
        log('Found notebook {}'.format(name))
        return notebook[0]
    else:
        notebook = Notebook()
        notebook.name = name
        notebook.defaultNotebook = False
        log('Create new notebook {}'.format(name))
        return store.createNotebook(dev_token, notebook)
Esempio n. 8
0
def test_export_no_export_date(cli_invoker, fake_storage, tmp_path):
    test_out_path = tmp_path / "test_out"

    test_notebooks = [
        Notebook(guid="nbid1", name="name1", stack=None),
    ]

    fake_storage.notebooks.add_notebooks(test_notebooks)

    fake_storage.notes.add_note(
        Note(
            guid="id1",
            title="title1",
            content="test",
            notebookGuid="nbid1",
            active=True,
        ))

    cli_invoker(
        "export",
        "--database",
        "fake_db",
        "--no-export-date",
        str(test_out_path),
    )

    book1_path = test_out_path / "name1.enex"

    with open(book1_path, "r") as f:
        book1_xml = f.read()

    assert "export-date" not in book1_xml
Esempio n. 9
0
def test_sync_massive_note_count(cli_invoker, mock_evernote_client,
                                 fake_storage, monkeypatch):
    mock_evernote_client.fake_notebooks.append(
        Notebook(
            guid="nbid1",
            name="name1",
            stack="stack1",
            serviceUpdated=1000,
        ), )

    for i in range(10):
        test_note = Note(
            guid=f"id{i}",
            title=f"title{i}",
            content="body1",
            notebookGuid="nbid1",
            contentLength=100,
            active=True,
        )

        mock_evernote_client.fake_notes.append(test_note)

    monkeypatch.setattr(note_synchronizer, "THREAD_CHUNK_SIZE", 2)

    cli_invoker("sync", "--database", "fake_db")

    result_notes = sorted(fake_storage.notes.iter_notes("nbid1"),
                          key=lambda x: int(x.guid[2:]))

    assert result_notes == mock_evernote_client.fake_notes
Esempio n. 10
0
def test_sync_custom_max_chunk_results(cli_invoker, mock_evernote_client,
                                       fake_storage):
    mock_evernote_client.fake_notebooks.append(
        Notebook(
            guid="nbid1",
            name="name1",
            stack="stack1",
            serviceUpdated=1000,
        ), )

    test_note = Note(
        guid="id1",
        title="title1",
        content="body1",
        notebookGuid="nbid1",
        contentLength=100,
        active=True,
    )

    mock_evernote_client.fake_notes.append(test_note)
    test_max_chunk_results = 100

    cli_invoker("sync", "--database", "fake_db", "--max-chunk-results",
                test_max_chunk_results)

    result_notes = list(fake_storage.notes.iter_notes("nbid1"))

    assert result_notes == [test_note]
    assert mock_evernote_client.last_maxEntries == test_max_chunk_results
Esempio n. 11
0
def test_sync_add_note_with_res(cli_invoker, mock_evernote_client,
                                fake_storage):
    mock_evernote_client.fake_notebooks.append(
        Notebook(
            guid="nbid1",
            name="name1",
            stack="stack1",
            serviceUpdated=1000,
        ), )

    test_note = Note(
        guid="id1",
        title="title1",
        content="body1",
        notebookGuid="nbid1",
        active=True,
        contentLength=100,
        resources=[
            Resource(
                guid="rid2",
                noteGuid="id1",
                data=Data(bodyHash=md5(b"000").digest(), size=3, body=b"000"),
            )
        ],
    )

    mock_evernote_client.fake_notes.append(test_note)

    cli_invoker("sync", "--database", "fake_db")

    result_notes = list(fake_storage.notes.iter_notes("nbid1"))

    assert result_notes == [test_note]
Esempio n. 12
0
def test_sync_add_linked_notebook_note_error_no_access(cli_invoker,
                                                       mock_evernote_client,
                                                       fake_storage):
    mock_evernote_client.fake_l_notebooks.append(
        Notebook(
            guid="nbid1",
            name="name1",
        ), )

    mock_evernote_client.fake_l_notes.append(
        Note(
            guid="id1",
            title="title1",
            content="body1",
            notebookGuid="nbid1",
            contentLength=100,
            active=True,
        ))

    mock_evernote_client.fake_linked_notebooks.append(
        LinkedNotebook(guid="id3"))

    mock_evernote_client.fake_linked_notebook_auth_token = (
        "S=200:U=ff:E=fff:C=ff:P=1:A=test222:V=2:H=ff")

    mock_evernote_client.fake_auth_linked_notebook_error = True

    cli_invoker("sync", "--database", "fake_db")

    result_notebooks = list(fake_storage.notebooks.iter_notebooks())
    result_notes = list(fake_storage.notes.iter_notes("nbid1"))

    assert result_notebooks == []
    assert result_notes == []
Esempio n. 13
0
 def notebooks_local(self):
     """Send local notebooks changes to server"""
     for notebook in self.sq(models.Notebook).filter(
             models.Notebook.action != ACTION_NONE, ):
         self.app.log('Notebook %s local' % notebook.name)
         kwargs = dict(
             name=notebook.name[:EDAM_NOTEBOOK_NAME_LEN_MAX].strip().encode(
                 'utf8'),
             defaultNotebook=notebook.default,
         )
         if notebook.guid:
             kwargs['guid'] = notebook.guid
         nb = Notebook(**kwargs)
         if notebook.action == ACTION_CHANGE:
             while True:
                 try:
                     nb = self.note_store.updateNotebook(
                         self.auth_token,
                         nb,
                     )
                     break
                 except EDAMUserException, e:
                     notebook.name = notebook.name + '*'  # shit, but work
                     print e
         elif notebook.action == ACTION_CREATE:
             nb = self.note_store.createNotebook(
                 self.auth_token,
                 nb,
             )
             notebook.guid = nb.guid
Esempio n. 14
0
def test_sync_add_note(cli_invoker, mock_evernote_client, fake_storage):
    mock_evernote_client.fake_notebooks.append(
        Notebook(
            guid="nbid1",
            name="name1",
            stack="stack1",
            serviceUpdated=1000,
        ), )

    test_note = Note(
        guid="id1",
        title="title1",
        content="body1",
        notebookGuid="nbid1",
        active=True,
        contentLength=100,
    )

    mock_evernote_client.fake_notes.append(test_note)

    cli_invoker("sync", "--database", "fake_db")

    result_notes = list(fake_storage.notes.iter_notes("nbid1"))

    assert result_notes == [test_note]
Esempio n. 15
0
def test_export_over_existing(cli_invoker, fake_storage, tmp_path):
    test_out_path = tmp_path / "test_out"

    test_notebooks = [
        Notebook(guid="nbid1", name="name1", stack="stack1"),
        Notebook(guid="nbid2", name="name2", stack=None),
        Notebook(guid="nbid3", name="name3", stack=None),
    ]

    test_notes = [
        Note(
            guid="id1",
            title="title1",
            content="test",
            notebookGuid="nbid1",
            active=True,
        ),
        Note(
            guid="id2",
            title="test",
            content="test",
            notebookGuid="nbid2",
            active=True,
        ),
    ]

    fake_storage.notebooks.add_notebooks(test_notebooks)

    for note in test_notes:
        fake_storage.notes.add_note(note)

    book1_existing_path = test_out_path / "stack1" / "name1.enex"
    book2_existing_path = test_out_path / "name2.enex"

    book1_existing_path.parent.mkdir(parents=True, exist_ok=True)
    book2_existing_path.parent.mkdir(parents=True, exist_ok=True)

    book1_existing_path.touch()
    book2_existing_path.touch()

    book1_expected_path = test_out_path / "stack1" / "name1 (1).enex"
    book2_expected_path = test_out_path / "name2 (1).enex"

    cli_invoker("export", "--database", "fake_db", str(test_out_path))

    assert book1_expected_path.is_file()
    assert book2_expected_path.is_file()
Esempio n. 16
0
    def iter_notebooks(self) -> Iterator[Notebook]:
        with self.db as con:
            cur = con.execute("select guid, name, stack from notebooks", )

            yield from (Notebook(
                guid=row["guid"],
                name=row["name"],
                stack=row["stack"],
            ) for row in cur)
Esempio n. 17
0
 def __init__(self, token, **kwargs):
     fake_notes = NotesMetadataList(startIndex=0, totalNotes=0, notes=[])
     fake_notebooks = []
     note_store = Mock()
     note_store.listNotebooks.return_value = kwargs.get('fake_notebooks', fake_notebooks)
     note_store.findNotesMetadata.return_value = kwargs.get('fake_notes', fake_notes)
     note_store.getNote.return_value = kwargs.get('fake_get_note', None)
     note_store.createNotebook.return_value = Notebook(guid='notebook-guid')
     self.note_store = note_store
     super(MockMininote, self).__init__(token)
def test_linked_notebook_deleted(fake_storage):
    test_notebook = Notebook(guid="id1", name="name1", stack="stack1")
    test_l_notebook = LinkedNotebook(guid="id3")

    fake_storage.notebooks.add_notebooks([test_notebook])
    fake_storage.notebooks.add_linked_notebook(test_l_notebook, test_notebook)

    fake_storage.notebooks.expunge_linked_notebooks([test_l_notebook.guid])

    with pytest.raises(ValueError):
        fake_storage.notebooks.get_notebook_by_linked_guid(test_l_notebook.guid)
Esempio n. 19
0
    def _get_create_notebook(self):
        """
        Get or create the Evernote notebook.

        :returns: Notebook guid
        """
        for notebook in self._note_store().listNotebooks():
            if notebook.name == EVERNOTE_NOTEBOOK:
                return notebook.guid
        return self._note_store() \
                   .createNotebook(Notebook(name=EVERNOTE_NOTEBOOK)) \
                   .guid
def test_linked_notebook_asn(fake_storage):
    test_notebook = Notebook(guid="id1", name="name1", stack="stack1")
    test_l_notebook = LinkedNotebook(guid="id3")

    fake_storage.notebooks.add_notebooks([test_notebook])
    fake_storage.notebooks.add_linked_notebook(test_l_notebook, test_notebook)

    fake_storage.notebooks.set_linked_notebook_usn(test_l_notebook.guid, 100)

    result = fake_storage.notebooks.get_linked_notebook_usn(test_l_notebook.guid)

    assert result == 100
Esempio n. 21
0
 def notebooks_local(self):
     """Send local notebooks changes to server"""
     for notebook in self.sq(models.Notebook).filter(
             models.Notebook.action != ACTION_NONE, ):
         self.app.log('Notebook %s local' % notebook.name)
         kwargs = dict(
             name=notebook.name[:EDAM_NOTEBOOK_NAME_LEN_MAX].strip().encode(
                 'utf8'),
             defaultNotebook=notebook.default,
         )
         if notebook.stack:
             kwargs[
                 'stack'] = notebook.stack[:
                                           EDAM_NOTEBOOK_STACK_LEN_MAX].strip(
                                           ).encode('utf8')
         if not regex.search(EDAM_NOTEBOOK_NAME_REGEX, notebook.name):
             self.app.log('notebook %s skipped' % notebook.name)
             notebook.action = ACTION_NONE
             continue  # just ignore it
         if notebook.guid:
             kwargs['guid'] = notebook.guid
         nb = Notebook(**kwargs)
         if notebook.action == ACTION_CHANGE:
             try:
                 nb = self.note_store.updateNotebook(
                     self.auth_token,
                     nb,
                 )
                 notebook.action = ACTION_NONE
             except EDAMUserException:
                 notebook.action = ACTION_DUPLICATE
                 self.app.log('Duplicate %s' % nb.name)
         elif notebook.action == ACTION_CREATE:
             try:
                 nb = self.note_store.createNotebook(
                     self.auth_token,
                     nb,
                 )
                 notebook.guid = nb.guid
                 notebook.action = ACTION_NONE
             except EDAMUserException:
                 notebook.action = ACTION_DUPLICATE
                 self.app.log('Duplicate %s' % nb.name)
         elif notebook.action == ACTION_DELETE and False:  # not allowed for app now
             try:
                 self.note_store.expungeNotebook(
                     self.auth_token,
                     notebook.guid,
                 )
                 self.session.delete(notebook)
             except EDAMUserException, e:
                 self.app.log(e)
Esempio n. 22
0
def test_sync_add_notebook(cli_invoker, mock_evernote_client, fake_storage):
    test_notebooks = [Notebook(
        guid="id1",
        name="name1",
        stack="stack1",
    )]
    mock_evernote_client.fake_notebooks = test_notebooks

    cli_invoker("sync", "--database", "fake_db")

    result_notebooks = list(fake_storage.notebooks.iter_notebooks())

    assert result_notebooks == test_notebooks
def test_notebook_deleted(fake_storage):
    test_notebooks = [
        Notebook(
            guid="id1",
            name="name1",
            stack="stack1",
        ),
        Notebook(
            guid="id2",
            name="name2",
            stack="stack2",
        ),
    ]

    fake_storage.notebooks.add_notebooks(test_notebooks)

    fake_storage.notebooks.expunge_notebooks(["id2"])

    result = list(fake_storage.notebooks.iter_notebooks())

    assert len(result) == 1
    assert result[0].guid == "id1"
def test_notebook_note_count(fake_storage):
    expected_notebooks = [
        Notebook(
            guid="notebook1",
            name="name1",
            stack="stack1",
        ),
        Notebook(
            guid="notebook2",
            name="name2",
            stack="stack2",
        ),
    ]

    test_notes = [
        Note(
            guid="id1",
            title="test",
            content="test",
            notebookGuid="notebook1",
            active=True,
        ),
        Note(
            guid="id2",
            title="test",
            content="test",
            notebookGuid="notebook1",
            active=False,
        ),
    ]

    for note in test_notes:
        fake_storage.notes.add_note(note)

    fake_storage.notebooks.add_notebooks(expected_notebooks)

    result = fake_storage.notebooks.get_notebook_notes_count("notebook1")

    assert result == 1
Esempio n. 25
0
def test_export(cli_invoker, fake_storage, tmp_path):
    test_out_path = tmp_path / "test_out"

    test_notebooks = [
        Notebook(guid="nbid1", name="name1", stack="stack1"),
        Notebook(guid="nbid2", name="name2", stack=None),
        Notebook(guid="nbid3", name="name3", stack=None),
    ]

    test_notes = [
        Note(
            guid="id1",
            title="title1",
            content="test",
            notebookGuid="nbid1",
            active=True,
        ),
        Note(
            guid="id2",
            title="test",
            content="test",
            notebookGuid="nbid2",
            active=True,
        ),
    ]

    fake_storage.notebooks.add_notebooks(test_notebooks)

    for note in test_notes:
        fake_storage.notes.add_note(note)

    cli_invoker("export", "--database", "fake_db", str(test_out_path))

    book1_path = test_out_path / "stack1" / "name1.enex"
    book2_path = test_out_path / "name2.enex"

    assert book1_path.is_file()
    assert book2_path.is_file()
Esempio n. 26
0
def evernote_create_notebook(request):
    if request.method != 'POST':
        return redirect('/api')

    name = request.POST.get('notebook')

    note_store = get_note_store()
    response_data = {}

    newNotebook = Notebook()
    newNotebook.name = name

    notebook = None
    try:
        notebook = note_store.createNotebook( newNotebook )
        response_data['result'] = "success"
    except:
        response_data['result'] = "error"

    return HttpResponse(
        json.dumps(response_data),
        content_type="application/json"
    )
Esempio n. 27
0
 def create_or_update_note(self, new_note):
     """ Create new note or update existing one if there's any with provided tile
     Arguments:
     new_note  -- new note dictionary with the following items:
       'title'    -- note title, should be unique, this field is used to search for existing note
       'content'  -- note data in ENML markup. See https://dev.evernote.com/doc/articles/enml.php
       'notebook' -- name of the notebook to create note in (ignored on 'update')
       'created'  -- note creation time in milliseconds from epoch
       'updated'  -- note last updated time in milliseconds from epoch
     """
     note_title = new_note.get('title')
     note_contents = new_note.get('content')
     notebook_name = new_note.get('notebook')
     note_created = new_note.get('created')
     note_updated = new_note.get('updated')
     note = self.find_note(note_title)
     if note:
         note.content = note_contents
         note.created = note_created
         note.updated = note_updated
         Evernote.call_method(self.note_store.updateNote, note)
     else:
         note = Note()
         note.title, note.content = note_title, note_contents
         note.created, note.updated = note_created, note_updated
         for notebook in Evernote.call_method(self.note_store.listNotebooks):
             if notebook.name == notebook_name:
                 note.notebookGuid = notebook.guid
                 break
         else:
             if notebook_name:
                 # Notebook not found, create new one
                 notebook = Notebook()
                 notebook.name = notebook_name
                 notebook = Evernote.call_method(self.note_store.createNotebook, notebook)
                 note.notebookGuid = notebook.guid
         Evernote.call_method(self.note_store.createNote, note)
Esempio n. 28
0
def test_sync_exception_while_download_retry(cli_invoker, mock_evernote_client,
                                             fake_storage, mocker):
    mock_evernote_client.fake_notebooks.append(
        Notebook(
            guid="nbid1",
            name="name1",
            stack="stack1",
            serviceUpdated=1000,
        ), )

    test_notes = [
        Note(
            guid=f"id{i}",
            title="test",
            content="test",
            notebookGuid="nbid1",
            contentLength=100,
            active=True,
        ) for i in range(10)
    ]

    mock_evernote_client.fake_notes.extend(test_notes)

    retry_count = 3

    def fake_get_note(note_guid):
        nonlocal retry_count
        if note_guid == "id3" and retry_count > 0:
            retry_count -= 1
            raise struct.error

        return Note(
            guid=note_guid,
            title="test",
            content="test",
            notebookGuid="nbid1",
            contentLength=100,
            active=True,
        )

    mock_get_note = mocker.patch(
        "evernote_backup.evernote_client_sync.EvernoteClientSync.get_note")
    mock_get_note.side_effect = fake_get_note

    cli_invoker("sync", "--database", "fake_db")

    result_notes = list(fake_storage.notes.iter_notes("nbid1"))

    assert set(result_notes) == set(test_notes)
Esempio n. 29
0
def test_sync_add_linked_notebook_note_with_tag(cli_invoker,
                                                mock_evernote_client,
                                                fake_storage):
    mock_evernote_client.fake_l_notebooks.append(
        Notebook(
            guid="nbid1",
            name="name1",
        ), )

    mock_evernote_client.fake_l_tags = [
        Tag(guid="tid1", name="tag1"),
        Tag(guid="tid2", name="tag2"),
    ]

    mock_evernote_client.fake_l_notes.append(
        Note(
            guid="id1",
            title="title1",
            content="body1",
            notebookGuid="nbid1",
            active=True,
            contentLength=100,
            tagGuids=["tid1", "tid2"],
        ))

    expected_notes = [
        Note(
            guid="id1",
            title="title1",
            content="body1",
            notebookGuid="nbid1",
            active=True,
            contentLength=100,
            tagGuids=["tid1", "tid2"],
            tagNames=["tag1", "tag2"],
        )
    ]

    mock_evernote_client.fake_linked_notebooks.append(
        LinkedNotebook(guid="id3", shardId="s100"))

    mock_evernote_client.fake_linked_notebook_auth_token = (
        "S=200:U=ff:E=fff:C=ff:P=1:A=test222:V=2:H=ff")

    cli_invoker("sync", "--database", "fake_db")

    result_notes = list(fake_storage.notes.iter_notes("nbid1"))

    assert result_notes == expected_notes
Esempio n. 30
0
def test_sync_add_linked_notebook_stack(cli_invoker, mock_evernote_client,
                                        fake_storage):
    mock_evernote_client.fake_l_notebooks.append(
        Notebook(
            guid="nbid1",
            name="name1",
        ), )

    mock_evernote_client.fake_linked_notebooks.append(
        LinkedNotebook(guid="id3", stack="test_stack"))

    expected_notebooks = [
        Notebook(
            guid="nbid1",
            name="name1",
            stack="test_stack",
        )
    ]

    cli_invoker("sync", "--database", "fake_db")

    result_notebooks = list(fake_storage.notebooks.iter_notebooks())

    assert result_notebooks == expected_notebooks
Esempio n. 31
0
def test_sync_nothing_to_sync(cli_invoker, mock_evernote_client, fake_storage):
    mock_evernote_client.fake_notebooks.append(
        Notebook(
            guid="id1",
            name="name1",
            stack="stack1",
        ), )

    fake_storage.config.set_config_value("USN", mock_evernote_client.fake_usn)

    cli_invoker("sync", "--database", "fake_db")

    result_notebooks = list(fake_storage.notebooks.iter_notebooks())

    assert not result_notebooks
Esempio n. 32
0
def test_sync_add_note_with_tags(cli_invoker, mock_evernote_client,
                                 fake_storage):
    mock_evernote_client.fake_tags = [
        Tag(guid="tid1", name="tag1"),
        Tag(guid="tid2", name="tag2"),
    ]

    mock_evernote_client.fake_notebooks.append(
        Notebook(
            guid="nbid1",
            name="name1",
            stack="stack1",
            serviceUpdated=1000,
        ), )

    mock_evernote_client.fake_notes.append(
        Note(
            guid="id1",
            title="title1",
            content="body1",
            notebookGuid="nbid1",
            active=True,
            contentLength=100,
            tagGuids=["tid1", "tid2"],
        ))

    expected_notes = [
        Note(
            guid="id1",
            title="title1",
            content="body1",
            notebookGuid="nbid1",
            active=True,
            contentLength=100,
            tagGuids=["tid1", "tid2"],
            tagNames=["tag1", "tag2"],
        )
    ]

    cli_invoker("sync", "--database", "fake_db")

    result_notes = list(fake_storage.notes.iter_notes("nbid1"))

    assert result_notes == expected_notes
Esempio n. 33
0
def notify(title, message,
           access_token=None,
           notebook='ntfy-notifications',
           sandbox=False, china=False,
           **_):

    try:
        client = EvernoteClient(
            consumer_key=CONSUMER_KEY,
            consumer_secret=CONSUMER_SECRET,
            token=access_token,
            sandbox=sandbox, china=china
        )

        if not client.token:
            login(client=client)

        if not client.token:
            print(f'Skiped with not login.')
            return 1

        noteStore = client.get_note_store()
        nbs = noteStore.listNotebooks()
        nb = ([x for x in nbs if x.name == notebook] + [None])[0]
        if nb is None:
            nb = Notebook(name=notebook)
            nb = noteStore.createNotebook(nb)

        note = Note(notebookGuid=nb.guid)
        note.title = str(title)
        note.content = '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">'
        note.content += f'<en-note>{escape(message)}</en-note>'

        noteStore = client.get_note_store()
        note = noteStore.createNote(note)

    except EDAMUserException as ue:
        if ue.errorCode == EDAMErrorCode.RATE_LIMIT_REACHED:
            print(f'Rate limit reached, Retry your request in {ue.rateLimitDuration} seconds')
            return 1
        else:
            raise
Esempio n. 34
0
def main():
    client = EvernoteClient(token=dev_token, sandbox=False)
    noteStore = client.get_note_store()
    noteStore = client.get_note_store()
    Filter=NodeTypes.NoteFilter()
    Filter.words = 'tag:@smarttodo'
    notes = noteStore.findNotes(dev_token, Filter, 0, 10)
    for note in notes.notes:
        nt = noteStore.getNote(dev_token, note.guid, True, False, False, False)
        root = ElementTree.fromstring(nt.content)
        ElementTree.dump(root)
        sections = split_into_sections(root)
        today = datetime.date.today() - datetime.timedelta(1)
        tomorrow = today + datetime.timedelta(1)
        conversions = {
            'today': today,
            'tomorrow': tomorrow,
            'yesterday': today - datetime.timedelta(1),
        }
        print sections
        unfinished = parse_out_due_dates(sections['today'][1:], today, conversions,
                                         sections['settings']['Date format'])
        unfinished.extend(
            parse_out_due_dates(sections['later'][1:], tomorrow, conversions,
                                sections['settings']['Date format']))
        new_today_list = [x for x in unfinished if x[0] <= tomorrow]
        new_tomorrow_list = [x for x in unfinished if x[0] > tomorrow]
        new_tomorrow_list.sort(key=lambda x: x[0])
        sections['today'][1:] = update_tasks(new_today_list, sections['settings']['Date format'], sections['settings']['Date separator'])
        sections['later'][1:] = update_tasks(new_tomorrow_list, sections['settings']['Date format'], sections['settings']['Date separator'])
        text, tail, attrib, tag = root.text, root.tail, root.attrib, root.tag
        root.clear()
        root.text, root.tail, root.attrib, root.tag = text, tail, attrib, tag
        for sec in ['start', 'today', 'later', 'end']:
            for section in sections[sec]:
                if sec in ['today', 'later']:
                    root.extend(section)
                else:
                    root.append(section)
        while len(root) > 0 and root[-1].tag == 'br':
            root.remove(root[-1])
        new_node_content = ElementTree.tostring(root, 'utf-8')
        nt.content = content_prefix + new_node_content
        print 'Updated:'
        ElementTree.dump(root)
        noteStore.updateNote(dev_token, nt)

        if len(sections['completed']) <= 0:
            continue
        history_notebook = sections['settings']['History notebook'].strip()
        history_interval = sections['settings']['History interval'].strip()
        history_prefix = sections['settings']['History note'].strip()
        history_title = get_history_note_title(history_prefix, today,
                                               history_interval,
                                               sections['settings']['Date format'],
                                               sections['settings']['Date separator'])
        notebooks = noteStore.listNotebooks(dev_token)
        notebook_guid = None
        for notebook in notebooks:
            if notebook.name == history_notebook:
                notebook_guid = notebook.guid
        if notebook_guid == None:
            notebook = Notebook()
            notebook.name = history_notebook
            notebook = noteStore.createNotebook(dev_token, notebook)
            notebook_guid = notebook.guid
        Filter = NodeTypes.NoteFilter()
        Filter.notebookGuid = notebook_guid
        Filter.words = 'intitle:' + history_title
        history_notes = noteStore.findNotes(dev_token, Filter, 0, 1)
        if len(history_notes.notes) < 1:
            hist_root = ElementTree.Element('en-note')
            hist_note = Note()
            hist_note.title = history_title
            hist_note.notebookGuid = notebook_guid
        else:
            hist_note = noteStore.getNote(dev_token, history_notes.notes[0].guid,
                                          True, False, False, False)
            hist_root = ElementTree.fromstring(hist_note.content)
        day_element = ElementTree.fromstring('<div><strong>{}</strong></div>'.format(
            date_to_string(today,
                           sections['settings']['Date format'],
                           sections['settings']['Date separator'])))
        hist_root.append(day_element)
        for x in sections['completed']:
            hist_root.extend(x)
        hist_note.content = content_prefix + ElementTree.tostring(hist_root, 'utf-8')
        if len(history_notes.notes) < 1:
            noteStore.createNote(dev_token, hist_note)
        else:
            noteStore.updateNote(dev_token, hist_note)