Skip to content

Dydyshko Andrey - #35

Open
InvokerAndrey wants to merge 28 commits into
introduction-to-python-bsuir-2019:masterfrom
InvokerAndrey:final_task
Open

Dydyshko Andrey#35
InvokerAndrey wants to merge 28 commits into
introduction-to-python-bsuir-2019:masterfrom
InvokerAndrey:final_task

Conversation

@InvokerAndrey

@InvokerAndreyInvokerAndrey commented Nov 10, 2019

Copy link
Copy Markdown

Progress

  • [Iteration 1] One-shot command-line RSS reader.
  • [Iteration 2] Distribution
  • [Iteration 3] News caching
  • [Iteration 4] Format converter
  • * [Iteration 5] Output colorization
  • * [Iteration 6] Web-server

@AlexeiBuzumaAlexeiBuzuma added the [Deadline] Iteration 1-2 This is a marker for first and second iterations deadline. label Nov 17, 2019
Added cache_mews_json(), get_cached_json_news(), print_chached_feed(), print_cached_feed_json() methods
Added argument --date
added class Converter in converter.py
added new fonts for PDF in fonts directory
does not contain images yet
added class PDFConverter
Comment threadsetup.py
long_description = f.read()


setup(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Забавная ситуация вышла)
Пакет установился успешно и вполне себе успешно распарсил новости с tut.by
но по какой-то причине не работачет обычный help :)

# rss-reader --help
Traceback (most recent call last):
File "/usr/local/bin/rss-reader", line 8, in<module>sys.exit(main())
File "/usr/local/lib/python3.8/site-packages/app/rss_reader.py", line 17, in main
arguments = ArgParser()
File "/usr/local/lib/python3.8/site-packages/app/argparser.py", line 15, in __init__
self.args = self.parse_args()
File "/usr/local/lib/python3.8/site-packages/app/argparser.py", line 61, in parse_args
args = argparser.parse_args()
File "/usr/local/lib/python3.8/argparse.py", line 1768, in parse_args
args, argv = self.parse_known_args(args, namespace)
File "/usr/local/lib/python3.8/argparse.py", line 1800, in parse_known_args
namespace, args = self._parse_known_args(args, namespace)
File "/usr/local/lib/python3.8/argparse.py", line 2006, in _parse_known_args
start_index = consume_optional(start_index)
File "/usr/local/lib/python3.8/argparse.py", line 1946, in consume_optional
take_action(action, args, option_string)
File "/usr/local/lib/python3.8/argparse.py", line 1874, in take_action
action(self, namespace, argument_values, option_string)
File "/usr/local/lib/python3.8/argparse.py", line 1044, in __call__
parser.print_help()
File "/usr/local/lib/python3.8/argparse.py", line 2493, in print_help
self._print_message(self.format_help(), file)
File "/usr/local/lib/python3.8/argparse.py", line 2477, in format_help
returnformatter.format_help()
File "/usr/local/lib/python3.8/argparse.py", line 282, in format_help
help = self._root_section.format_help()
File "/usr/local/lib/python3.8/argparse.py", line 213, in format_help
item_help = join([func(*args) forfunc, argsin self.items])
File "/usr/local/lib/python3.8/argparse.py", line 213, in<listcomp>
item_help = join([func(*args) forfunc, argsin self.items])
File "/usr/local/lib/python3.8/argparse.py", line 213, in format_help
item_help = join([func(*args) forfunc, argsin self.items])
File "/usr/local/lib/python3.8/argparse.py", line 213, in<listcomp>
item_help = join([func(*args) forfunc, argsin self.items])
File "/usr/local/lib/python3.8/argparse.py", line 529, in _format_action
help_text = self._expand_help(action)
File "/usr/local/lib/python3.8/argparse.py", line 621, in _expand_help
return self._get_help_string(action) % params
ValueError: unsupported format character 'Y' (0x59) at index 26

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Проблема была в атрибуте help аргумента date (написал там пример формата даты с процентами %Y%m%d, чего не стоило делать) Сейчас все работает
ну или почти все

Comment threadapp/pdf_converter.py Outdated
self.logger.info('Creating directory images')
os.mkdir(directory_path)
split_list = img_url.split('/')
img_name = split_list[len(split_list) - 1]

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. строка split_list[len(split_list) - 1] эквивалентна split_list[-1]
  2. что значит -1 и -2 ? Магические числа. возможно есть смысл это как-нибудь отрефакторить

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сделал получше
(а может только хуже :/)
Вынес все это дело в отдельный метод и обошелся без -2

Comment threadapp/RSSreader.py Outdated
# already cached
return
except FileNotFoundError:
pass

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

в данном случае стоило хотя бы залогировать факт возникновения такого эксепшена
а то два pass подряд в except блоках смотрится странно)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сделано

Comment threadapp/RSSreader.py Outdated
print('========================================================')

def to_json(self, entry):
""" Returns feed in JSON (actually dict()) format """

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сам факт такого док стринга должен навести на мысль, что тут что-то не так.
Эта функция не производит конвертацию в json.
Она создает словарь
название метода to_dict в данном случае подойдет намного лучше (ну или что-то другое, но точно не to_json)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправлено

Comment threadapp/RSSreader.py Outdated

for entry in entries:
print('========================================================')
print(f'Title: {entry.title}')

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А почему не печатается информация об изображениях?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Оформил вывод url изображения во всех форматах для консоли и кэша
А в pdf так вообще саму картинку иногда показывает

Comment threadapp/RSSreader.py Outdated

for entry in entries:
feed = self.to_json(entry)
print('========================================================')

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

эти строки тут не нужны
в аутпут должен пойти только JSON (чтобы аутпут можно было распарсить другой утилитой или записать результат в файл)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

то есть аутпутом должен являться валидный json

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сделяль

now image imformation prints in stdout
Fixed packages_data in setup.py
Now it should work correctly on clean machine
Comment threadREADME.md Outdated
internet connection
* Btw i use fonts for .pdf files to avoid encoding issues,
hope they will be installed correctly by 'pip install .'
* P.S. Ля, ребята, 4 курс птуира, уже распред идет во всю, работа нужна кааапец

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лучше удалить эту строку :)

Comment threadapp/RSSReader.py Outdated
class RSSReader:
""" Reads news from RSS url and prints them """

def __init__(self, args, logger):

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Советую заменить аргумент args на те три аргумента, которые используется в этом классе
то есть путь вместо этого аргумента оно принимает url, limit, date
таким образом будет больше гибкости в использовании этого класса. И интерфейс будет более понятным и прозрачным.

Comment threadapp/pdf_converter.py
from app.RSSReader import RSSReader


warnings.filterwarnings("ignore")

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А для чего необходимо игнорировать варнинги?

@InvokerAndreyInvokerAndreyDec 1, 2019

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я использую BeautifulSoup чтобы достать ссылку на картинку из тега img src=""
А скачиваю картинку уже при помощи urllib.request
Но BeautifulSoup все равно печатает в консоль такие warnings
C:\Users\F5\Documents\GitHub\PythonHomework\venv\lib\site-packages\bs4_init_.py:371: UserWarning: "https://img.tyt.by/thumbnails/n/01/3/novostroyka_dzerzhinskogo_obrushenie_1.jpg" looks like a URL. Beautiful Soup is not an HTTP client. You should probably use an HTTP client like requests to get the document behind the URL, and feed that document to Beautiful Soup.
warnings.warn(

Added class RSSException(Exception),
implemented argument --colorize
Added 2 tests for RSSReader class methods
was -> args
now -> limit url date etc.
@InvokerAndreyInvokerAndrey changed the title [WIP] Dydyshko AndreyDydyshko AndreyDec 1, 2019
@AlexeiBuzuma

AlexeiBuzuma commented Dec 7, 2019

Copy link
Copy Markdown
Collaborator

Не могу понять в чем дело
Пытаюсь сгенерировать новости в pdf или html формате.
Утилита сначала долго думает, потом заканчивает свою работу, но не создает никакого файла
В чем может быть причина?

@InvokerAndrey

InvokerAndrey commented Dec 7, 2019

Copy link
Copy Markdown
Author

Не могу понять в чем дело
Пытаюсь сгенерировать новости в pdf или html формате.
Утилита сначала долго думает, потом заканчивает свою работу, но не создает никакого файла
В чем может быть причина?

Может дело в передаваемом пути аргументу
--to-pdf и --to-html принимают полный путь к существующей папке (без имени файла), куда будет сохранен файл
Вот скриншотики, если от них есть толк:
https://ibb.co/D7YRLDB
https://ibb.co/dcRckQF
(если не откроются напрямую (github 404), то скопируйте и вставьте ссылку на картиночку)
У меня конечно все работает, только вот толку...

now feedparser receives response from requests.get(url)
added exception to write(img)
@AlexeiBuzumaAlexeiBuzuma added [3-4 iteration] Minimal requirements checked and removed Hard Deadline [Deadline] Iteration 1-2 This is a marker for first and second iterations deadline. labels Dec 11, 2019
@AlexeiBuzuma

Copy link
Copy Markdown
Collaborator

Моменты, которые можно улучшить:

  1. Класс RSSReader отвечает за то, что отвечать не должен. По названию он должен заниматсья вычиткой RSS, но по факту он занимается печатью новости в консоль и кэшированием. Необходимо немного переработать разбиение на классы.
  2. HTML собирается "руками". На сегодняшний день есть большое количество уже готовых библиотек, которые помогут сделать это удобнее, красивее и безопаснее.
  3. Фуникця main достаточно большая. Возможно есть смысл ее декомпозировать.
  4. Желательно, чтобы тестов было больше :)
  5. Варининги отключать решение не самое хорошее :) Не зря разработчики библиотеки сделали так, чтобы в какой-то конкретной ситуации был поднят вариниг. Это звоночек к тому, что что-то делается не так.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@InvokerAndrey@AlexeiBuzuma