├── .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 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 100 Days of web with Python
2 |
3 | 
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 |
10 |
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 |
10 |
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
--------------------------------------------------------------------------------