diff --git a/Makefile b/Makefile index 28affc3..c8c41e1 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ audit: docs: docs/index.html docs/index.html: $(source) README.md - rm -rf docs/* + pdoc --version pdoc --docformat "restructuredtext" jsonfeed jsonfeed.converters.feedparser -o docs clean: diff --git a/README.md b/README.md index 85a0613..1186c23 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,16 @@ This package's constructor arguments and class variables exactly match the field ### Installation -In this directory, run: +Install this package with `pip`: ```shell -$ pip install . +$ pip install jsonfeed-util +``` + +In your Python code, include the line + +```python +import jsonfeed ``` ### Parsing a JSON feed diff --git a/docs/index.html b/docs/index.html index 9cc99b0..bc8e76c 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,250 +1,7 @@ - +
- - -In this directory, run:
+Install this package with pip
:
$ pip install jsonfeed-util
+
+$ pip install .
-
In your Python code, include the line
+ +import jsonfeed
+
+import jsonfeed as jf
+
+import jsonfeed as jf
import requests
# Requesting a valid JSON feed!
@@ -177,11 +169,13 @@ Parsing a JSON feed
# ...or parse JSON separately.
r_json = r.json()
feed_from_json = jf.Feed.parse(r_json)
-
+
+import jsonfeed as jf
+
+import jsonfeed as jf
me = jf.Author(
name="Lukas Schwab",
@@ -192,7 +186,8 @@ Constructing a JSON feed
feed.items.append(item)
print(feed.toJSON())
-
+
+jsonfeed
exposes constructors for five classes of JSON feed objects:
""".. include:: ../README.md""" -import json -from typing import List - - -class ParseError(Exception): - pass - - -class MissingRequiredValueError(ParseError): - def __init__(self, structure: str, key: str): - self.structure = structure - self.key = key - - -class Feed: - version = "https://jsonfeed.org/version/1.1" - - def __init__( - self, - title: str, - home_page_url: str = None, - feed_url: str = None, - description: str = None, - user_comment: str = None, - next_url: str = None, - icon: str = None, - favicon: str = None, - author=None, # 1.1 deprecated; use authors. - authors: List['Author'] = None, - expired: bool = False, - language: str = None, - hubs: List['Hub'] = [], - items: List['Item'] = [] - ): - assert title - self.title = title - self.home_page_url = home_page_url - self.feed_url = feed_url - self.description = description - self.user_comment = user_comment - self.next_url = next_url - self.icon = icon - self.favicon = favicon - self.author = author - self.authors = authors - self.expired = expired - self.language = language - self.hubs = hubs - self.items = items - - @staticmethod - def parse(maybeFeed: dict) -> 'Feed': - if 'title' not in maybeFeed or not maybeFeed['title']: - raise MissingRequiredValueError("Feed", "title") - # The only required field exists. - parsed = Feed(maybeFeed['title']) - # Basic string fields. - parsed.home_page_url = maybeFeed.get('home_page_url') - parsed.feed_url = maybeFeed.get('feed_url') - parsed.description = maybeFeed.get('description') - parsed.user_comment = maybeFeed.get('user_comment') - parsed.next_url = maybeFeed.get('next_url') - parsed.icon = maybeFeed.get('icon') - parsed.favicon = maybeFeed.get('favicon') - parsed.expired = maybeFeed.get('expired', False) - parsed.language = maybeFeed.get('language') - # Structures requiring additional parsing. - if 'author' in maybeFeed: - parsed.author = Author.parse(maybeFeed['author']) - if 'authors' in maybeFeed: - parsed.authors = [Author.parse(a) for a in maybeFeed['authors']] - if 'hubs' in maybeFeed: - parsed.hubs = [Hub.parse(h) for h in maybeFeed['hubs']] - if 'items' in maybeFeed: - parsed.items = [Item.parse(i) for i in maybeFeed['items']] - return parsed - - @staticmethod - def parse_string(maybeFeed: str) -> 'Feed': - return Feed.parse(json.loads(maybeFeed)) - - def to_json(self, **kwargs) -> str: - return json.dumps(self._to_ordered_dict(), **kwargs) - - def _to_ordered_dict(self) -> dict: - ordered = { - 'version': self.version, - 'title': self.title, - 'expired': self.expired - } - if self.home_page_url: ordered['home_page_url'] = self.home_page_url - if self.feed_url: ordered['feed_url'] = self.feed_url - if self.description: ordered['description'] = self.description - if self.user_comment: ordered['user_comment'] = self.user_comment - if self.next_url: ordered['next_url'] = self.next_url - if self.icon: ordered['icon'] = self.icon - if self.favicon: ordered['favicon'] = self.favicon - if self.author: ordered['author'] = self.author._to_ordered_dict() - if self.authors: - ordered['authors'] = [a._to_ordered_dict() for a in self.authors] - if self.hubs: - ordered['hubs'] = [h._to_ordered_dict() for h in self.hubs] - ordered['items'] = [i._to_ordered_dict() for i in self.items] - return ordered - - def __str__(self) -> str: - return self.to_json() - - def __repr__(self) -> str: - return self.__str__() - - -class Author: - def __init__(self, name: str = None, url: str = None, avatar: str = None): - self.name = name - self.url = url - self.avatar = avatar - - @staticmethod - def parse(maybeAuthor: dict) -> 'Author': - return Author( - name=maybeAuthor.get('name'), - url=maybeAuthor.get('url'), - avatar=maybeAuthor.get('avatar') - ) - - def _to_ordered_dict(self) -> dict: - ordered = {} - if self.name: ordered['name'] = self.name - if self.url: ordered['url'] = self.url - if self.avatar: ordered['avatar'] = self.avatar - return ordered - - def __str__(self) -> str: - return json.dumps(self._to_ordered_dict()) - - def __repr__(self) -> str: - return self.__str__() - - -class Hub: - def __init__(self, type: str, url: str): - self.type = type - self.url = url - - @staticmethod - def parse(maybeHub: dict) -> 'Hub': - if 'type' not in maybeHub or not maybeHub['type']: - raise MissingRequiredValueError("Hub", "type") - if 'url' not in maybeHub or not maybeHub['url']: - raise MissingRequiredValueError("Hub", "url") - return Hub(maybeHub['type'], maybeHub['url']) - - def _to_ordered_dict(self) -> dict: - return {'type': self.type, 'url': self.url} - - def __str__(self) -> str: - return json.dumps(self._to_ordered_dict()) - - def __repr__(self) -> str: - return self.__str__() - - -# TODO: validate that dates are in RFC 3339 format OR a datetime that can be -# represented in RFC 3339. -class Item: - def __init__( - self, - id, - url: str = None, - external_url: str = None, - title: str = None, - content_html: str = None, - content_text: str = None, - summary: str = None, - image: str = None, - banner_image: str = None, - date_published: str = None, - date_modified: str = None, - author=None, # 1.1 deprecated; use authors. - authors: List[Author] = None, - tags: List[str] = [], - attachments: List['Attachment'] = [] - ): - self.id = id - self.url = url - self.external_url = external_url - self.title = title - self.content_html = content_html - self.content_text = content_text - self.summary = summary - self.image = image - self.banner_image = banner_image - self.date_published = date_published - self.date_modified = date_modified - self.author = author - self.authors = authors - self.tags = tags - self.attachments = attachments - - @staticmethod - def parse(maybeItem: dict) -> 'Item': - if 'id' not in maybeItem or not maybeItem['id']: - raise MissingRequiredValueError("Item", "id") - parsed = Item(maybeItem['id']) - parsed.url = maybeItem.get('url') - parsed.external_url = maybeItem.get('external_url') - parsed.title = maybeItem.get('title') - parsed.content_html = maybeItem.get('content_html') - parsed.content_text = maybeItem.get('content_text') - parsed.summary = maybeItem.get('summary') - parsed.image = maybeItem.get('image') - parsed.banner_image = maybeItem.get('banner_image') - parsed.date_published = maybeItem.get('date_published') - parsed.date_modified = maybeItem.get('date_modified') - parsed.tags = maybeItem.get('tags', []) - if 'authors' in maybeItem: - parsed.authors = [Author.parse(a) for a in maybeItem['authors']] - if 'author' in maybeItem and maybeItem['author']: - parsed.author = Author.parse(maybeItem['author']) - if 'attachments' in maybeItem and maybeItem['attachments']: - parsed.attachments = [Attachment.parse(a) for a in maybeItem['attachments']] - return parsed - - def _to_ordered_dict(self) -> dict: - ordered = {'id': self.id} - if self.url: ordered['url'] = self.url - if self.external_url: ordered['external_url'] = self.url - if self.title: ordered['title'] = self.title - if self.content_html: ordered['content_html'] = self.content_html - if self.content_text: ordered['content_text'] = self.content_text - if self.summary: ordered['summary'] = self.summary - if self.image: ordered['image'] = self.image - if self.banner_image: ordered['banner_image'] = self.banner_image - if self.date_published: ordered['date_published'] = self.date_published - if self.date_modified: ordered['date_modified'] = self.date_modified - if self.tags: ordered['tags'] = self.tags - if self.author: ordered['author'] = self.author._to_ordered_dict() - if self.authors: - ordered['authors'] = [a._to_ordered_dict() for a in self.authors] - if self.attachments: - ordered['attachments'] = [a._to_ordered_dict() for a in self.attachments] - return ordered - - def __str__(self) -> str: - return json.dumps(self._to_ordered_dict()) - - def __repr__(self) -> str: - return self.__str__() - - -class Attachment: - def __init__( - self, - url: str, - mime_type: str, - title: str = None, - size_in_bytes: int = None, - duration_in_seconds: int = None - ): - self.url = url - self.mime_type = mime_type - self.title = title - self.size_in_bytes = size_in_bytes - self.duration_in_seconds = duration_in_seconds - - @staticmethod - def parse(maybeAttachment: dict) -> 'Attachment': - if 'url' not in maybeAttachment or not maybeAttachment['url']: - raise MissingRequiredValueError("Attachment", "url") - if 'mime_type' not in maybeAttachment or not maybeAttachment['mime_type']: - raise MissingRequiredValueError("Attachment", "mime_type") - parsed = Attachment(maybeAttachment['url'], maybeAttachment['mime_type']) - parsed.title = maybeAttachment.get('title') - parsed.size_in_bytes = maybeAttachment.get('size_in_bytes'), - parsed.duration_in_seconds = maybeAttachment.get('duration_in_seconds') - return parsed - - def _to_ordered_dict(self) -> dict: - ordered = {'url': self.url, 'mime_type': self.mime_type} - if self.title: ordered['title'] = self.title - if self.size_in_bytes: ordered['size_in_bytes'] = self.size_in_bytes - if self.duration_in_seconds: - ordered['duration_in_seconds'] = self.duration_in_seconds - return ordered - - def __str__(self) -> str: - return json.dumps(self._to_ordered_dict()) - - def __repr__(self) -> str: - return self.__str__() -
1""".. include:: ../README.md""" + 2import json + 3from typing import List + 4 + 5 + 6class ParseError(Exception): + 7 pass + 8 + 9 + 10class MissingRequiredValueError(ParseError): + 11 def __init__(self, structure: str, key: str): + 12 self.structure = structure + 13 self.key = key + 14 + 15 + 16class Feed: + 17 version = "https://jsonfeed.org/version/1.1" + 18 + 19 def __init__( + 20 self, + 21 title: str, + 22 home_page_url: str = None, + 23 feed_url: str = None, + 24 description: str = None, + 25 user_comment: str = None, + 26 next_url: str = None, + 27 icon: str = None, + 28 favicon: str = None, + 29 author=None, # 1.1 deprecated; use authors. + 30 authors: List['Author'] = None, + 31 expired: bool = False, + 32 language: str = None, + 33 hubs: List['Hub'] = [], + 34 items: List['Item'] = [] + 35 ): + 36 assert title + 37 self.title = title + 38 self.home_page_url = home_page_url + 39 self.feed_url = feed_url + 40 self.description = description + 41 self.user_comment = user_comment + 42 self.next_url = next_url + 43 self.icon = icon + 44 self.favicon = favicon + 45 self.author = author + 46 self.authors = authors + 47 self.expired = expired + 48 self.language = language + 49 self.hubs = hubs + 50 self.items = items + 51 + 52 @staticmethod + 53 def parse(maybeFeed: dict) -> 'Feed': + 54 if 'title' not in maybeFeed or not maybeFeed['title']: + 55 raise MissingRequiredValueError("Feed", "title") + 56 # The only required field exists. + 57 parsed = Feed(maybeFeed['title']) + 58 # Basic string fields. + 59 parsed.home_page_url = maybeFeed.get('home_page_url') + 60 parsed.feed_url = maybeFeed.get('feed_url') + 61 parsed.description = maybeFeed.get('description') + 62 parsed.user_comment = maybeFeed.get('user_comment') + 63 parsed.next_url = maybeFeed.get('next_url') + 64 parsed.icon = maybeFeed.get('icon') + 65 parsed.favicon = maybeFeed.get('favicon') + 66 parsed.expired = maybeFeed.get('expired', False) + 67 parsed.language = maybeFeed.get('language') + 68 # Structures requiring additional parsing. + 69 if 'author' in maybeFeed: + 70 parsed.author = Author.parse(maybeFeed['author']) + 71 if 'authors' in maybeFeed: + 72 parsed.authors = [Author.parse(a) for a in maybeFeed['authors']] + 73 if 'hubs' in maybeFeed: + 74 parsed.hubs = [Hub.parse(h) for h in maybeFeed['hubs']] + 75 if 'items' in maybeFeed: + 76 parsed.items = [Item.parse(i) for i in maybeFeed['items']] + 77 return parsed + 78 + 79 @staticmethod + 80 def parse_string(maybeFeed: str) -> 'Feed': + 81 return Feed.parse(json.loads(maybeFeed)) + 82 + 83 def to_json(self, **kwargs) -> str: + 84 return json.dumps(self._to_ordered_dict(), **kwargs) + 85 + 86 def _to_ordered_dict(self) -> dict: + 87 ordered = { + 88 'version': self.version, + 89 'title': self.title, + 90 'expired': self.expired + 91 } + 92 if self.home_page_url: ordered['home_page_url'] = self.home_page_url + 93 if self.feed_url: ordered['feed_url'] = self.feed_url + 94 if self.description: ordered['description'] = self.description + 95 if self.user_comment: ordered['user_comment'] = self.user_comment + 96 if self.next_url: ordered['next_url'] = self.next_url + 97 if self.icon: ordered['icon'] = self.icon + 98 if self.favicon: ordered['favicon'] = self.favicon + 99 if self.author: ordered['author'] = self.author._to_ordered_dict() +100 if self.authors: +101 ordered['authors'] = [a._to_ordered_dict() for a in self.authors] +102 if self.hubs: +103 ordered['hubs'] = [h._to_ordered_dict() for h in self.hubs] +104 ordered['items'] = [i._to_ordered_dict() for i in self.items] +105 return ordered +106 +107 def __str__(self) -> str: +108 return self.to_json() +109 +110 def __repr__(self) -> str: +111 return self.__str__() +112 +113 +114class Author: +115 def __init__(self, name: str = None, url: str = None, avatar: str = None): +116 self.name = name +117 self.url = url +118 self.avatar = avatar +119 +120 @staticmethod +121 def parse(maybeAuthor: dict) -> 'Author': +122 return Author( +123 name=maybeAuthor.get('name'), +124 url=maybeAuthor.get('url'), +125 avatar=maybeAuthor.get('avatar') +126 ) +127 +128 def _to_ordered_dict(self) -> dict: +129 ordered = {} +130 if self.name: ordered['name'] = self.name +131 if self.url: ordered['url'] = self.url +132 if self.avatar: ordered['avatar'] = self.avatar +133 return ordered +134 +135 def __str__(self) -> str: +136 return json.dumps(self._to_ordered_dict()) +137 +138 def __repr__(self) -> str: +139 return self.__str__() +140 +141 +142class Hub: +143 def __init__(self, type: str, url: str): +144 self.type = type +145 self.url = url +146 +147 @staticmethod +148 def parse(maybeHub: dict) -> 'Hub': +149 if 'type' not in maybeHub or not maybeHub['type']: +150 raise MissingRequiredValueError("Hub", "type") +151 if 'url' not in maybeHub or not maybeHub['url']: +152 raise MissingRequiredValueError("Hub", "url") +153 return Hub(maybeHub['type'], maybeHub['url']) +154 +155 def _to_ordered_dict(self) -> dict: +156 return {'type': self.type, 'url': self.url} +157 +158 def __str__(self) -> str: +159 return json.dumps(self._to_ordered_dict()) +160 +161 def __repr__(self) -> str: +162 return self.__str__() +163 +164 +165# TODO: validate that dates are in RFC 3339 format OR a datetime that can be +166# represented in RFC 3339. +167class Item: +168 def __init__( +169 self, +170 id, +171 url: str = None, +172 external_url: str = None, +173 title: str = None, +174 content_html: str = None, +175 content_text: str = None, +176 summary: str = None, +177 image: str = None, +178 banner_image: str = None, +179 date_published: str = None, +180 date_modified: str = None, +181 author=None, # 1.1 deprecated; use authors. +182 authors: List[Author] = None, +183 tags: List[str] = [], +184 attachments: List['Attachment'] = [] +185 ): +186 self.id = id +187 self.url = url +188 self.external_url = external_url +189 self.title = title +190 self.content_html = content_html +191 self.content_text = content_text +192 self.summary = summary +193 self.image = image +194 self.banner_image = banner_image +195 self.date_published = date_published +196 self.date_modified = date_modified +197 self.author = author +198 self.authors = authors +199 self.tags = tags +200 self.attachments = attachments +201 +202 @staticmethod +203 def parse(maybeItem: dict) -> 'Item': +204 if 'id' not in maybeItem or not maybeItem['id']: +205 raise MissingRequiredValueError("Item", "id") +206 parsed = Item(maybeItem['id']) +207 parsed.url = maybeItem.get('url') +208 parsed.external_url = maybeItem.get('external_url') +209 parsed.title = maybeItem.get('title') +210 parsed.content_html = maybeItem.get('content_html') +211 parsed.content_text = maybeItem.get('content_text') +212 parsed.summary = maybeItem.get('summary') +213 parsed.image = maybeItem.get('image') +214 parsed.banner_image = maybeItem.get('banner_image') +215 parsed.date_published = maybeItem.get('date_published') +216 parsed.date_modified = maybeItem.get('date_modified') +217 parsed.tags = maybeItem.get('tags', []) +218 if 'authors' in maybeItem: +219 parsed.authors = [Author.parse(a) for a in maybeItem['authors']] +220 if 'author' in maybeItem and maybeItem['author']: +221 parsed.author = Author.parse(maybeItem['author']) +222 if 'attachments' in maybeItem and maybeItem['attachments']: +223 parsed.attachments = [Attachment.parse(a) for a in maybeItem['attachments']] +224 return parsed +225 +226 def _to_ordered_dict(self) -> dict: +227 ordered = {'id': self.id} +228 if self.url: ordered['url'] = self.url +229 if self.external_url: ordered['external_url'] = self.url +230 if self.title: ordered['title'] = self.title +231 if self.content_html: ordered['content_html'] = self.content_html +232 if self.content_text: ordered['content_text'] = self.content_text +233 if self.summary: ordered['summary'] = self.summary +234 if self.image: ordered['image'] = self.image +235 if self.banner_image: ordered['banner_image'] = self.banner_image +236 if self.date_published: ordered['date_published'] = self.date_published +237 if self.date_modified: ordered['date_modified'] = self.date_modified +238 if self.tags: ordered['tags'] = self.tags +239 if self.author: ordered['author'] = self.author._to_ordered_dict() +240 if self.authors: +241 ordered['authors'] = [a._to_ordered_dict() for a in self.authors] +242 if self.attachments: +243 ordered['attachments'] = [a._to_ordered_dict() for a in self.attachments] +244 return ordered +245 +246 def __str__(self) -> str: +247 return json.dumps(self._to_ordered_dict()) +248 +249 def __repr__(self) -> str: +250 return self.__str__() +251 +252 +253class Attachment: +254 def __init__( +255 self, +256 url: str, +257 mime_type: str, +258 title: str = None, +259 size_in_bytes: int = None, +260 duration_in_seconds: int = None +261 ): +262 self.url = url +263 self.mime_type = mime_type +264 self.title = title +265 self.size_in_bytes = size_in_bytes +266 self.duration_in_seconds = duration_in_seconds +267 +268 @staticmethod +269 def parse(maybeAttachment: dict) -> 'Attachment': +270 if 'url' not in maybeAttachment or not maybeAttachment['url']: +271 raise MissingRequiredValueError("Attachment", "url") +272 if 'mime_type' not in maybeAttachment or not maybeAttachment['mime_type']: +273 raise MissingRequiredValueError("Attachment", "mime_type") +274 parsed = Attachment(maybeAttachment['url'], maybeAttachment['mime_type']) +275 parsed.title = maybeAttachment.get('title') +276 parsed.size_in_bytes = maybeAttachment.get('size_in_bytes'), +277 parsed.duration_in_seconds = maybeAttachment.get('duration_in_seconds') +278 return parsed +279 +280 def _to_ordered_dict(self) -> dict: +281 ordered = {'url': self.url, 'mime_type': self.mime_type} +282 if self.title: ordered['title'] = self.title +283 if self.size_in_bytes: ordered['size_in_bytes'] = self.size_in_bytes +284 if self.duration_in_seconds: +285 ordered['duration_in_seconds'] = self.duration_in_seconds +286 return ordered +287 +288 def __str__(self) -> str: +289 return json.dumps(self._to_ordered_dict()) +290 +291 def __repr__(self) -> str: +292 return self.__str__() +
class ParseError(Exception): - pass -
Common base class for all non-exit exceptions.
class MissingRequiredValueError(ParseError): - def __init__(self, structure: str, key: str): - self.structure = structure - self.key = key -
11class MissingRequiredValueError(ParseError): +12 def __init__(self, structure: str, key: str): +13 self.structure = structure +14 self.key = key +
Common base class for all non-exit exceptions.
def __init__(self, structure: str, key: str): - self.structure = structure - self.key = key -
12 def __init__(self, structure: str, key: str): +13 self.structure = structure +14 self.key = key +
17class Feed: + 18 version = "https://jsonfeed.org/version/1.1" + 19 + 20 def __init__( + 21 self, + 22 title: str, + 23 home_page_url: str = None, + 24 feed_url: str = None, + 25 description: str = None, + 26 user_comment: str = None, + 27 next_url: str = None, + 28 icon: str = None, + 29 favicon: str = None, + 30 author=None, # 1.1 deprecated; use authors. + 31 authors: List['Author'] = None, + 32 expired: bool = False, + 33 language: str = None, + 34 hubs: List['Hub'] = [], + 35 items: List['Item'] = [] + 36 ): + 37 assert title + 38 self.title = title + 39 self.home_page_url = home_page_url + 40 self.feed_url = feed_url + 41 self.description = description + 42 self.user_comment = user_comment + 43 self.next_url = next_url + 44 self.icon = icon + 45 self.favicon = favicon + 46 self.author = author + 47 self.authors = authors + 48 self.expired = expired + 49 self.language = language + 50 self.hubs = hubs + 51 self.items = items + 52 + 53 @staticmethod + 54 def parse(maybeFeed: dict) -> 'Feed': + 55 if 'title' not in maybeFeed or not maybeFeed['title']: + 56 raise MissingRequiredValueError("Feed", "title") + 57 # The only required field exists. + 58 parsed = Feed(maybeFeed['title']) + 59 # Basic string fields. + 60 parsed.home_page_url = maybeFeed.get('home_page_url') + 61 parsed.feed_url = maybeFeed.get('feed_url') + 62 parsed.description = maybeFeed.get('description') + 63 parsed.user_comment = maybeFeed.get('user_comment') + 64 parsed.next_url = maybeFeed.get('next_url') + 65 parsed.icon = maybeFeed.get('icon') + 66 parsed.favicon = maybeFeed.get('favicon') + 67 parsed.expired = maybeFeed.get('expired', False) + 68 parsed.language = maybeFeed.get('language') + 69 # Structures requiring additional parsing. + 70 if 'author' in maybeFeed: + 71 parsed.author = Author.parse(maybeFeed['author']) + 72 if 'authors' in maybeFeed: + 73 parsed.authors = [Author.parse(a) for a in maybeFeed['authors']] + 74 if 'hubs' in maybeFeed: + 75 parsed.hubs = [Hub.parse(h) for h in maybeFeed['hubs']] + 76 if 'items' in maybeFeed: + 77 parsed.items = [Item.parse(i) for i in maybeFeed['items']] + 78 return parsed + 79 + 80 @staticmethod + 81 def parse_string(maybeFeed: str) -> 'Feed': + 82 return Feed.parse(json.loads(maybeFeed)) + 83 + 84 def to_json(self, **kwargs) -> str: + 85 return json.dumps(self._to_ordered_dict(), **kwargs) + 86 + 87 def _to_ordered_dict(self) -> dict: + 88 ordered = { + 89 'version': self.version, + 90 'title': self.title, + 91 'expired': self.expired + 92 } + 93 if self.home_page_url: ordered['home_page_url'] = self.home_page_url + 94 if self.feed_url: ordered['feed_url'] = self.feed_url + 95 if self.description: ordered['description'] = self.description + 96 if self.user_comment: ordered['user_comment'] = self.user_comment + 97 if self.next_url: ordered['next_url'] = self.next_url + 98 if self.icon: ordered['icon'] = self.icon + 99 if self.favicon: ordered['favicon'] = self.favicon +100 if self.author: ordered['author'] = self.author._to_ordered_dict() +101 if self.authors: +102 ordered['authors'] = [a._to_ordered_dict() for a in self.authors] +103 if self.hubs: +104 ordered['hubs'] = [h._to_ordered_dict() for h in self.hubs] +105 ordered['items'] = [i._to_ordered_dict() for i in self.items] +106 return ordered +107 +108 def __str__(self) -> str: +109 return self.to_json() +110 +111 def __repr__(self) -> str: +112 return self.__str__() +
class Feed: - version = "https://jsonfeed.org/version/1.1" - - def __init__( - self, - title: str, - home_page_url: str = None, - feed_url: str = None, - description: str = None, - user_comment: str = None, - next_url: str = None, - icon: str = None, - favicon: str = None, - author=None, # 1.1 deprecated; use authors. - authors: List['Author'] = None, - expired: bool = False, - language: str = None, - hubs: List['Hub'] = [], - items: List['Item'] = [] - ): - assert title - self.title = title - self.home_page_url = home_page_url - self.feed_url = feed_url - self.description = description - self.user_comment = user_comment - self.next_url = next_url - self.icon = icon - self.favicon = favicon - self.author = author - self.authors = authors - self.expired = expired - self.language = language - self.hubs = hubs - self.items = items - - @staticmethod - def parse(maybeFeed: dict) -> 'Feed': - if 'title' not in maybeFeed or not maybeFeed['title']: - raise MissingRequiredValueError("Feed", "title") - # The only required field exists. - parsed = Feed(maybeFeed['title']) - # Basic string fields. - parsed.home_page_url = maybeFeed.get('home_page_url') - parsed.feed_url = maybeFeed.get('feed_url') - parsed.description = maybeFeed.get('description') - parsed.user_comment = maybeFeed.get('user_comment') - parsed.next_url = maybeFeed.get('next_url') - parsed.icon = maybeFeed.get('icon') - parsed.favicon = maybeFeed.get('favicon') - parsed.expired = maybeFeed.get('expired', False) - parsed.language = maybeFeed.get('language') - # Structures requiring additional parsing. - if 'author' in maybeFeed: - parsed.author = Author.parse(maybeFeed['author']) - if 'authors' in maybeFeed: - parsed.authors = [Author.parse(a) for a in maybeFeed['authors']] - if 'hubs' in maybeFeed: - parsed.hubs = [Hub.parse(h) for h in maybeFeed['hubs']] - if 'items' in maybeFeed: - parsed.items = [Item.parse(i) for i in maybeFeed['items']] - return parsed - - @staticmethod - def parse_string(maybeFeed: str) -> 'Feed': - return Feed.parse(json.loads(maybeFeed)) - - def to_json(self, **kwargs) -> str: - return json.dumps(self._to_ordered_dict(), **kwargs) - - def _to_ordered_dict(self) -> dict: - ordered = { - 'version': self.version, - 'title': self.title, - 'expired': self.expired - } - if self.home_page_url: ordered['home_page_url'] = self.home_page_url - if self.feed_url: ordered['feed_url'] = self.feed_url - if self.description: ordered['description'] = self.description - if self.user_comment: ordered['user_comment'] = self.user_comment - if self.next_url: ordered['next_url'] = self.next_url - if self.icon: ordered['icon'] = self.icon - if self.favicon: ordered['favicon'] = self.favicon - if self.author: ordered['author'] = self.author._to_ordered_dict() - if self.authors: - ordered['authors'] = [a._to_ordered_dict() for a in self.authors] - if self.hubs: - ordered['hubs'] = [h._to_ordered_dict() for h in self.hubs] - ordered['items'] = [i._to_ordered_dict() for i in self.items] - return ordered - - def __str__(self) -> str: - return self.to_json() - - def __repr__(self) -> str: - return self.__str__() -
def __init__( - self, - title: str, - home_page_url: str = None, - feed_url: str = None, - description: str = None, - user_comment: str = None, - next_url: str = None, - icon: str = None, - favicon: str = None, - author=None, # 1.1 deprecated; use authors. - authors: List['Author'] = None, - expired: bool = False, - language: str = None, - hubs: List['Hub'] = [], - items: List['Item'] = [] - ): - assert title - self.title = title - self.home_page_url = home_page_url - self.feed_url = feed_url - self.description = description - self.user_comment = user_comment - self.next_url = next_url - self.icon = icon - self.favicon = favicon - self.author = author - self.authors = authors - self.expired = expired - self.language = language - self.hubs = hubs - self.items = items -
20 def __init__( +21 self, +22 title: str, +23 home_page_url: str = None, +24 feed_url: str = None, +25 description: str = None, +26 user_comment: str = None, +27 next_url: str = None, +28 icon: str = None, +29 favicon: str = None, +30 author=None, # 1.1 deprecated; use authors. +31 authors: List['Author'] = None, +32 expired: bool = False, +33 language: str = None, +34 hubs: List['Hub'] = [], +35 items: List['Item'] = [] +36 ): +37 assert title +38 self.title = title +39 self.home_page_url = home_page_url +40 self.feed_url = feed_url +41 self.description = description +42 self.user_comment = user_comment +43 self.next_url = next_url +44 self.icon = icon +45 self.favicon = favicon +46 self.author = author +47 self.authors = authors +48 self.expired = expired +49 self.language = language +50 self.hubs = hubs +51 self.items = items +
53 @staticmethod +54 def parse(maybeFeed: dict) -> 'Feed': +55 if 'title' not in maybeFeed or not maybeFeed['title']: +56 raise MissingRequiredValueError("Feed", "title") +57 # The only required field exists. +58 parsed = Feed(maybeFeed['title']) +59 # Basic string fields. +60 parsed.home_page_url = maybeFeed.get('home_page_url') +61 parsed.feed_url = maybeFeed.get('feed_url') +62 parsed.description = maybeFeed.get('description') +63 parsed.user_comment = maybeFeed.get('user_comment') +64 parsed.next_url = maybeFeed.get('next_url') +65 parsed.icon = maybeFeed.get('icon') +66 parsed.favicon = maybeFeed.get('favicon') +67 parsed.expired = maybeFeed.get('expired', False) +68 parsed.language = maybeFeed.get('language') +69 # Structures requiring additional parsing. +70 if 'author' in maybeFeed: +71 parsed.author = Author.parse(maybeFeed['author']) +72 if 'authors' in maybeFeed: +73 parsed.authors = [Author.parse(a) for a in maybeFeed['authors']] +74 if 'hubs' in maybeFeed: +75 parsed.hubs = [Hub.parse(h) for h in maybeFeed['hubs']] +76 if 'items' in maybeFeed: +77 parsed.items = [Item.parse(i) for i in maybeFeed['items']] +78 return parsed +
@staticmethod - def parse(maybeFeed: dict) -> 'Feed': - if 'title' not in maybeFeed or not maybeFeed['title']: - raise MissingRequiredValueError("Feed", "title") - # The only required field exists. - parsed = Feed(maybeFeed['title']) - # Basic string fields. - parsed.home_page_url = maybeFeed.get('home_page_url') - parsed.feed_url = maybeFeed.get('feed_url') - parsed.description = maybeFeed.get('description') - parsed.user_comment = maybeFeed.get('user_comment') - parsed.next_url = maybeFeed.get('next_url') - parsed.icon = maybeFeed.get('icon') - parsed.favicon = maybeFeed.get('favicon') - parsed.expired = maybeFeed.get('expired', False) - parsed.language = maybeFeed.get('language') - # Structures requiring additional parsing. - if 'author' in maybeFeed: - parsed.author = Author.parse(maybeFeed['author']) - if 'authors' in maybeFeed: - parsed.authors = [Author.parse(a) for a in maybeFeed['authors']] - if 'hubs' in maybeFeed: - parsed.hubs = [Hub.parse(h) for h in maybeFeed['hubs']] - if 'items' in maybeFeed: - parsed.items = [Item.parse(i) for i in maybeFeed['items']] - return parsed -
@staticmethod - def parse_string(maybeFeed: str) -> 'Feed': - return Feed.parse(json.loads(maybeFeed)) -
def to_json(self, **kwargs) -> str: - return json.dumps(self._to_ordered_dict(), **kwargs) -
115class Author: +116 def __init__(self, name: str = None, url: str = None, avatar: str = None): +117 self.name = name +118 self.url = url +119 self.avatar = avatar +120 +121 @staticmethod +122 def parse(maybeAuthor: dict) -> 'Author': +123 return Author( +124 name=maybeAuthor.get('name'), +125 url=maybeAuthor.get('url'), +126 avatar=maybeAuthor.get('avatar') +127 ) +128 +129 def _to_ordered_dict(self) -> dict: +130 ordered = {} +131 if self.name: ordered['name'] = self.name +132 if self.url: ordered['url'] = self.url +133 if self.avatar: ordered['avatar'] = self.avatar +134 return ordered +135 +136 def __str__(self) -> str: +137 return json.dumps(self._to_ordered_dict()) +138 +139 def __repr__(self) -> str: +140 return self.__str__() +
class Author: - def __init__(self, name: str = None, url: str = None, avatar: str = None): - self.name = name - self.url = url - self.avatar = avatar - - @staticmethod - def parse(maybeAuthor: dict) -> 'Author': - return Author( - name=maybeAuthor.get('name'), - url=maybeAuthor.get('url'), - avatar=maybeAuthor.get('avatar') - ) - - def _to_ordered_dict(self) -> dict: - ordered = {} - if self.name: ordered['name'] = self.name - if self.url: ordered['url'] = self.url - if self.avatar: ordered['avatar'] = self.avatar - return ordered - - def __str__(self) -> str: - return json.dumps(self._to_ordered_dict()) - - def __repr__(self) -> str: - return self.__str__() -
def __init__(self, name: str = None, url: str = None, avatar: str = None): - self.name = name - self.url = url - self.avatar = avatar -
@staticmethod - def parse(maybeAuthor: dict) -> 'Author': - return Author( - name=maybeAuthor.get('name'), - url=maybeAuthor.get('url'), - avatar=maybeAuthor.get('avatar') - ) -
class Hub: - def __init__(self, type: str, url: str): - self.type = type - self.url = url + ++ + class + Hub: - @staticmethod - def parse(maybeHub: dict) -> 'Hub': - if 'type' not in maybeHub or not maybeHub['type']: - raise MissingRequiredValueError("Hub", "type") - if 'url' not in maybeHub or not maybeHub['url']: - raise MissingRequiredValueError("Hub", "url") - return Hub(maybeHub['type'], maybeHub['url']) + - def _to_ordered_dict(self) -> dict: - return {'type': self.type, 'url': self.url} - - def __str__(self) -> str: - return json.dumps(self._to_ordered_dict()) - - def __repr__(self) -> str: - return self.__str__() -+
143class Hub: +144 def __init__(self, type: str, url: str): +145 self.type = type +146 self.url = url +147 +148 @staticmethod +149 def parse(maybeHub: dict) -> 'Hub': +150 if 'type' not in maybeHub or not maybeHub['type']: +151 raise MissingRequiredValueError("Hub", "type") +152 if 'url' not in maybeHub or not maybeHub['url']: +153 raise MissingRequiredValueError("Hub", "url") +154 return Hub(maybeHub['type'], maybeHub['url']) +155 +156 def _to_ordered_dict(self) -> dict: +157 return {'type': self.type, 'url': self.url} +158 +159 def __str__(self) -> str: +160 return json.dumps(self._to_ordered_dict()) +161 +162 def __repr__(self) -> str: +163 return self.__str__() +
def __init__(self, type: str, url: str): - self.type = type - self.url = url -
@staticmethod - def parse(maybeHub: dict) -> 'Hub': - if 'type' not in maybeHub or not maybeHub['type']: - raise MissingRequiredValueError("Hub", "type") - if 'url' not in maybeHub or not maybeHub['url']: - raise MissingRequiredValueError("Hub", "url") - return Hub(maybeHub['type'], maybeHub['url']) -
148 @staticmethod +149 def parse(maybeHub: dict) -> 'Hub': +150 if 'type' not in maybeHub or not maybeHub['type']: +151 raise MissingRequiredValueError("Hub", "type") +152 if 'url' not in maybeHub or not maybeHub['url']: +153 raise MissingRequiredValueError("Hub", "url") +154 return Hub(maybeHub['type'], maybeHub['url']) +
168class Item: +169 def __init__( +170 self, +171 id, +172 url: str = None, +173 external_url: str = None, +174 title: str = None, +175 content_html: str = None, +176 content_text: str = None, +177 summary: str = None, +178 image: str = None, +179 banner_image: str = None, +180 date_published: str = None, +181 date_modified: str = None, +182 author=None, # 1.1 deprecated; use authors. +183 authors: List[Author] = None, +184 tags: List[str] = [], +185 attachments: List['Attachment'] = [] +186 ): +187 self.id = id +188 self.url = url +189 self.external_url = external_url +190 self.title = title +191 self.content_html = content_html +192 self.content_text = content_text +193 self.summary = summary +194 self.image = image +195 self.banner_image = banner_image +196 self.date_published = date_published +197 self.date_modified = date_modified +198 self.author = author +199 self.authors = authors +200 self.tags = tags +201 self.attachments = attachments +202 +203 @staticmethod +204 def parse(maybeItem: dict) -> 'Item': +205 if 'id' not in maybeItem or not maybeItem['id']: +206 raise MissingRequiredValueError("Item", "id") +207 parsed = Item(maybeItem['id']) +208 parsed.url = maybeItem.get('url') +209 parsed.external_url = maybeItem.get('external_url') +210 parsed.title = maybeItem.get('title') +211 parsed.content_html = maybeItem.get('content_html') +212 parsed.content_text = maybeItem.get('content_text') +213 parsed.summary = maybeItem.get('summary') +214 parsed.image = maybeItem.get('image') +215 parsed.banner_image = maybeItem.get('banner_image') +216 parsed.date_published = maybeItem.get('date_published') +217 parsed.date_modified = maybeItem.get('date_modified') +218 parsed.tags = maybeItem.get('tags', []) +219 if 'authors' in maybeItem: +220 parsed.authors = [Author.parse(a) for a in maybeItem['authors']] +221 if 'author' in maybeItem and maybeItem['author']: +222 parsed.author = Author.parse(maybeItem['author']) +223 if 'attachments' in maybeItem and maybeItem['attachments']: +224 parsed.attachments = [Attachment.parse(a) for a in maybeItem['attachments']] +225 return parsed +226 +227 def _to_ordered_dict(self) -> dict: +228 ordered = {'id': self.id} +229 if self.url: ordered['url'] = self.url +230 if self.external_url: ordered['external_url'] = self.url +231 if self.title: ordered['title'] = self.title +232 if self.content_html: ordered['content_html'] = self.content_html +233 if self.content_text: ordered['content_text'] = self.content_text +234 if self.summary: ordered['summary'] = self.summary +235 if self.image: ordered['image'] = self.image +236 if self.banner_image: ordered['banner_image'] = self.banner_image +237 if self.date_published: ordered['date_published'] = self.date_published +238 if self.date_modified: ordered['date_modified'] = self.date_modified +239 if self.tags: ordered['tags'] = self.tags +240 if self.author: ordered['author'] = self.author._to_ordered_dict() +241 if self.authors: +242 ordered['authors'] = [a._to_ordered_dict() for a in self.authors] +243 if self.attachments: +244 ordered['attachments'] = [a._to_ordered_dict() for a in self.attachments] +245 return ordered +246 +247 def __str__(self) -> str: +248 return json.dumps(self._to_ordered_dict()) +249 +250 def __repr__(self) -> str: +251 return self.__str__() +
class Item: - def __init__( - self, - id, - url: str = None, - external_url: str = None, - title: str = None, - content_html: str = None, - content_text: str = None, - summary: str = None, - image: str = None, - banner_image: str = None, - date_published: str = None, - date_modified: str = None, - author=None, # 1.1 deprecated; use authors. - authors: List[Author] = None, - tags: List[str] = [], - attachments: List['Attachment'] = [] - ): - self.id = id - self.url = url - self.external_url = external_url - self.title = title - self.content_html = content_html - self.content_text = content_text - self.summary = summary - self.image = image - self.banner_image = banner_image - self.date_published = date_published - self.date_modified = date_modified - self.author = author - self.authors = authors - self.tags = tags - self.attachments = attachments - - @staticmethod - def parse(maybeItem: dict) -> 'Item': - if 'id' not in maybeItem or not maybeItem['id']: - raise MissingRequiredValueError("Item", "id") - parsed = Item(maybeItem['id']) - parsed.url = maybeItem.get('url') - parsed.external_url = maybeItem.get('external_url') - parsed.title = maybeItem.get('title') - parsed.content_html = maybeItem.get('content_html') - parsed.content_text = maybeItem.get('content_text') - parsed.summary = maybeItem.get('summary') - parsed.image = maybeItem.get('image') - parsed.banner_image = maybeItem.get('banner_image') - parsed.date_published = maybeItem.get('date_published') - parsed.date_modified = maybeItem.get('date_modified') - parsed.tags = maybeItem.get('tags', []) - if 'authors' in maybeItem: - parsed.authors = [Author.parse(a) for a in maybeItem['authors']] - if 'author' in maybeItem and maybeItem['author']: - parsed.author = Author.parse(maybeItem['author']) - if 'attachments' in maybeItem and maybeItem['attachments']: - parsed.attachments = [Attachment.parse(a) for a in maybeItem['attachments']] - return parsed - - def _to_ordered_dict(self) -> dict: - ordered = {'id': self.id} - if self.url: ordered['url'] = self.url - if self.external_url: ordered['external_url'] = self.url - if self.title: ordered['title'] = self.title - if self.content_html: ordered['content_html'] = self.content_html - if self.content_text: ordered['content_text'] = self.content_text - if self.summary: ordered['summary'] = self.summary - if self.image: ordered['image'] = self.image - if self.banner_image: ordered['banner_image'] = self.banner_image - if self.date_published: ordered['date_published'] = self.date_published - if self.date_modified: ordered['date_modified'] = self.date_modified - if self.tags: ordered['tags'] = self.tags - if self.author: ordered['author'] = self.author._to_ordered_dict() - if self.authors: - ordered['authors'] = [a._to_ordered_dict() for a in self.authors] - if self.attachments: - ordered['attachments'] = [a._to_ordered_dict() for a in self.attachments] - return ordered - - def __str__(self) -> str: - return json.dumps(self._to_ordered_dict()) - - def __repr__(self) -> str: - return self.__str__() -
169 def __init__( +170 self, +171 id, +172 url: str = None, +173 external_url: str = None, +174 title: str = None, +175 content_html: str = None, +176 content_text: str = None, +177 summary: str = None, +178 image: str = None, +179 banner_image: str = None, +180 date_published: str = None, +181 date_modified: str = None, +182 author=None, # 1.1 deprecated; use authors. +183 authors: List[Author] = None, +184 tags: List[str] = [], +185 attachments: List['Attachment'] = [] +186 ): +187 self.id = id +188 self.url = url +189 self.external_url = external_url +190 self.title = title +191 self.content_html = content_html +192 self.content_text = content_text +193 self.summary = summary +194 self.image = image +195 self.banner_image = banner_image +196 self.date_published = date_published +197 self.date_modified = date_modified +198 self.author = author +199 self.authors = authors +200 self.tags = tags +201 self.attachments = attachments +
def __init__( - self, - id, - url: str = None, - external_url: str = None, - title: str = None, - content_html: str = None, - content_text: str = None, - summary: str = None, - image: str = None, - banner_image: str = None, - date_published: str = None, - date_modified: str = None, - author=None, # 1.1 deprecated; use authors. - authors: List[Author] = None, - tags: List[str] = [], - attachments: List['Attachment'] = [] - ): - self.id = id - self.url = url - self.external_url = external_url - self.title = title - self.content_html = content_html - self.content_text = content_text - self.summary = summary - self.image = image - self.banner_image = banner_image - self.date_published = date_published - self.date_modified = date_modified - self.author = author - self.authors = authors - self.tags = tags - self.attachments = attachments -
203 @staticmethod +204 def parse(maybeItem: dict) -> 'Item': +205 if 'id' not in maybeItem or not maybeItem['id']: +206 raise MissingRequiredValueError("Item", "id") +207 parsed = Item(maybeItem['id']) +208 parsed.url = maybeItem.get('url') +209 parsed.external_url = maybeItem.get('external_url') +210 parsed.title = maybeItem.get('title') +211 parsed.content_html = maybeItem.get('content_html') +212 parsed.content_text = maybeItem.get('content_text') +213 parsed.summary = maybeItem.get('summary') +214 parsed.image = maybeItem.get('image') +215 parsed.banner_image = maybeItem.get('banner_image') +216 parsed.date_published = maybeItem.get('date_published') +217 parsed.date_modified = maybeItem.get('date_modified') +218 parsed.tags = maybeItem.get('tags', []) +219 if 'authors' in maybeItem: +220 parsed.authors = [Author.parse(a) for a in maybeItem['authors']] +221 if 'author' in maybeItem and maybeItem['author']: +222 parsed.author = Author.parse(maybeItem['author']) +223 if 'attachments' in maybeItem and maybeItem['attachments']: +224 parsed.attachments = [Attachment.parse(a) for a in maybeItem['attachments']] +225 return parsed +
@staticmethod - def parse(maybeItem: dict) -> 'Item': - if 'id' not in maybeItem or not maybeItem['id']: - raise MissingRequiredValueError("Item", "id") - parsed = Item(maybeItem['id']) - parsed.url = maybeItem.get('url') - parsed.external_url = maybeItem.get('external_url') - parsed.title = maybeItem.get('title') - parsed.content_html = maybeItem.get('content_html') - parsed.content_text = maybeItem.get('content_text') - parsed.summary = maybeItem.get('summary') - parsed.image = maybeItem.get('image') - parsed.banner_image = maybeItem.get('banner_image') - parsed.date_published = maybeItem.get('date_published') - parsed.date_modified = maybeItem.get('date_modified') - parsed.tags = maybeItem.get('tags', []) - if 'authors' in maybeItem: - parsed.authors = [Author.parse(a) for a in maybeItem['authors']] - if 'author' in maybeItem and maybeItem['author']: - parsed.author = Author.parse(maybeItem['author']) - if 'attachments' in maybeItem and maybeItem['attachments']: - parsed.attachments = [Attachment.parse(a) for a in maybeItem['attachments']] - return parsed -
254class Attachment: +255 def __init__( +256 self, +257 url: str, +258 mime_type: str, +259 title: str = None, +260 size_in_bytes: int = None, +261 duration_in_seconds: int = None +262 ): +263 self.url = url +264 self.mime_type = mime_type +265 self.title = title +266 self.size_in_bytes = size_in_bytes +267 self.duration_in_seconds = duration_in_seconds +268 +269 @staticmethod +270 def parse(maybeAttachment: dict) -> 'Attachment': +271 if 'url' not in maybeAttachment or not maybeAttachment['url']: +272 raise MissingRequiredValueError("Attachment", "url") +273 if 'mime_type' not in maybeAttachment or not maybeAttachment['mime_type']: +274 raise MissingRequiredValueError("Attachment", "mime_type") +275 parsed = Attachment(maybeAttachment['url'], maybeAttachment['mime_type']) +276 parsed.title = maybeAttachment.get('title') +277 parsed.size_in_bytes = maybeAttachment.get('size_in_bytes'), +278 parsed.duration_in_seconds = maybeAttachment.get('duration_in_seconds') +279 return parsed +280 +281 def _to_ordered_dict(self) -> dict: +282 ordered = {'url': self.url, 'mime_type': self.mime_type} +283 if self.title: ordered['title'] = self.title +284 if self.size_in_bytes: ordered['size_in_bytes'] = self.size_in_bytes +285 if self.duration_in_seconds: +286 ordered['duration_in_seconds'] = self.duration_in_seconds +287 return ordered +288 +289 def __str__(self) -> str: +290 return json.dumps(self._to_ordered_dict()) +291 +292 def __repr__(self) -> str: +293 return self.__str__() +
class Attachment: - def __init__( - self, - url: str, - mime_type: str, - title: str = None, - size_in_bytes: int = None, - duration_in_seconds: int = None - ): - self.url = url - self.mime_type = mime_type - self.title = title - self.size_in_bytes = size_in_bytes - self.duration_in_seconds = duration_in_seconds - - @staticmethod - def parse(maybeAttachment: dict) -> 'Attachment': - if 'url' not in maybeAttachment or not maybeAttachment['url']: - raise MissingRequiredValueError("Attachment", "url") - if 'mime_type' not in maybeAttachment or not maybeAttachment['mime_type']: - raise MissingRequiredValueError("Attachment", "mime_type") - parsed = Attachment(maybeAttachment['url'], maybeAttachment['mime_type']) - parsed.title = maybeAttachment.get('title') - parsed.size_in_bytes = maybeAttachment.get('size_in_bytes'), - parsed.duration_in_seconds = maybeAttachment.get('duration_in_seconds') - return parsed - - def _to_ordered_dict(self) -> dict: - ordered = {'url': self.url, 'mime_type': self.mime_type} - if self.title: ordered['title'] = self.title - if self.size_in_bytes: ordered['size_in_bytes'] = self.size_in_bytes - if self.duration_in_seconds: - ordered['duration_in_seconds'] = self.duration_in_seconds - return ordered - - def __str__(self) -> str: - return json.dumps(self._to_ordered_dict()) - - def __repr__(self) -> str: - return self.__str__() -
255 def __init__( +256 self, +257 url: str, +258 mime_type: str, +259 title: str = None, +260 size_in_bytes: int = None, +261 duration_in_seconds: int = None +262 ): +263 self.url = url +264 self.mime_type = mime_type +265 self.title = title +266 self.size_in_bytes = size_in_bytes +267 self.duration_in_seconds = duration_in_seconds +
def __init__( - self, - url: str, - mime_type: str, - title: str = None, - size_in_bytes: int = None, - duration_in_seconds: int = None - ): - self.url = url - self.mime_type = mime_type - self.title = title - self.size_in_bytes = size_in_bytes - self.duration_in_seconds = duration_in_seconds -
269 @staticmethod +270 def parse(maybeAttachment: dict) -> 'Attachment': +271 if 'url' not in maybeAttachment or not maybeAttachment['url']: +272 raise MissingRequiredValueError("Attachment", "url") +273 if 'mime_type' not in maybeAttachment or not maybeAttachment['mime_type']: +274 raise MissingRequiredValueError("Attachment", "mime_type") +275 parsed = Attachment(maybeAttachment['url'], maybeAttachment['mime_type']) +276 parsed.title = maybeAttachment.get('title') +277 parsed.size_in_bytes = maybeAttachment.get('size_in_bytes'), +278 parsed.duration_in_seconds = maybeAttachment.get('duration_in_seconds') +279 return parsed +
@staticmethod - def parse(maybeAttachment: dict) -> 'Attachment': - if 'url' not in maybeAttachment or not maybeAttachment['url']: - raise MissingRequiredValueError("Attachment", "url") - if 'mime_type' not in maybeAttachment or not maybeAttachment['mime_type']: - raise MissingRequiredValueError("Attachment", "mime_type") - parsed = Attachment(maybeAttachment['url'], maybeAttachment['mime_type']) - parsed.title = maybeAttachment.get('title') - parsed.size_in_bytes = maybeAttachment.get('size_in_bytes'), - parsed.duration_in_seconds = maybeAttachment.get('duration_in_seconds') - return parsed -