chronicle-pinboard 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -0
- data/Gemfile +0 -2
- data/README.md +6 -5
- data/Rakefile +1 -3
- data/bin/console +4 -12
- data/chronicle-pinboard.gemspec +29 -26
- data/lib/chronicle/pinboard/pinboard_extractor.rb +11 -8
- data/lib/chronicle/pinboard/pinboard_transformer.rb +57 -70
- data/lib/chronicle/pinboard/version.rb +1 -3
- data/lib/chronicle/pinboard.rb +3 -5
- metadata +70 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c3ca6b04d95423377e1b2b2d5fc935ae991917e7f29bbb21174e9412eb6c0251
|
4
|
+
data.tar.gz: 78166200e312683229681764e3b43c99b16eb2359df2e3b019814f14adf21571
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 735e34e238f0f2ff2f455b985484c4e4434372fc7293c20efa90a24327131dd303082f8d8fb9a315fca5cf1571c5c2f7f53bd41dcd8291c1b34b0738e0a62fe7
|
7
|
+
data.tar.gz: a5b7bc6653435128cd375e71a0c9a5045c74118567032ab323fd9d2878f45ba29d673d86cb1c0e959ce389dd031135b7471d7b19af73a268aefa7c80ce6bc198
|
data/.rubocop.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -13,11 +13,12 @@ Extract your Pinboard bookmarks using the command line with this plugin for [chr
|
|
13
13
|
## Usage
|
14
14
|
|
15
15
|
```sh
|
16
|
-
gem install chronicle-etl
|
17
|
-
chronicle-etl
|
16
|
+
$ gem install chronicle-etl
|
17
|
+
$ chronicle-etl plugins:install pinboard
|
18
|
+
|
19
|
+
# You can get a pinboard access token from https://pinboard.in/settings/password
|
20
|
+
$ chronicle-etl secrets:set pinboard access_token PINBOARD_ACCESS_TOKEN
|
18
21
|
|
19
|
-
# You can get PINBOARD_ACCESS_TOKEN from https://pinboard.in/settings/password
|
20
22
|
# Extract pinboard bookmarks from the last 10 days
|
21
|
-
chronicle-etl --extractor pinboard --
|
23
|
+
$ chronicle-etl --extractor pinboard --since 10d
|
22
24
|
```
|
23
|
-
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: true
|
3
2
|
|
4
|
-
require
|
5
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'chronicle/pinboard'
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
11
|
-
# require "pry"
|
12
|
-
# Pry.start
|
13
|
-
|
14
|
-
require "irb"
|
15
|
-
IRB.start(__FILE__)
|
6
|
+
require 'pry'
|
7
|
+
Pry.start
|
data/chronicle-pinboard.gemspec
CHANGED
@@ -1,45 +1,48 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
lib = File.expand_path("../lib", __FILE__)
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
4
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
-
require
|
3
|
+
require 'chronicle/pinboard/version'
|
6
4
|
|
7
5
|
Gem::Specification.new do |spec|
|
8
|
-
spec.name =
|
6
|
+
spec.name = 'chronicle-pinboard'
|
9
7
|
spec.version = Chronicle::Pinboard::VERSION
|
10
|
-
spec.authors = [
|
11
|
-
spec.email = [
|
8
|
+
spec.authors = ['Andrew Louis']
|
9
|
+
spec.email = ['andrew@hyfen.net']
|
12
10
|
|
13
|
-
spec.summary =
|
14
|
-
spec.description =
|
15
|
-
spec.homepage =
|
11
|
+
spec.summary = 'Pinboard importer for Chronicle'
|
12
|
+
spec.description = 'Import your Pinboard bookmarks'
|
13
|
+
spec.homepage = 'https://github.com/chronicle-app/chronicle-pinboard'
|
16
14
|
|
17
15
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
18
16
|
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
19
17
|
if spec.respond_to?(:metadata)
|
20
|
-
spec.metadata['allowed_push_host'] =
|
18
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
21
19
|
|
22
|
-
spec.metadata[
|
23
|
-
spec.metadata[
|
24
|
-
spec.metadata[
|
20
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
21
|
+
spec.metadata['source_code_uri'] = 'https://github.com/chronicle-app/chronicle-pinboard'
|
22
|
+
spec.metadata['changelog_uri'] = 'https://github.com/chronicle-app/chronicle-pinboard'
|
25
23
|
else
|
26
|
-
raise
|
27
|
-
|
24
|
+
raise 'RubyGems 2.0 or newer is required to protect against ' \
|
25
|
+
'public gem pushes.'
|
28
26
|
end
|
29
27
|
|
30
28
|
# Specify which files should be added to the gem when it is released.
|
31
29
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
32
|
-
spec.files
|
30
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
33
31
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
34
32
|
end
|
35
|
-
spec.bindir =
|
33
|
+
spec.bindir = 'exe'
|
36
34
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
37
|
-
spec.require_paths = [
|
38
|
-
|
39
|
-
|
40
|
-
spec.add_dependency
|
41
|
-
|
42
|
-
spec.
|
43
|
-
spec.
|
44
|
-
spec.
|
35
|
+
spec.require_paths = ['lib']
|
36
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
37
|
+
|
38
|
+
spec.add_dependency 'chronicle-core', '~> 0.3'
|
39
|
+
spec.add_dependency 'chronicle-etl', '~> 0.6'
|
40
|
+
spec.add_dependency 'faraday', '~> 2'
|
41
|
+
spec.add_dependency 'omniauth-oauth2', '~> 1'
|
42
|
+
spec.add_dependency 'sqlite3', '~> 1.4'
|
43
|
+
|
44
|
+
spec.add_development_dependency 'bundler', '~> 2.3'
|
45
|
+
spec.add_development_dependency 'pry-byebug', '~> 3.10'
|
46
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
47
|
+
spec.add_development_dependency 'rubocop', '~> 1.63'
|
45
48
|
end
|
@@ -2,25 +2,27 @@ require 'chronicle/etl'
|
|
2
2
|
require 'faraday'
|
3
3
|
|
4
4
|
module Chronicle
|
5
|
-
module Pinboard
|
5
|
+
module Pinboard
|
6
6
|
class PinboardExtractor < Chronicle::ETL::Extractor
|
7
7
|
register_connector do |r|
|
8
|
-
r.
|
9
|
-
r.
|
8
|
+
r.source = :pinboard
|
9
|
+
r.type = :bookmark
|
10
|
+
r.strategy = :api
|
11
|
+
r.description = 'a bookmark from pinboard'
|
10
12
|
end
|
11
13
|
|
12
14
|
setting :access_token, required: true
|
13
15
|
|
14
16
|
def prepare
|
15
|
-
raise(Chronicle::ETL::ExtractionError,
|
17
|
+
raise(Chronicle::ETL::ExtractionError, 'Access token is missing') if @config.access_token.empty?
|
16
18
|
|
17
19
|
@bookmarks = load_bookmarks
|
18
|
-
@username = @config.access_token.split(
|
20
|
+
@username = @config.access_token.split(':').first
|
19
21
|
end
|
20
22
|
|
21
23
|
def extract
|
22
24
|
@bookmarks.each do |bookmark|
|
23
|
-
yield
|
25
|
+
yield build_extraction(data: bookmark, meta: { username: @username })
|
24
26
|
end
|
25
27
|
end
|
26
28
|
|
@@ -34,18 +36,19 @@ module Chronicle
|
|
34
36
|
params = {
|
35
37
|
auth_token: @config.access_token,
|
36
38
|
format: 'json',
|
37
|
-
meta: true
|
39
|
+
meta: true
|
38
40
|
}
|
39
41
|
params[:fromdt] = @config.since.utc.iso8601 if @config.since
|
40
42
|
|
41
43
|
conn = Faraday.new(
|
42
44
|
url: 'https://api.pinboard.in/',
|
43
|
-
params:
|
45
|
+
params:
|
44
46
|
)
|
45
47
|
|
46
48
|
response = conn.get('/v1/posts/all')
|
47
49
|
bookmarks = JSON.parse(response.body, { symbolize_names: true })
|
48
50
|
bookmarks = bookmarks.keep_if { |bookmark| Time.parse(bookmark[:time]) < @config.until } if @config.until
|
51
|
+
bookmarks = bookmarks.first(@config.limit) if @config.limit
|
49
52
|
bookmarks
|
50
53
|
end
|
51
54
|
end
|
@@ -1,98 +1,85 @@
|
|
1
1
|
require 'chronicle/etl'
|
2
|
+
require 'chronicle/models'
|
2
3
|
|
3
4
|
module Chronicle
|
4
5
|
module Pinboard
|
5
6
|
class PinboardTransformer < Chronicle::ETL::Transformer
|
6
7
|
register_connector do |r|
|
7
|
-
r.
|
8
|
-
r.
|
8
|
+
r.source = :pinboard
|
9
|
+
r.type = :bookmark
|
10
|
+
r.strategy = :api
|
11
|
+
r.description = 'a booknark from pinboard'
|
12
|
+
r.from_schema = :extraction
|
13
|
+
r.to_schema = :chronicle
|
9
14
|
end
|
10
15
|
|
11
|
-
def transform
|
12
|
-
|
13
|
-
|
14
|
-
|
16
|
+
def transform(record)
|
17
|
+
site = build_site(record.data)
|
18
|
+
agent = build_agent(record.extraction.meta[:username])
|
19
|
+
id = record.data[:hash]
|
20
|
+
end_time = Time.parse(record.data[:time])
|
15
21
|
|
16
|
-
|
17
|
-
Time.parse(@bookmark[:time])
|
18
|
-
end
|
22
|
+
actions = []
|
19
23
|
|
20
|
-
|
21
|
-
@bookmark[:hash]
|
22
|
-
end
|
24
|
+
actions << build_bookmark(site:, agent:, id:, end_time:)
|
23
25
|
|
24
|
-
|
26
|
+
note = record.data[:extended]
|
27
|
+
actions << build_comment(site:, agent:, id:, end_time:, note:) if note.size.positive?
|
25
28
|
|
26
|
-
|
27
|
-
record = ::Chronicle::ETL::Models::Activity.new
|
28
|
-
record.end_at = timestamp
|
29
|
-
record.verb = 'liked'
|
30
|
-
record.provider_id = id
|
31
|
-
record.provider = 'pinboard'
|
32
|
-
record.dedupe_on = [[:provider, :verb, :provider_id]]
|
33
|
-
|
34
|
-
record.involved = build_bookmark
|
35
|
-
record.actor = build_actor
|
36
|
-
|
37
|
-
record
|
29
|
+
actions.compact
|
38
30
|
end
|
39
31
|
|
40
|
-
|
41
|
-
record = ::Chronicle::ETL::Models::Entity.new
|
42
|
-
record.title = @bookmark[:description]
|
43
|
-
record.provider_url = @bookmark[:href]
|
44
|
-
record.dedupe_on << [:provider_url]
|
32
|
+
private
|
45
33
|
|
46
|
-
|
34
|
+
def build_bookmark(site:, agent:, id:, end_time:)
|
35
|
+
Chronicle::Models::BookmarkAction.new do |r|
|
36
|
+
r.source = 'pinboard'
|
37
|
+
r.source_id = id
|
38
|
+
r.end_time = end_time
|
39
|
+
r.agent = agent
|
40
|
+
r.object = site
|
47
41
|
|
48
|
-
|
49
|
-
|
42
|
+
r.dedupe_on = [%i[source source_id type]]
|
43
|
+
end
|
50
44
|
end
|
51
45
|
|
52
|
-
def
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
record.provider = "pinboard"
|
61
|
-
record.dedupe_on << [:represents, :provider, :provider_id]
|
62
|
-
|
63
|
-
involvement = ::Chronicle::ETL::Models::Activity.new
|
64
|
-
involvement.end_at = timestamp
|
65
|
-
involvement.verb = 'noted'
|
66
|
-
involvement.provider_id = id
|
67
|
-
involvement.provider = 'pinboard'
|
68
|
-
involvement.dedupe_on << [:provider, :verb, :provider_id]
|
69
|
-
involvement.actor = build_actor
|
46
|
+
def build_comment(site:, agent:, id:, note:, end_time:)
|
47
|
+
comment = Chronicle::Models::Comment.new do |r|
|
48
|
+
r.source = 'pinboard'
|
49
|
+
r.source_id = id
|
50
|
+
r.text = note
|
51
|
+
r.about = [site]
|
52
|
+
r.dedupe_on = [%i[source source_id type]]
|
53
|
+
end
|
70
54
|
|
71
|
-
|
55
|
+
Chronicle::Models::CommentAction.new do |r|
|
56
|
+
r.source = 'pinboard'
|
57
|
+
r.source_id = id
|
58
|
+
r.end_time = end_time
|
59
|
+
r.agent = agent
|
60
|
+
r.result = comment
|
61
|
+
r.object = site
|
72
62
|
|
73
|
-
|
63
|
+
r.dedupe_on = [%i[source source_id type]]
|
64
|
+
end
|
74
65
|
end
|
75
66
|
|
76
|
-
def
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
record.dedupe_on << [:provider, :slug, :represents]
|
83
|
-
record
|
67
|
+
def build_site(bookmark)
|
68
|
+
Chronicle::Models::Thing.new do |r|
|
69
|
+
r.name = bookmark[:description]
|
70
|
+
r.url = bookmark[:href]
|
71
|
+
r.dedupe_on = [[:url]]
|
72
|
+
r.keywords = bookmark[:tags].split.map(&:strip)
|
84
73
|
end
|
85
74
|
end
|
86
75
|
|
87
|
-
def
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
record.dedupe_on << [:provider, :represents, :slug]
|
95
|
-
record
|
76
|
+
def build_agent(username)
|
77
|
+
Chronicle::Models::Person.new do |r|
|
78
|
+
r.source = 'pinboard'
|
79
|
+
r.slug = username
|
80
|
+
r.url = "https://pinboard.in/u:#{username}"
|
81
|
+
r.dedupe_on = [[:url], %i[source slug type]]
|
82
|
+
end
|
96
83
|
end
|
97
84
|
end
|
98
85
|
end
|
data/lib/chronicle/pinboard.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require_relative
|
4
|
-
require_relative "pinboard/pinboard_extractor"
|
5
|
-
require_relative "pinboard/pinboard_transformer"
|
1
|
+
require_relative 'pinboard/version'
|
2
|
+
require_relative 'pinboard/pinboard_extractor'
|
3
|
+
require_relative 'pinboard/pinboard_transformer'
|
6
4
|
|
7
5
|
module Chronicle
|
8
6
|
module Pinboard
|
metadata
CHANGED
@@ -1,43 +1,85 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chronicle-pinboard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Louis
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-04-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: chronicle-core
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.3'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.3'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: chronicle-etl
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - "~>"
|
18
32
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0.
|
33
|
+
version: '0.6'
|
20
34
|
type: :runtime
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
38
|
- - "~>"
|
25
39
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0.
|
40
|
+
version: '0.6'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: faraday
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
45
|
- - "~>"
|
32
46
|
- !ruby/object:Gem::Version
|
33
|
-
version: '2
|
47
|
+
version: '2'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: omniauth-oauth2
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: sqlite3
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.4'
|
34
76
|
type: :runtime
|
35
77
|
prerelease: false
|
36
78
|
version_requirements: !ruby/object:Gem::Requirement
|
37
79
|
requirements:
|
38
80
|
- - "~>"
|
39
81
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
82
|
+
version: '1.4'
|
41
83
|
- !ruby/object:Gem::Dependency
|
42
84
|
name: bundler
|
43
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,34 +94,48 @@ dependencies:
|
|
52
94
|
- - "~>"
|
53
95
|
- !ruby/object:Gem::Version
|
54
96
|
version: '2.3'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry-byebug
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '3.10'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '3.10'
|
55
111
|
- !ruby/object:Gem::Dependency
|
56
112
|
name: rake
|
57
113
|
requirement: !ruby/object:Gem::Requirement
|
58
114
|
requirements:
|
59
115
|
- - "~>"
|
60
116
|
- !ruby/object:Gem::Version
|
61
|
-
version: 13.0
|
117
|
+
version: '13.0'
|
62
118
|
type: :development
|
63
119
|
prerelease: false
|
64
120
|
version_requirements: !ruby/object:Gem::Requirement
|
65
121
|
requirements:
|
66
122
|
- - "~>"
|
67
123
|
- !ruby/object:Gem::Version
|
68
|
-
version: 13.0
|
124
|
+
version: '13.0'
|
69
125
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
126
|
+
name: rubocop
|
71
127
|
requirement: !ruby/object:Gem::Requirement
|
72
128
|
requirements:
|
73
129
|
- - "~>"
|
74
130
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
131
|
+
version: '1.63'
|
76
132
|
type: :development
|
77
133
|
prerelease: false
|
78
134
|
version_requirements: !ruby/object:Gem::Requirement
|
79
135
|
requirements:
|
80
136
|
- - "~>"
|
81
137
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
138
|
+
version: '1.63'
|
83
139
|
description: Import your Pinboard bookmarks
|
84
140
|
email:
|
85
141
|
- andrew@hyfen.net
|
@@ -88,6 +144,7 @@ extensions: []
|
|
88
144
|
extra_rdoc_files: []
|
89
145
|
files:
|
90
146
|
- ".gitignore"
|
147
|
+
- ".rubocop.yml"
|
91
148
|
- CODE_OF_CONDUCT.md
|
92
149
|
- Gemfile
|
93
150
|
- README.md
|
@@ -106,6 +163,7 @@ metadata:
|
|
106
163
|
homepage_uri: https://github.com/chronicle-app/chronicle-pinboard
|
107
164
|
source_code_uri: https://github.com/chronicle-app/chronicle-pinboard
|
108
165
|
changelog_uri: https://github.com/chronicle-app/chronicle-pinboard
|
166
|
+
rubygems_mfa_required: 'true'
|
109
167
|
post_install_message:
|
110
168
|
rdoc_options: []
|
111
169
|
require_paths:
|
@@ -121,7 +179,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
121
179
|
- !ruby/object:Gem::Version
|
122
180
|
version: '0'
|
123
181
|
requirements: []
|
124
|
-
rubygems_version: 3.
|
182
|
+
rubygems_version: 3.4.10
|
125
183
|
signing_key:
|
126
184
|
specification_version: 4
|
127
185
|
summary: Pinboard importer for Chronicle
|