├── .gitignore ├── .idea ├── 100web-course.iml └── ruff.xml ├── README.md ├── days ├── 001-004-flask-intro │ ├── code │ │ ├── .flaskenv │ │ ├── README.md │ │ ├── demo.py │ │ ├── program │ │ │ ├── __init__.py │ │ │ ├── routes.py │ │ │ └── templates │ │ │ │ ├── 100Days.html │ │ │ │ ├── base.html │ │ │ │ └── index.html │ │ ├── requirements.piptools │ │ └── requirements.txt │ └── readme.md ├── 005-008-html5 │ ├── demos │ │ ├── signup │ │ │ ├── .idea │ │ │ │ └── encodings.xml │ │ │ ├── extras │ │ │ │ ├── form.css │ │ │ │ ├── form_hook.js │ │ │ │ └── site.css │ │ │ └── index.html │ │ └── yahoo_clone │ │ │ ├── img │ │ │ ├── cool.png │ │ │ ├── more.png │ │ │ ├── new.png │ │ │ ├── news.png │ │ │ └── yaahoo.png │ │ │ └── index.html │ └── your-turn │ │ ├── README.md │ │ └── google-1998-marked-up.png ├── 009-012-modern-apis-starred │ ├── demo │ │ ├── main.py │ │ ├── requirements.piptools │ │ └── requirements.txt │ └── readme.md ├── 009-012-modern-apis-with-fastapi │ ├── demo │ │ ├── main.py │ │ └── requirements.txt │ └── readme.md ├── 013-016-css-basics │ ├── demos │ │ └── selectorville │ │ │ ├── .idea │ │ │ └── jsLibraryMappings.xml │ │ │ ├── box-model.html │ │ │ ├── float.html │ │ │ ├── index.html │ │ │ ├── layout.html │ │ │ ├── selectors.html │ │ │ └── static │ │ │ ├── css │ │ │ ├── float.css │ │ │ ├── layout.css │ │ │ ├── sample.css │ │ │ ├── site.css │ │ │ └── theme.css │ │ │ ├── img │ │ │ └── dunecat.jpg │ │ │ └── js │ │ │ ├── box.js │ │ │ └── selectors.js │ └── your-turn │ │ ├── README.md │ │ └── talk-python-nav.png ├── 017-020-flask-call-apis │ ├── README.md │ └── code │ │ ├── demo.py │ │ ├── program │ │ ├── __init__.py │ │ ├── routes.py │ │ └── templates │ │ │ ├── 100Days.html │ │ │ ├── base.html │ │ │ ├── chuck.html │ │ │ ├── index.html │ │ │ └── pokemon.html │ │ └── requirements.txt ├── 021-024-quart-async │ ├── async_cityscape_api │ │ ├── .idea │ │ │ ├── dictionaries │ │ │ │ ├── mkennedy.xml │ │ │ │ └── screencaster.xml │ │ │ ├── vcs.xml │ │ │ └── webResources.xml │ │ ├── app.py │ │ ├── config │ │ │ ├── dev.json │ │ │ ├── prod.json │ │ │ └── settings.py │ │ ├── requirements.txt │ │ ├── services │ │ │ ├── location_service.py │ │ │ ├── sun_service.py │ │ │ └── weather_service.py │ │ └── views │ │ │ ├── city_api.py │ │ │ └── home.py │ ├── cityscape_api │ │ ├── app.py │ │ ├── config │ │ │ ├── dev.json │ │ │ ├── prod.json │ │ │ └── settings.py │ │ ├── requirements.txt │ │ ├── services │ │ │ ├── event_service.py │ │ │ ├── location_service.py │ │ │ ├── sun_service.py │ │ │ └── weather_service.py │ │ └── views │ │ │ ├── city_api.py │ │ │ └── home.py │ ├── python_async │ │ ├── .idea │ │ │ ├── dictionaries │ │ │ │ └── screencaster.xml │ │ │ ├── python_async.iml │ │ │ └── vcs.xml │ │ ├── async_program.py │ │ ├── requirements.txt │ │ └── sync_program.py │ └── your_turn │ │ ├── README.md │ │ ├── day_2 │ │ └── web_crawl │ │ │ ├── program.py │ │ │ └── requirements.txt │ │ └── day_4 │ │ └── cityscape_api │ │ ├── app.py │ │ ├── config │ │ ├── dev.json │ │ ├── prod.json │ │ └── settings.py │ │ ├── requirements.txt │ │ ├── services │ │ ├── event_service.py │ │ ├── location_service.py │ │ ├── sun_service.py │ │ └── weather_service.py │ │ └── views │ │ ├── city_api.py │ │ └── home.py ├── 025-028-javascript │ ├── README.md │ └── demo │ │ ├── calculator │ │ ├── index-template.html │ │ └── index.html │ │ ├── calories │ │ ├── README.md │ │ ├── css │ │ │ ├── auto-complete.css │ │ │ ├── mui.min.css │ │ │ └── style.css │ │ ├── img │ │ │ ├── delete.png │ │ │ ├── favicon.ico │ │ │ └── le_bigmac.png │ │ ├── index.html │ │ ├── js │ │ │ ├── auto-complete.min.js │ │ │ ├── food.js │ │ │ ├── food.json │ │ │ ├── mui.min.js │ │ │ ├── script-template.js │ │ │ └── script.js │ │ └── scripts │ │ │ ├── food_csv2json.py │ │ │ └── menu.csv │ │ ├── dom │ │ └── index.html │ │ └── language │ │ ├── controlflow │ │ ├── guess-solution.html │ │ └── guess.html │ │ ├── debugging │ │ └── demo.html │ │ ├── functions │ │ ├── numbers-solutions.html │ │ └── numbers.html │ │ ├── looping │ │ ├── drive-solution.html │ │ └── drive.html │ │ ├── objects │ │ ├── food-solution.html │ │ └── food.html │ │ └── run-js │ │ ├── hello.js │ │ └── index.html ├── 029-032-static-site-gen │ ├── README.md │ └── code │ │ ├── Makefile │ │ ├── content │ │ ├── first_post.md │ │ ├── images │ │ │ └── pb-logo.png │ │ └── pages │ │ │ └── about.md │ │ ├── output │ │ ├── archives.html │ │ ├── author │ │ │ └── julian.html │ │ ├── authors.html │ │ ├── categories.html │ │ ├── category │ │ │ └── python.html │ │ ├── first_post.html │ │ ├── images │ │ │ └── pb-logo.png │ │ ├── index.html │ │ ├── pages │ │ │ └── about.html │ │ ├── tag │ │ │ ├── 100daysofweb.html │ │ │ ├── awesomeness.html │ │ │ └── python.html │ │ ├── tags.html │ │ └── theme │ │ │ ├── css │ │ │ ├── fonts.css │ │ │ ├── main.css │ │ │ ├── pygment.css │ │ │ ├── reset.css │ │ │ ├── typogrify.css │ │ │ └── wide.css │ │ │ ├── fonts │ │ │ ├── Yanone_Kaffeesatz_400.eot │ │ │ ├── Yanone_Kaffeesatz_400.svg │ │ │ ├── Yanone_Kaffeesatz_400.ttf │ │ │ ├── Yanone_Kaffeesatz_400.woff │ │ │ ├── Yanone_Kaffeesatz_400.woff2 │ │ │ └── font.css │ │ │ └── images │ │ │ └── icons │ │ │ ├── aboutme.png │ │ │ ├── bitbucket.png │ │ │ ├── delicious.png │ │ │ ├── facebook.png │ │ │ ├── github.png │ │ │ ├── gitorious.png │ │ │ ├── gittip.png │ │ │ ├── google-groups.png │ │ │ ├── google-plus.png │ │ │ ├── hackernews.png │ │ │ ├── lastfm.png │ │ │ ├── linkedin.png │ │ │ ├── reddit.png │ │ │ ├── rss.png │ │ │ ├── slideshare.png │ │ │ ├── speakerdeck.png │ │ │ ├── stackoverflow.png │ │ │ ├── twitter.png │ │ │ ├── vimeo.png │ │ │ └── youtube.png │ │ ├── pelicanconf.py │ │ ├── publishconf.py │ │ ├── requirements.txt │ │ └── tasks.py ├── 033-036-sqlalchemy-orm │ ├── demo │ │ ├── hovershare_app_final │ │ │ ├── .idea │ │ │ │ └── dictionaries │ │ │ │ │ └── screencaster.xml │ │ │ ├── data │ │ │ │ ├── __all_models.py │ │ │ │ ├── models │ │ │ │ │ ├── locations.py │ │ │ │ │ ├── rentals.py │ │ │ │ │ ├── scooters.py │ │ │ │ │ └── users.py │ │ │ │ ├── session_factory.py │ │ │ │ └── sqlalchemybase.py │ │ │ ├── db │ │ │ │ └── db_folder.py │ │ │ ├── import_data.py │ │ │ ├── infrastructure │ │ │ │ ├── numbers.py │ │ │ │ └── switchlang.py │ │ │ ├── program.py │ │ │ ├── requirements.txt │ │ │ └── services │ │ │ │ └── data_service.py │ │ └── hovershare_app_starter │ │ │ ├── .idea │ │ │ ├── dictionaries │ │ │ │ └── screencaster.xml │ │ │ └── vcs.xml │ │ │ ├── db │ │ │ └── db_folder.py │ │ │ ├── infrastructure │ │ │ ├── numbers.py │ │ │ └── switchlang.py │ │ │ ├── program.py │ │ │ └── requirements.txt │ └── your-turn │ │ └── README.md ├── 037-40-pyramid-intro │ ├── demo │ │ └── billtracker │ │ │ ├── .coveragerc │ │ │ ├── .gitignore │ │ │ ├── .idea │ │ │ ├── dictionaries │ │ │ │ └── screencaster.xml │ │ │ └── encodings.xml │ │ │ ├── CHANGES.txt │ │ │ ├── MANIFEST.in │ │ │ ├── README.txt │ │ │ ├── billtracker │ │ │ ├── __init__.py │ │ │ ├── bin │ │ │ │ ├── __init__.py │ │ │ │ └── load_base_data.py │ │ │ ├── data │ │ │ │ ├── __all_models.py │ │ │ │ ├── __init__.py │ │ │ │ ├── db_session.py │ │ │ │ ├── modelbase.py │ │ │ │ ├── models │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── bill.py │ │ │ │ │ └── users.py │ │ │ │ └── repository.py │ │ │ ├── db │ │ │ │ ├── MOCK_PAYMENTS.json │ │ │ │ └── MOCK_USERS.json │ │ │ ├── routes.py │ │ │ ├── static │ │ │ │ ├── css │ │ │ │ │ ├── site.css │ │ │ │ │ └── theme.css │ │ │ │ └── img │ │ │ │ │ ├── finance.png │ │ │ │ │ ├── pyramid-16x16.png │ │ │ │ │ └── pyramid.png │ │ │ ├── templates │ │ │ │ ├── errors │ │ │ │ │ └── 404.pt │ │ │ │ ├── home │ │ │ │ │ ├── default.pt │ │ │ │ │ └── details.pt │ │ │ │ └── shared │ │ │ │ │ └── layout.pt │ │ │ ├── tests.py │ │ │ └── views │ │ │ │ ├── __init__.py │ │ │ │ ├── default.py │ │ │ │ └── notfound.py │ │ │ ├── development.ini │ │ │ ├── production.ini │ │ │ ├── pytest.ini │ │ │ └── setup.py │ └── your-turn │ │ └── README.md ├── 041-044-react │ ├── README.md │ ├── demo │ │ ├── README.md │ │ ├── freemonkey │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── package-lock.json │ │ │ ├── package.json │ │ │ ├── public │ │ │ │ ├── favicon.ico │ │ │ │ ├── index.html │ │ │ │ └── manifest.json │ │ │ └── src │ │ │ │ ├── App.css │ │ │ │ ├── App.js │ │ │ │ ├── App.test.js │ │ │ │ ├── data.js │ │ │ │ ├── index.css │ │ │ │ ├── index.js │ │ │ │ ├── logo.svg │ │ │ │ └── serviceWorker.js │ │ ├── screenshots │ │ │ ├── freemonkey.png │ │ │ └── tips.png │ │ └── tips │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── package-lock.json │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── App.test.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── logo.svg │ │ │ └── serviceWorker.js │ └── es6 │ │ ├── arrow.js │ │ ├── class.js │ │ ├── destruct.js │ │ ├── hello.js │ │ ├── inherit.js │ │ └── mapfilter.js ├── 045-048-django-intro │ ├── README.md │ └── demo │ │ ├── manage.py │ │ ├── mysite │ │ ├── __init__.py │ │ ├── settings.py │ │ ├── static │ │ │ ├── css │ │ │ │ └── style.css │ │ │ └── img │ │ │ │ └── favicon.ico │ │ ├── templates │ │ │ └── base.html │ │ ├── urls.py │ │ └── wsgi.py │ │ ├── quotes │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── forms.py │ │ ├── migrations │ │ │ ├── 0001_initial.py │ │ │ ├── 0002_auto_20180828_1103.py │ │ │ ├── 0003_remove_quote_inspiration.py │ │ │ └── __init__.py │ │ ├── models.py │ │ ├── templates │ │ │ └── quotes │ │ │ │ ├── quote_confirm_delete.html │ │ │ │ ├── quote_detail.html │ │ │ │ ├── quote_form.html │ │ │ │ └── quote_list.html │ │ ├── tests.py │ │ ├── urls-cb.py │ │ ├── urls.py │ │ ├── views-cb.py │ │ └── views.py │ │ └── requirements.txt ├── 049-selenium │ ├── .env-template │ ├── README.md │ ├── final │ │ └── test_pbreadinglist.py │ ├── requirements.txt │ └── start │ │ └── test_pbreadinglist.py ├── 050-responder │ ├── demo │ │ └── movie_svc │ │ │ ├── .idea │ │ │ └── webResources.xml │ │ │ ├── api_instance.py │ │ │ ├── app.py │ │ │ ├── data │ │ │ ├── db.py │ │ │ └── movies.csv │ │ │ ├── requirements.txt │ │ │ ├── static │ │ │ └── css │ │ │ │ ├── docs.css │ │ │ │ └── theme.css │ │ │ ├── templates │ │ │ ├── home │ │ │ │ └── index.html │ │ │ └── shared │ │ │ │ └── _layout.html │ │ │ └── views │ │ │ ├── api_views.py │ │ │ └── home.py │ └── your-turn │ │ └── README.md ├── 051-twilio │ ├── README.md │ └── code │ │ ├── requirements.txt │ │ └── twilio_sms.py ├── 052-anvil │ └── your-turn │ │ └── README.md ├── 053-056-django-registration │ ├── README.md │ ├── demo │ │ ├── env_variables.txt │ │ ├── manage.py │ │ ├── mysite │ │ │ ├── __init__.py │ │ │ ├── settings.py │ │ │ ├── static │ │ │ │ ├── css │ │ │ │ │ └── style.css │ │ │ │ └── img │ │ │ │ │ └── favicon.ico │ │ │ ├── templates │ │ │ │ ├── base.html │ │ │ │ ├── django_registration │ │ │ │ │ ├── activation_complete.html │ │ │ │ │ ├── activation_email_body.txt │ │ │ │ │ ├── activation_email_subject.txt │ │ │ │ │ ├── activation_failed.html │ │ │ │ │ ├── registration_closed.html │ │ │ │ │ ├── registration_complete.html │ │ │ │ │ └── registration_form.html │ │ │ │ └── registration │ │ │ │ │ ├── login.html │ │ │ │ │ ├── logout.html │ │ │ │ │ ├── password_change_done.html │ │ │ │ │ ├── password_change_form.html │ │ │ │ │ ├── password_reset_complete.html │ │ │ │ │ ├── password_reset_confirm.html │ │ │ │ │ ├── password_reset_done.html │ │ │ │ │ ├── password_reset_email.html │ │ │ │ │ ├── password_reset_email.txt │ │ │ │ │ └── password_reset_form.html │ │ │ ├── urls.py │ │ │ └── wsgi.py │ │ ├── quotes │ │ │ ├── __init__.py │ │ │ ├── admin.py │ │ │ ├── apps.py │ │ │ ├── forms.py │ │ │ ├── migrations │ │ │ │ ├── 0001_initial.py │ │ │ │ ├── 0002_auto_20180828_1103.py │ │ │ │ ├── 0003_remove_quote_inspiration.py │ │ │ │ ├── 0004_quote_user.py │ │ │ │ └── __init__.py │ │ │ ├── models.py │ │ │ ├── templates │ │ │ │ └── quotes │ │ │ │ │ ├── quote_confirm_delete.html │ │ │ │ │ ├── quote_detail.html │ │ │ │ │ ├── quote_form.html │ │ │ │ │ └── quote_list.html │ │ │ ├── tests.py │ │ │ ├── urls-cb.py │ │ │ ├── urls.py │ │ │ ├── views-cb.py │ │ │ └── views.py │ │ └── requirements.txt │ └── django-registration-templates.zip ├── 057-060-flask-login │ ├── README.md │ └── code │ │ ├── launch.py │ │ ├── project_awesome │ │ ├── __init__.py │ │ ├── models.py │ │ ├── routes.py │ │ ├── site_users.db │ │ └── templates │ │ │ ├── create_user.html │ │ │ ├── index.html │ │ │ ├── loginpage.html │ │ │ └── pybitesdashboard.html │ │ └── requirements.txt ├── 061-064-db-migrations │ ├── demo │ │ └── billtracker │ │ │ ├── .coveragerc │ │ │ ├── .gitignore │ │ │ ├── CHANGES.txt │ │ │ ├── MANIFEST.in │ │ │ ├── README.txt │ │ │ ├── alembic.ini │ │ │ ├── alembic │ │ │ ├── README │ │ │ ├── env.py │ │ │ ├── script.py.mako │ │ │ └── versions │ │ │ │ ├── 2d8f63c0c219_adds_bills_last_payment_column.py │ │ │ │ └── 99977ae5426e_new_other_column.py │ │ │ ├── billtracker │ │ │ ├── __init__.py │ │ │ ├── bin │ │ │ │ ├── __init__.py │ │ │ │ └── load_base_data.py │ │ │ ├── data │ │ │ │ ├── __all_models.py │ │ │ │ ├── __init__.py │ │ │ │ ├── db_session.py │ │ │ │ ├── modelbase.py │ │ │ │ ├── models │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── bill.py │ │ │ │ │ └── users.py │ │ │ │ └── repository.py │ │ │ ├── db │ │ │ │ ├── MOCK_PAYMENTS.json │ │ │ │ └── MOCK_USERS.json │ │ │ ├── routes.py │ │ │ ├── static │ │ │ │ ├── css │ │ │ │ │ ├── site.css │ │ │ │ │ └── theme.css │ │ │ │ └── img │ │ │ │ │ ├── finance.png │ │ │ │ │ ├── pyramid-16x16.png │ │ │ │ │ └── pyramid.png │ │ │ ├── templates │ │ │ │ ├── errors │ │ │ │ │ └── 404.pt │ │ │ │ ├── home │ │ │ │ │ ├── default.pt │ │ │ │ │ └── details.pt │ │ │ │ └── shared │ │ │ │ │ └── layout.pt │ │ │ ├── tests.py │ │ │ └── views │ │ │ │ ├── __init__.py │ │ │ │ ├── default.py │ │ │ │ └── notfound.py │ │ │ ├── development.ini │ │ │ ├── production.ini │ │ │ ├── pytest.ini │ │ │ ├── requirements.txt │ │ │ └── setup.py │ └── your-turn │ │ ├── README.md │ │ └── hovershare_project │ │ └── hovershare │ │ ├── data │ │ ├── __all_models.py │ │ ├── models │ │ │ ├── locations.py │ │ │ ├── rentals.py │ │ │ ├── scooters.py │ │ │ └── users.py │ │ ├── session_factory.py │ │ └── sqlalchemybase.py │ │ ├── db │ │ └── db_folder.py │ │ ├── import_data.py │ │ ├── infrastructure │ │ ├── numbers.py │ │ └── switchlang.py │ │ ├── program.py │ │ ├── requirements.txt │ │ └── services │ │ └── data_service.py ├── 065-068-heroku-deployment │ ├── README.md │ └── code │ │ ├── Procfile │ │ ├── app.py │ │ ├── emailer.py │ │ ├── requirements.txt │ │ ├── runtime.txt │ │ ├── sendgrid_emailer.py │ │ └── templates │ │ └── index.html ├── 069-072-django-rest │ ├── .gitignore │ ├── README.md │ ├── demo │ │ ├── api │ │ │ ├── __init__.py │ │ │ ├── admin.py │ │ │ ├── apps.py │ │ │ ├── migrations │ │ │ │ └── __init__.py │ │ │ ├── models.py │ │ │ ├── permissions.py │ │ │ ├── serializers.py │ │ │ ├── tests.py │ │ │ ├── urls.py │ │ │ └── views.py │ │ ├── env_variables.txt │ │ ├── manage.py │ │ ├── mysite │ │ │ ├── __init__.py │ │ │ ├── settings.py │ │ │ ├── static │ │ │ │ ├── css │ │ │ │ │ └── style.css │ │ │ │ └── img │ │ │ │ │ └── favicon.ico │ │ │ ├── templates │ │ │ │ ├── base.html │ │ │ │ ├── django_registration │ │ │ │ │ ├── activation_complete.html │ │ │ │ │ ├── activation_email_body.txt │ │ │ │ │ ├── activation_email_subject.txt │ │ │ │ │ ├── activation_failed.html │ │ │ │ │ ├── registration_closed.html │ │ │ │ │ ├── registration_complete.html │ │ │ │ │ └── registration_form.html │ │ │ │ └── registration │ │ │ │ │ ├── login.html │ │ │ │ │ ├── logout.html │ │ │ │ │ ├── password_change_done.html │ │ │ │ │ ├── password_change_form.html │ │ │ │ │ ├── password_reset_complete.html │ │ │ │ │ ├── password_reset_confirm.html │ │ │ │ │ ├── password_reset_done.html │ │ │ │ │ ├── password_reset_email.html │ │ │ │ │ ├── password_reset_email.txt │ │ │ │ │ └── password_reset_form.html │ │ │ ├── urls.py │ │ │ └── wsgi.py │ │ ├── quotes │ │ │ ├── __init__.py │ │ │ ├── admin.py │ │ │ ├── apps.py │ │ │ ├── forms.py │ │ │ ├── management │ │ │ │ └── commands │ │ │ │ │ └── import_quotes.py │ │ │ ├── migrations │ │ │ │ ├── 0001_initial.py │ │ │ │ ├── 0002_auto_20180828_1103.py │ │ │ │ ├── 0003_remove_quote_inspiration.py │ │ │ │ ├── 0004_quote_user.py │ │ │ │ └── __init__.py │ │ │ ├── models.py │ │ │ ├── templates │ │ │ │ └── quotes │ │ │ │ │ ├── quote_confirm_delete.html │ │ │ │ │ ├── quote_detail.html │ │ │ │ │ ├── quote_form.html │ │ │ │ │ └── quote_list.html │ │ │ ├── tests.py │ │ │ ├── urls-cb.py │ │ │ ├── urls.py │ │ │ ├── views-cb.py │ │ │ └── views.py │ │ └── requirements.txt │ └── starter_code.zip ├── 073-076-webscraping │ ├── README.md │ └── code │ │ ├── newspaper3k_code.py │ │ └── talkpy_bs4.py ├── 077-080-twitter-slack-bots │ └── README.md ├── 081-084-unit-testing │ ├── demo │ │ └── billtracker │ │ │ ├── .coveragerc │ │ │ ├── .gitignore │ │ │ ├── .idea │ │ │ ├── dictionaries │ │ │ │ └── screencaster.xml │ │ │ └── vcs.xml │ │ │ ├── CHANGES.txt │ │ │ ├── MANIFEST.in │ │ │ ├── README.txt │ │ │ ├── alembic.ini │ │ │ ├── alembic │ │ │ ├── README │ │ │ ├── env.py │ │ │ ├── script.py.mako │ │ │ └── versions │ │ │ │ ├── 2d8f63c0c219_adds_bills_last_payment_column.py │ │ │ │ └── 99977ae5426e_new_other_column.py │ │ │ ├── billtracker │ │ │ ├── __init__.py │ │ │ ├── bin │ │ │ │ ├── __init__.py │ │ │ │ └── load_base_data.py │ │ │ ├── data │ │ │ │ ├── __all_models.py │ │ │ │ ├── __init__.py │ │ │ │ ├── db_session.py │ │ │ │ ├── modelbase.py │ │ │ │ ├── models │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── bill.py │ │ │ │ │ └── users.py │ │ │ │ └── repository.py │ │ │ ├── db │ │ │ │ ├── MOCK_PAYMENTS.json │ │ │ │ └── MOCK_USERS.json │ │ │ ├── routes.py │ │ │ ├── static │ │ │ │ ├── css │ │ │ │ │ ├── site.css │ │ │ │ │ └── theme.css │ │ │ │ └── img │ │ │ │ │ ├── finance.png │ │ │ │ │ ├── pyramid-16x16.png │ │ │ │ │ └── pyramid.png │ │ │ ├── templates │ │ │ │ ├── errors │ │ │ │ │ └── 404.pt │ │ │ │ ├── home │ │ │ │ │ ├── default.pt │ │ │ │ │ └── details.pt │ │ │ │ └── shared │ │ │ │ │ └── layout.pt │ │ │ ├── tests │ │ │ │ ├── __init__.py │ │ │ │ ├── all_tests.py │ │ │ │ ├── default │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── default_view_tests.py │ │ │ │ │ └── default_viewmodel_tests.py │ │ │ │ └── site_tests.py │ │ │ ├── viewmodels │ │ │ │ ├── __init__.py │ │ │ │ ├── default │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── bill_details_viewmodel.py │ │ │ │ │ └── index_viewmodel.py │ │ │ │ └── viewmodelbase.py │ │ │ └── views │ │ │ │ ├── __init__.py │ │ │ │ ├── default.py │ │ │ │ └── notfound.py │ │ │ ├── development.ini │ │ │ ├── production.ini │ │ │ ├── pytest.ini │ │ │ ├── requirements-dev.txt │ │ │ ├── requirements.txt │ │ │ └── setup.py │ └── your-turn │ │ ├── README.md │ │ └── billtracker_with_viewmodels │ │ └── billtracker │ │ ├── .coveragerc │ │ ├── .gitignore │ │ ├── CHANGES.txt │ │ ├── MANIFEST.in │ │ ├── README.txt │ │ ├── alembic.ini │ │ ├── alembic │ │ ├── README │ │ ├── env.py │ │ ├── script.py.mako │ │ └── versions │ │ │ ├── 2d8f63c0c219_adds_bills_last_payment_column.py │ │ │ └── 99977ae5426e_new_other_column.py │ │ ├── billtracker │ │ ├── __init__.py │ │ ├── bin │ │ │ ├── __init__.py │ │ │ └── load_base_data.py │ │ ├── data │ │ │ ├── __all_models.py │ │ │ ├── __init__.py │ │ │ ├── db_session.py │ │ │ ├── modelbase.py │ │ │ ├── models │ │ │ │ ├── __init__.py │ │ │ │ ├── bill.py │ │ │ │ └── users.py │ │ │ └── repository.py │ │ ├── db │ │ │ ├── MOCK_PAYMENTS.json │ │ │ └── MOCK_USERS.json │ │ ├── routes.py │ │ ├── static │ │ │ ├── css │ │ │ │ ├── site.css │ │ │ │ └── theme.css │ │ │ └── img │ │ │ │ ├── finance.png │ │ │ │ ├── pyramid-16x16.png │ │ │ │ └── pyramid.png │ │ ├── templates │ │ │ ├── errors │ │ │ │ └── 404.pt │ │ │ ├── home │ │ │ │ ├── default.pt │ │ │ │ └── details.pt │ │ │ └── shared │ │ │ │ └── layout.pt │ │ ├── tests.py │ │ ├── viewmodels │ │ │ ├── __init__.py │ │ │ ├── default │ │ │ │ ├── __init__.py │ │ │ │ ├── bill_details_viewmodel.py │ │ │ │ └── index_viewmodel.py │ │ │ └── viewmodelbase.py │ │ └── views │ │ │ ├── __init__.py │ │ │ ├── default.py │ │ │ └── notfound.py │ │ ├── development.ini │ │ ├── production.ini │ │ ├── pytest.ini │ │ ├── requirements.txt │ │ └── setup.py ├── 085-088-aws-lambda │ ├── README.md │ ├── demo │ │ ├── app.py │ │ ├── lambdas │ │ │ ├── lambda.pkg.zip │ │ │ ├── lambda_calculator.py │ │ │ └── lambda_pep8checker.py │ │ ├── requirements.txt │ │ └── views │ │ │ └── index.tpl │ └── img │ │ ├── architecture.png │ │ ├── pep-notok.png │ │ └── pep-ok.png ├── 089-092-deployment │ ├── demo │ │ └── billtracker │ │ │ ├── .coveragerc │ │ │ ├── .gitignore │ │ │ ├── CHANGES.txt │ │ │ ├── MANIFEST.in │ │ │ ├── README.txt │ │ │ ├── alembic.ini │ │ │ ├── alembic │ │ │ ├── README │ │ │ ├── env.py │ │ │ ├── script.py.mako │ │ │ └── versions │ │ │ │ ├── 2d8f63c0c219_adds_bills_last_payment_column.py │ │ │ │ └── 99977ae5426e_new_other_column.py │ │ │ ├── billtracker │ │ │ ├── __init__.py │ │ │ ├── bin │ │ │ │ ├── __init__.py │ │ │ │ └── load_base_data.py │ │ │ ├── data │ │ │ │ ├── __all_models.py │ │ │ │ ├── __init__.py │ │ │ │ ├── db_session.py │ │ │ │ ├── modelbase.py │ │ │ │ ├── models │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── bill.py │ │ │ │ │ └── users.py │ │ │ │ └── repository.py │ │ │ ├── db │ │ │ │ ├── MOCK_PAYMENTS.json │ │ │ │ └── MOCK_USERS.json │ │ │ ├── routes.py │ │ │ ├── static │ │ │ │ ├── css │ │ │ │ │ ├── site.css │ │ │ │ │ └── theme.css │ │ │ │ └── img │ │ │ │ │ ├── finance.png │ │ │ │ │ ├── pyramid-16x16.png │ │ │ │ │ └── pyramid.png │ │ │ ├── templates │ │ │ │ ├── errors │ │ │ │ │ └── 404.pt │ │ │ │ ├── home │ │ │ │ │ ├── default.pt │ │ │ │ │ └── details.pt │ │ │ │ └── shared │ │ │ │ │ └── layout.pt │ │ │ ├── tests │ │ │ │ ├── __init__.py │ │ │ │ ├── all_tests.py │ │ │ │ ├── default │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── default_view_tests.py │ │ │ │ │ └── default_viewmodel_tests.py │ │ │ │ └── site_tests.py │ │ │ ├── viewmodels │ │ │ │ ├── __init__.py │ │ │ │ ├── default │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── bill_details_viewmodel.py │ │ │ │ │ └── index_viewmodel.py │ │ │ │ └── viewmodelbase.py │ │ │ └── views │ │ │ │ ├── __init__.py │ │ │ │ ├── default.py │ │ │ │ └── notfound.py │ │ │ ├── development.ini │ │ │ ├── production.ini │ │ │ ├── pytest.ini │ │ │ ├── requirements-dev.txt │ │ │ ├── requirements.txt │ │ │ ├── server │ │ │ ├── billtracker.nginx │ │ │ ├── billtracker.service │ │ │ └── server_setup.sh │ │ │ └── setup.py │ └── your-turn │ │ └── README.md ├── 093-096-vuejs │ ├── movie_exploder │ │ ├── css │ │ │ ├── bootstrap │ │ │ │ ├── css │ │ │ │ │ ├── bootstrap-grid.css │ │ │ │ │ ├── bootstrap-grid.min.css │ │ │ │ │ ├── bootstrap-reboot.css │ │ │ │ │ ├── bootstrap-reboot.min.css │ │ │ │ │ ├── bootstrap.css │ │ │ │ │ └── bootstrap.min.css │ │ │ │ └── js │ │ │ │ │ ├── bootstrap.bundle.js │ │ │ │ │ ├── bootstrap.bundle.min.js │ │ │ │ │ ├── bootstrap.js │ │ │ │ │ └── bootstrap.min.js │ │ │ ├── dropdown.css │ │ │ └── site.css │ │ ├── js │ │ │ ├── dropdown.js │ │ │ ├── fake_data.js │ │ │ ├── site.js │ │ │ └── vue │ │ │ │ ├── README.md │ │ │ │ ├── vue.common.dev.js │ │ │ │ ├── vue.common.js │ │ │ │ ├── vue.common.prod.js │ │ │ │ ├── vue.esm.browser.js │ │ │ │ ├── vue.esm.browser.min.js │ │ │ │ ├── vue.esm.js │ │ │ │ ├── vue.js │ │ │ │ ├── vue.min.js │ │ │ │ ├── vue.runtime.common.dev.js │ │ │ │ ├── vue.runtime.common.js │ │ │ │ ├── vue.runtime.common.prod.js │ │ │ │ ├── vue.runtime.esm.js │ │ │ │ ├── vue.runtime.js │ │ │ │ └── vue.runtime.min.js │ │ ├── package-lock.json │ │ ├── package.json │ │ └── views │ │ │ └── index.html │ ├── movie_svc │ │ ├── app.py │ │ ├── app_instance.py │ │ ├── data │ │ │ ├── db.py │ │ │ └── movies.csv │ │ ├── requirements.txt │ │ ├── routes.py │ │ ├── static │ │ │ └── css │ │ │ │ ├── docs.css │ │ │ │ └── theme.css │ │ ├── templates │ │ │ ├── home │ │ │ │ └── index.html │ │ │ └── shared │ │ │ │ └── _layout.html │ │ └── views │ │ │ ├── api_views.py │ │ │ └── home.py │ ├── starter_movie_exploder │ │ ├── css │ │ │ ├── bootstrap │ │ │ │ ├── css │ │ │ │ │ ├── bootstrap-grid.css │ │ │ │ │ ├── bootstrap-grid.min.css │ │ │ │ │ ├── bootstrap-reboot.css │ │ │ │ │ ├── bootstrap-reboot.min.css │ │ │ │ │ ├── bootstrap.css │ │ │ │ │ └── bootstrap.min.css │ │ │ │ └── js │ │ │ │ │ ├── bootstrap.bundle.js │ │ │ │ │ ├── bootstrap.bundle.min.js │ │ │ │ │ ├── bootstrap.js │ │ │ │ │ └── bootstrap.min.js │ │ │ ├── dropdown.css │ │ │ └── site.css │ │ ├── js │ │ │ ├── dropdown.js │ │ │ ├── site.js │ │ │ └── vue │ │ │ │ ├── README.md │ │ │ │ ├── vue.common.dev.js │ │ │ │ ├── vue.common.js │ │ │ │ ├── vue.common.prod.js │ │ │ │ ├── vue.esm.browser.js │ │ │ │ ├── vue.esm.browser.min.js │ │ │ │ ├── vue.esm.js │ │ │ │ ├── vue.js │ │ │ │ ├── vue.min.js │ │ │ │ ├── vue.runtime.common.dev.js │ │ │ │ ├── vue.runtime.common.js │ │ │ │ ├── vue.runtime.common.prod.js │ │ │ │ ├── vue.runtime.esm.js │ │ │ │ ├── vue.runtime.js │ │ │ │ └── vue.runtime.min.js │ │ └── views │ │ │ └── index.html │ └── your-turn │ │ ├── README.md │ │ └── your_movie_exploder │ │ ├── .idea │ │ ├── dictionaries │ │ │ └── mkennedy.xml │ │ ├── encodings.xml │ │ └── your_movie_exploder.iml │ │ ├── css │ │ ├── dropdown.css │ │ └── site.css │ │ ├── js │ │ ├── dropdown.js │ │ └── site.js │ │ ├── node_modules │ │ ├── axios │ │ │ ├── CHANGELOG.md │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── UPGRADE_GUIDE.md │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── bootstrap │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── js │ │ │ │ └── src │ │ │ │ │ ├── alert.js │ │ │ │ │ ├── button.js │ │ │ │ │ ├── carousel.js │ │ │ │ │ ├── collapse.js │ │ │ │ │ ├── dropdown.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── modal.js │ │ │ │ │ ├── popover.js │ │ │ │ │ ├── scrollspy.js │ │ │ │ │ ├── tab.js │ │ │ │ │ ├── toast.js │ │ │ │ │ ├── tools │ │ │ │ │ └── sanitizer.js │ │ │ │ │ ├── tooltip.js │ │ │ │ │ └── util.js │ │ │ ├── package.json │ │ │ └── scss │ │ │ │ ├── _alert.scss │ │ │ │ ├── _badge.scss │ │ │ │ ├── _breadcrumb.scss │ │ │ │ ├── _button-group.scss │ │ │ │ ├── _buttons.scss │ │ │ │ ├── _card.scss │ │ │ │ ├── _carousel.scss │ │ │ │ ├── _close.scss │ │ │ │ ├── _code.scss │ │ │ │ ├── _custom-forms.scss │ │ │ │ ├── _dropdown.scss │ │ │ │ ├── _forms.scss │ │ │ │ ├── _functions.scss │ │ │ │ ├── _grid.scss │ │ │ │ ├── _images.scss │ │ │ │ ├── _input-group.scss │ │ │ │ ├── _jumbotron.scss │ │ │ │ ├── _list-group.scss │ │ │ │ ├── _media.scss │ │ │ │ ├── _mixins.scss │ │ │ │ ├── _modal.scss │ │ │ │ ├── _nav.scss │ │ │ │ ├── _navbar.scss │ │ │ │ ├── _pagination.scss │ │ │ │ ├── _popover.scss │ │ │ │ ├── _print.scss │ │ │ │ ├── _progress.scss │ │ │ │ ├── _reboot.scss │ │ │ │ ├── _root.scss │ │ │ │ ├── _spinners.scss │ │ │ │ ├── _tables.scss │ │ │ │ ├── _toasts.scss │ │ │ │ ├── _tooltip.scss │ │ │ │ ├── _transitions.scss │ │ │ │ ├── _type.scss │ │ │ │ ├── _utilities.scss │ │ │ │ ├── _variables.scss │ │ │ │ ├── bootstrap-grid.scss │ │ │ │ ├── bootstrap-reboot.scss │ │ │ │ ├── bootstrap.scss │ │ │ │ ├── mixins │ │ │ │ ├── _alert.scss │ │ │ │ ├── _background-variant.scss │ │ │ │ ├── _badge.scss │ │ │ │ ├── _border-radius.scss │ │ │ │ ├── _box-shadow.scss │ │ │ │ ├── _breakpoints.scss │ │ │ │ ├── _buttons.scss │ │ │ │ ├── _caret.scss │ │ │ │ ├── _clearfix.scss │ │ │ │ ├── _deprecate.scss │ │ │ │ ├── _float.scss │ │ │ │ ├── _forms.scss │ │ │ │ ├── _gradients.scss │ │ │ │ ├── _grid-framework.scss │ │ │ │ ├── _grid.scss │ │ │ │ ├── _hover.scss │ │ │ │ ├── _image.scss │ │ │ │ ├── _list-group.scss │ │ │ │ ├── _lists.scss │ │ │ │ ├── _nav-divider.scss │ │ │ │ ├── _pagination.scss │ │ │ │ ├── _reset-text.scss │ │ │ │ ├── _resize.scss │ │ │ │ ├── _screen-reader.scss │ │ │ │ ├── _size.scss │ │ │ │ ├── _table-row.scss │ │ │ │ ├── _text-emphasis.scss │ │ │ │ ├── _text-hide.scss │ │ │ │ ├── _text-truncate.scss │ │ │ │ ├── _transition.scss │ │ │ │ └── _visibility.scss │ │ │ │ ├── utilities │ │ │ │ ├── _align.scss │ │ │ │ ├── _background.scss │ │ │ │ ├── _borders.scss │ │ │ │ ├── _clearfix.scss │ │ │ │ ├── _display.scss │ │ │ │ ├── _embed.scss │ │ │ │ ├── _flex.scss │ │ │ │ ├── _float.scss │ │ │ │ ├── _overflow.scss │ │ │ │ ├── _position.scss │ │ │ │ ├── _screenreaders.scss │ │ │ │ ├── _shadows.scss │ │ │ │ ├── _sizing.scss │ │ │ │ ├── _spacing.scss │ │ │ │ ├── _stretched-link.scss │ │ │ │ ├── _text.scss │ │ │ │ └── _visibility.scss │ │ │ │ └── vendor │ │ │ │ └── _rfs.scss │ │ ├── debug │ │ │ ├── CHANGELOG.md │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── node.js │ │ │ ├── package.json │ │ │ └── src │ │ │ │ ├── browser.js │ │ │ │ ├── common.js │ │ │ │ ├── index.js │ │ │ │ └── node.js │ │ ├── follow-redirects │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── http.js │ │ │ ├── https.js │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── is-buffer │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── index.js │ │ │ ├── package.json │ │ │ └── test │ │ │ │ └── basic.js │ │ ├── jquery │ │ │ ├── AUTHORS.txt │ │ │ ├── LICENSE.txt │ │ │ ├── README.md │ │ │ ├── bower.json │ │ │ ├── external │ │ │ │ └── sizzle │ │ │ │ │ └── LICENSE.txt │ │ │ ├── package.json │ │ │ └── src │ │ │ │ ├── .eslintrc.json │ │ │ │ ├── ajax.js │ │ │ │ ├── ajax │ │ │ │ ├── jsonp.js │ │ │ │ ├── load.js │ │ │ │ ├── parseXML.js │ │ │ │ ├── script.js │ │ │ │ └── xhr.js │ │ │ │ ├── attributes.js │ │ │ │ ├── attributes │ │ │ │ ├── attr.js │ │ │ │ ├── classes.js │ │ │ │ ├── prop.js │ │ │ │ ├── support.js │ │ │ │ └── val.js │ │ │ │ ├── callbacks.js │ │ │ │ ├── core.js │ │ │ │ ├── core │ │ │ │ ├── DOMEval.js │ │ │ │ ├── access.js │ │ │ │ ├── camelCase.js │ │ │ │ ├── init.js │ │ │ │ ├── nodeName.js │ │ │ │ ├── parseHTML.js │ │ │ │ ├── ready-no-deferred.js │ │ │ │ ├── ready.js │ │ │ │ ├── readyException.js │ │ │ │ ├── stripAndCollapse.js │ │ │ │ ├── support.js │ │ │ │ └── toType.js │ │ │ │ ├── css.js │ │ │ │ ├── css │ │ │ │ ├── addGetHookIf.js │ │ │ │ ├── adjustCSS.js │ │ │ │ ├── curCSS.js │ │ │ │ ├── hiddenVisibleSelectors.js │ │ │ │ ├── showHide.js │ │ │ │ └── support.js │ │ │ │ ├── data.js │ │ │ │ ├── data │ │ │ │ └── Data.js │ │ │ │ ├── deferred.js │ │ │ │ ├── deferred │ │ │ │ └── exceptionHook.js │ │ │ │ ├── deprecated.js │ │ │ │ ├── dimensions.js │ │ │ │ ├── effects.js │ │ │ │ ├── effects │ │ │ │ ├── Tween.js │ │ │ │ └── animatedSelector.js │ │ │ │ ├── event.js │ │ │ │ ├── event │ │ │ │ ├── ajax.js │ │ │ │ ├── alias.js │ │ │ │ ├── focusin.js │ │ │ │ ├── support.js │ │ │ │ └── trigger.js │ │ │ │ ├── exports │ │ │ │ ├── amd.js │ │ │ │ └── global.js │ │ │ │ ├── jquery.js │ │ │ │ ├── manipulation.js │ │ │ │ ├── manipulation │ │ │ │ ├── _evalUrl.js │ │ │ │ ├── buildFragment.js │ │ │ │ ├── getAll.js │ │ │ │ ├── setGlobalEval.js │ │ │ │ ├── support.js │ │ │ │ └── wrapMap.js │ │ │ │ ├── offset.js │ │ │ │ ├── queue.js │ │ │ │ ├── queue │ │ │ │ └── delay.js │ │ │ │ ├── selector-native.js │ │ │ │ ├── selector-sizzle.js │ │ │ │ ├── selector.js │ │ │ │ ├── serialize.js │ │ │ │ ├── traversing.js │ │ │ │ ├── traversing │ │ │ │ └── findFilter.js │ │ │ │ └── wrap.js │ │ ├── ms │ │ │ ├── index.js │ │ │ ├── license.md │ │ │ ├── package.json │ │ │ └── readme.md │ │ └── vue │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── package.json │ │ │ ├── src │ │ │ ├── compiler │ │ │ │ ├── codeframe.js │ │ │ │ ├── codegen │ │ │ │ │ ├── events.js │ │ │ │ │ └── index.js │ │ │ │ ├── create-compiler.js │ │ │ │ ├── directives │ │ │ │ │ ├── bind.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── model.js │ │ │ │ │ └── on.js │ │ │ │ ├── error-detector.js │ │ │ │ ├── helpers.js │ │ │ │ ├── index.js │ │ │ │ ├── optimizer.js │ │ │ │ ├── parser │ │ │ │ │ ├── entity-decoder.js │ │ │ │ │ ├── filter-parser.js │ │ │ │ │ ├── html-parser.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── text-parser.js │ │ │ │ └── to-function.js │ │ │ ├── core │ │ │ │ ├── components │ │ │ │ │ ├── index.js │ │ │ │ │ └── keep-alive.js │ │ │ │ ├── config.js │ │ │ │ ├── global-api │ │ │ │ │ ├── assets.js │ │ │ │ │ ├── extend.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── mixin.js │ │ │ │ │ └── use.js │ │ │ │ ├── index.js │ │ │ │ ├── observer │ │ │ │ │ ├── array.js │ │ │ │ │ ├── dep.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── scheduler.js │ │ │ │ │ ├── traverse.js │ │ │ │ │ └── watcher.js │ │ │ │ ├── util │ │ │ │ │ ├── debug.js │ │ │ │ │ ├── env.js │ │ │ │ │ ├── error.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── lang.js │ │ │ │ │ ├── next-tick.js │ │ │ │ │ ├── options.js │ │ │ │ │ ├── perf.js │ │ │ │ │ └── props.js │ │ │ │ └── vdom │ │ │ │ │ ├── create-component.js │ │ │ │ │ ├── create-element.js │ │ │ │ │ ├── create-functional-component.js │ │ │ │ │ ├── helpers │ │ │ │ │ ├── extract-props.js │ │ │ │ │ ├── get-first-component-child.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── is-async-placeholder.js │ │ │ │ │ ├── merge-hook.js │ │ │ │ │ ├── normalize-children.js │ │ │ │ │ ├── normalize-scoped-slots.js │ │ │ │ │ ├── resolve-async-component.js │ │ │ │ │ └── update-listeners.js │ │ │ │ │ ├── modules │ │ │ │ │ ├── directives.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── ref.js │ │ │ │ │ ├── patch.js │ │ │ │ │ └── vnode.js │ │ │ ├── platforms │ │ │ │ ├── web │ │ │ │ │ ├── compiler │ │ │ │ │ │ ├── directives │ │ │ │ │ │ │ ├── html.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── model.js │ │ │ │ │ │ │ └── text.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── modules │ │ │ │ │ │ │ ├── class.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── model.js │ │ │ │ │ │ │ └── style.js │ │ │ │ │ │ ├── options.js │ │ │ │ │ │ └── util.js │ │ │ │ │ ├── entry-compiler.js │ │ │ │ │ ├── entry-runtime-with-compiler.js │ │ │ │ │ ├── entry-runtime.js │ │ │ │ │ ├── entry-server-basic-renderer.js │ │ │ │ │ ├── entry-server-renderer.js │ │ │ │ │ ├── runtime │ │ │ │ │ │ ├── class-util.js │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── transition-group.js │ │ │ │ │ │ │ └── transition.js │ │ │ │ │ │ ├── directives │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── model.js │ │ │ │ │ │ │ └── show.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── modules │ │ │ │ │ │ │ ├── attrs.js │ │ │ │ │ │ │ ├── class.js │ │ │ │ │ │ │ ├── dom-props.js │ │ │ │ │ │ │ ├── events.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── style.js │ │ │ │ │ │ │ └── transition.js │ │ │ │ │ │ ├── node-ops.js │ │ │ │ │ │ ├── patch.js │ │ │ │ │ │ └── transition-util.js │ │ │ │ │ ├── server │ │ │ │ │ │ ├── compiler.js │ │ │ │ │ │ ├── directives │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── model.js │ │ │ │ │ │ │ └── show.js │ │ │ │ │ │ ├── modules │ │ │ │ │ │ │ ├── attrs.js │ │ │ │ │ │ │ ├── class.js │ │ │ │ │ │ │ ├── dom-props.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── style.js │ │ │ │ │ │ └── util.js │ │ │ │ │ └── util │ │ │ │ │ │ ├── attrs.js │ │ │ │ │ │ ├── class.js │ │ │ │ │ │ ├── compat.js │ │ │ │ │ │ ├── element.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── style.js │ │ │ │ └── weex │ │ │ │ │ ├── compiler │ │ │ │ │ ├── directives │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── model.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── modules │ │ │ │ │ │ ├── append.js │ │ │ │ │ │ ├── class.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── props.js │ │ │ │ │ │ ├── recycle-list │ │ │ │ │ │ ├── component-root.js │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── recycle-list.js │ │ │ │ │ │ ├── text.js │ │ │ │ │ │ ├── v-bind.js │ │ │ │ │ │ ├── v-for.js │ │ │ │ │ │ ├── v-if.js │ │ │ │ │ │ ├── v-on.js │ │ │ │ │ │ └── v-once.js │ │ │ │ │ │ └── style.js │ │ │ │ │ ├── entry-compiler.js │ │ │ │ │ ├── entry-framework.js │ │ │ │ │ ├── entry-runtime-factory.js │ │ │ │ │ ├── runtime │ │ │ │ │ ├── components │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── richtext.js │ │ │ │ │ │ ├── transition-group.js │ │ │ │ │ │ └── transition.js │ │ │ │ │ ├── directives │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── modules │ │ │ │ │ │ ├── attrs.js │ │ │ │ │ │ ├── class.js │ │ │ │ │ │ ├── events.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── style.js │ │ │ │ │ │ └── transition.js │ │ │ │ │ ├── node-ops.js │ │ │ │ │ ├── patch.js │ │ │ │ │ ├── recycle-list │ │ │ │ │ │ ├── render-component-template.js │ │ │ │ │ │ └── virtual-component.js │ │ │ │ │ └── text-node.js │ │ │ │ │ └── util │ │ │ │ │ ├── element.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── parser.js │ │ │ ├── server │ │ │ │ ├── bundle-renderer │ │ │ │ │ ├── create-bundle-renderer.js │ │ │ │ │ ├── create-bundle-runner.js │ │ │ │ │ └── source-map-support.js │ │ │ │ ├── create-basic-renderer.js │ │ │ │ ├── create-renderer.js │ │ │ │ ├── optimizing-compiler │ │ │ │ │ ├── codegen.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── modules.js │ │ │ │ │ ├── optimizer.js │ │ │ │ │ └── runtime-helpers.js │ │ │ │ ├── render-context.js │ │ │ │ ├── render-stream.js │ │ │ │ ├── render.js │ │ │ │ ├── template-renderer │ │ │ │ │ ├── create-async-file-mapper.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── parse-template.js │ │ │ │ │ └── template-stream.js │ │ │ │ ├── util.js │ │ │ │ ├── webpack-plugin │ │ │ │ │ ├── client.js │ │ │ │ │ ├── server.js │ │ │ │ │ └── util.js │ │ │ │ └── write.js │ │ │ ├── sfc │ │ │ │ └── parser.js │ │ │ └── shared │ │ │ │ ├── constants.js │ │ │ │ └── util.js │ │ │ └── types │ │ │ ├── index.d.ts │ │ │ ├── options.d.ts │ │ │ ├── plugin.d.ts │ │ │ ├── vnode.d.ts │ │ │ └── vue.d.ts │ │ ├── package-lock.json │ │ ├── package.json │ │ └── views │ │ └── index.html └── 097-100-docker │ ├── demo │ ├── base_server │ │ └── dockerfile │ ├── docker-compose.yml │ ├── frontend │ │ ├── dockerfile │ │ ├── movie_exploder │ │ │ ├── css │ │ │ │ ├── bootstrap │ │ │ │ │ ├── css │ │ │ │ │ │ ├── bootstrap-grid.css │ │ │ │ │ │ ├── bootstrap-grid.min.css │ │ │ │ │ │ ├── bootstrap-reboot.css │ │ │ │ │ │ ├── bootstrap-reboot.min.css │ │ │ │ │ │ ├── bootstrap.css │ │ │ │ │ │ └── bootstrap.min.css │ │ │ │ │ └── js │ │ │ │ │ │ ├── bootstrap.bundle.js │ │ │ │ │ │ ├── bootstrap.bundle.min.js │ │ │ │ │ │ ├── bootstrap.js │ │ │ │ │ │ └── bootstrap.min.js │ │ │ │ ├── dropdown.css │ │ │ │ └── site.css │ │ │ ├── js │ │ │ │ ├── dropdown.js │ │ │ │ ├── fake_data.js │ │ │ │ ├── site.js │ │ │ │ └── vue │ │ │ │ │ ├── README.md │ │ │ │ │ ├── vue.common.dev.js │ │ │ │ │ ├── vue.common.js │ │ │ │ │ ├── vue.common.prod.js │ │ │ │ │ ├── vue.esm.browser.js │ │ │ │ │ ├── vue.esm.browser.min.js │ │ │ │ │ ├── vue.esm.js │ │ │ │ │ ├── vue.js │ │ │ │ │ ├── vue.min.js │ │ │ │ │ ├── vue.runtime.common.dev.js │ │ │ │ │ ├── vue.runtime.common.js │ │ │ │ │ ├── vue.runtime.common.prod.js │ │ │ │ │ ├── vue.runtime.esm.js │ │ │ │ │ ├── vue.runtime.js │ │ │ │ │ └── vue.runtime.min.js │ │ │ ├── node_modules │ │ │ │ └── vue │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── package.json │ │ │ │ │ ├── src │ │ │ │ │ ├── compiler │ │ │ │ │ │ ├── codeframe.js │ │ │ │ │ │ ├── codegen │ │ │ │ │ │ │ ├── events.js │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── create-compiler.js │ │ │ │ │ │ ├── directives │ │ │ │ │ │ │ ├── bind.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── model.js │ │ │ │ │ │ │ └── on.js │ │ │ │ │ │ ├── error-detector.js │ │ │ │ │ │ ├── helpers.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── optimizer.js │ │ │ │ │ │ ├── parser │ │ │ │ │ │ │ ├── entity-decoder.js │ │ │ │ │ │ │ ├── filter-parser.js │ │ │ │ │ │ │ ├── html-parser.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── text-parser.js │ │ │ │ │ │ └── to-function.js │ │ │ │ │ ├── core │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── keep-alive.js │ │ │ │ │ │ ├── config.js │ │ │ │ │ │ ├── global-api │ │ │ │ │ │ │ ├── assets.js │ │ │ │ │ │ │ ├── extend.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── mixin.js │ │ │ │ │ │ │ └── use.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── observer │ │ │ │ │ │ │ ├── array.js │ │ │ │ │ │ │ ├── dep.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── scheduler.js │ │ │ │ │ │ │ ├── traverse.js │ │ │ │ │ │ │ └── watcher.js │ │ │ │ │ │ ├── util │ │ │ │ │ │ │ ├── debug.js │ │ │ │ │ │ │ ├── env.js │ │ │ │ │ │ │ ├── error.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── lang.js │ │ │ │ │ │ │ ├── next-tick.js │ │ │ │ │ │ │ ├── options.js │ │ │ │ │ │ │ ├── perf.js │ │ │ │ │ │ │ └── props.js │ │ │ │ │ │ └── vdom │ │ │ │ │ │ │ ├── create-component.js │ │ │ │ │ │ │ ├── create-element.js │ │ │ │ │ │ │ ├── create-functional-component.js │ │ │ │ │ │ │ ├── helpers │ │ │ │ │ │ │ ├── extract-props.js │ │ │ │ │ │ │ ├── get-first-component-child.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── is-async-placeholder.js │ │ │ │ │ │ │ ├── merge-hook.js │ │ │ │ │ │ │ ├── normalize-children.js │ │ │ │ │ │ │ ├── normalize-scoped-slots.js │ │ │ │ │ │ │ ├── resolve-async-component.js │ │ │ │ │ │ │ └── update-listeners.js │ │ │ │ │ │ │ ├── modules │ │ │ │ │ │ │ ├── directives.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── ref.js │ │ │ │ │ │ │ ├── patch.js │ │ │ │ │ │ │ └── vnode.js │ │ │ │ │ ├── platforms │ │ │ │ │ │ ├── web │ │ │ │ │ │ │ ├── compiler │ │ │ │ │ │ │ │ ├── directives │ │ │ │ │ │ │ │ │ ├── html.js │ │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ │ ├── model.js │ │ │ │ │ │ │ │ │ └── text.js │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ ├── modules │ │ │ │ │ │ │ │ │ ├── class.js │ │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ │ ├── model.js │ │ │ │ │ │ │ │ │ └── style.js │ │ │ │ │ │ │ │ ├── options.js │ │ │ │ │ │ │ │ └── util.js │ │ │ │ │ │ │ ├── entry-compiler.js │ │ │ │ │ │ │ ├── entry-runtime-with-compiler.js │ │ │ │ │ │ │ ├── entry-runtime.js │ │ │ │ │ │ │ ├── entry-server-basic-renderer.js │ │ │ │ │ │ │ ├── entry-server-renderer.js │ │ │ │ │ │ │ ├── runtime │ │ │ │ │ │ │ │ ├── class-util.js │ │ │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ │ ├── transition-group.js │ │ │ │ │ │ │ │ │ └── transition.js │ │ │ │ │ │ │ │ ├── directives │ │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ │ ├── model.js │ │ │ │ │ │ │ │ │ └── show.js │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ ├── modules │ │ │ │ │ │ │ │ │ ├── attrs.js │ │ │ │ │ │ │ │ │ ├── class.js │ │ │ │ │ │ │ │ │ ├── dom-props.js │ │ │ │ │ │ │ │ │ ├── events.js │ │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ │ ├── style.js │ │ │ │ │ │ │ │ │ └── transition.js │ │ │ │ │ │ │ │ ├── node-ops.js │ │ │ │ │ │ │ │ ├── patch.js │ │ │ │ │ │ │ │ └── transition-util.js │ │ │ │ │ │ │ ├── server │ │ │ │ │ │ │ │ ├── compiler.js │ │ │ │ │ │ │ │ ├── directives │ │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ │ ├── model.js │ │ │ │ │ │ │ │ │ └── show.js │ │ │ │ │ │ │ │ ├── modules │ │ │ │ │ │ │ │ │ ├── attrs.js │ │ │ │ │ │ │ │ │ ├── class.js │ │ │ │ │ │ │ │ │ ├── dom-props.js │ │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ │ └── style.js │ │ │ │ │ │ │ │ └── util.js │ │ │ │ │ │ │ └── util │ │ │ │ │ │ │ │ ├── attrs.js │ │ │ │ │ │ │ │ ├── class.js │ │ │ │ │ │ │ │ ├── compat.js │ │ │ │ │ │ │ │ ├── element.js │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ └── style.js │ │ │ │ │ │ └── weex │ │ │ │ │ │ │ ├── compiler │ │ │ │ │ │ │ ├── directives │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ └── model.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── modules │ │ │ │ │ │ │ │ ├── append.js │ │ │ │ │ │ │ │ ├── class.js │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ ├── props.js │ │ │ │ │ │ │ │ ├── recycle-list │ │ │ │ │ │ │ │ ├── component-root.js │ │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ ├── recycle-list.js │ │ │ │ │ │ │ │ ├── text.js │ │ │ │ │ │ │ │ ├── v-bind.js │ │ │ │ │ │ │ │ ├── v-for.js │ │ │ │ │ │ │ │ ├── v-if.js │ │ │ │ │ │ │ │ ├── v-on.js │ │ │ │ │ │ │ │ └── v-once.js │ │ │ │ │ │ │ │ └── style.js │ │ │ │ │ │ │ ├── entry-compiler.js │ │ │ │ │ │ │ ├── entry-framework.js │ │ │ │ │ │ │ ├── entry-runtime-factory.js │ │ │ │ │ │ │ ├── runtime │ │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ ├── richtext.js │ │ │ │ │ │ │ │ ├── transition-group.js │ │ │ │ │ │ │ │ └── transition.js │ │ │ │ │ │ │ ├── directives │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── modules │ │ │ │ │ │ │ │ ├── attrs.js │ │ │ │ │ │ │ │ ├── class.js │ │ │ │ │ │ │ │ ├── events.js │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ ├── style.js │ │ │ │ │ │ │ │ └── transition.js │ │ │ │ │ │ │ ├── node-ops.js │ │ │ │ │ │ │ ├── patch.js │ │ │ │ │ │ │ ├── recycle-list │ │ │ │ │ │ │ │ ├── render-component-template.js │ │ │ │ │ │ │ │ └── virtual-component.js │ │ │ │ │ │ │ └── text-node.js │ │ │ │ │ │ │ └── util │ │ │ │ │ │ │ ├── element.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── parser.js │ │ │ │ │ ├── server │ │ │ │ │ │ ├── bundle-renderer │ │ │ │ │ │ │ ├── create-bundle-renderer.js │ │ │ │ │ │ │ ├── create-bundle-runner.js │ │ │ │ │ │ │ └── source-map-support.js │ │ │ │ │ │ ├── create-basic-renderer.js │ │ │ │ │ │ ├── create-renderer.js │ │ │ │ │ │ ├── optimizing-compiler │ │ │ │ │ │ │ ├── codegen.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── modules.js │ │ │ │ │ │ │ ├── optimizer.js │ │ │ │ │ │ │ └── runtime-helpers.js │ │ │ │ │ │ ├── render-context.js │ │ │ │ │ │ ├── render-stream.js │ │ │ │ │ │ ├── render.js │ │ │ │ │ │ ├── template-renderer │ │ │ │ │ │ │ ├── create-async-file-mapper.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── parse-template.js │ │ │ │ │ │ │ └── template-stream.js │ │ │ │ │ │ ├── util.js │ │ │ │ │ │ ├── webpack-plugin │ │ │ │ │ │ │ ├── client.js │ │ │ │ │ │ │ ├── server.js │ │ │ │ │ │ │ └── util.js │ │ │ │ │ │ └── write.js │ │ │ │ │ ├── sfc │ │ │ │ │ │ └── parser.js │ │ │ │ │ └── shared │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ └── util.js │ │ │ │ │ └── types │ │ │ │ │ ├── index.d.ts │ │ │ │ │ ├── options.d.ts │ │ │ │ │ ├── plugin.d.ts │ │ │ │ │ ├── vnode.d.ts │ │ │ │ │ └── vue.d.ts │ │ │ ├── package-lock.json │ │ │ ├── package.json │ │ │ └── views │ │ │ │ └── index.html │ │ └── site.nginx │ └── services │ │ ├── dockerfile │ │ └── movie_svc │ │ ├── app.py │ │ ├── app_instance.py │ │ ├── data │ │ ├── db.py │ │ └── movies.csv │ │ ├── requirements.txt │ │ ├── routes.py │ │ ├── static │ │ └── css │ │ │ ├── docs.css │ │ │ └── theme.css │ │ ├── templates │ │ ├── home │ │ │ └── index.html │ │ └── shared │ │ │ └── _layout.html │ │ └── views │ │ ├── api_views.py │ │ └── home.py │ └── your-turn │ └── README.md ├── node_modules └── vue │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── src │ ├── compiler │ │ ├── codeframe.js │ │ ├── codegen │ │ │ ├── events.js │ │ │ └── index.js │ │ ├── create-compiler.js │ │ ├── directives │ │ │ ├── bind.js │ │ │ ├── index.js │ │ │ ├── model.js │ │ │ └── on.js │ │ ├── error-detector.js │ │ ├── helpers.js │ │ ├── index.js │ │ ├── optimizer.js │ │ ├── parser │ │ │ ├── entity-decoder.js │ │ │ ├── filter-parser.js │ │ │ ├── html-parser.js │ │ │ ├── index.js │ │ │ └── text-parser.js │ │ └── to-function.js │ ├── core │ │ ├── components │ │ │ ├── index.js │ │ │ └── keep-alive.js │ │ ├── config.js │ │ ├── global-api │ │ │ ├── assets.js │ │ │ ├── extend.js │ │ │ ├── index.js │ │ │ ├── mixin.js │ │ │ └── use.js │ │ ├── index.js │ │ ├── observer │ │ │ ├── array.js │ │ │ ├── dep.js │ │ │ ├── index.js │ │ │ ├── scheduler.js │ │ │ ├── traverse.js │ │ │ └── watcher.js │ │ ├── util │ │ │ ├── debug.js │ │ │ ├── env.js │ │ │ ├── error.js │ │ │ ├── index.js │ │ │ ├── lang.js │ │ │ ├── next-tick.js │ │ │ ├── options.js │ │ │ ├── perf.js │ │ │ └── props.js │ │ └── vdom │ │ │ ├── create-component.js │ │ │ ├── create-element.js │ │ │ ├── create-functional-component.js │ │ │ ├── helpers │ │ │ ├── extract-props.js │ │ │ ├── get-first-component-child.js │ │ │ ├── index.js │ │ │ ├── is-async-placeholder.js │ │ │ ├── merge-hook.js │ │ │ ├── normalize-children.js │ │ │ ├── normalize-scoped-slots.js │ │ │ ├── resolve-async-component.js │ │ │ └── update-listeners.js │ │ │ ├── modules │ │ │ ├── directives.js │ │ │ ├── index.js │ │ │ └── ref.js │ │ │ ├── patch.js │ │ │ └── vnode.js │ ├── platforms │ │ ├── web │ │ │ ├── compiler │ │ │ │ ├── directives │ │ │ │ │ ├── html.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── model.js │ │ │ │ │ └── text.js │ │ │ │ ├── index.js │ │ │ │ ├── modules │ │ │ │ │ ├── class.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── model.js │ │ │ │ │ └── style.js │ │ │ │ ├── options.js │ │ │ │ └── util.js │ │ │ ├── entry-compiler.js │ │ │ ├── entry-runtime-with-compiler.js │ │ │ ├── entry-runtime.js │ │ │ ├── entry-server-basic-renderer.js │ │ │ ├── entry-server-renderer.js │ │ │ ├── runtime │ │ │ │ ├── class-util.js │ │ │ │ ├── components │ │ │ │ │ ├── index.js │ │ │ │ │ ├── transition-group.js │ │ │ │ │ └── transition.js │ │ │ │ ├── directives │ │ │ │ │ ├── index.js │ │ │ │ │ ├── model.js │ │ │ │ │ └── show.js │ │ │ │ ├── index.js │ │ │ │ ├── modules │ │ │ │ │ ├── attrs.js │ │ │ │ │ ├── class.js │ │ │ │ │ ├── dom-props.js │ │ │ │ │ ├── events.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── style.js │ │ │ │ │ └── transition.js │ │ │ │ ├── node-ops.js │ │ │ │ ├── patch.js │ │ │ │ └── transition-util.js │ │ │ ├── server │ │ │ │ ├── compiler.js │ │ │ │ ├── directives │ │ │ │ │ ├── index.js │ │ │ │ │ ├── model.js │ │ │ │ │ └── show.js │ │ │ │ ├── modules │ │ │ │ │ ├── attrs.js │ │ │ │ │ ├── class.js │ │ │ │ │ ├── dom-props.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── style.js │ │ │ │ └── util.js │ │ │ └── util │ │ │ │ ├── attrs.js │ │ │ │ ├── class.js │ │ │ │ ├── compat.js │ │ │ │ ├── element.js │ │ │ │ ├── index.js │ │ │ │ └── style.js │ │ └── weex │ │ │ ├── compiler │ │ │ ├── directives │ │ │ │ ├── index.js │ │ │ │ └── model.js │ │ │ ├── index.js │ │ │ └── modules │ │ │ │ ├── append.js │ │ │ │ ├── class.js │ │ │ │ ├── index.js │ │ │ │ ├── props.js │ │ │ │ ├── recycle-list │ │ │ │ ├── component-root.js │ │ │ │ ├── component.js │ │ │ │ ├── index.js │ │ │ │ ├── recycle-list.js │ │ │ │ ├── text.js │ │ │ │ ├── v-bind.js │ │ │ │ ├── v-for.js │ │ │ │ ├── v-if.js │ │ │ │ ├── v-on.js │ │ │ │ └── v-once.js │ │ │ │ └── style.js │ │ │ ├── entry-compiler.js │ │ │ ├── entry-framework.js │ │ │ ├── entry-runtime-factory.js │ │ │ ├── runtime │ │ │ ├── components │ │ │ │ ├── index.js │ │ │ │ ├── richtext.js │ │ │ │ ├── transition-group.js │ │ │ │ └── transition.js │ │ │ ├── directives │ │ │ │ └── index.js │ │ │ ├── index.js │ │ │ ├── modules │ │ │ │ ├── attrs.js │ │ │ │ ├── class.js │ │ │ │ ├── events.js │ │ │ │ ├── index.js │ │ │ │ ├── style.js │ │ │ │ └── transition.js │ │ │ ├── node-ops.js │ │ │ ├── patch.js │ │ │ ├── recycle-list │ │ │ │ ├── render-component-template.js │ │ │ │ └── virtual-component.js │ │ │ └── text-node.js │ │ │ └── util │ │ │ ├── element.js │ │ │ ├── index.js │ │ │ └── parser.js │ ├── server │ │ ├── bundle-renderer │ │ │ ├── create-bundle-renderer.js │ │ │ ├── create-bundle-runner.js │ │ │ └── source-map-support.js │ │ ├── create-basic-renderer.js │ │ ├── create-renderer.js │ │ ├── optimizing-compiler │ │ │ ├── codegen.js │ │ │ ├── index.js │ │ │ ├── modules.js │ │ │ ├── optimizer.js │ │ │ └── runtime-helpers.js │ │ ├── render-context.js │ │ ├── render-stream.js │ │ ├── render.js │ │ ├── template-renderer │ │ │ ├── create-async-file-mapper.js │ │ │ ├── index.js │ │ │ ├── parse-template.js │ │ │ └── template-stream.js │ │ ├── util.js │ │ ├── webpack-plugin │ │ │ ├── client.js │ │ │ ├── server.js │ │ │ └── util.js │ │ └── write.js │ ├── sfc │ │ └── parser.js │ └── shared │ │ ├── constants.js │ │ └── util.js │ └── types │ ├── index.d.ts │ ├── options.d.ts │ ├── plugin.d.ts │ ├── vnode.d.ts │ └── vue.d.ts ├── package-lock.json ├── package.json └── readme_resources └── 100days-web.png /.idea/ruff.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 100 Days of web with Python 2 | 3 | ![](https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/master/readme_resources/100days-web.png?token=AAPQ62OROPS5REVP3COFPSS4ZIIEW) 4 | 5 | -------------------------------------------------------------------------------- /days/001-004-flask-intro/code/.flaskenv: -------------------------------------------------------------------------------- 1 | FLASK_APP=demo.py 2 | -------------------------------------------------------------------------------- /days/001-004-flask-intro/code/demo.py: -------------------------------------------------------------------------------- 1 | from program import app # noqa: F401 2 | -------------------------------------------------------------------------------- /days/001-004-flask-intro/code/program/__init__.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from program import routes # noqa: F401 3 | 4 | app = Flask(__name__) 5 | 6 | 7 | -------------------------------------------------------------------------------- /days/001-004-flask-intro/code/program/routes.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from flask import render_template 3 | from program import app 4 | 5 | @app.route('/') 6 | @app.route('/index') 7 | def index(): 8 | return render_template('index.html', title='Template Demo', time=datetime.now()) 9 | 10 | @app.route('/100Days') 11 | def p100days(): 12 | return render_template('100Days.html') 13 | -------------------------------------------------------------------------------- /days/001-004-flask-intro/code/program/templates/100Days.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 |

Congrats on starting your 100 Days of Code Challenge!

5 |

THIS IS TEXT FROM 100DAYS HTML, NOT BASE

6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /days/001-004-flask-intro/code/program/templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 |

Hello! The current date is {{ time }}

5 |

THIS IS TEXT FROM INDEX, NOT BASE

6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /days/001-004-flask-intro/code/requirements.piptools: -------------------------------------------------------------------------------- 1 | click 2 | Flask 3 | itsdangerous 4 | Jinja2 5 | MarkupSafe 6 | python-dotenv 7 | werkzeug 8 | -------------------------------------------------------------------------------- /days/005-008-html5/demos/signup/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /days/005-008-html5/demos/signup/extras/form_hook.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function () { 2 | 3 | $("form").submit(function (e) { 4 | e.preventDefault() 5 | 6 | const $inputs = $('form :input'); 7 | 8 | let values = {} 9 | $inputs.each(function () { 10 | if (this.name) { 11 | values[this.name] = $(this).val(); 12 | } 13 | }) 14 | 15 | alert(JSON.stringify(values, null, 2)) 16 | 17 | return false 18 | }) 19 | }) 20 | -------------------------------------------------------------------------------- /days/005-008-html5/demos/yahoo_clone/img/cool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/005-008-html5/demos/yahoo_clone/img/cool.png -------------------------------------------------------------------------------- /days/005-008-html5/demos/yahoo_clone/img/more.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/005-008-html5/demos/yahoo_clone/img/more.png -------------------------------------------------------------------------------- /days/005-008-html5/demos/yahoo_clone/img/new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/005-008-html5/demos/yahoo_clone/img/new.png -------------------------------------------------------------------------------- /days/005-008-html5/demos/yahoo_clone/img/news.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/005-008-html5/demos/yahoo_clone/img/news.png -------------------------------------------------------------------------------- /days/005-008-html5/demos/yahoo_clone/img/yaahoo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/005-008-html5/demos/yahoo_clone/img/yaahoo.png -------------------------------------------------------------------------------- /days/005-008-html5/your-turn/google-1998-marked-up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/005-008-html5/your-turn/google-1998-marked-up.png -------------------------------------------------------------------------------- /days/009-012-modern-apis-starred/demo/requirements.piptools: -------------------------------------------------------------------------------- 1 | fastapi 2 | uvicorn 3 | 4 | -------------------------------------------------------------------------------- /days/009-012-modern-apis-with-fastapi/demo/requirements.txt: -------------------------------------------------------------------------------- 1 | fastapi 2 | uvicorn 3 | 4 | -------------------------------------------------------------------------------- /days/013-016-css-basics/demos/selectorville/.idea/jsLibraryMappings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /days/013-016-css-basics/demos/selectorville/static/css/sample.css: -------------------------------------------------------------------------------- 1 | 2 | body { 3 | background-color: #ccc; 4 | color: #222; 5 | } 6 | 7 | .content { 8 | padding: 20px; 9 | line-height: 1.25em; 10 | } 11 | 12 | .nav ul.dropdown > #profile_image { 13 | width: 64px; 14 | } 15 | 16 | .content.lead { 17 | font-size: 18px; 18 | } -------------------------------------------------------------------------------- /days/013-016-css-basics/demos/selectorville/static/img/dunecat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/013-016-css-basics/demos/selectorville/static/img/dunecat.jpg -------------------------------------------------------------------------------- /days/013-016-css-basics/demos/selectorville/static/js/selectors.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function () { 2 | $("#search_button").click(function (e) { 3 | e.preventDefault() 4 | 5 | var selector_text = $("#search_entry").val(); 6 | $(".selected").removeClass("selected"); 7 | 8 | 9 | console.log(selector_text); 10 | $(selector_text).each(function (i, e) { 11 | $(e).addClass('selected') 12 | }) 13 | 14 | return false 15 | }) 16 | }) -------------------------------------------------------------------------------- /days/013-016-css-basics/your-turn/talk-python-nav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/013-016-css-basics/your-turn/talk-python-nav.png -------------------------------------------------------------------------------- /days/017-020-flask-call-apis/code/demo.py: -------------------------------------------------------------------------------- 1 | from program import app 2 | 3 | if __name__ == '__main__': 4 | app.run(load_dotenv=False) 5 | -------------------------------------------------------------------------------- /days/017-020-flask-call-apis/code/program/__init__.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | 3 | app = Flask(__name__) 4 | 5 | from program import routes 6 | -------------------------------------------------------------------------------- /days/017-020-flask-call-apis/code/program/templates/100Days.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 |

Congrats on starting your 100 Days of Code Challenge!

5 |

THIS IS TEXT FROM 100DAYS HTML, NOT BASE

6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /days/017-020-flask-call-apis/code/program/templates/chuck.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 |

Chuck Norris Jokes!

5 |

{{joke}}

6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /days/017-020-flask-call-apis/code/program/templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 |

Hello! The current date is {{ time }}

5 |

THIS IS TEXT FROM INDEX, NOT BASE

6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /days/017-020-flask-call-apis/code/requirements.txt: -------------------------------------------------------------------------------- 1 | certifi==2018.8.24 2 | chardet==3.0.4 3 | Click==7.0 4 | Flask==1.0.2 5 | idna==2.7 6 | itsdangerous==0.24 7 | Jinja2>=2.10.1 8 | MarkupSafe==1.0 9 | python-dotenv==0.9.1 10 | requests>=2.21.0 11 | urllib3==1.26.5 12 | werkzeug>=0.15.3 13 | -------------------------------------------------------------------------------- /days/021-024-quart-async/async_cityscape_api/.idea/dictionaries/mkennedy.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | appid 5 | 6 | 7 | -------------------------------------------------------------------------------- /days/021-024-quart-async/async_cityscape_api/.idea/dictionaries/screencaster.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | aiodns 5 | aiohttp 6 | cchardet 7 | 8 | 9 | -------------------------------------------------------------------------------- /days/021-024-quart-async/async_cityscape_api/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /days/021-024-quart-async/async_cityscape_api/.idea/webResources.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /days/021-024-quart-async/async_cityscape_api/config/dev.json: -------------------------------------------------------------------------------- 1 | { 2 | "dev": true, 3 | "weather_key": "" 4 | } -------------------------------------------------------------------------------- /days/021-024-quart-async/async_cityscape_api/config/prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "dev": false, 3 | "weather_key": "" 4 | } -------------------------------------------------------------------------------- /days/021-024-quart-async/async_cityscape_api/config/settings.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | 4 | 5 | def load(mode='dev') -> dict: 6 | file = os.path.join(os.path.dirname(__file__), f"{mode}.json") 7 | if not os.path.exists(file): 8 | raise Exception(f"Config not found for {mode}.") 9 | 10 | with open(file, 'r', encoding='utf-8') as fin: 11 | return json.load(fin) 12 | -------------------------------------------------------------------------------- /days/021-024-quart-async/async_cityscape_api/requirements.txt: -------------------------------------------------------------------------------- 1 | # Web framework requirements 2 | # flask 3 | quart 4 | 5 | # Calling services requirements 6 | # requests 7 | 8 | aiohttp 9 | aiodns 10 | cchardet 11 | -------------------------------------------------------------------------------- /days/021-024-quart-async/cityscape_api/config/dev.json: -------------------------------------------------------------------------------- 1 | { 2 | "dev": true, 3 | "weather_key": "" 4 | } -------------------------------------------------------------------------------- /days/021-024-quart-async/cityscape_api/config/prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "dev": false, 3 | "weather_key": "" 4 | } -------------------------------------------------------------------------------- /days/021-024-quart-async/cityscape_api/config/settings.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | 4 | 5 | def load(mode='dev') -> dict: 6 | file = os.path.join(os.path.dirname(__file__), f"{mode}.json") 7 | if not os.path.exists(file): 8 | raise Exception(f"Config not found for {mode}.") 9 | 10 | with open(file, 'r', encoding='utf-8') as fin: 11 | return json.load(fin) 12 | -------------------------------------------------------------------------------- /days/021-024-quart-async/cityscape_api/requirements.txt: -------------------------------------------------------------------------------- 1 | # Web framework requirements 2 | flask 3 | 4 | # Calling services requirements 5 | requests 6 | 7 | aiohttp 8 | aiodns 9 | cchardet 10 | 11 | -------------------------------------------------------------------------------- /days/021-024-quart-async/cityscape_api/services/event_service.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/021-024-quart-async/cityscape_api/services/event_service.py -------------------------------------------------------------------------------- /days/021-024-quart-async/python_async/.idea/dictionaries/screencaster.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | colorama 5 | 6 | 7 | -------------------------------------------------------------------------------- /days/021-024-quart-async/python_async/.idea/python_async.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 11 | -------------------------------------------------------------------------------- /days/021-024-quart-async/python_async/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /days/021-024-quart-async/python_async/requirements.txt: -------------------------------------------------------------------------------- 1 | colorama -------------------------------------------------------------------------------- /days/021-024-quart-async/your_turn/day_2/web_crawl/requirements.txt: -------------------------------------------------------------------------------- 1 | requests 2 | bs4 3 | colorama 4 | aiohttp 5 | cchardet 6 | -------------------------------------------------------------------------------- /days/021-024-quart-async/your_turn/day_4/cityscape_api/config/dev.json: -------------------------------------------------------------------------------- 1 | { 2 | "dev": true, 3 | "weather_key": "" 4 | } -------------------------------------------------------------------------------- /days/021-024-quart-async/your_turn/day_4/cityscape_api/config/prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "dev": false, 3 | "weather_key": "" 4 | } -------------------------------------------------------------------------------- /days/021-024-quart-async/your_turn/day_4/cityscape_api/config/settings.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | 4 | 5 | def load(mode='dev') -> dict: 6 | file = os.path.join(os.path.dirname(__file__), f"{mode}.json") 7 | if not os.path.exists(file): 8 | raise Exception(f"Config not found for {mode}.") 9 | 10 | with open(file, 'r', encoding='utf-8') as fin: 11 | return json.load(fin) 12 | -------------------------------------------------------------------------------- /days/021-024-quart-async/your_turn/day_4/cityscape_api/requirements.txt: -------------------------------------------------------------------------------- 1 | # Web framework requirements 2 | flask 3 | 4 | # Calling services requirements 5 | requests 6 | 7 | aiohttp 8 | aiodns 9 | cchardet 10 | 11 | -------------------------------------------------------------------------------- /days/021-024-quart-async/your_turn/day_4/cityscape_api/services/event_service.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/021-024-quart-async/your_turn/day_4/cityscape_api/services/event_service.py -------------------------------------------------------------------------------- /days/021-024-quart-async/your_turn/day_4/cityscape_api/views/home.py: -------------------------------------------------------------------------------- 1 | import flask 2 | 3 | blueprint = flask.blueprints.Blueprint(__name__.replace('.', '_'), __name__) 4 | 5 | 6 | @blueprint.route('/') 7 | def index(): 8 | return "Welcome to the city_scape API. Use /api/city/* for API calls." 9 | 10 | 11 | @blueprint.errorhandler(404) 12 | def not_found(_): 13 | return flask.Response("The page was not found.", status=404) 14 | -------------------------------------------------------------------------------- /days/025-028-javascript/demo/calories/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/025-028-javascript/demo/calories/README.md -------------------------------------------------------------------------------- /days/025-028-javascript/demo/calories/css/style.css: -------------------------------------------------------------------------------- 1 | th, td { 2 | text-align: left; 3 | } 4 | #logo { 5 | position: relative; 6 | top: 10px; 7 | right: 15px; 8 | } 9 | #content-wrapper { 10 | margin: 20px; 11 | } 12 | .delete { 13 | background: url('../img/delete.png') no-repeat top left; 14 | border: none; 15 | cursor: pointer; 16 | width: 20px; 17 | height: 20px; 18 | } 19 | .bold { 20 | font-weight: bold; 21 | } 22 | -------------------------------------------------------------------------------- /days/025-028-javascript/demo/calories/img/delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/025-028-javascript/demo/calories/img/delete.png -------------------------------------------------------------------------------- /days/025-028-javascript/demo/calories/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/025-028-javascript/demo/calories/img/favicon.ico -------------------------------------------------------------------------------- /days/025-028-javascript/demo/calories/img/le_bigmac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/025-028-javascript/demo/calories/img/le_bigmac.png -------------------------------------------------------------------------------- /days/025-028-javascript/demo/language/run-js/hello.js: -------------------------------------------------------------------------------- 1 | function hello(name){ 2 | return 'Hello ' + name; 3 | } 4 | 5 | console.log(hello('bob')); 6 | 7 | -------------------------------------------------------------------------------- /days/025-028-javascript/demo/language/run-js/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | JS is Fun! 5 | 6 | 7 | 8 | 9 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/content/images/pb-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/content/images/pb-logo.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/content/pages/about.md: -------------------------------------------------------------------------------- 1 | Title: About 2 | 3 | #About Page! 4 | 5 | ##This is a page about me 6 | 7 | I made this site to demonstrate static site generators 8 | -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/images/pb-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/images/pb-logo.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/css/typogrify.css: -------------------------------------------------------------------------------- 1 | .caps {font-size:.92em;} 2 | .amp {color:#666; font-size:1.05em;font-family:"Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua",serif; font-style:italic;} 3 | .dquo {margin-left:-.38em;} 4 | -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/fonts/Yanone_Kaffeesatz_400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/fonts/Yanone_Kaffeesatz_400.eot -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/fonts/Yanone_Kaffeesatz_400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/fonts/Yanone_Kaffeesatz_400.ttf -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/fonts/Yanone_Kaffeesatz_400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/fonts/Yanone_Kaffeesatz_400.woff -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/fonts/Yanone_Kaffeesatz_400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/fonts/Yanone_Kaffeesatz_400.woff2 -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/aboutme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/aboutme.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/bitbucket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/bitbucket.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/delicious.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/delicious.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/facebook.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/github.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/gitorious.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/gitorious.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/gittip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/gittip.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/google-groups.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/google-groups.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/google-plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/google-plus.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/hackernews.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/hackernews.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/lastfm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/lastfm.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/linkedin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/linkedin.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/reddit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/reddit.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/rss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/rss.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/slideshare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/slideshare.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/speakerdeck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/speakerdeck.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/stackoverflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/stackoverflow.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/twitter.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/vimeo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/vimeo.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/output/theme/images/icons/youtube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/029-032-static-site-gen/code/output/theme/images/icons/youtube.png -------------------------------------------------------------------------------- /days/029-032-static-site-gen/code/requirements.txt: -------------------------------------------------------------------------------- 1 | blinker==1.4 2 | docutils==0.14 3 | feedgenerator==1.9 4 | Jinja2>=2.10.1 5 | Markdown==3.1 6 | MarkupSafe==1.1.1 7 | pelican==4.0.1 8 | Pygments==2.7.4 9 | python-dateutil==2.8.0 10 | pytz==2018.9 11 | six==1.12.0 12 | Unidecode==1.0.23 13 | -------------------------------------------------------------------------------- /days/033-036-sqlalchemy-orm/demo/hovershare_app_final/.idea/dictionaries/screencaster.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | istory 5 | ocate 6 | tablename 7 | terwilliger 8 | vailable 9 | 10 | 11 | -------------------------------------------------------------------------------- /days/033-036-sqlalchemy-orm/demo/hovershare_app_final/data/__all_models.py: -------------------------------------------------------------------------------- 1 | # noinspection PyUnresolvedReferences 2 | import data.models.rentals 3 | # noinspection PyUnresolvedReferences 4 | import data.models.locations 5 | # noinspection PyUnresolvedReferences 6 | import data.models.scooters 7 | # noinspection PyUnresolvedReferences 8 | import data.models.users 9 | -------------------------------------------------------------------------------- /days/033-036-sqlalchemy-orm/demo/hovershare_app_final/data/sqlalchemybase.py: -------------------------------------------------------------------------------- 1 | import sqlalchemy.ext.declarative 2 | 3 | SqlAlchemyBase = sqlalchemy.ext.declarative.declarative_base() 4 | 5 | 6 | -------------------------------------------------------------------------------- /days/033-036-sqlalchemy-orm/demo/hovershare_app_final/db/db_folder.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | 4 | def get_full_path(db_filename: str) -> str: 5 | this_folder = os.path.dirname(__file__) 6 | return os.path.join(this_folder, db_filename) 7 | -------------------------------------------------------------------------------- /days/033-036-sqlalchemy-orm/demo/hovershare_app_final/infrastructure/numbers.py: -------------------------------------------------------------------------------- 1 | def try_int(text: str, default=-1) -> int: 2 | try: 3 | return int(text) 4 | except: 5 | return default 6 | -------------------------------------------------------------------------------- /days/033-036-sqlalchemy-orm/demo/hovershare_app_final/requirements.txt: -------------------------------------------------------------------------------- 1 | sqlalchemy==1.2.19 2 | -------------------------------------------------------------------------------- /days/033-036-sqlalchemy-orm/demo/hovershare_app_starter/.idea/dictionaries/screencaster.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | istory 5 | ocate 6 | sqlalchemy 7 | vailable 8 | 9 | 10 | -------------------------------------------------------------------------------- /days/033-036-sqlalchemy-orm/demo/hovershare_app_starter/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /days/033-036-sqlalchemy-orm/demo/hovershare_app_starter/db/db_folder.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | 4 | def get_full_path(db_filename: str) -> str: 5 | this_folder = os.path.dirname(__file__) 6 | return os.path.join(this_folder, db_filename) 7 | -------------------------------------------------------------------------------- /days/033-036-sqlalchemy-orm/demo/hovershare_app_starter/infrastructure/numbers.py: -------------------------------------------------------------------------------- 1 | def try_int(text: str, default=-1) -> int: 2 | try: 3 | return int(text) 4 | except: 5 | return default 6 | -------------------------------------------------------------------------------- /days/033-036-sqlalchemy-orm/demo/hovershare_app_starter/requirements.txt: -------------------------------------------------------------------------------- 1 | sqlalchemy==1.2.19 2 | -------------------------------------------------------------------------------- /days/037-40-pyramid-intro/demo/billtracker/.coveragerc: -------------------------------------------------------------------------------- 1 | [run] 2 | source = billtracker 3 | omit = billtracker/test* 4 | -------------------------------------------------------------------------------- /days/037-40-pyramid-intro/demo/billtracker/.gitignore: -------------------------------------------------------------------------------- 1 | *.egg 2 | *.egg-info 3 | *.pyc 4 | *$py.class 5 | *~ 6 | .coverage 7 | coverage.xml 8 | build/ 9 | dist/ 10 | .tox/ 11 | nosetests.xml 12 | env*/ 13 | tmp/ 14 | Data.fs* 15 | *.sublime-project 16 | *.sublime-workspace 17 | .*.sw? 18 | .sw? 19 | .DS_Store 20 | coverage 21 | test 22 | -------------------------------------------------------------------------------- /days/037-40-pyramid-intro/demo/billtracker/.idea/dictionaries/screencaster.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | dateutil 5 | debugtoolbar 6 | includeme 7 | maxcdn 8 | pastedeploy 9 | sqlalchemy 10 | tablename 11 | 12 | 13 | -------------------------------------------------------------------------------- /days/037-40-pyramid-intro/demo/billtracker/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /days/037-40-pyramid-intro/demo/billtracker/CHANGES.txt: -------------------------------------------------------------------------------- 1 | 0.0 2 | --- 3 | 4 | - Initial version. 5 | -------------------------------------------------------------------------------- /days/037-40-pyramid-intro/demo/billtracker/MANIFEST.in: -------------------------------------------------------------------------------- 1 | include *.txt *.ini *.cfg *.rst 2 | recursive-include billtracker *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2 3 | -------------------------------------------------------------------------------- /days/037-40-pyramid-intro/demo/billtracker/billtracker/bin/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/037-40-pyramid-intro/demo/billtracker/billtracker/bin/__init__.py -------------------------------------------------------------------------------- /days/037-40-pyramid-intro/demo/billtracker/billtracker/data/__all_models.py: -------------------------------------------------------------------------------- 1 | # noinspection PyUnresolvedReferences 2 | from billtracker.data.models.bill import Bill 3 | # noinspection PyUnresolvedReferences 4 | from billtracker.data.models.users import User 5 | 6 | -------------------------------------------------------------------------------- /days/037-40-pyramid-intro/demo/billtracker/billtracker/data/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/037-40-pyramid-intro/demo/billtracker/billtracker/data/__init__.py -------------------------------------------------------------------------------- /days/037-40-pyramid-intro/demo/billtracker/billtracker/data/modelbase.py: -------------------------------------------------------------------------------- 1 | import sqlalchemy.ext.declarative as dec 2 | 3 | SqlAlchemyBase = dec.declarative_base() 4 | -------------------------------------------------------------------------------- /days/037-40-pyramid-intro/demo/billtracker/billtracker/data/models/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/037-40-pyramid-intro/demo/billtracker/billtracker/data/models/__init__.py -------------------------------------------------------------------------------- /days/037-40-pyramid-intro/demo/billtracker/billtracker/routes.py: -------------------------------------------------------------------------------- 1 | def includeme(config): 2 | config.add_static_view('static', 'static', cache_max_age=3600) 3 | config.add_route('home', '/') 4 | config.add_route('details', '/bill/{bill_id}') 5 | -------------------------------------------------------------------------------- /days/037-40-pyramid-intro/demo/billtracker/billtracker/static/img/finance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/037-40-pyramid-intro/demo/billtracker/billtracker/static/img/finance.png -------------------------------------------------------------------------------- /days/037-40-pyramid-intro/demo/billtracker/billtracker/static/img/pyramid-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/037-40-pyramid-intro/demo/billtracker/billtracker/static/img/pyramid-16x16.png -------------------------------------------------------------------------------- /days/037-40-pyramid-intro/demo/billtracker/billtracker/static/img/pyramid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/037-40-pyramid-intro/demo/billtracker/billtracker/static/img/pyramid.png -------------------------------------------------------------------------------- /days/037-40-pyramid-intro/demo/billtracker/billtracker/templates/errors/404.pt: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |

Pyramid Starter project

6 |

404 Page Not Found

7 |
8 | 9 |
10 |
11 | -------------------------------------------------------------------------------- /days/037-40-pyramid-intro/demo/billtracker/billtracker/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/037-40-pyramid-intro/demo/billtracker/billtracker/views/__init__.py -------------------------------------------------------------------------------- /days/037-40-pyramid-intro/demo/billtracker/billtracker/views/notfound.py: -------------------------------------------------------------------------------- 1 | from pyramid.view import notfound_view_config 2 | 3 | 4 | @notfound_view_config(renderer='../templates/errors/404.pt') 5 | def notfound_view(request): 6 | request.response.status = 404 7 | return {} 8 | -------------------------------------------------------------------------------- /days/037-40-pyramid-intro/demo/billtracker/pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | testpaths = billtracker 3 | python_files = test*.py 4 | -------------------------------------------------------------------------------- /days/041-044-react/demo/README.md: -------------------------------------------------------------------------------- 1 | # React Projects Code 2 | 3 | In this folder you will find the React code for the [Tips API front-end](tips/) and the [Free Monkey (hangman) game](freemonkey/). 4 | -------------------------------------------------------------------------------- /days/041-044-react/demo/freemonkey/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /days/041-044-react/demo/freemonkey/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/041-044-react/demo/freemonkey/public/favicon.ico -------------------------------------------------------------------------------- /days/041-044-react/demo/freemonkey/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /days/041-044-react/demo/freemonkey/src/App.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | 5 | it('renders without crashing', () => { 6 | const div = document.createElement('div'); 7 | ReactDOM.render(, div); 8 | ReactDOM.unmountComponentAtNode(div); 9 | }); 10 | -------------------------------------------------------------------------------- /days/041-044-react/demo/freemonkey/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import App from './App'; 5 | import * as serviceWorker from './serviceWorker'; 6 | 7 | ReactDOM.render(, document.getElementById('root')); 8 | 9 | // If you want your app to work offline and load faster, you can change 10 | // unregister() to register() below. Note this comes with some pitfalls. 11 | // Learn more about service workers: https://bit.ly/CRA-PWA 12 | serviceWorker.unregister(); 13 | -------------------------------------------------------------------------------- /days/041-044-react/demo/screenshots/freemonkey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/041-044-react/demo/screenshots/freemonkey.png -------------------------------------------------------------------------------- /days/041-044-react/demo/screenshots/tips.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/041-044-react/demo/screenshots/tips.png -------------------------------------------------------------------------------- /days/041-044-react/demo/tips/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /days/041-044-react/demo/tips/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/041-044-react/demo/tips/public/favicon.ico -------------------------------------------------------------------------------- /days/041-044-react/demo/tips/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /days/041-044-react/demo/tips/src/App.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | 5 | it('renders without crashing', () => { 6 | const div = document.createElement('div'); 7 | ReactDOM.render(, div); 8 | ReactDOM.unmountComponentAtNode(div); 9 | }); 10 | -------------------------------------------------------------------------------- /days/041-044-react/demo/tips/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", 5 | "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", 6 | sans-serif; 7 | -webkit-font-smoothing: antialiased; 8 | -moz-osx-font-smoothing: grayscale; 9 | } 10 | 11 | code { 12 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", 13 | monospace; 14 | } 15 | -------------------------------------------------------------------------------- /days/041-044-react/demo/tips/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import App from './App'; 5 | import * as serviceWorker from './serviceWorker'; 6 | 7 | ReactDOM.render(, document.getElementById('root')); 8 | 9 | // If you want your app to work offline and load faster, you can change 10 | // unregister() to register() below. Note this comes with some pitfalls. 11 | // Learn more about service workers: https://bit.ly/CRA-PWA 12 | serviceWorker.unregister(); 13 | -------------------------------------------------------------------------------- /days/041-044-react/es6/arrow.js: -------------------------------------------------------------------------------- 1 | // if single line, omit return and {} 2 | const myFunc = (name='stranger') => 'Hello ' + name; 3 | 4 | console.log(myFunc()); 5 | console.log(myFunc('mike')); 6 | -------------------------------------------------------------------------------- /days/041-044-react/es6/class.js: -------------------------------------------------------------------------------- 1 | class Bite { 2 | 3 | constructor(title, points){ 4 | this.title = title; 5 | this.points = points; 6 | } 7 | 8 | str(){ 9 | return 'Bite: ' + this.title + ' (' + this.points + ' pt.)'; 10 | } 11 | } 12 | 13 | if (require.main === module) { 14 | bite1 = new Bite('sum of numbers', 2) 15 | console.log(bite1.str()) 16 | 17 | bite2 = new Bite('parse list of names', 3) 18 | console.log(bite2.str()) 19 | } 20 | 21 | module.exports = Bite; -------------------------------------------------------------------------------- /days/041-044-react/es6/destruct.js: -------------------------------------------------------------------------------- 1 | const bite = { 2 | id: 1, 3 | title: 'sum of numbers', 4 | level: 'beginner', 5 | points: 3, 6 | } 7 | 8 | // destructure bite object 9 | const { id, title, level, points } = bite; 10 | console.log(id); 11 | console.log(title); 12 | console.log(level); 13 | console.log(points); 14 | -------------------------------------------------------------------------------- /days/041-044-react/es6/hello.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | 3 | class App extends Component { 4 | 5 | render(){ 6 | const hello = 'Hello world from React'; 7 | return ( 8 |

{hello}

9 | ) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /days/041-044-react/es6/inherit.js: -------------------------------------------------------------------------------- 1 | const Bite = require('./class.js'); 2 | 3 | class EnterpriseBite extends Bite { 4 | str(){ 5 | return 'EP ' + super.str(); 6 | } 7 | } 8 | 9 | let bite = new EnterpriseBite('hangman', 4); 10 | 11 | console.log(bite.title); 12 | console.log(bite.str()); 13 | -------------------------------------------------------------------------------- /days/041-044-react/es6/mapfilter.js: -------------------------------------------------------------------------------- 1 | const ninjas = [ 2 | { name: 'martin', points: 225 }, 3 | { name: 'mike', points: 200 }, 4 | { name: 'dirk', points: 175 }, 5 | ]; 6 | 7 | console.log( 8 | ninjas 9 | .filter(ninja => ninja.points >= 200) 10 | .map(ninja => `
  • ${ninja.name}
  • `) 11 | ) 12 | -------------------------------------------------------------------------------- /days/045-048-django-intro/demo/mysite/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/045-048-django-intro/demo/mysite/__init__.py -------------------------------------------------------------------------------- /days/045-048-django-intro/demo/mysite/static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/045-048-django-intro/demo/mysite/static/img/favicon.ico -------------------------------------------------------------------------------- /days/045-048-django-intro/demo/mysite/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import include, path 3 | 4 | 5 | urlpatterns = [ 6 | path('', include('quotes.urls')), 7 | path('my-backend/', admin.site.urls), 8 | ] 9 | -------------------------------------------------------------------------------- /days/045-048-django-intro/demo/mysite/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for mysite project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /days/045-048-django-intro/demo/quotes/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/045-048-django-intro/demo/quotes/__init__.py -------------------------------------------------------------------------------- /days/045-048-django-intro/demo/quotes/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import Quote 4 | 5 | admin.site.register(Quote) 6 | -------------------------------------------------------------------------------- /days/045-048-django-intro/demo/quotes/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class QuotesConfig(AppConfig): 5 | name = 'quotes' 6 | -------------------------------------------------------------------------------- /days/045-048-django-intro/demo/quotes/forms.py: -------------------------------------------------------------------------------- 1 | from django.forms import ModelForm 2 | 3 | from .models import Quote 4 | 5 | 6 | class QuoteForm(ModelForm): 7 | class Meta: 8 | model = Quote 9 | fields = ['quote', 'author', 'source', 'cover'] 10 | -------------------------------------------------------------------------------- /days/045-048-django-intro/demo/quotes/migrations/0002_auto_20180828_1103.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.1 on 2018-08-28 11:03 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('quotes', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='quote', 15 | name='inspiration', 16 | field=models.TextField(blank=True, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /days/045-048-django-intro/demo/quotes/migrations/0003_remove_quote_inspiration.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.1 on 2018-08-28 22:24 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('quotes', '0002_auto_20180828_1103'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='quote', 15 | name='inspiration', 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /days/045-048-django-intro/demo/quotes/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/045-048-django-intro/demo/quotes/migrations/__init__.py -------------------------------------------------------------------------------- /days/045-048-django-intro/demo/quotes/urls-cb.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from . import views 4 | 5 | app_name = 'quotes' 6 | urlpatterns = [ 7 | path('', views.QuoteList.as_view(), name='quote_list'), 8 | path('', views.QuoteView.as_view(), name='quote_detail'), 9 | path('new', views.QuoteCreate.as_view(), name='quote_new'), 10 | path('edit/', views.QuoteUpdate.as_view(), name='quote_edit'), 11 | path('delete/', views.QuoteDelete.as_view(), name='quote_delete'), 12 | ] 13 | -------------------------------------------------------------------------------- /days/045-048-django-intro/demo/quotes/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from . import views 4 | 5 | app_name = 'quotes' 6 | urlpatterns = [ 7 | path('', views.quote_list, name='quote_list'), 8 | path('', views.quote_detail, name='quote_detail'), 9 | path('new', views.quote_new, name='quote_new'), 10 | path('edit/', views.quote_edit, name='quote_edit'), 11 | path('delete/', views.quote_delete, name='quote_delete'), 12 | ] 13 | -------------------------------------------------------------------------------- /days/045-048-django-intro/demo/requirements.txt: -------------------------------------------------------------------------------- 1 | django 2 | -------------------------------------------------------------------------------- /days/049-selenium/.env-template: -------------------------------------------------------------------------------- 1 | USERNAME= 2 | PASSWORD= 3 | -------------------------------------------------------------------------------- /days/049-selenium/requirements.txt: -------------------------------------------------------------------------------- 1 | pytest 2 | selenium 3 | python-dotenv 4 | -------------------------------------------------------------------------------- /days/050-responder/demo/movie_svc/.idea/webResources.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /days/050-responder/demo/movie_svc/api_instance.py: -------------------------------------------------------------------------------- 1 | import responder 2 | 3 | api = responder.API() 4 | -------------------------------------------------------------------------------- /days/050-responder/demo/movie_svc/app.py: -------------------------------------------------------------------------------- 1 | # noinspection PyUnresolvedReferences 2 | from data import db 3 | # noinspection PyUnresolvedReferences 4 | from api_instance import api 5 | # noinspection PyUnresolvedReferences 6 | from views.home import * 7 | from views.api_views import * 8 | 9 | 10 | def main(): 11 | db.global_init() 12 | 13 | api.run() 14 | 15 | 16 | if __name__ == '__main__': 17 | main() 18 | -------------------------------------------------------------------------------- /days/050-responder/demo/movie_svc/requirements.txt: -------------------------------------------------------------------------------- 1 | responder 2 | starlette==0.8 3 | -------------------------------------------------------------------------------- /days/050-responder/demo/movie_svc/views/home.py: -------------------------------------------------------------------------------- 1 | from api_instance import api 2 | 3 | 4 | # api.static_route('/static', static=True) 5 | 6 | @api.route('/') 7 | def index(_, resp): 8 | resp.content = api.template('home/index.html') 9 | -------------------------------------------------------------------------------- /days/050-responder/your-turn/README.md: -------------------------------------------------------------------------------- 1 | # Day 50 Responder 2 | 3 | In this miscellaneous, 1-day lesson there is not a dedicated follow on exercise. 4 | 5 | But feel free to play converting one of your Flask API apps over to responder. That should go pretty quick. 6 | -------------------------------------------------------------------------------- /days/051-twilio/code/requirements.txt: -------------------------------------------------------------------------------- 1 | certifi==2019.3.9 2 | chardet==3.0.4 3 | idna==2.8 4 | PyJWT==2.4.0 5 | PySocks==1.6.8 6 | pytz==2019.1 7 | requests==2.21.0 8 | six==1.12.0 9 | twilio==6.26.1 10 | urllib3==1.26.5 11 | -------------------------------------------------------------------------------- /days/051-twilio/code/twilio_sms.py: -------------------------------------------------------------------------------- 1 | from twilio.rest import Client 2 | 3 | account_sid = "" 4 | auth_token = "" 5 | 6 | client = Client(account_sid, auth_token) 7 | 8 | client.messages.create( 9 | to="+61", 10 | from_="+61", 11 | body="Welcome to the 100daysofweb Course using Twilio!" 12 | ) 13 | -------------------------------------------------------------------------------- /days/052-anvil/your-turn/README.md: -------------------------------------------------------------------------------- 1 | # Day 52 Anvil 2 | 3 | In this miscellaneous, 1-day lesson there is not a dedicated follow on exercise. This was a long one so watching the videos definitely covers the day's exercises. But feel free to play with Anvil over at: 4 | 5 | [**talkpython.fm/anvil100**](https://talkpython.fm/anvil100) -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/env_variables.txt: -------------------------------------------------------------------------------- 1 | Set these env variables in your venv/bin/activate script 2 | 3 | export SECRET_KEY='some-long-string' 4 | export DEBUG=True 5 | export SENDGRID_USERNAME='your-user' 6 | export SENDGRID_PASSWORD='your-password' 7 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/mysite/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/053-056-django-registration/demo/mysite/__init__.py -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/mysite/static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/053-056-django-registration/demo/mysite/static/img/favicon.ico -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/mysite/templates/django_registration/activation_complete.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 |

    {% trans "Thanks for signing up, your account is now activated. Enjoy!" %}

    6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/mysite/templates/django_registration/activation_email_body.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% trans "Activate account at" %} {{ site.name }}: 3 | 4 | http://{{ site.name }}{% url 'django_registration_activate' activation_key %} 5 | 6 | {% blocktrans %}Link is valid for {{ expiration_days }} days.{% endblocktrans %} 7 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/mysite/templates/django_registration/activation_email_subject.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %}{% trans "Account activation on" %} {{ site.name }} 2 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/mysite/templates/django_registration/activation_failed.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 | 6 |

    {% trans "Account activation failed" %}

    7 | 8 | {% endblock %} 9 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/mysite/templates/django_registration/registration_closed.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 |

    {% trans "Registration is currently closed." %}

    6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/mysite/templates/django_registration/registration_complete.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 |

    {% trans "You are now registered. Activation email sent." %}

    6 | {% endblock %} -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/mysite/templates/registration/logout.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 |

    {% trans "Logged out" %}

    6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/mysite/templates/registration/password_change_done.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 |

    {% trans "Password changed" %}

    6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/mysite/templates/registration/password_reset_complete.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 | 6 |

    {% trans "Password reset successfully" %}

    7 | 8 |

    {% trans "Log in" %}

    9 | 10 | {% endblock %} 11 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/mysite/templates/registration/password_reset_done.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 |

    {% trans "Email with password reset instructions has been sent." %}

    6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/mysite/templates/registration/password_reset_email.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}Reset password at {{ site_name }}{% endblocktrans %}: 3 | {% block reset_link %} 4 | http://{{ site_name }}{% url 'password_reset_confirm' uid token %} 5 | {% endblock %} 6 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/mysite/templates/registration/password_reset_email.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}Reset password at {{ site_name }}{% endblocktrans %}: 3 | {% block reset_link %} 4 | http://{{ site_name }}{% url 'auth_password_reset_confirm' uid token %} 5 | {% endblock %} 6 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/mysite/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import include, path 3 | 4 | 5 | urlpatterns = [ 6 | path('', include('quotes.urls')), 7 | path('my-backend/', admin.site.urls), 8 | path(r'accounts/', include('django_registration.backends.activation.urls')), 9 | path(r'accounts/', include('django.contrib.auth.urls')), 10 | ] 11 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/mysite/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for mysite project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/quotes/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/053-056-django-registration/demo/quotes/__init__.py -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/quotes/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import Quote 4 | 5 | admin.site.register(Quote) 6 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/quotes/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class QuotesConfig(AppConfig): 5 | name = 'quotes' 6 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/quotes/forms.py: -------------------------------------------------------------------------------- 1 | from django.forms import ModelForm 2 | 3 | from .models import Quote 4 | 5 | 6 | class QuoteForm(ModelForm): 7 | class Meta: 8 | model = Quote 9 | exclude = ('user',) 10 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/quotes/migrations/0002_auto_20180828_1103.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.1 on 2018-08-28 11:03 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('quotes', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='quote', 15 | name='inspiration', 16 | field=models.TextField(blank=True, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/quotes/migrations/0003_remove_quote_inspiration.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.1 on 2018-08-28 22:24 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('quotes', '0002_auto_20180828_1103'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='quote', 15 | name='inspiration', 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/quotes/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/053-056-django-registration/demo/quotes/migrations/__init__.py -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/quotes/urls-cb.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from . import views 4 | 5 | app_name = 'quotes' 6 | urlpatterns = [ 7 | path('', views.QuoteList.as_view(), name='quote_list'), 8 | path('', views.QuoteView.as_view(), name='quote_detail'), 9 | path('new', views.QuoteCreate.as_view(), name='quote_new'), 10 | path('edit/', views.QuoteUpdate.as_view(), name='quote_edit'), 11 | path('delete/', views.QuoteDelete.as_view(), name='quote_delete'), 12 | ] 13 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/quotes/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from . import views 4 | 5 | app_name = 'quotes' 6 | urlpatterns = [ 7 | path('', views.quote_list, name='quote_list'), 8 | path('', views.quote_detail, name='quote_detail'), 9 | path('new', views.quote_new, name='quote_new'), 10 | path('edit/', views.quote_edit, name='quote_edit'), 11 | path('delete/', views.quote_delete, name='quote_delete'), 12 | ] 13 | -------------------------------------------------------------------------------- /days/053-056-django-registration/demo/requirements.txt: -------------------------------------------------------------------------------- 1 | django==2.2.28 2 | django-registration==3.1.2 3 | -------------------------------------------------------------------------------- /days/053-056-django-registration/django-registration-templates.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/053-056-django-registration/django-registration-templates.zip -------------------------------------------------------------------------------- /days/057-060-flask-login/code/launch.py: -------------------------------------------------------------------------------- 1 | from project_awesome import app 2 | -------------------------------------------------------------------------------- /days/057-060-flask-login/code/project_awesome/__init__.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from flask_sqlalchemy import SQLAlchemy 3 | import os 4 | 5 | app = Flask(__name__) 6 | db = SQLAlchemy(app) 7 | app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site_users.db' 8 | app.secret_key = os.urandom(12) 9 | 10 | from project_awesome import routes, models 11 | -------------------------------------------------------------------------------- /days/057-060-flask-login/code/project_awesome/models.py: -------------------------------------------------------------------------------- 1 | from flask_sqlalchemy import SQLAlchemy 2 | from flask_login import UserMixin 3 | from project_awesome import db 4 | 5 | class User(UserMixin, db.Model): 6 | id = db.Column(db.Integer, primary_key=True) 7 | username = db.Column(db.String(80), unique=True, nullable=False) 8 | password = db.Column(db.String(120), unique=False, nullable=False) 9 | 10 | def __repr__(self): 11 | return 'User {}'.format(self.username) 12 | -------------------------------------------------------------------------------- /days/057-060-flask-login/code/project_awesome/site_users.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/057-060-flask-login/code/project_awesome/site_users.db -------------------------------------------------------------------------------- /days/057-060-flask-login/code/project_awesome/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Home Page 4 | 5 | 6 | 7 |

    This is the home page, you do not need to be logged in to access this page

    8 | 9 | 10 | -------------------------------------------------------------------------------- /days/057-060-flask-login/code/project_awesome/templates/pybitesdashboard.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | PyBites Dashboard 4 | 5 | 6 | 7 |

    This is the PyBites Dashboard. You can only access this page once logged in

    8 | 9 | 10 | -------------------------------------------------------------------------------- /days/057-060-flask-login/code/requirements.txt: -------------------------------------------------------------------------------- 1 | Click==7.0 2 | Flask==1.0.2 3 | Flask-Login==0.4.1 4 | Flask-SQLAlchemy==2.3.2 5 | itsdangerous==1.1.0 6 | Jinja2>=2.10.1 7 | MarkupSafe==1.1.0 8 | python-dotenv==0.10.1 9 | SQLAlchemy>=1.3.0 10 | Werkzeug==0.15.3 11 | -------------------------------------------------------------------------------- /days/061-064-db-migrations/demo/billtracker/.coveragerc: -------------------------------------------------------------------------------- 1 | [run] 2 | source = billtracker 3 | omit = billtracker/test* 4 | -------------------------------------------------------------------------------- /days/061-064-db-migrations/demo/billtracker/.gitignore: -------------------------------------------------------------------------------- 1 | *.egg 2 | *.egg-info 3 | *.pyc 4 | *$py.class 5 | *~ 6 | .coverage 7 | coverage.xml 8 | build/ 9 | dist/ 10 | .tox/ 11 | nosetests.xml 12 | env*/ 13 | tmp/ 14 | Data.fs* 15 | *.sublime-project 16 | *.sublime-workspace 17 | .*.sw? 18 | .sw? 19 | .DS_Store 20 | coverage 21 | test 22 | -------------------------------------------------------------------------------- /days/061-064-db-migrations/demo/billtracker/CHANGES.txt: -------------------------------------------------------------------------------- 1 | 0.0 2 | --- 3 | 4 | - Initial version. 5 | -------------------------------------------------------------------------------- /days/061-064-db-migrations/demo/billtracker/MANIFEST.in: -------------------------------------------------------------------------------- 1 | include *.txt *.ini *.cfg *.rst 2 | recursive-include billtracker *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2 3 | -------------------------------------------------------------------------------- /days/061-064-db-migrations/demo/billtracker/alembic/README: -------------------------------------------------------------------------------- 1 | Generic single-database configuration. -------------------------------------------------------------------------------- /days/061-064-db-migrations/demo/billtracker/billtracker/bin/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/061-064-db-migrations/demo/billtracker/billtracker/bin/__init__.py -------------------------------------------------------------------------------- /days/061-064-db-migrations/demo/billtracker/billtracker/data/__all_models.py: -------------------------------------------------------------------------------- 1 | # noinspection PyUnresolvedReferences 2 | from billtracker.data.models.bill import Bill 3 | # noinspection PyUnresolvedReferences 4 | from billtracker.data.models.users import User 5 | 6 | -------------------------------------------------------------------------------- /days/061-064-db-migrations/demo/billtracker/billtracker/data/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/061-064-db-migrations/demo/billtracker/billtracker/data/__init__.py -------------------------------------------------------------------------------- /days/061-064-db-migrations/demo/billtracker/billtracker/data/modelbase.py: -------------------------------------------------------------------------------- 1 | import sqlalchemy.ext.declarative as dec 2 | 3 | SqlAlchemyBase = dec.declarative_base() 4 | -------------------------------------------------------------------------------- /days/061-064-db-migrations/demo/billtracker/billtracker/data/models/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/061-064-db-migrations/demo/billtracker/billtracker/data/models/__init__.py -------------------------------------------------------------------------------- /days/061-064-db-migrations/demo/billtracker/billtracker/routes.py: -------------------------------------------------------------------------------- 1 | def includeme(config): 2 | config.add_static_view('static', 'static', cache_max_age=3600) 3 | config.add_route('home', '/') 4 | config.add_route('details', '/bill/{bill_id}') 5 | -------------------------------------------------------------------------------- /days/061-064-db-migrations/demo/billtracker/billtracker/static/img/finance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/061-064-db-migrations/demo/billtracker/billtracker/static/img/finance.png -------------------------------------------------------------------------------- /days/061-064-db-migrations/demo/billtracker/billtracker/static/img/pyramid-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/061-064-db-migrations/demo/billtracker/billtracker/static/img/pyramid-16x16.png -------------------------------------------------------------------------------- /days/061-064-db-migrations/demo/billtracker/billtracker/static/img/pyramid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/061-064-db-migrations/demo/billtracker/billtracker/static/img/pyramid.png -------------------------------------------------------------------------------- /days/061-064-db-migrations/demo/billtracker/billtracker/templates/errors/404.pt: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | 4 |
    5 |

    Pyramid Starter project

    6 |

    404 Page Not Found

    7 |
    8 | 9 |
    10 |
    11 | -------------------------------------------------------------------------------- /days/061-064-db-migrations/demo/billtracker/billtracker/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/061-064-db-migrations/demo/billtracker/billtracker/views/__init__.py -------------------------------------------------------------------------------- /days/061-064-db-migrations/demo/billtracker/billtracker/views/notfound.py: -------------------------------------------------------------------------------- 1 | from pyramid.view import notfound_view_config 2 | 3 | 4 | @notfound_view_config(renderer='../templates/errors/404.pt') 5 | def notfound_view(request): 6 | request.response.status = 404 7 | return {} 8 | -------------------------------------------------------------------------------- /days/061-064-db-migrations/demo/billtracker/pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | testpaths = billtracker 3 | python_files = test*.py 4 | -------------------------------------------------------------------------------- /days/061-064-db-migrations/demo/billtracker/requirements.txt: -------------------------------------------------------------------------------- 1 | alembic 2 | Chameleon 3 | hupper 4 | Mako 5 | MarkupSafe 6 | PasteDeploy 7 | plaster 8 | plaster-pastedeploy 9 | Pygments 10 | pyramid 11 | pyramid-chameleon 12 | pyramid-debugtoolbar 13 | pyramid-mako 14 | python-dateutil 15 | python-editor 16 | repoze.lru 17 | six 18 | SQLAlchemy 19 | translationstring 20 | venusian 21 | waitress 22 | WebOb 23 | zope.deprecation 24 | zope.interface 25 | -------------------------------------------------------------------------------- /days/061-064-db-migrations/your-turn/hovershare_project/hovershare/data/__all_models.py: -------------------------------------------------------------------------------- 1 | # noinspection PyUnresolvedReferences 2 | import data.models.rentals 3 | # noinspection PyUnresolvedReferences 4 | import data.models.locations 5 | # noinspection PyUnresolvedReferences 6 | import data.models.scooters 7 | # noinspection PyUnresolvedReferences 8 | import data.models.users 9 | -------------------------------------------------------------------------------- /days/061-064-db-migrations/your-turn/hovershare_project/hovershare/data/sqlalchemybase.py: -------------------------------------------------------------------------------- 1 | import sqlalchemy.ext.declarative 2 | 3 | SqlAlchemyBase = sqlalchemy.ext.declarative.declarative_base() 4 | 5 | 6 | -------------------------------------------------------------------------------- /days/061-064-db-migrations/your-turn/hovershare_project/hovershare/db/db_folder.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | 4 | def get_full_path(db_filename: str) -> str: 5 | this_folder = os.path.dirname(__file__) 6 | return os.path.join(this_folder, db_filename) 7 | -------------------------------------------------------------------------------- /days/061-064-db-migrations/your-turn/hovershare_project/hovershare/infrastructure/numbers.py: -------------------------------------------------------------------------------- 1 | def try_int(text: str, default=-1) -> int: 2 | try: 3 | return int(text) 4 | except: 5 | return default 6 | -------------------------------------------------------------------------------- /days/061-064-db-migrations/your-turn/hovershare_project/hovershare/requirements.txt: -------------------------------------------------------------------------------- 1 | sqlalchemy 2 | -------------------------------------------------------------------------------- /days/065-068-heroku-deployment/code/Procfile: -------------------------------------------------------------------------------- 1 | web: gunicorn app:app 2 | -------------------------------------------------------------------------------- /days/065-068-heroku-deployment/code/app.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, render_template 2 | 3 | app = Flask(__name__) 4 | 5 | @app.route('/') 6 | def index(): 7 | return render_template("index.html") 8 | 9 | if __name__ == '__main__': 10 | app.run() 11 | -------------------------------------------------------------------------------- /days/065-068-heroku-deployment/code/emailer.py: -------------------------------------------------------------------------------- 1 | import smtplib 2 | 3 | smtp_server = smtplib.SMTP('smtp.gmail.com', 587) 4 | 5 | smtp_server.ehlo() 6 | 7 | smtp_server.starttls() 8 | 9 | smtp_server.login('', '') 10 | 11 | smtp_server.sendmail('@gmail.com', '@', 'Subject: Hello from Heroku!\nTest email from Heroku. Cheers!') 12 | 13 | smtp_server.quit() 14 | -------------------------------------------------------------------------------- /days/065-068-heroku-deployment/code/requirements.txt: -------------------------------------------------------------------------------- 1 | Click==7.0 2 | Flask==1.0.2 3 | gunicorn==19.9.0 4 | itsdangerous==1.1.0 5 | Jinja2>=2.10.1 6 | MarkupSafe==1.1.1 7 | python-http-client==3.1.0 8 | sendgrid==5.6.0 9 | werkzeug>=0.15.3 10 | -------------------------------------------------------------------------------- /days/065-068-heroku-deployment/code/runtime.txt: -------------------------------------------------------------------------------- 1 | python-3.6.0 2 | -------------------------------------------------------------------------------- /days/065-068-heroku-deployment/code/sendgrid_emailer.py: -------------------------------------------------------------------------------- 1 | import sendgrid 2 | from sendgrid.helpers.mail import Mail 3 | 4 | sg = sendgrid.SendGridAPIClient(api_key="MY_API_KEY") 5 | 6 | from_email = "test@example.com" 7 | subject = "Winter is coming" 8 | to_email = "@" 9 | content = "So... put on a jumper!" 10 | 11 | mail = Mail(from_email, to_email, subject, content) 12 | 13 | response = sg.send(mail) 14 | 15 | print(response.status_code) 16 | print(response.body) 17 | print(response.headers) 18 | -------------------------------------------------------------------------------- /days/065-068-heroku-deployment/code/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Index Page 4 | 5 | 6 | 7 |

    My Test Heroku Index Page

    8 | 9 | 10 | -------------------------------------------------------------------------------- /days/069-072-django-rest/.gitignore: -------------------------------------------------------------------------------- 1 | **venv 2 | **sqlite* 3 | **DS_Store 4 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/api/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/069-072-django-rest/demo/api/__init__.py -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/api/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/api/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ApiConfig(AppConfig): 5 | name = 'api' 6 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/api/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/069-072-django-rest/demo/api/migrations/__init__.py -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/api/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/api/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/api/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path, include 2 | from rest_framework_swagger.views import get_swagger_view 3 | 4 | from .views import QuoteList, QuoteDetail 5 | 6 | schema_view = get_swagger_view(title='PyBites Quotes API') 7 | 8 | urlpatterns = [ 9 | path('', QuoteList.as_view()), 10 | path('', QuoteDetail.as_view()), 11 | path('api-auth/', include('rest_framework.urls')), 12 | path('docs/', schema_view), 13 | ] 14 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/env_variables.txt: -------------------------------------------------------------------------------- 1 | Set these env variables in your venv/bin/activate script 2 | 3 | export SECRET_KEY='some-long-string' 4 | export DEBUG=True 5 | export SENDGRID_USERNAME='your-user' 6 | export SENDGRID_PASSWORD='your-password' 7 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/mysite/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/069-072-django-rest/demo/mysite/__init__.py -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/mysite/static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/069-072-django-rest/demo/mysite/static/img/favicon.ico -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/mysite/templates/django_registration/activation_complete.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 |

    {% trans "Thanks for signing up, your account is now activated. Enjoy!" %}

    6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/mysite/templates/django_registration/activation_email_body.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% trans "Activate account at" %} {{ site.name }}: 3 | 4 | http://{{ site.name }}{% url 'django_registration_activate' activation_key %} 5 | 6 | {% blocktrans %}Link is valid for {{ expiration_days }} days.{% endblocktrans %} 7 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/mysite/templates/django_registration/activation_email_subject.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %}{% trans "Account activation on" %} {{ site.name }} 2 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/mysite/templates/django_registration/activation_failed.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 | 6 |

    {% trans "Account activation failed" %}

    7 | 8 | {% endblock %} 9 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/mysite/templates/django_registration/registration_closed.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 |

    {% trans "Registration is currently closed." %}

    6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/mysite/templates/django_registration/registration_complete.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 |

    {% trans "You are now registered. Activation email sent." %}

    6 | {% endblock %} -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/mysite/templates/registration/logout.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 |

    {% trans "Logged out" %}

    6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/mysite/templates/registration/password_change_done.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 |

    {% trans "Password changed" %}

    6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/mysite/templates/registration/password_reset_complete.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 | 6 |

    {% trans "Password reset successfully" %}

    7 | 8 |

    {% trans "Log in" %}

    9 | 10 | {% endblock %} 11 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/mysite/templates/registration/password_reset_done.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 |

    {% trans "Email with password reset instructions has been sent." %}

    6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/mysite/templates/registration/password_reset_email.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}Reset password at {{ site_name }}{% endblocktrans %}: 3 | {% block reset_link %} 4 | http://{{ site_name }}{% url 'password_reset_confirm' uid token %} 5 | {% endblock %} 6 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/mysite/templates/registration/password_reset_email.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% blocktrans %}Reset password at {{ site_name }}{% endblocktrans %}: 3 | {% block reset_link %} 4 | http://{{ site_name }}{% url 'auth_password_reset_confirm' uid token %} 5 | {% endblock %} 6 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/mysite/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import include, path 3 | 4 | 5 | urlpatterns = [ 6 | path('', include('quotes.urls')), 7 | path('my-backend/', admin.site.urls), 8 | path(r'accounts/', include('django_registration.backends.activation.urls')), 9 | path(r'accounts/', include('django.contrib.auth.urls')), 10 | path(r'api/', include('api.urls')), 11 | ] 12 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/mysite/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for mysite project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/quotes/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/069-072-django-rest/demo/quotes/__init__.py -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/quotes/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import Quote 4 | 5 | admin.site.register(Quote) 6 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/quotes/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class QuotesConfig(AppConfig): 5 | name = 'quotes' 6 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/quotes/forms.py: -------------------------------------------------------------------------------- 1 | from django.forms import ModelForm 2 | 3 | from .models import Quote 4 | 5 | 6 | class QuoteForm(ModelForm): 7 | class Meta: 8 | model = Quote 9 | exclude = ('user',) 10 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/quotes/migrations/0002_auto_20180828_1103.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.1 on 2018-08-28 11:03 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('quotes', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='quote', 15 | name='inspiration', 16 | field=models.TextField(blank=True, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/quotes/migrations/0003_remove_quote_inspiration.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.1 on 2018-08-28 22:24 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('quotes', '0002_auto_20180828_1103'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='quote', 15 | name='inspiration', 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/quotes/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/069-072-django-rest/demo/quotes/migrations/__init__.py -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/quotes/urls-cb.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from . import views 4 | 5 | app_name = 'quotes' 6 | urlpatterns = [ 7 | path('', views.QuoteList.as_view(), name='quote_list'), 8 | path('', views.QuoteView.as_view(), name='quote_detail'), 9 | path('new', views.QuoteCreate.as_view(), name='quote_new'), 10 | path('edit/', views.QuoteUpdate.as_view(), name='quote_edit'), 11 | path('delete/', views.QuoteDelete.as_view(), name='quote_delete'), 12 | ] 13 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/quotes/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from . import views 4 | 5 | app_name = 'quotes' 6 | urlpatterns = [ 7 | path('', views.quote_list, name='quote_list'), 8 | path('', views.quote_detail, name='quote_detail'), 9 | path('new', views.quote_new, name='quote_new'), 10 | path('edit/', views.quote_edit, name='quote_edit'), 11 | path('delete/', views.quote_delete, name='quote_delete'), 12 | ] 13 | -------------------------------------------------------------------------------- /days/069-072-django-rest/demo/requirements.txt: -------------------------------------------------------------------------------- 1 | django==2.2.28 2 | django-registration==3.1.2 3 | djangorestframework 4 | requests 5 | django-rest-swagger 6 | -------------------------------------------------------------------------------- /days/069-072-django-rest/starter_code.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/069-072-django-rest/starter_code.zip -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/.coveragerc: -------------------------------------------------------------------------------- 1 | [run] 2 | source = billtracker 3 | omit = billtracker/test* 4 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/.gitignore: -------------------------------------------------------------------------------- 1 | *.egg 2 | *.egg-info 3 | *.pyc 4 | *$py.class 5 | *~ 6 | .coverage 7 | coverage.xml 8 | build/ 9 | dist/ 10 | .tox/ 11 | nosetests.xml 12 | env*/ 13 | tmp/ 14 | Data.fs* 15 | *.sublime-project 16 | *.sublime-workspace 17 | .*.sw? 18 | .sw? 19 | .DS_Store 20 | coverage 21 | test 22 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/CHANGES.txt: -------------------------------------------------------------------------------- 1 | 0.0 2 | --- 3 | 4 | - Initial version. 5 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/MANIFEST.in: -------------------------------------------------------------------------------- 1 | include *.txt *.ini *.cfg *.rst 2 | recursive-include billtracker *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2 3 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/alembic/README: -------------------------------------------------------------------------------- 1 | Generic single-database configuration. -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/billtracker/bin/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/demo/billtracker/billtracker/bin/__init__.py -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/billtracker/data/__all_models.py: -------------------------------------------------------------------------------- 1 | # noinspection PyUnresolvedReferences 2 | from billtracker.data.models.bill import Bill 3 | # noinspection PyUnresolvedReferences 4 | from billtracker.data.models.users import User 5 | 6 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/billtracker/data/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/demo/billtracker/billtracker/data/__init__.py -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/billtracker/data/modelbase.py: -------------------------------------------------------------------------------- 1 | import sqlalchemy.ext.declarative as dec 2 | 3 | SqlAlchemyBase = dec.declarative_base() 4 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/billtracker/data/models/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/demo/billtracker/billtracker/data/models/__init__.py -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/billtracker/routes.py: -------------------------------------------------------------------------------- 1 | def includeme(config): 2 | config.add_static_view('static', 'static', cache_max_age=3600) 3 | config.add_route('home', '/') 4 | config.add_route('details', '/bill/{bill_id}') 5 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/billtracker/static/img/finance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/demo/billtracker/billtracker/static/img/finance.png -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/billtracker/static/img/pyramid-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/demo/billtracker/billtracker/static/img/pyramid-16x16.png -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/billtracker/static/img/pyramid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/demo/billtracker/billtracker/static/img/pyramid.png -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/billtracker/templates/errors/404.pt: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | 4 |
    5 |

    Pyramid Starter project

    6 |

    404 Page Not Found

    7 |
    8 | 9 |
    10 |
    11 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/billtracker/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/demo/billtracker/billtracker/tests/__init__.py -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/billtracker/tests/all_tests.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | 3 | # noinspection PyUnresolvedReferences 4 | from billtracker.tests.default.default_viewmodel_tests import * 5 | # noinspection PyUnresolvedReferences 6 | from billtracker.tests.default.default_view_tests import * 7 | # noinspection PyUnresolvedReferences 8 | from billtracker.tests.site_tests import * 9 | 10 | 11 | class AllTests(unittest.TestCase): 12 | pass 13 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/billtracker/tests/default/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/demo/billtracker/billtracker/tests/default/__init__.py -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/billtracker/viewmodels/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/demo/billtracker/billtracker/viewmodels/__init__.py -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/billtracker/viewmodels/default/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/demo/billtracker/billtracker/viewmodels/default/__init__.py -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/billtracker/viewmodels/viewmodelbase.py: -------------------------------------------------------------------------------- 1 | from pyramid.request import Request 2 | 3 | 4 | class ViewModelBase: 5 | def __init__(self, request: Request): 6 | self.request = request 7 | self.error = None 8 | 9 | def to_dict(self) -> dict: 10 | return self.__dict__ 11 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/billtracker/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/demo/billtracker/billtracker/views/__init__.py -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/billtracker/views/notfound.py: -------------------------------------------------------------------------------- 1 | from pyramid.view import notfound_view_config 2 | 3 | 4 | @notfound_view_config(renderer='../templates/errors/404.pt') 5 | def notfound_view(request): 6 | request.response.status = 404 7 | return {} 8 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | testpaths = billtracker 3 | python_files = test*.py 4 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/requirements-dev.txt: -------------------------------------------------------------------------------- 1 | -r requirements.txt 2 | 3 | webtest 4 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/demo/billtracker/requirements.txt: -------------------------------------------------------------------------------- 1 | alembic 2 | Chameleon 3 | hupper 4 | Mako 5 | MarkupSafe 6 | PasteDeploy 7 | plaster 8 | plaster-pastedeploy 9 | Pygments 10 | pyramid 11 | pyramid-chameleon 12 | pyramid-debugtoolbar 13 | pyramid-mako 14 | python-dateutil 15 | python-editor 16 | repoze.lru 17 | six 18 | SQLAlchemy 19 | translationstring 20 | venusian 21 | waitress 22 | WebOb 23 | zope.deprecation 24 | zope.interface 25 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/.coveragerc: -------------------------------------------------------------------------------- 1 | [run] 2 | source = billtracker 3 | omit = billtracker/test* 4 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/.gitignore: -------------------------------------------------------------------------------- 1 | *.egg 2 | *.egg-info 3 | *.pyc 4 | *$py.class 5 | *~ 6 | .coverage 7 | coverage.xml 8 | build/ 9 | dist/ 10 | .tox/ 11 | nosetests.xml 12 | env*/ 13 | tmp/ 14 | Data.fs* 15 | *.sublime-project 16 | *.sublime-workspace 17 | .*.sw? 18 | .sw? 19 | .DS_Store 20 | coverage 21 | test 22 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/CHANGES.txt: -------------------------------------------------------------------------------- 1 | 0.0 2 | --- 3 | 4 | - Initial version. 5 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/MANIFEST.in: -------------------------------------------------------------------------------- 1 | include *.txt *.ini *.cfg *.rst 2 | recursive-include billtracker *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2 3 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/alembic/README: -------------------------------------------------------------------------------- 1 | Generic single-database configuration. -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/bin/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/bin/__init__.py -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/data/__all_models.py: -------------------------------------------------------------------------------- 1 | # noinspection PyUnresolvedReferences 2 | from billtracker.data.models.bill import Bill 3 | # noinspection PyUnresolvedReferences 4 | from billtracker.data.models.users import User 5 | 6 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/data/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/data/__init__.py -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/data/modelbase.py: -------------------------------------------------------------------------------- 1 | import sqlalchemy.ext.declarative as dec 2 | 3 | SqlAlchemyBase = dec.declarative_base() 4 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/data/models/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/data/models/__init__.py -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/routes.py: -------------------------------------------------------------------------------- 1 | def includeme(config): 2 | config.add_static_view('static', 'static', cache_max_age=3600) 3 | config.add_route('home', '/') 4 | config.add_route('details', '/bill/{bill_id}') 5 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/static/img/finance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/static/img/finance.png -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/static/img/pyramid-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/static/img/pyramid-16x16.png -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/static/img/pyramid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/static/img/pyramid.png -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/templates/errors/404.pt: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | 4 |
    5 |

    Pyramid Starter project

    6 |

    404 Page Not Found

    7 |
    8 | 9 |
    10 |
    11 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/viewmodels/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/viewmodels/__init__.py -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/viewmodels/default/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/viewmodels/default/__init__.py -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/viewmodels/viewmodelbase.py: -------------------------------------------------------------------------------- 1 | from pyramid.request import Request 2 | 3 | 4 | class ViewModelBase: 5 | def __init__(self, request: Request): 6 | self.request = request 7 | self.error = None 8 | 9 | def to_dict(self) -> dict: 10 | return self.__dict__ 11 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/views/__init__.py -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/billtracker/views/notfound.py: -------------------------------------------------------------------------------- 1 | from pyramid.view import notfound_view_config 2 | 3 | 4 | @notfound_view_config(renderer='../templates/errors/404.pt') 5 | def notfound_view(request): 6 | request.response.status = 404 7 | return {} 8 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | testpaths = billtracker 3 | python_files = test*.py 4 | -------------------------------------------------------------------------------- /days/081-084-unit-testing/your-turn/billtracker_with_viewmodels/billtracker/requirements.txt: -------------------------------------------------------------------------------- 1 | alembic 2 | Chameleon 3 | hupper 4 | Mako 5 | MarkupSafe 6 | PasteDeploy 7 | plaster 8 | plaster-pastedeploy 9 | Pygments 10 | pyramid 11 | pyramid-chameleon 12 | pyramid-debugtoolbar 13 | pyramid-mako 14 | python-dateutil 15 | python-editor 16 | repoze.lru 17 | six 18 | SQLAlchemy 19 | translationstring 20 | venusian 21 | waitress 22 | WebOb 23 | zope.deprecation 24 | zope.interface 25 | -------------------------------------------------------------------------------- /days/085-088-aws-lambda/demo/lambdas/lambda.pkg.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/085-088-aws-lambda/demo/lambdas/lambda.pkg.zip -------------------------------------------------------------------------------- /days/085-088-aws-lambda/demo/lambdas/lambda_calculator.py: -------------------------------------------------------------------------------- 1 | import operator 2 | 3 | CALCULATIONS = { 4 | '+': operator.add, 5 | '-': operator.sub, 6 | '*': operator.mul, 7 | '/': operator.truediv, 8 | } 9 | 10 | 11 | def lambda_handler(event, context): 12 | code = event.get('code', '') 13 | status_code = 200 14 | 15 | num1, sign, num2 = code.split() 16 | return_value = CALCULATIONS[sign](int(num1), int(num2)) 17 | 18 | return {'statusCode': status_code, 'body': return_value} 19 | -------------------------------------------------------------------------------- /days/085-088-aws-lambda/demo/requirements.txt: -------------------------------------------------------------------------------- 1 | bottle 2 | pycodestyle 3 | requests 4 | -------------------------------------------------------------------------------- /days/085-088-aws-lambda/img/architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/085-088-aws-lambda/img/architecture.png -------------------------------------------------------------------------------- /days/085-088-aws-lambda/img/pep-notok.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/085-088-aws-lambda/img/pep-notok.png -------------------------------------------------------------------------------- /days/085-088-aws-lambda/img/pep-ok.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/085-088-aws-lambda/img/pep-ok.png -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/.coveragerc: -------------------------------------------------------------------------------- 1 | [run] 2 | source = billtracker 3 | omit = billtracker/test* 4 | -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/.gitignore: -------------------------------------------------------------------------------- 1 | *.egg 2 | *.egg-info 3 | *.pyc 4 | *$py.class 5 | *~ 6 | .coverage 7 | coverage.xml 8 | build/ 9 | dist/ 10 | .tox/ 11 | nosetests.xml 12 | env*/ 13 | tmp/ 14 | Data.fs* 15 | *.sublime-project 16 | *.sublime-workspace 17 | .*.sw? 18 | .sw? 19 | .DS_Store 20 | coverage 21 | test 22 | -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/CHANGES.txt: -------------------------------------------------------------------------------- 1 | 0.0 2 | --- 3 | 4 | - Initial version. 5 | -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/MANIFEST.in: -------------------------------------------------------------------------------- 1 | include *.txt *.ini *.cfg *.rst 2 | recursive-include billtracker *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2 3 | -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/alembic/README: -------------------------------------------------------------------------------- 1 | Generic single-database configuration. -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/billtracker/bin/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/089-092-deployment/demo/billtracker/billtracker/bin/__init__.py -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/billtracker/data/__all_models.py: -------------------------------------------------------------------------------- 1 | # noinspection PyUnresolvedReferences 2 | from billtracker.data.models.bill import Bill 3 | # noinspection PyUnresolvedReferences 4 | from billtracker.data.models.users import User 5 | 6 | -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/billtracker/data/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/089-092-deployment/demo/billtracker/billtracker/data/__init__.py -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/billtracker/data/modelbase.py: -------------------------------------------------------------------------------- 1 | import sqlalchemy.ext.declarative as dec 2 | 3 | SqlAlchemyBase = dec.declarative_base() 4 | -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/billtracker/data/models/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/089-092-deployment/demo/billtracker/billtracker/data/models/__init__.py -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/billtracker/routes.py: -------------------------------------------------------------------------------- 1 | def includeme(config): 2 | config.add_static_view('static', 'static', cache_max_age=3600) 3 | config.add_route('home', '/') 4 | config.add_route('details', '/bill/{bill_id}') 5 | -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/billtracker/static/img/finance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/089-092-deployment/demo/billtracker/billtracker/static/img/finance.png -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/billtracker/static/img/pyramid-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/089-092-deployment/demo/billtracker/billtracker/static/img/pyramid-16x16.png -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/billtracker/static/img/pyramid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/089-092-deployment/demo/billtracker/billtracker/static/img/pyramid.png -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/billtracker/templates/errors/404.pt: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | 4 |
    5 |

    Pyramid Starter project

    6 |

    404 Page Not Found

    7 |
    8 | 9 |
    10 |
    11 | -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/billtracker/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/089-092-deployment/demo/billtracker/billtracker/tests/__init__.py -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/billtracker/tests/all_tests.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | 3 | # noinspection PyUnresolvedReferences 4 | from billtracker.tests.default.default_viewmodel_tests import * 5 | # noinspection PyUnresolvedReferences 6 | from billtracker.tests.default.default_view_tests import * 7 | # noinspection PyUnresolvedReferences 8 | from billtracker.tests.site_tests import * 9 | 10 | 11 | class AllTests(unittest.TestCase): 12 | pass 13 | -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/billtracker/tests/default/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/089-092-deployment/demo/billtracker/billtracker/tests/default/__init__.py -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/billtracker/viewmodels/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/089-092-deployment/demo/billtracker/billtracker/viewmodels/__init__.py -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/billtracker/viewmodels/default/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/089-092-deployment/demo/billtracker/billtracker/viewmodels/default/__init__.py -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/billtracker/viewmodels/viewmodelbase.py: -------------------------------------------------------------------------------- 1 | from pyramid.request import Request 2 | 3 | 4 | class ViewModelBase: 5 | def __init__(self, request: Request): 6 | self.request = request 7 | self.error = None 8 | 9 | def to_dict(self) -> dict: 10 | return self.__dict__ 11 | -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/billtracker/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/089-092-deployment/demo/billtracker/billtracker/views/__init__.py -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/billtracker/views/notfound.py: -------------------------------------------------------------------------------- 1 | from pyramid.view import notfound_view_config 2 | 3 | 4 | @notfound_view_config(renderer='../templates/errors/404.pt') 5 | def notfound_view(request): 6 | request.response.status = 404 7 | return {} 8 | -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | testpaths = billtracker 3 | python_files = test*.py 4 | -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/requirements-dev.txt: -------------------------------------------------------------------------------- 1 | -r requirements.txt 2 | 3 | webtest 4 | pyramid-debugtoolbar 5 | -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/requirements.txt: -------------------------------------------------------------------------------- 1 | alembic 2 | Chameleon 3 | hupper 4 | Mako 5 | MarkupSafe 6 | PasteDeploy 7 | plaster 8 | plaster-pastedeploy 9 | Pygments 10 | pyramid 11 | pyramid-chameleon 12 | pyramid-mako 13 | python-dateutil 14 | python-editor 15 | repoze.lru 16 | six 17 | SQLAlchemy 18 | translationstring 19 | venusian 20 | waitress 21 | WebOb 22 | zope.deprecation 23 | zope.interface 24 | -------------------------------------------------------------------------------- /days/089-092-deployment/demo/billtracker/server/billtracker.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=uWSGI Bill Tracker server instance 3 | After=syslog.target 4 | 5 | [Service] 6 | ExecStart=/webapps/venv/bin/uwsgi -H /webapps/venv --ini-paste /webapps/app_repo/days/089-092-deployment/demo/billtracker/production.ini 7 | RuntimeDirectory=/webapps/app_repo/days/089-092-deployment/demo/billtracker/ 8 | Restart=always 9 | KillSignal=SIGQUIT 10 | Type=notify 11 | StandardError=syslog 12 | NotifyAccess=all 13 | 14 | [Install] 15 | WantedBy=multi-user.target -------------------------------------------------------------------------------- /days/093-096-vuejs/movie_exploder/js/vue/vue.common.js: -------------------------------------------------------------------------------- 1 | if (process.env.NODE_ENV === 'production') { 2 | module.exports = require('./vue.common.prod.js') 3 | } else { 4 | module.exports = require('./vue.common.dev.js') 5 | } 6 | -------------------------------------------------------------------------------- /days/093-096-vuejs/movie_exploder/js/vue/vue.runtime.common.js: -------------------------------------------------------------------------------- 1 | if (process.env.NODE_ENV === 'production') { 2 | module.exports = require('./vue.runtime.common.prod.js') 3 | } else { 4 | module.exports = require('./vue.runtime.common.dev.js') 5 | } 6 | -------------------------------------------------------------------------------- /days/093-096-vuejs/movie_exploder/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "movie_exploder", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "vue": { 8 | "version": "2.6.3", 9 | "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.3.tgz", 10 | "integrity": "sha512-yftjtahz4UTAtOlXXuw7UaYD86fWrMDAAzqTdqJJx2FIBqcPmBN6kPBHiBJFGaQELVblb5ijbFMXsx0i0F7q3g==" 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /days/093-096-vuejs/movie_exploder/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "movie_exploder", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "vue": "^2.6.3" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /days/093-096-vuejs/movie_svc/app.py: -------------------------------------------------------------------------------- 1 | # noinspection PyUnresolvedReferences 2 | from app_instance import api 3 | from routes import * 4 | from data import db 5 | 6 | db.global_init() 7 | 8 | api.run(port=7007) 9 | -------------------------------------------------------------------------------- /days/093-096-vuejs/movie_svc/app_instance.py: -------------------------------------------------------------------------------- 1 | import responder 2 | 3 | cors_params = { 4 | 'allow_origins': '*', 5 | 'allow_methods': '*', 6 | } 7 | 8 | api = responder.API(cors=True, cors_params=cors_params) 9 | -------------------------------------------------------------------------------- /days/093-096-vuejs/movie_svc/requirements.txt: -------------------------------------------------------------------------------- 1 | responder 2 | -------------------------------------------------------------------------------- /days/093-096-vuejs/movie_svc/routes.py: -------------------------------------------------------------------------------- 1 | # noinspection PyUnresolvedReferences 2 | from app_instance import api 3 | # noinspection PyUnresolvedReferences 4 | from views.api_views import * 5 | # noinspection PyUnresolvedReferences 6 | from views.home import * 7 | 8 | api.add_route("/static", static=True) 9 | -------------------------------------------------------------------------------- /days/093-096-vuejs/movie_svc/views/home.py: -------------------------------------------------------------------------------- 1 | from app_instance import api 2 | 3 | 4 | @api.route("/") 5 | def index(req, resp): 6 | resp.content = api.template('home/index.html') 7 | -------------------------------------------------------------------------------- /days/093-096-vuejs/starter_movie_exploder/js/site.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/days/093-096-vuejs/starter_movie_exploder/js/site.js -------------------------------------------------------------------------------- /days/093-096-vuejs/starter_movie_exploder/js/vue/vue.common.js: -------------------------------------------------------------------------------- 1 | if (process.env.NODE_ENV === 'production') { 2 | module.exports = require('./vue.common.prod.js') 3 | } else { 4 | module.exports = require('./vue.common.dev.js') 5 | } 6 | -------------------------------------------------------------------------------- /days/093-096-vuejs/starter_movie_exploder/js/vue/vue.runtime.common.js: -------------------------------------------------------------------------------- 1 | if (process.env.NODE_ENV === 'production') { 2 | module.exports = require('./vue.runtime.common.prod.js') 3 | } else { 4 | module.exports = require('./vue.runtime.common.dev.js') 5 | } 6 | -------------------------------------------------------------------------------- /days/093-096-vuejs/starter_movie_exploder/views/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Movie Exploder! 6 | 7 | 8 | 9 | 10 | 11 | 12 |
    13 |

    Movie Exploder

    14 |
    15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/.idea/dictionaries/mkennedy.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | axios 5 | 6 | 7 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/.idea/your_movie_exploder.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 11 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/js/site.js: -------------------------------------------------------------------------------- 1 | // Write your Vue JavaScript code here. 2 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/axios/index.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./lib/axios'); -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/_media.scss: -------------------------------------------------------------------------------- 1 | .media { 2 | display: flex; 3 | align-items: flex-start; 4 | } 5 | 6 | .media-body { 7 | flex: 1; 8 | } 9 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/_transitions.scss: -------------------------------------------------------------------------------- 1 | .fade { 2 | @include transition($transition-fade); 3 | 4 | &:not(.show) { 5 | opacity: 0; 6 | } 7 | } 8 | 9 | .collapse { 10 | &:not(.show) { 11 | display: none; 12 | } 13 | } 14 | 15 | .collapsing { 16 | position: relative; 17 | height: 0; 18 | overflow: hidden; 19 | @include transition($transition-collapse); 20 | } 21 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/mixins/_alert.scss: -------------------------------------------------------------------------------- 1 | @mixin alert-variant($background, $border, $color) { 2 | color: $color; 3 | @include gradient-bg($background); 4 | border-color: $border; 5 | 6 | hr { 7 | border-top-color: darken($border, 5%); 8 | } 9 | 10 | .alert-link { 11 | color: darken($color, 10%); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/mixins/_badge.scss: -------------------------------------------------------------------------------- 1 | @mixin badge-variant($bg) { 2 | color: color-yiq($bg); 3 | background-color: $bg; 4 | 5 | @at-root a#{&} { 6 | @include hover-focus { 7 | color: color-yiq($bg); 8 | background-color: darken($bg, 10%); 9 | } 10 | 11 | &:focus, 12 | &.focus { 13 | outline: 0; 14 | box-shadow: 0 0 0 $badge-focus-width rgba($bg, .5); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/mixins/_clearfix.scss: -------------------------------------------------------------------------------- 1 | @mixin clearfix() { 2 | &::after { 3 | display: block; 4 | clear: both; 5 | content: ""; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/mixins/_float.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @mixin float-left { 4 | float: left !important; 5 | @include deprecate("The `float-left` mixin", "v4.3.0", "v5"); 6 | } 7 | @mixin float-right { 8 | float: right !important; 9 | @include deprecate("The `float-right` mixin", "v4.3.0", "v5"); 10 | } 11 | @mixin float-none { 12 | float: none !important; 13 | @include deprecate("The `float-none` mixin", "v4.3.0", "v5"); 14 | } 15 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/mixins/_lists.scss: -------------------------------------------------------------------------------- 1 | // Lists 2 | 3 | // Unstyled keeps list items block level, just removes default browser padding and list-style 4 | @mixin list-unstyled { 5 | padding-left: 0; 6 | list-style: none; 7 | } 8 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/mixins/_nav-divider.scss: -------------------------------------------------------------------------------- 1 | // Horizontal dividers 2 | // 3 | // Dividers (basically an hr) within dropdowns and nav lists 4 | 5 | @mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y) { 6 | height: 0; 7 | margin: $margin-y 0; 8 | overflow: hidden; 9 | border-top: 1px solid $color; 10 | } 11 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/mixins/_resize.scss: -------------------------------------------------------------------------------- 1 | // Resize anything 2 | 3 | @mixin resizable($direction) { 4 | overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible` 5 | resize: $direction; // Options: horizontal, vertical, both 6 | } 7 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/mixins/_size.scss: -------------------------------------------------------------------------------- 1 | // Sizing shortcuts 2 | 3 | @mixin size($width, $height: $width) { 4 | width: $width; 5 | height: $height; 6 | @include deprecate("`size()`", "v4.3.0", "v5"); 7 | } 8 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/mixins/_text-emphasis.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Typography 4 | 5 | @mixin text-emphasis-variant($parent, $color) { 6 | #{$parent} { 7 | color: $color !important; 8 | } 9 | @if $emphasized-link-hover-darken-percentage != 0 { 10 | a#{$parent} { 11 | @include hover-focus { 12 | color: darken($color, $emphasized-link-hover-darken-percentage) !important; 13 | } 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/mixins/_text-hide.scss: -------------------------------------------------------------------------------- 1 | // CSS image replacement 2 | @mixin text-hide($ignore-warning: false) { 3 | // stylelint-disable-next-line font-family-no-missing-generic-family-keyword 4 | font: 0/0 a; 5 | color: transparent; 6 | text-shadow: none; 7 | background-color: transparent; 8 | border: 0; 9 | 10 | @include deprecate("`text-hide()`", "v4.1.0", "v5", $ignore-warning); 11 | } 12 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/mixins/_text-truncate.scss: -------------------------------------------------------------------------------- 1 | // Text truncate 2 | // Requires inline-block or block for proper styling 3 | 4 | @mixin text-truncate() { 5 | overflow: hidden; 6 | text-overflow: ellipsis; 7 | white-space: nowrap; 8 | } 9 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/mixins/_transition.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable property-blacklist 2 | @mixin transition($transition...) { 3 | @if $enable-transitions { 4 | @if length($transition) == 0 { 5 | transition: $transition-base; 6 | } @else { 7 | transition: $transition; 8 | } 9 | } 10 | 11 | @if $enable-prefers-reduced-motion-media-query { 12 | @media (prefers-reduced-motion: reduce) { 13 | transition: none; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/mixins/_visibility.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Visibility 4 | 5 | @mixin invisible($visibility) { 6 | visibility: $visibility !important; 7 | @include deprecate("`invisible()`", "v4.3.0", "v5"); 8 | } 9 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/utilities/_align.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | .align-baseline { vertical-align: baseline !important; } // Browser default 4 | .align-top { vertical-align: top !important; } 5 | .align-middle { vertical-align: middle !important; } 6 | .align-bottom { vertical-align: bottom !important; } 7 | .align-text-bottom { vertical-align: text-bottom !important; } 8 | .align-text-top { vertical-align: text-top !important; } 9 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/utilities/_clearfix.scss: -------------------------------------------------------------------------------- 1 | .clearfix { 2 | @include clearfix(); 3 | } 4 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/utilities/_float.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @each $breakpoint in map-keys($grid-breakpoints) { 4 | @include media-breakpoint-up($breakpoint) { 5 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints); 6 | 7 | .float#{$infix}-left { float: left !important; } 8 | .float#{$infix}-right { float: right !important; } 9 | .float#{$infix}-none { float: none !important; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/utilities/_overflow.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @each $value in $overflows { 4 | .overflow-#{$value} { overflow: $value !important; } 5 | } 6 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/utilities/_screenreaders.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Screenreaders 3 | // 4 | 5 | .sr-only { 6 | @include sr-only(); 7 | } 8 | 9 | .sr-only-focusable { 10 | @include sr-only-focusable(); 11 | } 12 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/utilities/_shadows.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | .shadow-sm { box-shadow: $box-shadow-sm !important; } 4 | .shadow { box-shadow: $box-shadow !important; } 5 | .shadow-lg { box-shadow: $box-shadow-lg !important; } 6 | .shadow-none { box-shadow: none !important; } 7 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/bootstrap/scss/utilities/_visibility.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // 4 | // Visibility utilities 5 | // 6 | 7 | .visible { 8 | visibility: visible !important; 9 | } 10 | 11 | .invisible { 12 | visibility: hidden !important; 13 | } 14 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/debug/node.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./src/node'); 2 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/debug/src/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | /** 4 | * Detect Electron renderer / nwjs process, which is node, but we should 5 | * treat as a browser. 6 | */ 7 | if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) { 8 | module.exports = require('./browser.js'); 9 | } else { 10 | module.exports = require('./node.js'); 11 | } 12 | 13 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/follow-redirects/http.js: -------------------------------------------------------------------------------- 1 | module.exports = require("./").http; 2 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/follow-redirects/https.js: -------------------------------------------------------------------------------- 1 | module.exports = require("./").https; 2 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/jquery/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery", 3 | "main": "dist/jquery.js", 4 | "license": "MIT", 5 | "ignore": [ 6 | "package.json" 7 | ], 8 | "keywords": [ 9 | "jquery", 10 | "javascript", 11 | "browser", 12 | "library" 13 | ] 14 | } -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/jquery/src/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | 4 | "extends": "../.eslintrc-browser.json" 5 | } 6 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/jquery/src/attributes.js: -------------------------------------------------------------------------------- 1 | define( [ 2 | "./core", 3 | "./attributes/attr", 4 | "./attributes/prop", 5 | "./attributes/classes", 6 | "./attributes/val" 7 | ], function( jQuery ) { 8 | 9 | "use strict"; 10 | 11 | // Return jQuery for attributes-only inclusion 12 | return jQuery; 13 | } ); 14 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/jquery/src/core/nodeName.js: -------------------------------------------------------------------------------- 1 | define( function() { 2 | 3 | "use strict"; 4 | 5 | function nodeName( elem, name ) { 6 | 7 | return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); 8 | 9 | }; 10 | 11 | return nodeName; 12 | 13 | } ); 14 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/jquery/src/core/readyException.js: -------------------------------------------------------------------------------- 1 | define( [ 2 | "../core" 3 | ], function( jQuery ) { 4 | 5 | "use strict"; 6 | 7 | jQuery.readyException = function( error ) { 8 | window.setTimeout( function() { 9 | throw error; 10 | } ); 11 | }; 12 | 13 | } ); 14 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/jquery/src/core/stripAndCollapse.js: -------------------------------------------------------------------------------- 1 | define( [ 2 | "../var/rnothtmlwhite" 3 | ], function( rnothtmlwhite ) { 4 | "use strict"; 5 | 6 | // Strip and collapse whitespace according to HTML spec 7 | // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace 8 | function stripAndCollapse( value ) { 9 | var tokens = value.match( rnothtmlwhite ) || []; 10 | return tokens.join( " " ); 11 | } 12 | 13 | return stripAndCollapse; 14 | } ); 15 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/jquery/src/css/hiddenVisibleSelectors.js: -------------------------------------------------------------------------------- 1 | define( [ 2 | "../core", 3 | "../selector" 4 | ], function( jQuery ) { 5 | 6 | "use strict"; 7 | 8 | jQuery.expr.pseudos.hidden = function( elem ) { 9 | return !jQuery.expr.pseudos.visible( elem ); 10 | }; 11 | jQuery.expr.pseudos.visible = function( elem ) { 12 | return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); 13 | }; 14 | 15 | } ); 16 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/jquery/src/effects/animatedSelector.js: -------------------------------------------------------------------------------- 1 | define( [ 2 | "../core", 3 | "../selector", 4 | "../effects" 5 | ], function( jQuery ) { 6 | 7 | "use strict"; 8 | 9 | jQuery.expr.pseudos.animated = function( elem ) { 10 | return jQuery.grep( jQuery.timers, function( fn ) { 11 | return elem === fn.elem; 12 | } ).length; 13 | }; 14 | 15 | } ); 16 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/jquery/src/event/ajax.js: -------------------------------------------------------------------------------- 1 | define( [ 2 | "../core", 3 | "../event" 4 | ], function( jQuery ) { 5 | 6 | "use strict"; 7 | 8 | // Attach a bunch of functions for handling common AJAX events 9 | jQuery.each( [ 10 | "ajaxStart", 11 | "ajaxStop", 12 | "ajaxComplete", 13 | "ajaxError", 14 | "ajaxSuccess", 15 | "ajaxSend" 16 | ], function( i, type ) { 17 | jQuery.fn[ type ] = function( fn ) { 18 | return this.on( type, fn ); 19 | }; 20 | } ); 21 | 22 | } ); 23 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/jquery/src/event/support.js: -------------------------------------------------------------------------------- 1 | define( [ 2 | "../var/support" 3 | ], function( support ) { 4 | 5 | "use strict"; 6 | 7 | support.focusin = "onfocusin" in window; 8 | 9 | return support; 10 | 11 | } ); 12 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/jquery/src/selector.js: -------------------------------------------------------------------------------- 1 | define( [ "./selector-sizzle" ], function() { 2 | "use strict"; 3 | } ); 4 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/compiler/directives/bind.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export default function bind (el: ASTElement, dir: ASTDirective) { 4 | el.wrapData = (code: string) => { 5 | return `_b(${code},'${el.tag}',${dir.value},${ 6 | dir.modifiers && dir.modifiers.prop ? 'true' : 'false' 7 | }${ 8 | dir.modifiers && dir.modifiers.sync ? ',true' : '' 9 | })` 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/compiler/directives/index.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import on from './on' 4 | import bind from './bind' 5 | import { noop } from 'shared/util' 6 | 7 | export default { 8 | on, 9 | bind, 10 | cloak: noop 11 | } 12 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/compiler/directives/on.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { warn } from 'core/util/index' 4 | 5 | export default function on (el: ASTElement, dir: ASTDirective) { 6 | if (process.env.NODE_ENV !== 'production' && dir.modifiers) { 7 | warn(`v-on without argument does not support modifiers.`) 8 | } 9 | el.wrapListeners = (code: string) => `_g(${code},${dir.value})` 10 | } 11 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/compiler/parser/entity-decoder.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | let decoder 4 | 5 | export default { 6 | decode (html: string): string { 7 | decoder = decoder || document.createElement('div') 8 | decoder.innerHTML = html 9 | return decoder.textContent 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/core/components/index.js: -------------------------------------------------------------------------------- 1 | import KeepAlive from './keep-alive' 2 | 3 | export default { 4 | KeepAlive 5 | } 6 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/core/global-api/mixin.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { mergeOptions } from '../util/index' 4 | 5 | export function initMixin (Vue: GlobalAPI) { 6 | Vue.mixin = function (mixin: Object) { 7 | this.options = mergeOptions(this.options, mixin) 8 | return this 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/core/util/index.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export * from 'shared/util' 4 | export * from './lang' 5 | export * from './env' 6 | export * from './options' 7 | export * from './debug' 8 | export * from './props' 9 | export * from './error' 10 | export * from './next-tick' 11 | export { defineReactive } from '../observer/index' 12 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/core/vdom/helpers/index.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export * from './merge-hook' 4 | export * from './extract-props' 5 | export * from './update-listeners' 6 | export * from './normalize-children' 7 | export * from './resolve-async-component' 8 | export * from './get-first-component-child' 9 | export * from './is-async-placeholder' 10 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/core/vdom/helpers/is-async-placeholder.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export function isAsyncPlaceholder (node: VNode): boolean { 4 | return node.isComment && node.asyncFactory 5 | } 6 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/core/vdom/modules/index.js: -------------------------------------------------------------------------------- 1 | import directives from './directives' 2 | import ref from './ref' 3 | 4 | export default [ 5 | ref, 6 | directives 7 | ] 8 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/web/compiler/directives/html.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { addProp } from 'compiler/helpers' 4 | 5 | export default function html (el: ASTElement, dir: ASTDirective) { 6 | if (dir.value) { 7 | addProp(el, 'innerHTML', `_s(${dir.value})`, dir) 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/web/compiler/directives/index.js: -------------------------------------------------------------------------------- 1 | import model from './model' 2 | import text from './text' 3 | import html from './html' 4 | 5 | export default { 6 | model, 7 | text, 8 | html 9 | } 10 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/web/compiler/directives/text.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { addProp } from 'compiler/helpers' 4 | 5 | export default function text (el: ASTElement, dir: ASTDirective) { 6 | if (dir.value) { 7 | addProp(el, 'textContent', `_s(${dir.value})`, dir) 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/web/compiler/index.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { baseOptions } from './options' 4 | import { createCompiler } from 'compiler/index' 5 | 6 | const { compile, compileToFunctions } = createCompiler(baseOptions) 7 | 8 | export { compile, compileToFunctions } 9 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/web/compiler/modules/index.js: -------------------------------------------------------------------------------- 1 | import klass from './class' 2 | import style from './style' 3 | import model from './model' 4 | 5 | export default [ 6 | klass, 7 | style, 8 | model 9 | ] 10 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/web/entry-compiler.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export { parseComponent } from 'sfc/parser' 4 | export { compile, compileToFunctions } from './compiler/index' 5 | export { ssrCompile, ssrCompileToFunctions } from './server/compiler' 6 | export { generateCodeFrame } from 'compiler/codeframe' 7 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/web/entry-runtime.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import Vue from './runtime/index' 4 | 5 | export default Vue 6 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/web/entry-server-basic-renderer.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import modules from './server/modules/index' 4 | import directives from './server/directives/index' 5 | import { isUnaryTag, canBeLeftOpenTag } from './compiler/util' 6 | import { createBasicRenderer } from 'server/create-basic-renderer' 7 | 8 | export default createBasicRenderer({ 9 | modules, 10 | directives, 11 | isUnaryTag, 12 | canBeLeftOpenTag 13 | }) 14 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/web/runtime/components/index.js: -------------------------------------------------------------------------------- 1 | import Transition from './transition' 2 | import TransitionGroup from './transition-group' 3 | 4 | export default { 5 | Transition, 6 | TransitionGroup 7 | } 8 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/web/runtime/directives/index.js: -------------------------------------------------------------------------------- 1 | import model from './model' 2 | import show from './show' 3 | 4 | export default { 5 | model, 6 | show 7 | } 8 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/web/runtime/modules/index.js: -------------------------------------------------------------------------------- 1 | import attrs from './attrs' 2 | import klass from './class' 3 | import events from './events' 4 | import domProps from './dom-props' 5 | import style from './style' 6 | import transition from './transition' 7 | 8 | export default [ 9 | attrs, 10 | klass, 11 | events, 12 | domProps, 13 | style, 14 | transition 15 | ] 16 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/web/server/compiler.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { baseOptions } from '../compiler/options' 4 | import { createCompiler } from 'server/optimizing-compiler/index' 5 | 6 | const { compile, compileToFunctions } = createCompiler(baseOptions) 7 | 8 | export { 9 | compile as ssrCompile, 10 | compileToFunctions as ssrCompileToFunctions 11 | } 12 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/web/server/directives/index.js: -------------------------------------------------------------------------------- 1 | import show from './show' 2 | import model from './model' 3 | 4 | export default { 5 | show, 6 | model 7 | } 8 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/web/server/directives/show.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export default function show (node: VNodeWithData, dir: VNodeDirective) { 4 | if (!dir.value) { 5 | const style: any = node.data.style || (node.data.style = {}) 6 | if (Array.isArray(style)) { 7 | style.push({ display: 'none' }) 8 | } else { 9 | style.display = 'none' 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/web/server/modules/class.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { escape } from '../util' 4 | import { genClassForVnode } from 'web/util/index' 5 | 6 | export default function renderClass (node: VNodeWithData): ?string { 7 | const classList = genClassForVnode(node) 8 | if (classList !== '') { 9 | return ` class="${escape(classList)}"` 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/web/server/modules/index.js: -------------------------------------------------------------------------------- 1 | import attrs from './attrs' 2 | import domProps from './dom-props' 3 | import klass from './class' 4 | import style from './style' 5 | 6 | export default [ 7 | attrs, 8 | domProps, 9 | klass, 10 | style 11 | ] 12 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/weex/compiler/directives/index.js: -------------------------------------------------------------------------------- 1 | import model from './model' 2 | 3 | export default { 4 | model 5 | } 6 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/weex/compiler/modules/index.js: -------------------------------------------------------------------------------- 1 | import klass from './class' 2 | import style from './style' 3 | import props from './props' 4 | import append from './append' 5 | import recycleList from './recycle-list/index' 6 | 7 | export default [ 8 | recycleList, 9 | klass, 10 | style, 11 | props, 12 | append 13 | ] 14 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/weex/compiler/modules/recycle-list/component-root.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { addAttr } from 'compiler/helpers' 4 | 5 | // mark component root nodes as 6 | export function postTransformComponentRoot (el: ASTElement) { 7 | if (!el.parent) { 8 | // component root 9 | addAttr(el, '@isComponentRoot', 'true') 10 | addAttr(el, '@templateId', '_uid') 11 | addAttr(el, '@componentProps', '$props || {}') 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/weex/entry-compiler.js: -------------------------------------------------------------------------------- 1 | export { compile } from 'weex/compiler/index' 2 | export { generateCodeFrame } from 'compiler/codeframe' 3 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/weex/entry-runtime-factory.js: -------------------------------------------------------------------------------- 1 | // this entry is built and wrapped with a factory function 2 | // used to generate a fresh copy of Vue for every Weex instance. 3 | 4 | import Vue from './runtime/index' 5 | 6 | exports.Vue = Vue 7 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/weex/runtime/components/index.js: -------------------------------------------------------------------------------- 1 | import Richtext from './richtext' 2 | import Transition from './transition' 3 | import TransitionGroup from './transition-group' 4 | 5 | export default { 6 | Richtext, 7 | Transition, 8 | TransitionGroup 9 | } 10 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/weex/runtime/components/transition.js: -------------------------------------------------------------------------------- 1 | // reuse same transition component logic from web 2 | export { 3 | transitionProps, 4 | extractTransitionData 5 | } from 'web/runtime/components/transition' 6 | 7 | import Transition from 'web/runtime/components/transition' 8 | 9 | export default Transition 10 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/weex/runtime/directives/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | } 3 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/weex/runtime/modules/index.js: -------------------------------------------------------------------------------- 1 | import attrs from './attrs' 2 | import klass from './class' 3 | import events from './events' 4 | import style from './style' 5 | import transition from './transition' 6 | 7 | export default [ 8 | attrs, 9 | klass, 10 | events, 11 | style, 12 | transition 13 | ] 14 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/platforms/weex/runtime/text-node.js: -------------------------------------------------------------------------------- 1 | let latestNodeId = 1 2 | 3 | export default function TextNode (text) { 4 | this.instanceId = '' 5 | this.nodeId = latestNodeId++ 6 | this.parentNode = null 7 | this.nodeType = 3 8 | this.text = text 9 | } 10 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/src/shared/constants.js: -------------------------------------------------------------------------------- 1 | export const SSR_ATTR = 'data-server-rendered' 2 | 3 | export const ASSET_TYPES = [ 4 | 'component', 5 | 'directive', 6 | 'filter' 7 | ] 8 | 9 | export const LIFECYCLE_HOOKS = [ 10 | 'beforeCreate', 11 | 'created', 12 | 'beforeMount', 13 | 'mounted', 14 | 'beforeUpdate', 15 | 'updated', 16 | 'beforeDestroy', 17 | 'destroyed', 18 | 'activated', 19 | 'deactivated', 20 | 'errorCaptured', 21 | 'serverPrefetch' 22 | ] 23 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/node_modules/vue/types/plugin.d.ts: -------------------------------------------------------------------------------- 1 | import { Vue as _Vue } from "./vue"; 2 | 3 | export type PluginFunction = (Vue: typeof _Vue, options?: T) => void; 4 | 5 | export interface PluginObject { 6 | install: PluginFunction; 7 | [key: string]: any; 8 | } 9 | -------------------------------------------------------------------------------- /days/093-096-vuejs/your-turn/your_movie_exploder/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "your_movie_exploder", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "axios": "^0.21.2", 13 | "bootstrap": "^4.3.1", 14 | "jquery": "^3.5.0", 15 | "vue": "^2.6.6" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/base_server/dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:latest 2 | 3 | RUN apt-get update && apt-get upgrade -y 4 | ENV TZ=America/Los_Angeles 5 | RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone 6 | RUN apt-get install -y -q sudo 7 | RUN apt-get install -y -q fail2ban 8 | RUN apt-get install -y -q httpie 9 | RUN apt-get install -y -q glances 10 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | services: 3 | base_server: 4 | build: ./base_server/ 5 | image: base_server:latest 6 | frontend: 7 | build: ./frontend/ 8 | command: nginx -g "daemon off;" 9 | depends_on: 10 | - services 11 | - base_server 12 | ports: 13 | - "80:80" 14 | services: 15 | build: ./services/ 16 | command: /venv/bin/python /app/app.py 17 | depends_on: 18 | - base_server 19 | ports: 20 | - "7007:7007" 21 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/dockerfile: -------------------------------------------------------------------------------- 1 | FROM base_server:latest 2 | 3 | RUN apt-get install -y -q nginx 4 | RUN rm /etc/nginx/sites-enabled/default 5 | COPY site.nginx /etc/nginx/sites-enabled/site.nginx 6 | COPY movie_exploder /app 7 | 8 | ENTRYPOINT nginx -g "daemon off;" 9 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/js/vue/vue.common.js: -------------------------------------------------------------------------------- 1 | if (process.env.NODE_ENV === 'production') { 2 | module.exports = require('./vue.common.prod.js') 3 | } else { 4 | module.exports = require('./vue.common.dev.js') 5 | } 6 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/js/vue/vue.runtime.common.js: -------------------------------------------------------------------------------- 1 | if (process.env.NODE_ENV === 'production') { 2 | module.exports = require('./vue.runtime.common.prod.js') 3 | } else { 4 | module.exports = require('./vue.runtime.common.dev.js') 5 | } 6 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/compiler/directives/bind.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export default function bind (el: ASTElement, dir: ASTDirective) { 4 | el.wrapData = (code: string) => { 5 | return `_b(${code},'${el.tag}',${dir.value},${ 6 | dir.modifiers && dir.modifiers.prop ? 'true' : 'false' 7 | }${ 8 | dir.modifiers && dir.modifiers.sync ? ',true' : '' 9 | })` 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/compiler/directives/index.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import on from './on' 4 | import bind from './bind' 5 | import { noop } from 'shared/util' 6 | 7 | export default { 8 | on, 9 | bind, 10 | cloak: noop 11 | } 12 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/compiler/directives/on.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { warn } from 'core/util/index' 4 | 5 | export default function on (el: ASTElement, dir: ASTDirective) { 6 | if (process.env.NODE_ENV !== 'production' && dir.modifiers) { 7 | warn(`v-on without argument does not support modifiers.`) 8 | } 9 | el.wrapListeners = (code: string) => `_g(${code},${dir.value})` 10 | } 11 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/compiler/parser/entity-decoder.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | let decoder 4 | 5 | export default { 6 | decode (html: string): string { 7 | decoder = decoder || document.createElement('div') 8 | decoder.innerHTML = html 9 | return decoder.textContent 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/core/components/index.js: -------------------------------------------------------------------------------- 1 | import KeepAlive from './keep-alive' 2 | 3 | export default { 4 | KeepAlive 5 | } 6 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/core/global-api/mixin.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { mergeOptions } from '../util/index' 4 | 5 | export function initMixin (Vue: GlobalAPI) { 6 | Vue.mixin = function (mixin: Object) { 7 | this.options = mergeOptions(this.options, mixin) 8 | return this 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/core/util/index.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export * from 'shared/util' 4 | export * from './lang' 5 | export * from './env' 6 | export * from './options' 7 | export * from './debug' 8 | export * from './props' 9 | export * from './error' 10 | export * from './next-tick' 11 | export { defineReactive } from '../observer/index' 12 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/core/vdom/helpers/index.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export * from './merge-hook' 4 | export * from './extract-props' 5 | export * from './update-listeners' 6 | export * from './normalize-children' 7 | export * from './resolve-async-component' 8 | export * from './get-first-component-child' 9 | export * from './is-async-placeholder' 10 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/core/vdom/helpers/is-async-placeholder.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export function isAsyncPlaceholder (node: VNode): boolean { 4 | return node.isComment && node.asyncFactory 5 | } 6 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/core/vdom/modules/index.js: -------------------------------------------------------------------------------- 1 | import directives from './directives' 2 | import ref from './ref' 3 | 4 | export default [ 5 | ref, 6 | directives 7 | ] 8 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/web/compiler/directives/html.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { addProp } from 'compiler/helpers' 4 | 5 | export default function html (el: ASTElement, dir: ASTDirective) { 6 | if (dir.value) { 7 | addProp(el, 'innerHTML', `_s(${dir.value})`, dir) 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/web/compiler/directives/index.js: -------------------------------------------------------------------------------- 1 | import model from './model' 2 | import text from './text' 3 | import html from './html' 4 | 5 | export default { 6 | model, 7 | text, 8 | html 9 | } 10 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/web/compiler/directives/text.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { addProp } from 'compiler/helpers' 4 | 5 | export default function text (el: ASTElement, dir: ASTDirective) { 6 | if (dir.value) { 7 | addProp(el, 'textContent', `_s(${dir.value})`, dir) 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/web/compiler/index.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { baseOptions } from './options' 4 | import { createCompiler } from 'compiler/index' 5 | 6 | const { compile, compileToFunctions } = createCompiler(baseOptions) 7 | 8 | export { compile, compileToFunctions } 9 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/web/compiler/modules/index.js: -------------------------------------------------------------------------------- 1 | import klass from './class' 2 | import style from './style' 3 | import model from './model' 4 | 5 | export default [ 6 | klass, 7 | style, 8 | model 9 | ] 10 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/web/entry-compiler.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export { parseComponent } from 'sfc/parser' 4 | export { compile, compileToFunctions } from './compiler/index' 5 | export { ssrCompile, ssrCompileToFunctions } from './server/compiler' 6 | export { generateCodeFrame } from 'compiler/codeframe' 7 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/web/entry-runtime.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import Vue from './runtime/index' 4 | 5 | export default Vue 6 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/web/entry-server-basic-renderer.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import modules from './server/modules/index' 4 | import directives from './server/directives/index' 5 | import { isUnaryTag, canBeLeftOpenTag } from './compiler/util' 6 | import { createBasicRenderer } from 'server/create-basic-renderer' 7 | 8 | export default createBasicRenderer({ 9 | modules, 10 | directives, 11 | isUnaryTag, 12 | canBeLeftOpenTag 13 | }) 14 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/web/runtime/components/index.js: -------------------------------------------------------------------------------- 1 | import Transition from './transition' 2 | import TransitionGroup from './transition-group' 3 | 4 | export default { 5 | Transition, 6 | TransitionGroup 7 | } 8 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/web/runtime/directives/index.js: -------------------------------------------------------------------------------- 1 | import model from './model' 2 | import show from './show' 3 | 4 | export default { 5 | model, 6 | show 7 | } 8 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/web/runtime/modules/index.js: -------------------------------------------------------------------------------- 1 | import attrs from './attrs' 2 | import klass from './class' 3 | import events from './events' 4 | import domProps from './dom-props' 5 | import style from './style' 6 | import transition from './transition' 7 | 8 | export default [ 9 | attrs, 10 | klass, 11 | events, 12 | domProps, 13 | style, 14 | transition 15 | ] 16 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/web/server/compiler.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { baseOptions } from '../compiler/options' 4 | import { createCompiler } from 'server/optimizing-compiler/index' 5 | 6 | const { compile, compileToFunctions } = createCompiler(baseOptions) 7 | 8 | export { 9 | compile as ssrCompile, 10 | compileToFunctions as ssrCompileToFunctions 11 | } 12 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/web/server/directives/index.js: -------------------------------------------------------------------------------- 1 | import show from './show' 2 | import model from './model' 3 | 4 | export default { 5 | show, 6 | model 7 | } 8 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/web/server/directives/show.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export default function show (node: VNodeWithData, dir: VNodeDirective) { 4 | if (!dir.value) { 5 | const style: any = node.data.style || (node.data.style = {}) 6 | if (Array.isArray(style)) { 7 | style.push({ display: 'none' }) 8 | } else { 9 | style.display = 'none' 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/web/server/modules/class.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { escape } from '../util' 4 | import { genClassForVnode } from 'web/util/index' 5 | 6 | export default function renderClass (node: VNodeWithData): ?string { 7 | const classList = genClassForVnode(node) 8 | if (classList !== '') { 9 | return ` class="${escape(classList)}"` 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/web/server/modules/index.js: -------------------------------------------------------------------------------- 1 | import attrs from './attrs' 2 | import domProps from './dom-props' 3 | import klass from './class' 4 | import style from './style' 5 | 6 | export default [ 7 | attrs, 8 | domProps, 9 | klass, 10 | style 11 | ] 12 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/weex/compiler/directives/index.js: -------------------------------------------------------------------------------- 1 | import model from './model' 2 | 3 | export default { 4 | model 5 | } 6 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/weex/compiler/modules/index.js: -------------------------------------------------------------------------------- 1 | import klass from './class' 2 | import style from './style' 3 | import props from './props' 4 | import append from './append' 5 | import recycleList from './recycle-list/index' 6 | 7 | export default [ 8 | recycleList, 9 | klass, 10 | style, 11 | props, 12 | append 13 | ] 14 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/weex/compiler/modules/recycle-list/component-root.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { addAttr } from 'compiler/helpers' 4 | 5 | // mark component root nodes as 6 | export function postTransformComponentRoot (el: ASTElement) { 7 | if (!el.parent) { 8 | // component root 9 | addAttr(el, '@isComponentRoot', 'true') 10 | addAttr(el, '@templateId', '_uid') 11 | addAttr(el, '@componentProps', '$props || {}') 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/weex/entry-compiler.js: -------------------------------------------------------------------------------- 1 | export { compile } from 'weex/compiler/index' 2 | export { generateCodeFrame } from 'compiler/codeframe' 3 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/weex/entry-runtime-factory.js: -------------------------------------------------------------------------------- 1 | // this entry is built and wrapped with a factory function 2 | // used to generate a fresh copy of Vue for every Weex instance. 3 | 4 | import Vue from './runtime/index' 5 | 6 | exports.Vue = Vue 7 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/weex/runtime/components/index.js: -------------------------------------------------------------------------------- 1 | import Richtext from './richtext' 2 | import Transition from './transition' 3 | import TransitionGroup from './transition-group' 4 | 5 | export default { 6 | Richtext, 7 | Transition, 8 | TransitionGroup 9 | } 10 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/weex/runtime/components/transition.js: -------------------------------------------------------------------------------- 1 | // reuse same transition component logic from web 2 | export { 3 | transitionProps, 4 | extractTransitionData 5 | } from 'web/runtime/components/transition' 6 | 7 | import Transition from 'web/runtime/components/transition' 8 | 9 | export default Transition 10 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/weex/runtime/directives/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | } 3 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/weex/runtime/modules/index.js: -------------------------------------------------------------------------------- 1 | import attrs from './attrs' 2 | import klass from './class' 3 | import events from './events' 4 | import style from './style' 5 | import transition from './transition' 6 | 7 | export default [ 8 | attrs, 9 | klass, 10 | events, 11 | style, 12 | transition 13 | ] 14 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/platforms/weex/runtime/text-node.js: -------------------------------------------------------------------------------- 1 | let latestNodeId = 1 2 | 3 | export default function TextNode (text) { 4 | this.instanceId = '' 5 | this.nodeId = latestNodeId++ 6 | this.parentNode = null 7 | this.nodeType = 3 8 | this.text = text 9 | } 10 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/src/shared/constants.js: -------------------------------------------------------------------------------- 1 | export const SSR_ATTR = 'data-server-rendered' 2 | 3 | export const ASSET_TYPES = [ 4 | 'component', 5 | 'directive', 6 | 'filter' 7 | ] 8 | 9 | export const LIFECYCLE_HOOKS = [ 10 | 'beforeCreate', 11 | 'created', 12 | 'beforeMount', 13 | 'mounted', 14 | 'beforeUpdate', 15 | 'updated', 16 | 'beforeDestroy', 17 | 'destroyed', 18 | 'activated', 19 | 'deactivated', 20 | 'errorCaptured', 21 | 'serverPrefetch' 22 | ] 23 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/node_modules/vue/types/plugin.d.ts: -------------------------------------------------------------------------------- 1 | import { Vue as _Vue } from "./vue"; 2 | 3 | export type PluginFunction = (Vue: typeof _Vue, options?: T) => void; 4 | 5 | export interface PluginObject { 6 | install: PluginFunction; 7 | [key: string]: any; 8 | } 9 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "movie_exploder", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "vue": { 8 | "version": "2.6.3", 9 | "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.3.tgz", 10 | "integrity": "sha512-yftjtahz4UTAtOlXXuw7UaYD86fWrMDAAzqTdqJJx2FIBqcPmBN6kPBHiBJFGaQELVblb5ijbFMXsx0i0F7q3g==" 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/frontend/movie_exploder/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "movie_exploder", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "vue": "^2.6.3" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/services/dockerfile: -------------------------------------------------------------------------------- 1 | FROM base_server:latest 2 | 3 | RUN apt-get install -y -q build-essential git python3-pip python3-dev python3-venv 4 | RUN python3 -m venv /venv 5 | RUN /venv/bin/pip install -U pip setuptools 6 | RUN /venv/bin/pip install responder 7 | 8 | COPY movie_svc /app 9 | WORKDIR /app 10 | RUN /venv/bin/pip install -r /app/requirements.txt 11 | 12 | ENTRYPOINT /venv/bin/python /app/app.py 13 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/services/movie_svc/app.py: -------------------------------------------------------------------------------- 1 | # noinspection PyUnresolvedReferences 2 | from app_instance import api 3 | from routes import * 4 | from data import db 5 | 6 | db.global_init() 7 | 8 | 9 | api.run(port=7007, address="0.0.0.0") 10 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/services/movie_svc/app_instance.py: -------------------------------------------------------------------------------- 1 | import responder 2 | 3 | cors_params = { 4 | 'allow_origins': '*', 5 | 'allow_methods': '*', 6 | } 7 | 8 | api = responder.API(cors=True, cors_params=cors_params) 9 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/services/movie_svc/requirements.txt: -------------------------------------------------------------------------------- 1 | responder 2 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/services/movie_svc/routes.py: -------------------------------------------------------------------------------- 1 | # noinspection PyUnresolvedReferences 2 | from app_instance import api 3 | # noinspection PyUnresolvedReferences 4 | from views.api_views import * 5 | # noinspection PyUnresolvedReferences 6 | from views.home import * 7 | 8 | api.add_route("/static", static=True) 9 | -------------------------------------------------------------------------------- /days/097-100-docker/demo/services/movie_svc/views/home.py: -------------------------------------------------------------------------------- 1 | from app_instance import api 2 | 3 | 4 | @api.route("/") 5 | def index(req, resp): 6 | resp.content = api.template('home/index.html') 7 | -------------------------------------------------------------------------------- /node_modules/vue/src/compiler/directives/bind.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export default function bind (el: ASTElement, dir: ASTDirective) { 4 | el.wrapData = (code: string) => { 5 | return `_b(${code},'${el.tag}',${dir.value},${ 6 | dir.modifiers && dir.modifiers.prop ? 'true' : 'false' 7 | }${ 8 | dir.modifiers && dir.modifiers.sync ? ',true' : '' 9 | })` 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /node_modules/vue/src/compiler/directives/index.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import on from './on' 4 | import bind from './bind' 5 | import { noop } from 'shared/util' 6 | 7 | export default { 8 | on, 9 | bind, 10 | cloak: noop 11 | } 12 | -------------------------------------------------------------------------------- /node_modules/vue/src/compiler/directives/on.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { warn } from 'core/util/index' 4 | 5 | export default function on (el: ASTElement, dir: ASTDirective) { 6 | if (process.env.NODE_ENV !== 'production' && dir.modifiers) { 7 | warn(`v-on without argument does not support modifiers.`) 8 | } 9 | el.wrapListeners = (code: string) => `_g(${code},${dir.value})` 10 | } 11 | -------------------------------------------------------------------------------- /node_modules/vue/src/compiler/parser/entity-decoder.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | let decoder 4 | 5 | export default { 6 | decode (html: string): string { 7 | decoder = decoder || document.createElement('div') 8 | decoder.innerHTML = html 9 | return decoder.textContent 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /node_modules/vue/src/core/components/index.js: -------------------------------------------------------------------------------- 1 | import KeepAlive from './keep-alive' 2 | 3 | export default { 4 | KeepAlive 5 | } 6 | -------------------------------------------------------------------------------- /node_modules/vue/src/core/global-api/mixin.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { mergeOptions } from '../util/index' 4 | 5 | export function initMixin (Vue: GlobalAPI) { 6 | Vue.mixin = function (mixin: Object) { 7 | this.options = mergeOptions(this.options, mixin) 8 | return this 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /node_modules/vue/src/core/util/index.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export * from 'shared/util' 4 | export * from './lang' 5 | export * from './env' 6 | export * from './options' 7 | export * from './debug' 8 | export * from './props' 9 | export * from './error' 10 | export * from './next-tick' 11 | export { defineReactive } from '../observer/index' 12 | -------------------------------------------------------------------------------- /node_modules/vue/src/core/vdom/helpers/get-first-component-child.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { isDef } from 'shared/util' 4 | import { isAsyncPlaceholder } from './is-async-placeholder' 5 | 6 | export function getFirstComponentChild (children: ?Array): ?VNode { 7 | if (Array.isArray(children)) { 8 | for (let i = 0; i < children.length; i++) { 9 | const c = children[i] 10 | if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) { 11 | return c 12 | } 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /node_modules/vue/src/core/vdom/helpers/index.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export * from './merge-hook' 4 | export * from './extract-props' 5 | export * from './update-listeners' 6 | export * from './normalize-children' 7 | export * from './resolve-async-component' 8 | export * from './get-first-component-child' 9 | export * from './is-async-placeholder' 10 | -------------------------------------------------------------------------------- /node_modules/vue/src/core/vdom/helpers/is-async-placeholder.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export function isAsyncPlaceholder (node: VNode): boolean { 4 | return node.isComment && node.asyncFactory 5 | } 6 | -------------------------------------------------------------------------------- /node_modules/vue/src/core/vdom/modules/index.js: -------------------------------------------------------------------------------- 1 | import directives from './directives' 2 | import ref from './ref' 3 | 4 | export default [ 5 | ref, 6 | directives 7 | ] 8 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/web/compiler/directives/html.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { addProp } from 'compiler/helpers' 4 | 5 | export default function html (el: ASTElement, dir: ASTDirective) { 6 | if (dir.value) { 7 | addProp(el, 'innerHTML', `_s(${dir.value})`, dir) 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/web/compiler/directives/index.js: -------------------------------------------------------------------------------- 1 | import model from './model' 2 | import text from './text' 3 | import html from './html' 4 | 5 | export default { 6 | model, 7 | text, 8 | html 9 | } 10 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/web/compiler/directives/text.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { addProp } from 'compiler/helpers' 4 | 5 | export default function text (el: ASTElement, dir: ASTDirective) { 6 | if (dir.value) { 7 | addProp(el, 'textContent', `_s(${dir.value})`, dir) 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/web/compiler/index.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { baseOptions } from './options' 4 | import { createCompiler } from 'compiler/index' 5 | 6 | const { compile, compileToFunctions } = createCompiler(baseOptions) 7 | 8 | export { compile, compileToFunctions } 9 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/web/compiler/modules/index.js: -------------------------------------------------------------------------------- 1 | import klass from './class' 2 | import style from './style' 3 | import model from './model' 4 | 5 | export default [ 6 | klass, 7 | style, 8 | model 9 | ] 10 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/web/entry-compiler.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export { parseComponent } from 'sfc/parser' 4 | export { compile, compileToFunctions } from './compiler/index' 5 | export { ssrCompile, ssrCompileToFunctions } from './server/compiler' 6 | export { generateCodeFrame } from 'compiler/codeframe' 7 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/web/entry-runtime.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import Vue from './runtime/index' 4 | 5 | export default Vue 6 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/web/entry-server-basic-renderer.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import modules from './server/modules/index' 4 | import directives from './server/directives/index' 5 | import { isUnaryTag, canBeLeftOpenTag } from './compiler/util' 6 | import { createBasicRenderer } from 'server/create-basic-renderer' 7 | 8 | export default createBasicRenderer({ 9 | modules, 10 | directives, 11 | isUnaryTag, 12 | canBeLeftOpenTag 13 | }) 14 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/web/runtime/components/index.js: -------------------------------------------------------------------------------- 1 | import Transition from './transition' 2 | import TransitionGroup from './transition-group' 3 | 4 | export default { 5 | Transition, 6 | TransitionGroup 7 | } 8 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/web/runtime/directives/index.js: -------------------------------------------------------------------------------- 1 | import model from './model' 2 | import show from './show' 3 | 4 | export default { 5 | model, 6 | show 7 | } 8 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/web/runtime/modules/index.js: -------------------------------------------------------------------------------- 1 | import attrs from './attrs' 2 | import klass from './class' 3 | import events from './events' 4 | import domProps from './dom-props' 5 | import style from './style' 6 | import transition from './transition' 7 | 8 | export default [ 9 | attrs, 10 | klass, 11 | events, 12 | domProps, 13 | style, 14 | transition 15 | ] 16 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/web/runtime/patch.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import * as nodeOps from 'web/runtime/node-ops' 4 | import { createPatchFunction } from 'core/vdom/patch' 5 | import baseModules from 'core/vdom/modules/index' 6 | import platformModules from 'web/runtime/modules/index' 7 | 8 | // the directive module should be applied last, after all 9 | // built-in modules have been applied. 10 | const modules = platformModules.concat(baseModules) 11 | 12 | export const patch: Function = createPatchFunction({ nodeOps, modules }) 13 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/web/server/compiler.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { baseOptions } from '../compiler/options' 4 | import { createCompiler } from 'server/optimizing-compiler/index' 5 | 6 | const { compile, compileToFunctions } = createCompiler(baseOptions) 7 | 8 | export { 9 | compile as ssrCompile, 10 | compileToFunctions as ssrCompileToFunctions 11 | } 12 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/web/server/directives/index.js: -------------------------------------------------------------------------------- 1 | import show from './show' 2 | import model from './model' 3 | 4 | export default { 5 | show, 6 | model 7 | } 8 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/web/server/directives/show.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export default function show (node: VNodeWithData, dir: VNodeDirective) { 4 | if (!dir.value) { 5 | const style: any = node.data.style || (node.data.style = {}) 6 | if (Array.isArray(style)) { 7 | style.push({ display: 'none' }) 8 | } else { 9 | style.display = 'none' 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/web/server/modules/class.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { escape } from '../util' 4 | import { genClassForVnode } from 'web/util/index' 5 | 6 | export default function renderClass (node: VNodeWithData): ?string { 7 | const classList = genClassForVnode(node) 8 | if (classList !== '') { 9 | return ` class="${escape(classList)}"` 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/web/server/modules/index.js: -------------------------------------------------------------------------------- 1 | import attrs from './attrs' 2 | import domProps from './dom-props' 3 | import klass from './class' 4 | import style from './style' 5 | 6 | export default [ 7 | attrs, 8 | domProps, 9 | klass, 10 | style 11 | ] 12 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/weex/compiler/directives/index.js: -------------------------------------------------------------------------------- 1 | import model from './model' 2 | 3 | export default { 4 | model 5 | } 6 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/weex/compiler/modules/index.js: -------------------------------------------------------------------------------- 1 | import klass from './class' 2 | import style from './style' 3 | import props from './props' 4 | import append from './append' 5 | import recycleList from './recycle-list/index' 6 | 7 | export default [ 8 | recycleList, 9 | klass, 10 | style, 11 | props, 12 | append 13 | ] 14 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/weex/compiler/modules/recycle-list/component-root.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { addAttr } from 'compiler/helpers' 4 | 5 | // mark component root nodes as 6 | export function postTransformComponentRoot (el: ASTElement) { 7 | if (!el.parent) { 8 | // component root 9 | addAttr(el, '@isComponentRoot', 'true') 10 | addAttr(el, '@templateId', '_uid') 11 | addAttr(el, '@componentProps', '$props || {}') 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/weex/entry-compiler.js: -------------------------------------------------------------------------------- 1 | export { compile } from 'weex/compiler/index' 2 | export { generateCodeFrame } from 'compiler/codeframe' 3 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/weex/entry-runtime-factory.js: -------------------------------------------------------------------------------- 1 | // this entry is built and wrapped with a factory function 2 | // used to generate a fresh copy of Vue for every Weex instance. 3 | 4 | import Vue from './runtime/index' 5 | 6 | exports.Vue = Vue 7 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/weex/runtime/components/index.js: -------------------------------------------------------------------------------- 1 | import Richtext from './richtext' 2 | import Transition from './transition' 3 | import TransitionGroup from './transition-group' 4 | 5 | export default { 6 | Richtext, 7 | Transition, 8 | TransitionGroup 9 | } 10 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/weex/runtime/components/transition.js: -------------------------------------------------------------------------------- 1 | // reuse same transition component logic from web 2 | export { 3 | transitionProps, 4 | extractTransitionData 5 | } from 'web/runtime/components/transition' 6 | 7 | import Transition from 'web/runtime/components/transition' 8 | 9 | export default Transition 10 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/weex/runtime/directives/index.js: -------------------------------------------------------------------------------- 1 | export default { 2 | } 3 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/weex/runtime/modules/index.js: -------------------------------------------------------------------------------- 1 | import attrs from './attrs' 2 | import klass from './class' 3 | import events from './events' 4 | import style from './style' 5 | import transition from './transition' 6 | 7 | export default [ 8 | attrs, 9 | klass, 10 | events, 11 | style, 12 | transition 13 | ] 14 | -------------------------------------------------------------------------------- /node_modules/vue/src/platforms/weex/runtime/text-node.js: -------------------------------------------------------------------------------- 1 | let latestNodeId = 1 2 | 3 | export default function TextNode (text) { 4 | this.instanceId = '' 5 | this.nodeId = latestNodeId++ 6 | this.parentNode = null 7 | this.nodeType = 3 8 | this.text = text 9 | } 10 | -------------------------------------------------------------------------------- /node_modules/vue/src/shared/constants.js: -------------------------------------------------------------------------------- 1 | export const SSR_ATTR = 'data-server-rendered' 2 | 3 | export const ASSET_TYPES = [ 4 | 'component', 5 | 'directive', 6 | 'filter' 7 | ] 8 | 9 | export const LIFECYCLE_HOOKS = [ 10 | 'beforeCreate', 11 | 'created', 12 | 'beforeMount', 13 | 'mounted', 14 | 'beforeUpdate', 15 | 'updated', 16 | 'beforeDestroy', 17 | 'destroyed', 18 | 'activated', 19 | 'deactivated', 20 | 'errorCaptured', 21 | 'serverPrefetch' 22 | ] 23 | -------------------------------------------------------------------------------- /node_modules/vue/types/plugin.d.ts: -------------------------------------------------------------------------------- 1 | import { Vue as _Vue } from "./vue"; 2 | 3 | export type PluginFunction = (Vue: typeof _Vue, options?: T) => void; 4 | 5 | export interface PluginObject { 6 | install: PluginFunction; 7 | [key: string]: any; 8 | } 9 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "web100-demos", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "vue": { 8 | "version": "2.6.10", 9 | "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.10.tgz", 10 | "integrity": "sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ==" 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /readme_resources/100days-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/talkpython/100daysofweb-with-python-course/d0f67bf6684e099a717f382c6711401f7395e163/readme_resources/100days-web.png --------------------------------------------------------------------------------