synclenote 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +68 -0
- data/Rakefile +7 -1
- data/lib/synclenote/command.rb +2 -54
- data/lib/synclenote/configuration.rb +0 -2
- data/lib/synclenote/markdown_to_enml_builder.rb +52 -0
- data/lib/synclenote/note_builder.rb +41 -0
- data/lib/synclenote/version.rb +1 -1
- data/lib/synclenote.rb +6 -4
- data/synclenote.gemspec +3 -0
- data/test/lib/synclenote/markdown_to_enml_builder_test.rb +58 -0
- data/test/lib/synclenote/note_builder_test.rb +68 -0
- data/test/test_helper.rb +3 -0
- metadata +54 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6842ad72e5f7f899d1b5d962b8af0db7cae65c99e16693cedd43de396b51c529
|
4
|
+
data.tar.gz: 296010bb3a8b526e43a49986314076bb85be2cd9a7c2cade2fd4a50eb6cf361f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b64e8832799ca114404b838d28fb159d4730072041caf405601d372ada55a25816741486cdcc864e89b4ea8c500a7b4de640d7f5bf26d1c01c4abc5a3beddc92
|
7
|
+
data.tar.gz: 7f1a3179d818e0fcff4e3174ce66d517d05e87ed8f31447cbaaa6c80e6ef2888501286c315107ca7050e380fb8be94d1ccd8252a749c0897fda393a89d472821
|
@@ -0,0 +1,68 @@
|
|
1
|
+
name: test
|
2
|
+
|
3
|
+
on:
|
4
|
+
- pull_request
|
5
|
+
- push
|
6
|
+
- workflow_dispatch
|
7
|
+
|
8
|
+
jobs:
|
9
|
+
test:
|
10
|
+
strategy:
|
11
|
+
fail-fast: false
|
12
|
+
matrix:
|
13
|
+
os:
|
14
|
+
- macos
|
15
|
+
- ubuntu
|
16
|
+
- windows
|
17
|
+
ruby_version:
|
18
|
+
- 3.3
|
19
|
+
- 3.2
|
20
|
+
- 3.1
|
21
|
+
runs-on: ${{ matrix.os }}-latest
|
22
|
+
steps:
|
23
|
+
- uses: actions/checkout@v3
|
24
|
+
- uses: kenchan0130/actions-system-info@1.2.0
|
25
|
+
id: system-info
|
26
|
+
- name: Cache rubygems
|
27
|
+
uses: actions/cache@v3.2.2
|
28
|
+
with:
|
29
|
+
path: vendor/bundle
|
30
|
+
key: ${{ runner.os }}-${{ steps.system-info.outputs.release }}-rubygems-${{ matrix.ruby_version }}-${{ hashFiles('**/Gemfile') }}-${{ hashFiles('**/*.gemspec') }}
|
31
|
+
restore-keys: |
|
32
|
+
${{ runner.os }}-${{ steps.system-info.outputs.release }}-rubygems-${{ matrix.ruby_version }}
|
33
|
+
- name: Set up Ruby
|
34
|
+
uses: ruby/setup-ruby@v1
|
35
|
+
with:
|
36
|
+
ruby-version: ${{ matrix.ruby_version }}
|
37
|
+
- name: Install dependencies
|
38
|
+
shell: bash
|
39
|
+
run: |
|
40
|
+
set -eux
|
41
|
+
gem update --system
|
42
|
+
bundle config path vendor/bundle
|
43
|
+
bundle install --jobs "${{ steps.system-info.outputs.cpu-core }}" --retry 3
|
44
|
+
- name: Run tests
|
45
|
+
run: bundle exec rake
|
46
|
+
- name: Output versions
|
47
|
+
if: always()
|
48
|
+
shell: bash
|
49
|
+
run: |
|
50
|
+
set -eux
|
51
|
+
run_if_exist() {
|
52
|
+
if test "x$(which $1)" != "x"
|
53
|
+
then
|
54
|
+
"$@"
|
55
|
+
fi
|
56
|
+
}
|
57
|
+
uname -a
|
58
|
+
run_if_exist sw_vers # macos
|
59
|
+
run_if_exist lsb_release --all # ubuntu
|
60
|
+
ruby --version
|
61
|
+
gem --version
|
62
|
+
bundle --version
|
63
|
+
- name: Output gem versions
|
64
|
+
if: always()
|
65
|
+
run: bundle list
|
66
|
+
- name: Output deb package versions
|
67
|
+
if: always() && matrix.os == 'ubuntu'
|
68
|
+
run: dpkg -l
|
data/Rakefile
CHANGED
data/lib/synclenote/command.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require "synclenote"
|
2
|
-
|
3
1
|
require "yaml"
|
4
2
|
require "pathname"
|
5
3
|
require "logger"
|
@@ -137,18 +135,6 @@ EOS
|
|
137
135
|
|
138
136
|
EOS
|
139
137
|
|
140
|
-
HEADER = <<EOS.freeze
|
141
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
142
|
-
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">
|
143
|
-
<en-note>
|
144
|
-
EOS
|
145
|
-
|
146
|
-
FOOTER = <<EOS.freeze
|
147
|
-
</en-note>
|
148
|
-
EOS
|
149
|
-
|
150
|
-
TITLE_IF_EMPTY = "no title"
|
151
|
-
|
152
138
|
def load_yaml_path(path)
|
153
139
|
return YAML.safe_load(
|
154
140
|
path.read,
|
@@ -183,46 +169,8 @@ EOS
|
|
183
169
|
return 4 # 4 sec for sandbox
|
184
170
|
end
|
185
171
|
|
186
|
-
def
|
187
|
-
|
188
|
-
Redcarpet::Render::HTML.new(
|
189
|
-
filter_html: true,
|
190
|
-
hard_wrap: true,
|
191
|
-
),
|
192
|
-
underline: true,
|
193
|
-
lax_spacing: true,
|
194
|
-
footnotes: true,
|
195
|
-
no_intra_emphasis: true,
|
196
|
-
superscript: true,
|
197
|
-
strikethrough: true,
|
198
|
-
tables: true,
|
199
|
-
space_after_headers: true,
|
200
|
-
fenced_code_blocks: true,
|
201
|
-
# autolink: true,
|
202
|
-
)
|
203
|
-
html = @formatter.render(markdown_text)
|
204
|
-
return html
|
205
|
-
end
|
206
|
-
|
207
|
-
def create_note(note_path, options = {})
|
208
|
-
title = nil
|
209
|
-
tags = ["syncle"]
|
210
|
-
body = nil
|
211
|
-
note_path.open do |f|
|
212
|
-
title = f.gets.chomp.sub(/\A#\s*/, "")
|
213
|
-
if md = /\A(?<tags>(?:\[.*?\])+)(?:\s|\z)/.match(title)
|
214
|
-
tags += md[:tags].scan(/\[(.*?)\]/).flatten
|
215
|
-
title = md.post_match
|
216
|
-
end
|
217
|
-
body = f.read
|
218
|
-
end
|
219
|
-
html = build_html(body)
|
220
|
-
content = HEADER +
|
221
|
-
html.gsub(/ class=\".*?\"/, "").gsub(/<(br|hr|img).*?>/, "\\&</\\1>") +
|
222
|
-
FOOTER
|
223
|
-
title = TITLE_IF_EMPTY if /\A\s*\z/ === title
|
224
|
-
o = options.merge(title: title, content: content, tagNames: tags)
|
225
|
-
return Evernote::EDAM::Type::Note.new(o)
|
172
|
+
def create_note(note_path, **options)
|
173
|
+
return Synclenote::NoteBuilder.(note_path, **options)
|
226
174
|
end
|
227
175
|
|
228
176
|
def target_note?(note)
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require "nokogiri"
|
2
|
+
require "redcarpet"
|
3
|
+
|
4
|
+
class Synclenote::MarkdownToEnmlBuilder
|
5
|
+
HEADER = <<~EOS
|
6
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
7
|
+
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">
|
8
|
+
<en-note>
|
9
|
+
EOS
|
10
|
+
|
11
|
+
FOOTER = <<~EOS
|
12
|
+
</en-note>
|
13
|
+
EOS
|
14
|
+
|
15
|
+
class << self
|
16
|
+
def call(markdown_text)
|
17
|
+
formatter = Redcarpet::Markdown.new(
|
18
|
+
Redcarpet::Render::HTML.new(
|
19
|
+
filter_html: true,
|
20
|
+
hard_wrap: true,
|
21
|
+
),
|
22
|
+
underline: true,
|
23
|
+
lax_spacing: true,
|
24
|
+
footnotes: true,
|
25
|
+
no_intra_emphasis: true,
|
26
|
+
superscript: true,
|
27
|
+
strikethrough: true,
|
28
|
+
tables: true,
|
29
|
+
space_after_headers: true,
|
30
|
+
fenced_code_blocks: true,
|
31
|
+
# autolink: true,
|
32
|
+
)
|
33
|
+
html = formatter.render(markdown_text)
|
34
|
+
root = Nokogiri::HTML::DocumentFragment.parse(html)
|
35
|
+
|
36
|
+
root.css("*[class]").each do |node|
|
37
|
+
node.remove_attribute("class")
|
38
|
+
end
|
39
|
+
|
40
|
+
# '<a href="example.html?foo=bar&baz=quux">'
|
41
|
+
# =>
|
42
|
+
# '<a href="example.html?foo=bar&baz=quux">'
|
43
|
+
treated_html = root.to_html
|
44
|
+
content = [
|
45
|
+
HEADER,
|
46
|
+
treated_html.gsub(/<(br|hr|img).*?>/, "\\&</\\1>"),
|
47
|
+
FOOTER,
|
48
|
+
].join
|
49
|
+
return content
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Synclenote::NoteBuilder
|
2
|
+
DEFAULT_TAGS = %w[syncle]
|
3
|
+
|
4
|
+
TITLE_IF_EMPTY = "no title"
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def call(raw_note, guid: nil)
|
8
|
+
lines = raw_note.each_line.lazy
|
9
|
+
title, tags_in_raw_note, body_markdown = *parse_lines(lines)
|
10
|
+
title = TITLE_IF_EMPTY if /\A\s*\z/ === title
|
11
|
+
tags = (DEFAULT_TAGS + tags_in_raw_note).uniq
|
12
|
+
enml = Synclenote::MarkdownToEnmlBuilder.(body_markdown)
|
13
|
+
|
14
|
+
options = {
|
15
|
+
title:,
|
16
|
+
content: enml,
|
17
|
+
tagNames: tags,
|
18
|
+
}
|
19
|
+
options[:guid] = guid if guid
|
20
|
+
return Evernote::EDAM::Type::Note.new(options)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def parse_lines(lines)
|
26
|
+
tags = []
|
27
|
+
title = lines.first.chomp.sub(/\A#\s*/, "")
|
28
|
+
lines = lines.drop(1)
|
29
|
+
md = /\A(?<tags>(?:\[.*?\])+)(?:\s|\z)/.match(title)
|
30
|
+
if md
|
31
|
+
tags = md[:tags].scan(/\[(.*?)\]/).flatten
|
32
|
+
title = md.post_match
|
33
|
+
end
|
34
|
+
|
35
|
+
lines = lines.drop_while { |l| /\A\s*\z/ === l }
|
36
|
+
body_markdown = lines.to_a.join
|
37
|
+
|
38
|
+
return [title, tags, body_markdown]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/synclenote/version.rb
CHANGED
data/lib/synclenote.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
# This module is a namespace for this gem.
|
2
2
|
module Synclenote
|
3
3
|
DRY_RUN = false
|
4
|
-
autoload :VERSION, "synclenote/varsion"
|
5
|
-
|
6
|
-
autoload :Command, "synclenote/command"
|
7
|
-
autoload :Configuration, "synclenote/configuration"
|
8
4
|
|
9
5
|
def self.configure(version, &block)
|
10
6
|
Configuration.run(version, &block)
|
11
7
|
end
|
12
8
|
end
|
9
|
+
|
10
|
+
(Pathname(__dir__).glob("**/*.rb") - [Pathname(__FILE__)]).map { |path|
|
11
|
+
path.sub_ext("")
|
12
|
+
}.sort.each do |path|
|
13
|
+
require(path.relative_path_from(__dir__))
|
14
|
+
end
|
data/synclenote.gemspec
CHANGED
@@ -24,10 +24,13 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
25
25
|
spec.require_paths = ["lib"]
|
26
26
|
|
27
|
+
spec.add_runtime_dependency "base64" # suppress warnings
|
27
28
|
spec.add_runtime_dependency "evernote_oauth"
|
29
|
+
spec.add_runtime_dependency "nokogiri"
|
28
30
|
spec.add_runtime_dependency "redcarpet"
|
29
31
|
spec.add_runtime_dependency "thor"
|
30
32
|
spec.add_development_dependency "bundler"
|
31
33
|
spec.add_development_dependency "debug"
|
32
34
|
spec.add_development_dependency "rake"
|
35
|
+
spec.add_development_dependency "test-unit"
|
33
36
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class Synclenote::MarkdownToEnmlBuilderTest < Test::Unit::TestCase
|
4
|
+
sub_test_case(".call") do
|
5
|
+
data(
|
6
|
+
regular_text: {
|
7
|
+
markdown_text: <<~EOS,
|
8
|
+
body
|
9
|
+
EOS
|
10
|
+
expected_enml_text: <<~EOS,
|
11
|
+
<p>body</p>
|
12
|
+
EOS
|
13
|
+
},
|
14
|
+
fenced_code_blocks: {
|
15
|
+
markdown_text: <<~EOS,
|
16
|
+
```ruby
|
17
|
+
1 + 2 * 3
|
18
|
+
```
|
19
|
+
EOS
|
20
|
+
# remove "class" attribute
|
21
|
+
expected_enml_text: <<~EOS,
|
22
|
+
<pre><code>1 + 2 * 3
|
23
|
+
</code></pre>
|
24
|
+
EOS
|
25
|
+
},
|
26
|
+
hard_wrap: {
|
27
|
+
markdown_text: <<~EOS,
|
28
|
+
abc
|
29
|
+
def
|
30
|
+
EOS
|
31
|
+
# convert "<br/>" to "<br></br>"
|
32
|
+
expected_enml_text: <<~EOS,
|
33
|
+
<p>abc<br></br>
|
34
|
+
def</p>
|
35
|
+
EOS
|
36
|
+
},
|
37
|
+
hyperlink: {
|
38
|
+
markdown_text: <<~EOS,
|
39
|
+
[link text](https://example.org/?foo=bar&baz=quux;hoge=fuga#anchor)
|
40
|
+
EOS
|
41
|
+
# convert "&" to "&"
|
42
|
+
expected_enml_text: <<~EOS,
|
43
|
+
<p><a href="https://example.org/?foo=bar&baz=quux;hoge=fuga#anchor">link text</a></p>
|
44
|
+
EOS
|
45
|
+
},
|
46
|
+
)
|
47
|
+
test("returns ENML String") do |h|
|
48
|
+
assert_equal(
|
49
|
+
[
|
50
|
+
Synclenote::MarkdownToEnmlBuilder::HEADER,
|
51
|
+
h[:expected_enml_text],
|
52
|
+
Synclenote::MarkdownToEnmlBuilder::FOOTER,
|
53
|
+
].join,
|
54
|
+
Synclenote::MarkdownToEnmlBuilder.(h[:markdown_text]),
|
55
|
+
)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class Synclenote::NoteBuilderTest < Test::Unit::TestCase
|
4
|
+
sub_test_case(".call") do
|
5
|
+
data(
|
6
|
+
regular: {
|
7
|
+
raw_note_text: <<~EOS,
|
8
|
+
# title
|
9
|
+
|
10
|
+
body
|
11
|
+
EOS
|
12
|
+
expected_title: "title",
|
13
|
+
expected_additional_tag_names: [],
|
14
|
+
expected_content_body: <<~EOS,
|
15
|
+
<p>body</p>
|
16
|
+
EOS
|
17
|
+
},
|
18
|
+
no_title: {
|
19
|
+
raw_note_text: <<~EOS,
|
20
|
+
# \t
|
21
|
+
|
22
|
+
body
|
23
|
+
EOS
|
24
|
+
expected_title: Synclenote::NoteBuilder::TITLE_IF_EMPTY,
|
25
|
+
expected_additional_tag_names: [],
|
26
|
+
expected_content_body: <<~EOS,
|
27
|
+
<p>body</p>
|
28
|
+
EOS
|
29
|
+
},
|
30
|
+
have_tags: {
|
31
|
+
raw_note_text: <<~EOS,
|
32
|
+
# [foo][bar-baz] title
|
33
|
+
|
34
|
+
body
|
35
|
+
EOS
|
36
|
+
expected_title: "title",
|
37
|
+
expected_additional_tag_names: %w[foo bar-baz],
|
38
|
+
expected_content_body: <<~EOS,
|
39
|
+
<p>body</p>
|
40
|
+
EOS
|
41
|
+
},
|
42
|
+
)
|
43
|
+
test("returns Note object") do |h|
|
44
|
+
Tempfile.create do |f|
|
45
|
+
f.write(h[:raw_note_text])
|
46
|
+
f.close
|
47
|
+
raw_note_path = Pathname(f.path)
|
48
|
+
note = Synclenote::NoteBuilder.(raw_note_path)
|
49
|
+
assert_equal(h[:expected_title], note.title)
|
50
|
+
assert_equal(
|
51
|
+
[
|
52
|
+
*Synclenote::NoteBuilder::DEFAULT_TAGS,
|
53
|
+
*h[:expected_additional_tag_names],
|
54
|
+
].sort,
|
55
|
+
note.tagNames.sort,
|
56
|
+
)
|
57
|
+
assert_equal(
|
58
|
+
[
|
59
|
+
Synclenote::MarkdownToEnmlBuilder::HEADER,
|
60
|
+
h[:expected_content_body],
|
61
|
+
Synclenote::MarkdownToEnmlBuilder::FOOTER,
|
62
|
+
].join,
|
63
|
+
note.content,
|
64
|
+
)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: synclenote
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuya.Nishida.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-01-
|
11
|
+
date: 2024-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: base64
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: evernote_oauth
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -24,6 +38,20 @@ dependencies:
|
|
24
38
|
- - ">="
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: nokogiri
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: redcarpet
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +122,20 @@ dependencies:
|
|
94
122
|
- - ">="
|
95
123
|
- !ruby/object:Gem::Version
|
96
124
|
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: test-unit
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
97
139
|
description: A synchronization tool for GFM (GitHub Flavored Markdown) files and Evernote.
|
98
140
|
email:
|
99
141
|
- yuya@j96.org
|
@@ -103,6 +145,7 @@ extensions: []
|
|
103
145
|
extra_rdoc_files: []
|
104
146
|
files:
|
105
147
|
- ".github/dependabot.yml"
|
148
|
+
- ".github/workflows/test.yml"
|
106
149
|
- ".gitignore"
|
107
150
|
- ".travis.yml"
|
108
151
|
- Gemfile
|
@@ -114,8 +157,13 @@ files:
|
|
114
157
|
- lib/synclenote.rb
|
115
158
|
- lib/synclenote/command.rb
|
116
159
|
- lib/synclenote/configuration.rb
|
160
|
+
- lib/synclenote/markdown_to_enml_builder.rb
|
161
|
+
- lib/synclenote/note_builder.rb
|
117
162
|
- lib/synclenote/version.rb
|
118
163
|
- synclenote.gemspec
|
164
|
+
- test/lib/synclenote/markdown_to_enml_builder_test.rb
|
165
|
+
- test/lib/synclenote/note_builder_test.rb
|
166
|
+
- test/test_helper.rb
|
119
167
|
homepage: https://github.com/nishidayuya/synclenote
|
120
168
|
licenses:
|
121
169
|
- X11
|
@@ -139,4 +187,7 @@ rubygems_version: 3.5.3
|
|
139
187
|
signing_key:
|
140
188
|
specification_version: 4
|
141
189
|
summary: A synchronization tool for GFM (GitHub Flavored Markdown) files and Evernote.
|
142
|
-
test_files:
|
190
|
+
test_files:
|
191
|
+
- test/lib/synclenote/markdown_to_enml_builder_test.rb
|
192
|
+
- test/lib/synclenote/note_builder_test.rb
|
193
|
+
- test/test_helper.rb
|