readwise 0.5.0 → 1.0.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2132de7e8f9fdbc395fc94872968cee73d333c67723b2e81a7554b61105e1469
4
- data.tar.gz: 4aca80570f7ea3d6d7045cfe0f3fe75c64d578e4ea2de05697d98e747215d74a
3
+ metadata.gz: 69d1388e16dfcaf6db33d61ee780ce3172154a2f48ddc246fa0e82cf7eff81ec
4
+ data.tar.gz: 369ba0fd764cbc86cb78e99008dcf967a525bd850ed0f5e5270c046808a12248
5
5
  SHA512:
6
- metadata.gz: 35498d0c04b98eab247b3bf78bdf66dc51294f0538273c9515d8122b737c494421a4425f241d25577d77ec55a2ce01455e02fb91281a72769c753a7d74e9690c
7
- data.tar.gz: 751bfaf4334fcf74cd6f16b685108a8df095a84366b91c76e1978447d839f28ff7234c136f933bd37eb18f7e1b0e437a40e84e7b17a4c5e3641a6d0995519268
6
+ metadata.gz: 599eef221a90c3c7259f99d65816f902104ed85e197af64887ced7522be0db56239700c199cb4ba1e8f7a83e4dca85a4331e68258c6ff7f4a23b09ef3cc4da8a
7
+ data.tar.gz: 4dad02e9aa6063a8da149b775185baf239a3ec5f6f799263fd8b02324e08ae8fa0dc281b0008a10d438e01a84d4ce24c3ad676a4a287a67f71964fa0a6273a22
data/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [1.0.1] - 2025-06-29
6
+ - Handle absent tags in transforming highlights
7
+
8
+ ## [1.0.0] - 2025-06-29
9
+ - Add Readwise API v3 support for Reader documents ([#13](https://github.com/joshbeckman/readwise-ruby/pull/13))
10
+ - Add `daily_review` client method and Review type ([#14](https://github.com/joshbeckman/readwise-ruby/pull/14))
11
+ - Add comprehensive document API methods (list, get, create, update, delete)
12
+ - Add support for document tags and metadata handling
13
+ - Add tests for document API functionality
14
+
5
15
  ## [0.5.0] - 2023-06-15
6
16
  - Add methods to create/update highlights ([#8](https://github.com/joshbeckman/readwise-ruby/pull/12))
7
17
  - Add methods to add/update/remove highlight tags
@@ -9,15 +19,15 @@
9
19
 
10
20
  ## [0.4.0] - 2023-03-19
11
21
 
12
- - Add `get_highlight` client method ([#10](https://github.com/andjosh/readwise-ruby/pull/10) from [@ajistrying](https://github.com/ajistrying))
22
+ - Add `get_highlight` client method ([#10](https://github.com/joshbeckman/readwise-ruby/pull/10) from [@ajistrying](https://github.com/ajistrying))
13
23
 
14
24
  ## [0.3.0] - 2023-02-28
15
25
 
16
- - Change `Tag` from hash to struct ([#6](https://github.com/andjosh/readwise-ruby/pull/6) from [@ajistrying](https://github.com/ajistrying))
26
+ - Change `Tag` from hash to struct ([#6](https://github.com/joshbeckman/readwise-ruby/pull/6) from [@ajistrying](https://github.com/ajistrying))
17
27
 
18
28
  ## [0.2.0] - 2023-02-20
19
29
 
20
- - Add support for `Book.note` ([#4](https://github.com/andjosh/readwise-ruby/pull/4))
30
+ - Add support for `Book.note` ([#4](https://github.com/joshbeckman/readwise-ruby/pull/4))
21
31
 
22
32
  ## [0.1.0] - 2023-01-16
23
33
 
data/CODE_OF_CONDUCT.md CHANGED
@@ -55,7 +55,7 @@ further defined and clarified by project maintainers.
55
55
  ## Enforcement
56
56
 
57
57
  Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
- reported by contacting the project team at email@andjosh.com. All
58
+ reported by contacting the project team at josh@joshbeckman.org. All
59
59
  complaints will be reviewed and investigated and will result in a response that
60
60
  is deemed necessary and appropriate to the circumstances. The project team is
61
61
  obligated to maintain confidentiality with regard to the reporter of an incident.
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # Readwise
2
2
 
3
- [Readwise](https://readwise.io/) is an application suite to store, revisit, and learn from your book and article highlights. This is a basic library to call the [Readwise API](https://readwise.io/api_deets) to read and write highlights.
3
+ [![Gem Version](https://badge.fury.io/rb/readwise.svg)](https://badge.fury.io/rb/readwise) [![Ruby](https://github.com/joshbeckman/readwise-ruby/actions/workflows/ruby.yml/badge.svg)](https://github.com/joshbeckman/readwise-ruby/actions/workflows/ruby.yml)
4
+
5
+ [Readwise](https://readwise.io/) is an application suite to store, revisit, and learn from your book and article highlights. This is a basic library to call the [Readwise API](https://readwise.io/api_deets) to read and write highlights, and manage Reader documents through the [Reader API](https://readwise.io/reader_api).
4
6
 
5
7
  This library is not at 100% coverage of the API, so if you need a method that is missing, open an issue or contribute changes!
6
8
 
@@ -24,6 +26,10 @@ Or install it yourself as:
24
26
 
25
27
  First, obtain an API access token from https://readwise.io/access_token.
26
28
 
29
+ ### Highlights API (V2)
30
+
31
+ The [V2 API](https://readwise.io/api_deets) provides access to your highlights and books:
32
+
27
33
  ```ruby
28
34
  client = Readwise::Client.new(token: token)
29
35
 
@@ -52,6 +58,88 @@ updated_tag = client.update_highlight_tag(highlight: highlight, tag: added_tag)
52
58
 
53
59
  # remove a tag from a highlight
54
60
  client.remove_highlight_tag(highlight: highlight, tag: added_tag)
61
+
62
+ # get daily review highlights
63
+ daily_review = client.daily_review
64
+ puts daily_review.id
65
+ puts daily_review.url
66
+ puts daily_review.completed?
67
+ puts daily_review.highlights.size
68
+ puts daily_review.highlights.first.text
69
+ ```
70
+
71
+ ### Reader API (V3)
72
+
73
+ The [V3 API](https://readwise.io/reader_api) provides access to Readwise Reader functionality for managing documents (articles, PDFs, etc.):
74
+
75
+ ```ruby
76
+ # Get all documents
77
+ documents = client.get_documents
78
+
79
+ # Get documents with filters
80
+ documents = client.get_documents(
81
+ updated_after: '2023-01-01T00:00:00Z',
82
+ location: 'new', # 'new', 'later', 'archive', or 'feed'
83
+ category: 'article' # 'article', 'email', 'rss', 'highlight', 'note', 'pdf', 'epub', 'tweet', 'video'
84
+ )
85
+
86
+ # Get a specific document
87
+ document = client.get_document(document_id: '123456')
88
+
89
+ puts document.title
90
+ puts document.author
91
+ puts document.url
92
+ puts document.reading_progress
93
+ puts document.location
94
+ puts document.category
95
+
96
+ # Check document properties
97
+ puts document.read? # reading progress >= 85%
98
+ puts document.read?(threshold: 0.5) # custom threshold
99
+ puts document.parent? # is this a top-level document?
100
+ puts document.child? # is this a highlight/note of another document?
101
+
102
+ # Check location
103
+ puts document.in_new?
104
+ puts document.in_later?
105
+ puts document.in_archive?
106
+
107
+ # Check category
108
+ puts document.article?
109
+ puts document.pdf?
110
+ puts document.epub?
111
+ puts document.tweet?
112
+ puts document.video?
113
+ puts document.book?
114
+ puts document.email?
115
+ puts document.rss?
116
+ puts document.highlight?
117
+ puts document.note?
118
+
119
+ # Access timestamps
120
+ puts document.created_at_time
121
+ puts document.updated_at_time
122
+ puts document.published_date_time
123
+
124
+ # Create a new document
125
+ document_create = Readwise::DocumentCreate.new(
126
+ url: 'https://example.com/article',
127
+ title: 'My Article',
128
+ author: 'John Doe',
129
+ html: '<p>Article content</p>',
130
+ summary: 'A brief summary',
131
+ location: 'new', # 'new', 'later', 'archive', or 'feed'
132
+ category: 'article', # 'article', 'email', 'rss', etc.
133
+ tags: ['technology', 'programming'],
134
+ notes: 'My personal notes',
135
+ should_clean_html: true,
136
+ saved_using: 'api'
137
+ )
138
+
139
+ document = client.create_document(document: document_create)
140
+
141
+ # Create multiple documents
142
+ documents = client.create_documents(documents: [document_create1, document_create2])
55
143
  ```
56
144
 
57
145
  ## Development
@@ -62,7 +150,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
62
150
 
63
151
  ## Contributing
64
152
 
65
- Bug reports and pull requests are welcome on GitHub at https://github.com/andjosh/readwise. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
153
+ Bug reports and pull requests are welcome on GitHub at https://github.com/joshbeckman/readwise-ruby. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
66
154
 
67
155
  ## License
68
156
 
@@ -70,4 +158,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
70
158
 
71
159
  ## Code of Conduct
72
160
 
73
- Everyone interacting in the Readwise project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/andjosh/readwise/blob/master/CODE_OF_CONDUCT.md).
161
+ Everyone interacting in the Readwise project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/joshbeckman/readwise-ruby/blob/main/CODE_OF_CONDUCT.md).
@@ -3,12 +3,15 @@ require 'net/http'
3
3
  require_relative 'book'
4
4
  require_relative 'highlight'
5
5
  require_relative 'tag'
6
+ require_relative 'document'
7
+ require_relative 'review'
6
8
 
7
9
  module Readwise
8
10
  class Client
9
11
  class Error < StandardError; end
10
12
 
11
13
  BASE_URL = "https://readwise.io/api/v2/"
14
+ V3_BASE_URL = "https://readwise.io/api/v3/"
12
15
 
13
16
  def initialize(token: nil)
14
17
  raise ArgumentError unless token
@@ -16,6 +19,43 @@ module Readwise
16
19
  @token = token.to_s
17
20
  end
18
21
 
22
+ def create_document(document:)
23
+ raise ArgumentError unless document.is_a?(Readwise::DocumentCreate)
24
+
25
+ url = V3_BASE_URL + 'save/'
26
+
27
+ res = post_readwise_request(url, payload: document.serialize)
28
+ get_document(document_id: res['id'])
29
+ end
30
+
31
+ def create_documents(documents: [])
32
+ return [] unless documents.any?
33
+
34
+ documents.map do |document|
35
+ create_document(document: document)
36
+ end
37
+ end
38
+
39
+ def get_document(document_id:)
40
+ url = V3_BASE_URL + "list?id=#{document_id}"
41
+
42
+ res = get_readwise_request(url)
43
+
44
+ res['results'].map { |item| transform_document(item) }.first
45
+ end
46
+
47
+ def get_documents(updated_after: nil, location: nil, category: nil)
48
+ resp = documents_page(updated_after: updated_after, location: location, category: category)
49
+ next_page_cursor = resp[:next_page_cursor]
50
+ results = resp[:results]
51
+ while next_page_cursor
52
+ resp = documents_page(updated_after: updated_after, location: location, category: category, page_cursor: next_page_cursor)
53
+ results.concat(resp[:results])
54
+ next_page_cursor = resp[:next_page_cursor]
55
+ end
56
+ results.sort_by(&:created_at)
57
+ end
58
+
19
59
  def create_highlight(highlight:)
20
60
  create_highlights(highlights: [highlight]).first
21
61
  end
@@ -87,6 +127,13 @@ module Readwise
87
127
  transform_book(res)
88
128
  end
89
129
 
130
+ def daily_review
131
+ url = BASE_URL + 'review/'
132
+
133
+ res = get_readwise_request(url)
134
+ transform_review(res)
135
+ end
136
+
90
137
  def export(updated_after: nil, book_ids: [])
91
138
  resp = export_page(updated_after: updated_after, book_ids: book_ids)
92
139
  next_page_cursor = resp[:next_page_cursor]
@@ -101,6 +148,28 @@ module Readwise
101
148
 
102
149
  private
103
150
 
151
+ def documents_page(page_cursor: nil, updated_after:, location:, category:)
152
+ parsed_body = get_documents_page(page_cursor: page_cursor, updated_after: updated_after, location: location, category: category)
153
+ results = parsed_body.dig('results').map do |item|
154
+ transform_document(item)
155
+ end
156
+ {
157
+ results: results,
158
+ next_page_cursor: parsed_body.dig('nextPageCursor')
159
+ }
160
+ end
161
+
162
+ def get_documents_page(page_cursor: nil, updated_after:, location:, category:)
163
+ params = {}
164
+ params['updatedAfter'] = updated_after if updated_after
165
+ params['location'] = location if location
166
+ params['category'] = category if category
167
+ params['pageCursor'] = page_cursor if page_cursor
168
+ url = V3_BASE_URL + 'list/?' + URI.encode_www_form(params)
169
+
170
+ get_readwise_request(url)
171
+ end
172
+
104
173
  def export_page(page_cursor: nil, updated_after: nil, book_ids: [])
105
174
  parsed_body = get_export_page(page_cursor: page_cursor, updated_after: updated_after, book_ids: book_ids)
106
175
  results = parsed_body.dig('results').map do |item|
@@ -120,7 +189,6 @@ module Readwise
120
189
  url = BASE_URL + 'export/?' + URI.encode_www_form(params)
121
190
 
122
191
  get_readwise_request(url)
123
-
124
192
  end
125
193
 
126
194
  def transform_book(res)
@@ -159,20 +227,73 @@ module Readwise
159
227
  location_type: res['location_type'],
160
228
  note: res['note'],
161
229
  readwise_url: res['readwise_url'],
162
- tags: res['tags'].map { |tag| transform_tag(tag) },
230
+ tags: (res['tags'] || []).map { |tag| transform_tag(tag) },
163
231
  text: res['text'],
164
232
  updated_at: res['updated_at'],
165
233
  url: res['url'],
166
234
  )
167
235
  end
168
236
 
237
+ def transform_document(res)
238
+ Document.new(
239
+ author: res['author'],
240
+ category: res['category'],
241
+ created_at: res['created_at'],
242
+ html: res['html'],
243
+ id: res['id'].to_s,
244
+ image_url: res['image_url'],
245
+ location: res['location'],
246
+ notes: res['notes'],
247
+ parent_id: res['parent_id'],
248
+ published_date: res['published_date'],
249
+ reading_progress: res['reading_progress'],
250
+ site_name: res['site_name'],
251
+ source: res['source'],
252
+ source_url: res['source_url'],
253
+ summary: res['summary'],
254
+ tags: transform_tags(res['tags']),
255
+ title: res['title'],
256
+ updated_at: res['updated_at'],
257
+ url: res['url'],
258
+ word_count: res['word_count'],
259
+ )
260
+ end
261
+
262
+ def transform_tags(res)
263
+ if res.is_a?(Array)
264
+ res.map { |tag| transform_tag(tag) }
265
+ elsif res.is_a?(Hash)
266
+ res.map do |tag_id, tag|
267
+ tag['id'] = tag_id
268
+ transform_tag(tag)
269
+ end
270
+ else
271
+ []
272
+ end
273
+ end
274
+
169
275
  def transform_tag(res)
276
+ if res.is_a?(String)
277
+ return Tag.new(name: res)
278
+ end
279
+
170
280
  Tag.new(
171
- tag_id: res['id'].to_s,
281
+ tag_id: res['id']&.to_s,
172
282
  name: res['name'],
173
283
  )
174
284
  end
175
285
 
286
+ def transform_review(res)
287
+ highlights = (res['highlights'] || []).map { |highlight| transform_highlight(highlight) }
288
+
289
+ Review.new(
290
+ id: res['review_id'],
291
+ url: res['review_url'],
292
+ completed: res['review_completed'],
293
+ highlights: highlights
294
+ )
295
+ end
296
+
176
297
  def get_readwise_request(url)
177
298
  uri = URI.parse(url)
178
299
  req = Net::HTTP::Get.new(uri)
@@ -181,7 +302,7 @@ module Readwise
181
302
  http.request(req)
182
303
  end
183
304
 
184
- raise Error, 'Get request failed' unless res.is_a?(Net::HTTPSuccess)
305
+ raise Error, "Get request failed with status code: #{res.code}" unless res.is_a?(Net::HTTPSuccess)
185
306
 
186
307
  JSON.parse(res.body)
187
308
  end
@@ -0,0 +1,140 @@
1
+ require 'time'
2
+
3
+ module Readwise
4
+ Document = Struct.new(
5
+ 'ReadwiseDocument',
6
+ :author,
7
+ :category, # One of: article, email, rss, highlight, note, pdf, epub, tweet or video.
8
+ # Default is guessed based on the URL, usually article.
9
+ :created_at,
10
+ :html,
11
+ :id,
12
+ :image_url,
13
+ :location, # One of: new, later, archive or feed. Default is new.
14
+ :notes,
15
+ :published_date,
16
+ :reading_progress,
17
+ :site_name,
18
+ :source,
19
+ :source_url,
20
+ :summary,
21
+ :tags,
22
+ :title,
23
+ :updated_at,
24
+ :url,
25
+ :word_count,
26
+ :parent_id, # both highlights and notes made in Reader are also considered Documents.
27
+ # Highlights and notes will have `parent_id` set, which is the Document id
28
+ # of the article/book/etc and highlight that they belong to, respectively.
29
+ keyword_init: true
30
+ ) do
31
+ def created_at_time
32
+ return unless created_at
33
+
34
+ Time.parse(created_at)
35
+ end
36
+
37
+ def updated_at_time
38
+ return unless updated_at
39
+
40
+ Time.parse(updated_at)
41
+ end
42
+
43
+ def published_date_time
44
+ return unless published_date
45
+
46
+ Time.at(published_date/1000)
47
+ end
48
+
49
+ def read?(threshold: 0.85)
50
+ reading_progress >= threshold
51
+ end
52
+
53
+ def parent?
54
+ parent_id.nil?
55
+ end
56
+
57
+ def child?
58
+ !parent?
59
+ end
60
+
61
+ def in_new?
62
+ location == 'new'
63
+ end
64
+
65
+ def in_later?
66
+ location == 'later'
67
+ end
68
+
69
+ def in_archive?
70
+ location == 'archive'
71
+ end
72
+
73
+ def pdf?
74
+ category == 'pdf'
75
+ end
76
+
77
+ def epub?
78
+ category == 'epub'
79
+ end
80
+
81
+ def tweet?
82
+ category == 'tweet'
83
+ end
84
+
85
+ def video?
86
+ category == 'video'
87
+ end
88
+
89
+ def article?
90
+ category == 'article'
91
+ end
92
+
93
+ def book?
94
+ category == 'book'
95
+ end
96
+
97
+ def email?
98
+ category == 'email'
99
+ end
100
+
101
+ def rss?
102
+ category == 'rss'
103
+ end
104
+
105
+ def highlight?
106
+ category == 'highlight'
107
+ end
108
+
109
+ def note?
110
+ category == 'note'
111
+ end
112
+
113
+ def serialize
114
+ to_h
115
+ end
116
+ end
117
+
118
+ DocumentCreate = Struct.new(
119
+ 'ReadwiseDocumentCreate',
120
+ :author,
121
+ :category, # One of: article, email, rss, highlight, note, pdf, epub, tweet or video.
122
+ # Default is guessed based on the URL, usually article.
123
+ :html,
124
+ :image_url,
125
+ :location, # One of: new, later, archive or feed. Default is new.
126
+ :notes,
127
+ :published_date,
128
+ :saved_using,
129
+ :should_clean_html,
130
+ :summary,
131
+ :tags,
132
+ :title,
133
+ :url,
134
+ keyword_init: true
135
+ ) do
136
+ def serialize
137
+ to_h.compact
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,17 @@
1
+ module Readwise
2
+ Review = Struct.new(
3
+ :id,
4
+ :url,
5
+ :completed,
6
+ :highlights,
7
+ keyword_init: true
8
+ ) do
9
+ def completed?
10
+ completed
11
+ end
12
+
13
+ def serialize
14
+ to_h.compact
15
+ end
16
+ end
17
+ end
@@ -1,3 +1,3 @@
1
1
  module Readwise
2
- VERSION = "0.5.0"
2
+ VERSION = "1.0.1"
3
3
  end
data/lib/readwise.rb CHANGED
@@ -1,5 +1,5 @@
1
- require 'readwise/version'
2
- require 'readwise/client'
1
+ require_relative 'readwise/version'
2
+ require_relative 'readwise/client'
3
3
 
4
4
  module Readwise
5
5
  class Error < StandardError; end
data/readwise.gemspec CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
11
11
 
12
12
  spec.summary = "Readwise API client"
13
13
  spec.description = "Minimal Readwise API client and highlight parsing library"
14
- spec.homepage = "https://github.com/andjosh/readwise-ruby"
14
+ spec.homepage = "https://github.com/joshbeckman/readwise-ruby"
15
15
  spec.license = "MIT"
16
16
 
17
17
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
@@ -22,6 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.metadata["homepage_uri"] = spec.homepage
23
23
  spec.metadata["source_code_uri"] = spec.homepage
24
24
  spec.metadata["changelog_uri"] = spec.homepage + "/blob/main/CHANGELOG.md"
25
+ spec.metadata["funding_uri"] = "https://github.com/sponsors/joshbeckman"
25
26
  else
26
27
  raise "RubyGems 2.0 or newer is required to protect against " \
27
28
  "public gem pushes."
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: readwise
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Beckman
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2023-06-16 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: bundler
@@ -87,19 +86,21 @@ files:
87
86
  - lib/readwise.rb
88
87
  - lib/readwise/book.rb
89
88
  - lib/readwise/client.rb
89
+ - lib/readwise/document.rb
90
90
  - lib/readwise/highlight.rb
91
+ - lib/readwise/review.rb
91
92
  - lib/readwise/tag.rb
92
93
  - lib/readwise/version.rb
93
94
  - readwise.gemspec
94
- homepage: https://github.com/andjosh/readwise-ruby
95
+ homepage: https://github.com/joshbeckman/readwise-ruby
95
96
  licenses:
96
97
  - MIT
97
98
  metadata:
98
99
  allowed_push_host: https://rubygems.org
99
- homepage_uri: https://github.com/andjosh/readwise-ruby
100
- source_code_uri: https://github.com/andjosh/readwise-ruby
101
- changelog_uri: https://github.com/andjosh/readwise-ruby/blob/main/CHANGELOG.md
102
- post_install_message:
100
+ homepage_uri: https://github.com/joshbeckman/readwise-ruby
101
+ source_code_uri: https://github.com/joshbeckman/readwise-ruby
102
+ changelog_uri: https://github.com/joshbeckman/readwise-ruby/blob/main/CHANGELOG.md
103
+ funding_uri: https://github.com/sponsors/joshbeckman
103
104
  rdoc_options: []
104
105
  require_paths:
105
106
  - lib
@@ -114,8 +115,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
115
  - !ruby/object:Gem::Version
115
116
  version: '0'
116
117
  requirements: []
117
- rubygems_version: 3.4.14
118
- signing_key:
118
+ rubygems_version: 3.6.9
119
119
  specification_version: 4
120
120
  summary: Readwise API client
121
121
  test_files: []