podcast_index 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1364632f70ac0a7504a90e90c5b6bd53d978697ecba73dc85bbbcddebe92706e
4
- data.tar.gz: d495e5fdce0ce3baedb5ada68f4876f7e906c0dbfee655dc49df0681aad45601
3
+ metadata.gz: 6401b33a024231d7afb4bea6585557e56c0d2d9d40d078a9f289c9e1d5df5382
4
+ data.tar.gz: 537b4f2c7df6efbf29595198b8a8edc014204173b900147f19504dcd328ad926
5
5
  SHA512:
6
- metadata.gz: f3b68defbe2c3640ac0ac63317a4838590304a296dabb786c43ebeb8b3eca4eba2aa90745e5857cc0b916e22c2e025a43dd4f991b0915185261c03b33f445aeb
7
- data.tar.gz: dbd7f74e52c4e2f5c40d1ccdfad1bfb498b28d6ce3e14b8c32cb38cd1bc014bf21083ad3db05c0167979974a5c14be8889552fbb94c7bd168b324c327fcad7cf
6
+ metadata.gz: 69eafb7f3827dc2ae609db437bef45c62010fbd3c4b580925cb4a26ab4b1ca579b6aac3d8c997469c0df772b9b99b6fb985cc0d143e3c736a11f2848f4076144
7
+ data.tar.gz: 47b8106313bc2d25004358b902a50be8f3536288ecaad330113f0f952e7eb84c20d0b9c943059494a11a3b78b6e977076fe9f33b963c579b7966d22413297bb5
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.4.0] - 2024-01-21
4
+
5
+ * Add Categories to API (thanks @lbrito1)
6
+ * Add Category domain model
7
+ * Add stats API and domain model
8
+
3
9
  ## [0.3.0] - 2023-09-22
4
10
 
5
11
  * Add `max` parameter to search requests (thanks @lbrito1)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- podcast_index (0.3.0)
4
+ podcast_index (0.4.0)
5
5
  activesupport (>= 6.0, < 8)
6
6
  addressable (~> 2)
7
7
 
data/README.md CHANGED
@@ -38,12 +38,16 @@ This client currently implements the following sections of the API:
38
38
  * [Episodes](https://podcastindex-org.github.io/docs-api/#tag--Episodes)
39
39
  * [Recent](https://podcastindex-org.github.io/docs-api/#tag--Recent)
40
40
  * [Value](https://podcastindex-org.github.io/docs-api/#tag--Value)
41
+ * [Categories](https://podcastindex-org.github.io/docs-api/#tag--Categories)
42
+ * [Stats](https://podcastindex-org.github.io/docs-api/#tag--Stats)
41
43
 
42
44
  These are exposed through the following domain models:
43
45
  * [Episode](lib/podcast_index/episode.rb)
44
46
  * [Podcast](lib/podcast_index/podcast.rb)
45
47
  * [Soundbite](lib/podcast_index/soundbite.rb)
46
48
  * [Value](lib/podcast_index/value.rb)
49
+ * [Category](lib/podcast_index/category.rb)
50
+ * [Stats](lib/podcast_index/stats.rb)
47
51
 
48
52
  The intent is to follow ActiveRecord conventions as reasonably possible. Therefore, most of the requests are accessed through the model's `.find_by` and `.where` methods.
49
53
 
@@ -93,8 +97,6 @@ soundbite = PodcastIndex::Soundbite.where(recent: true)
93
97
  soundbite.first.episode_id # => 15082076307
94
98
  ```
95
99
 
96
-
97
-
98
100
  ### Supported Methods
99
101
 
100
102
  ```ruby
@@ -133,6 +135,13 @@ Soundbite.where(recent: true, max: nil)
133
135
  # Value
134
136
  Value.find_by(feed_id)
135
137
  Value.find_by(feed_url)
138
+
139
+ # Category
140
+ Category.all
141
+ Category.find(category_id)
142
+
143
+ # Stats
144
+ Stats.current.feed_count_total # => 4316919
136
145
  ```
137
146
 
138
147
  The attributes of the models mirror the names in the API, but have been translated to "underscore" format to more closely follow Ruby conventions. For example, the `lastUpdateTime` attribute for a `Podcast` is exposed as `last_update_time`.
@@ -149,6 +158,10 @@ rescue PodcastIndex::Error => e
149
158
  end
150
159
  ```
151
160
 
161
+ ## Performance
162
+
163
+ Be aware that this client currently does not cache responses. So for example, multiple calls to `Category.find()` or `Stats.current` will make multiple API requests. This may change in the future.
164
+
152
165
  ## Development
153
166
 
154
167
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -0,0 +1,14 @@
1
+ module PodcastIndex
2
+ module Api
3
+ class Categories
4
+ extend Request
5
+
6
+ class << self
7
+ def list
8
+ response = get("/categories/list", pretty: false)
9
+ JSON.parse(response.body)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module PodcastIndex
2
+ module Api
3
+ class Stats
4
+ extend Request
5
+
6
+ class << self
7
+ def current
8
+ response = get("/stats/current", pretty: false)
9
+ JSON.parse(response.body)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,29 @@
1
+ require "ostruct"
2
+ require "delegate"
3
+
4
+ module PodcastIndex
5
+ class Category < SimpleDelegator
6
+ class << self
7
+ def find(id)
8
+ category = all.detect { |element| element.id == id }
9
+ raise PodcastIndex::CategoryNotFound if category.nil?
10
+
11
+ category
12
+ end
13
+
14
+ def all
15
+ response = Api::Categories.list
16
+ from_response_collection(response)
17
+ end
18
+
19
+ private
20
+
21
+ def from_response_collection(response, collection_key = "feeds")
22
+ response[collection_key].map do |item|
23
+ category = item.transform_keys(&:underscore)
24
+ new(JSON.parse(category.to_json, object_class: OpenStruct)) # rubocop:disable Style/OpenStructUse
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,20 @@
1
+ require "ostruct"
2
+ require "delegate"
3
+
4
+ module PodcastIndex
5
+ class Stats < SimpleDelegator
6
+ class << self
7
+ def current
8
+ response = Api::Stats.current
9
+ from_response(response)
10
+ end
11
+
12
+ private
13
+
14
+ def from_response(response)
15
+ value = response["stats"].transform_keys(&:underscore)
16
+ new(JSON.parse(value.to_json, object_class: OpenStruct)) # rubocop:disable Style/OpenStructUse
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,3 +1,3 @@
1
1
  module PodcastIndex
2
- VERSION = "0.3.0".freeze
2
+ VERSION = "0.4.0".freeze
3
3
  end
data/lib/podcast_index.rb CHANGED
@@ -4,14 +4,19 @@ require "active_support/core_ext/string/inflections"
4
4
  require "json"
5
5
 
6
6
  require_relative "podcast_index/api/request"
7
- require_relative "podcast_index/api/podcasts"
7
+
8
+ require_relative "podcast_index/api/categories"
8
9
  require_relative "podcast_index/api/episodes"
9
- require_relative "podcast_index/api/search"
10
+ require_relative "podcast_index/api/podcasts"
10
11
  require_relative "podcast_index/api/recent"
12
+ require_relative "podcast_index/api/search"
13
+ require_relative "podcast_index/api/stats"
11
14
  require_relative "podcast_index/api/value"
12
- require_relative "podcast_index/podcast"
15
+ require_relative "podcast_index/category"
13
16
  require_relative "podcast_index/episode"
17
+ require_relative "podcast_index/podcast"
14
18
  require_relative "podcast_index/soundbite"
19
+ require_relative "podcast_index/stats"
15
20
  require_relative "podcast_index/value"
16
21
 
17
22
  module PodcastIndex
@@ -21,6 +26,7 @@ module PodcastIndex
21
26
 
22
27
  class Error < StandardError; end
23
28
  class PodcastNotFound < Error; end
29
+ class CategoryNotFound < Error; end
24
30
 
25
31
  def self.configure
26
32
  self.base_url = "https://api.podcastindex.org/api/1.0".freeze
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: podcast_index
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason York
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-09-23 00:00:00.000000000 Z
11
+ date: 2024-01-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -171,15 +171,19 @@ files:
171
171
  - README.md
172
172
  - Rakefile
173
173
  - lib/podcast_index.rb
174
+ - lib/podcast_index/api/categories.rb
174
175
  - lib/podcast_index/api/episodes.rb
175
176
  - lib/podcast_index/api/podcasts.rb
176
177
  - lib/podcast_index/api/recent.rb
177
178
  - lib/podcast_index/api/request.rb
178
179
  - lib/podcast_index/api/search.rb
180
+ - lib/podcast_index/api/stats.rb
179
181
  - lib/podcast_index/api/value.rb
182
+ - lib/podcast_index/category.rb
180
183
  - lib/podcast_index/episode.rb
181
184
  - lib/podcast_index/podcast.rb
182
185
  - lib/podcast_index/soundbite.rb
186
+ - lib/podcast_index/stats.rb
183
187
  - lib/podcast_index/value.rb
184
188
  - lib/podcast_index/version.rb
185
189
  homepage: https://github.com/jasonyork/podcast-index