From c6c07e1c414025b33a2fcd626248bb3e113e0a14 Mon Sep 17 00:00:00 2001 From: Peter Butkovic Date: Wed, 11 Aug 2021 09:10:22 +0200 Subject: [PATCH 1/9] Cloud native refactoring (#1) * kubernetes-ready version * keep spring app only * ignore mvn build targets * ignore idea dirs * dir structure refactored * hsql for unit test, postgres for others * postgres -> mysql * gh actions based docker build/push --- .github/workflows/ci-notejam.yml | 75 + .gitignore | 6 + CA_TECH | 84 - Dockerfile | 4 + README.rst | 170 +- cakephp/README.rst | 88 - cakephp/notejam/.editorconfig | 18 - cakephp/notejam/.gitattributes | 36 - cakephp/notejam/.gitignore | 4 - cakephp/notejam/.htaccess | 5 - cakephp/notejam/.travis.yml | 18 - cakephp/notejam/bin/cake | 40 - cakephp/notejam/bin/cake.bat | 30 - cakephp/notejam/bin/cake.php | 33 - cakephp/notejam/composer.json | 41 - .../Migrations/20150928200943_initial.php | 141 - cakephp/notejam/config/app.default.php | 326 -- cakephp/notejam/config/app.php | 313 -- cakephp/notejam/config/bootstrap.php | 202 - cakephp/notejam/config/bootstrap_cli.php | 32 - cakephp/notejam/config/paths.php | 85 - cakephp/notejam/config/routes.php | 78 - cakephp/notejam/config/schema/i18n.sql | 27 - cakephp/notejam/config/schema/sessions.sql | 17 - cakephp/notejam/index.php | 16 - cakephp/notejam/phpunit.xml.dist | 33 - cakephp/notejam/src/Console/Installer.php | 192 - .../notejam/src/Controller/AppController.php | 88 - .../src/Controller/NotesController.php | 138 - .../notejam/src/Controller/PadsController.php | 121 - .../src/Controller/UsersController.php | 145 - .../notejam/src/Form/ForgotPasswordForm.php | 35 - cakephp/notejam/src/Form/SettingsForm.php | 47 - cakephp/notejam/src/Model/Entity/Note.php | 41 - cakephp/notejam/src/Model/Entity/Pad.php | 23 - cakephp/notejam/src/Model/Entity/User.php | 50 - .../notejam/src/Model/Table/NotesTable.php | 82 - cakephp/notejam/src/Model/Table/PadsTable.php | 70 - .../notejam/src/Model/Table/UsersTable.php | 80 - cakephp/notejam/src/Shell/ConsoleShell.php | 79 - .../src/Template/Cell/Pads/display.ctp | 16 - .../src/Template/Element/Flash/default.ctp | 7 - .../src/Template/Element/Flash/error.ctp | 3 - .../src/Template/Element/Flash/success.ctp | 3 - .../src/Template/Element/notes/form.ctp | 6 - .../src/Template/Element/pads/form.ctp | 4 - .../src/Template/Email/html/default.ctp | 22 - .../src/Template/Email/text/default.ctp | 16 - .../notejam/src/Template/Error/error400.ctp | 38 - .../notejam/src/Template/Error/error500.ctp | 37 - .../Template/Layout/Email/html/default.ctp | 24 - .../Template/Layout/Email/text/default.ctp | 16 - cakephp/notejam/src/Template/Layout/ajax.ctp | 16 - .../notejam/src/Template/Layout/anonymous.ctp | 6 - .../notejam/src/Template/Layout/default.ctp | 39 - cakephp/notejam/src/Template/Layout/error.ctp | 55 - .../src/Template/Layout/rss/default.ctp | 14 - cakephp/notejam/src/Template/Layout/user.ctp | 8 - cakephp/notejam/src/Template/Notes/create.ctp | 3 - cakephp/notejam/src/Template/Notes/delete.ctp | 7 - cakephp/notejam/src/Template/Notes/edit.ctp | 3 - cakephp/notejam/src/Template/Notes/index.ctp | 20 - cakephp/notejam/src/Template/Notes/view.ctp | 9 - cakephp/notejam/src/Template/Pads/create.ctp | 3 - cakephp/notejam/src/Template/Pads/delete.ctp | 6 - cakephp/notejam/src/Template/Pads/edit.ctp | 4 - cakephp/notejam/src/Template/Pads/view.ctp | 19 - .../src/Template/Users/forgotpassword.ctp | 6 - cakephp/notejam/src/Template/Users/index.ctp | 45 - .../notejam/src/Template/Users/settings.ctp | 8 - cakephp/notejam/src/Template/Users/signin.ctp | 9 - cakephp/notejam/src/Template/Users/signup.ctp | 7 - cakephp/notejam/src/View/AppView.php | 35 - cakephp/notejam/src/View/Cell/PadsCell.php | 33 - .../notejam/tests/Fixture/NotesFixture.php | 51 - cakephp/notejam/tests/Fixture/PadsFixture.php | 42 - .../notejam/tests/Fixture/UsersFixture.php | 48 - .../Controller/NotesControllerTest.php | 151 - .../Controller/PadsControllerTest.php | 151 - .../Controller/UsersControllerTest.php | 139 - .../tests/TestCase/NotejamTestCase.php | 44 - cakephp/notejam/tests/bootstrap.php | 8 - cakephp/notejam/webroot/.htaccess | 5 - cakephp/notejam/webroot/css/style.css | 396 -- cakephp/notejam/webroot/favicon.ico | Bin 1782 -> 0 bytes cakephp/notejam/webroot/img/cake.icon.png | Bin 943 -> 0 bytes cakephp/notejam/webroot/img/cake.power.gif | Bin 201 -> 0 bytes cakephp/notejam/webroot/index.php | 37 - cakephp/notejam/webroot/js/empty | 0 contribute.rst | 152 - django/README.rst | 83 - django/notejam/manage.py | 10 - django/notejam/notejam/__init__.py | 0 django/notejam/notejam/settings.py | 184 - django/notejam/notejam/tests.py | 36 - django/notejam/notejam/urls.py | 25 - django/notejam/notejam/wsgi.py | 28 - django/notejam/notes/__init__.py | 0 django/notejam/notes/forms.py | 9 - .../notejam/notes/migrations/0001_initial.py | 84 - django/notejam/notes/migrations/__init__.py | 0 django/notejam/notes/models.py | 13 - .../templates/notes/note_confirm_delete.html | 13 - .../notes/templates/notes/note_create.html | 8 - .../notes/templates/notes/note_detail.html | 14 - .../notes/templates/notes/note_edit.html | 8 - .../notes/templates/notes/note_form.html | 13 - .../notes/templates/notes/note_list.html | 33 - django/notejam/notes/templatetags/__init__.py | 0 .../notejam/notes/templatetags/date_tags.py | 17 - django/notejam/notes/tests.py | 110 - django/notejam/notes/urls.py | 21 - django/notejam/notes/views.py | 110 - django/notejam/pads/__init__.py | 0 django/notejam/pads/forms.py | 9 - .../notejam/pads/migrations/0001_initial.py | 70 - django/notejam/pads/migrations/__init__.py | 0 django/notejam/pads/models.py | 10 - .../templates/pads/pad_confirm_delete.html | 14 - .../pads/templates/pads/pad_create.html | 9 - .../notejam/pads/templates/pads/pad_edit.html | 11 - .../notejam/pads/templates/pads/pad_form.html | 7 - .../pads/templates/pads/pad_note_list.html | 29 - django/notejam/pads/templatetags/__init__.py | 0 django/notejam/pads/templatetags/pad_tags.py | 31 - django/notejam/pads/tests.py | 49 - django/notejam/pads/urls.py | 16 - django/notejam/pads/views.py | 79 - django/notejam/static_files/css/style.css | 395 -- django/notejam/templates/404.html | 0 django/notejam/templates/base.html | 92 - django/notejam/templates/user.html | 5 - django/notejam/users/__init__.py | 0 django/notejam/users/auth_backends.py | 18 - django/notejam/users/forms.py | 56 - django/notejam/users/models.py | 3 - .../users/templates/forgot_password.html | 15 - django/notejam/users/templates/settings.html | 20 - django/notejam/users/templates/signin.html | 19 - django/notejam/users/templates/signup.html | 21 - django/notejam/users/tests.py | 83 - django/notejam/users/views.py | 106 - django/requirements.txt | 2 - express/README.rst | 83 - express/notejam/app.js | 110 - express/notejam/bin/www | 9 - express/notejam/db.js | 105 - express/notejam/helpers.js | 22 - express/notejam/models.js | 49 - express/notejam/package.json | 34 - express/notejam/public/stylesheets/style.css | 397 -- express/notejam/routes/notes.js | 108 - express/notejam/routes/pads.js | 93 - express/notejam/routes/users.js | 230 - express/notejam/settings.js | 17 - express/notejam/tests/config.js | 25 - express/notejam/tests/notes.js | 141 - express/notejam/tests/pads.js | 138 - express/notejam/tests/users.js | 106 - express/notejam/views/error.jade | 6 - express/notejam/views/layout.jade | 44 - express/notejam/views/main.jade | 18 - express/notejam/views/mixins.jade | 13 - express/notejam/views/notes/create.jade | 19 - express/notejam/views/notes/delete.jade | 12 - express/notejam/views/notes/edit.jade | 20 - express/notejam/views/notes/list.jade | 33 - express/notejam/views/notes/view.jade | 12 - express/notejam/views/pads/create.jade | 11 - express/notejam/views/pads/delete.jade | 11 - express/notejam/views/pads/edit.jade | 14 - express/notejam/views/pads/list.jade | 27 - express/notejam/views/user.jade | 6 - .../notejam/views/users/forgot-password.jade | 11 - express/notejam/views/users/settings.jade | 18 - express/notejam/views/users/signin.jade | 18 - express/notejam/views/users/signup.jade | 22 - flask/README.rst | 89 - flask/db.py | 4 - flask/notejam/__init__.py | 19 - flask/notejam/config.py | 24 - flask/notejam/forms.py | 84 - flask/notejam/models.py | 66 - flask/notejam/static/css/style.css | 350 -- flask/notejam/static/css/tables.css | 45 - flask/notejam/templates/_helpers.html | 11 - flask/notejam/templates/base.html | 95 - flask/notejam/templates/notes/create.html | 10 - flask/notejam/templates/notes/delete.html | 13 - flask/notejam/templates/notes/edit.html | 11 - flask/notejam/templates/notes/form.html | 10 - flask/notejam/templates/notes/list.html | 34 - flask/notejam/templates/notes/view.html | 14 - flask/notejam/templates/pads/create.html | 11 - flask/notejam/templates/pads/delete.html | 17 - flask/notejam/templates/pads/edit.html | 13 - flask/notejam/templates/pads/form.html | 9 - flask/notejam/templates/pads/note_list.html | 26 - flask/notejam/templates/user.html | 4 - .../templates/users/forgot_password.html | 14 - flask/notejam/templates/users/settings.html | 16 - flask/notejam/templates/users/signin.html | 16 - flask/notejam/templates/users/signup.html | 16 - flask/notejam/views.py | 264 -- flask/notejam/wsgi.py | 7 - flask/requirements.txt | 15 - flask/runserver.py | 7 - flask/tests.py | 336 -- html/account-settings.html | 59 - html/alerts-and-errors.html | 69 - html/create-pad.html | 72 - html/create.html | 80 - html/css/style.css | 400 -- html/delete.html | 70 - html/edit.html | 78 - html/empty-list.html | 61 - html/forgot-password.html | 55 - html/index.html | 121 - html/pad-notes.html | 117 - html/screenshots/1.png | Bin 62464 -> 0 bytes html/screenshots/1p.png | Bin 21596 -> 0 bytes html/screenshots/2.png | Bin 96890 -> 0 bytes html/screenshots/2p.png | Bin 29797 -> 0 bytes html/screenshots/3.png | Bin 87165 -> 0 bytes html/screenshots/3p.png | Bin 29489 -> 0 bytes html/screenshots/4.png | Bin 100665 -> 0 bytes html/screenshots/5.png | Bin 71944 -> 0 bytes html/screenshots/6.png | Bin 71209 -> 0 bytes html/signin.html | 65 - html/signup.html | 59 - html/view.html | 78 - index.html | 0 laravel/README.rst | 90 - laravel/notejam/.gitattributes | 1 - laravel/notejam/.gitignore | 8 - laravel/notejam/app/commands/.gitkeep | 0 laravel/notejam/app/config/app.php | 193 - laravel/notejam/app/config/auth.php | 71 - laravel/notejam/app/config/cache.php | 89 - laravel/notejam/app/config/compile.php | 18 - laravel/notejam/app/config/database.php | 130 - laravel/notejam/app/config/local/app.php | 18 - laravel/notejam/app/config/mail.php | 124 - laravel/notejam/app/config/packages/.gitkeep | 0 laravel/notejam/app/config/queue.php | 85 - laravel/notejam/app/config/remote.php | 59 - laravel/notejam/app/config/session.php | 140 - laravel/notejam/app/config/testing/cache.php | 20 - .../notejam/app/config/testing/database.php | 14 - .../notejam/app/config/testing/session.php | 21 - laravel/notejam/app/config/view.php | 31 - laravel/notejam/app/config/workbench.php | 31 - laravel/notejam/app/controllers/.gitkeep | 0 .../app/controllers/BaseController.php | 28 - .../app/controllers/NoteController.php | 114 - .../notejam/app/controllers/PadController.php | 87 - .../app/controllers/UserController.php | 150 - .../notejam/app/database/migrations/.gitkeep | 0 .../2014_05_14_215427_create_users_table.php | 34 - .../2014_05_16_225623_create_pads_table.php | 34 - .../2014_05_18_180146_create_notes_table.php | 36 - .../notejam/app/database/production.sqlite | 0 laravel/notejam/app/database/seeds/.gitkeep | 0 .../app/database/seeds/DatabaseSeeder.php | 17 - laravel/notejam/app/filters.php | 80 - laravel/notejam/app/lang/en/pagination.php | 20 - laravel/notejam/app/lang/en/reminders.php | 24 - laravel/notejam/app/lang/en/validation.php | 104 - laravel/notejam/app/models/Note.php | 41 - laravel/notejam/app/models/Pad.php | 26 - laravel/notejam/app/models/User.php | 85 - laravel/notejam/app/routes.php | 91 - laravel/notejam/app/start/artisan.php | 13 - laravel/notejam/app/start/global.php | 89 - laravel/notejam/app/start/local.php | 3 - laravel/notejam/app/storage/.gitignore | 1 - laravel/notejam/app/storage/cache/.gitignore | 2 - laravel/notejam/app/storage/logs/.gitignore | 2 - laravel/notejam/app/storage/meta/.gitignore | 2 - .../notejam/app/storage/sessions/.gitignore | 2 - laravel/notejam/app/storage/views/.gitignore | 2 - laravel/notejam/app/tests/NoteTest.php | 179 - laravel/notejam/app/tests/PadTest.php | 138 - laravel/notejam/app/tests/TestCase.php | 36 - laravel/notejam/app/tests/UserTest.php | 97 - .../app/views/emails/auth/reminder.blade.php | 13 - .../app/views/emails/password.blade.php | 4 - laravel/notejam/app/views/layout.blade.php | 71 - .../notejam/app/views/note/create.blade.php | 24 - .../notejam/app/views/note/delete.blade.php | 16 - laravel/notejam/app/views/note/edit.blade.php | 26 - .../notejam/app/views/note/index.blade.php | 33 - laravel/notejam/app/views/note/view.blade.php | 21 - .../notejam/app/views/pad/create.blade.php | 18 - .../notejam/app/views/pad/delete.blade.php | 15 - laravel/notejam/app/views/pad/edit.blade.php | 17 - laravel/notejam/app/views/pad/view.blade.php | 26 - .../app/views/partials/error.blade.php | 5 - laravel/notejam/app/views/user.blade.php | 24 - .../app/views/user/forgot-password.blade.php | 18 - .../notejam/app/views/user/settings.blade.php | 22 - .../notejam/app/views/user/signin.blade.php | 21 - .../notejam/app/views/user/signup.blade.php | 21 - laravel/notejam/artisan | 74 - laravel/notejam/bootstrap/autoload.php | 75 - laravel/notejam/bootstrap/paths.php | 57 - laravel/notejam/bootstrap/start.php | 73 - laravel/notejam/composer.json | 39 - laravel/notejam/phpunit.xml | 18 - laravel/notejam/public/.htaccess | 15 - laravel/notejam/public/css/style.css | 395 -- laravel/notejam/public/favicon.ico | 0 laravel/notejam/public/index.php | 49 - laravel/notejam/public/packages/.gitkeep | 0 laravel/notejam/public/robots.txt | 2 - laravel/notejam/server.php | 19 - nette/doctrine/README.rst | 98 - nette/doctrine/notejam/.gitignore | 2 - .../app/Components/ConfirmationControl.php | 71 - .../Components/ForgottenPasswordControl.php | 136 - .../notejam/app/Components/NoteControl.php | 172 - .../notejam/app/Components/PadsControl.php | 129 - .../Components/PadsList/PadsListControl.php | 60 - .../app/Components/PadsList/default.latte | 14 - .../app/Components/SettingsControl.php | 116 - .../notejam/app/Components/SignInControl.php | 100 - .../notejam/app/Components/SignUpControl.php | 125 - .../notejam/app/Presenters/BasePresenter.php | 68 - .../app/Presenters/Error4xxPresenter.php | 27 - .../notejam/app/Presenters/ErrorPresenter.php | 58 - .../notejam/app/Presenters/NotePresenter.php | 252 -- .../notejam/app/Presenters/PadPresenter.php | 223 - .../notejam/app/Presenters/UserPresenter.php | 145 - .../app/Presenters/templates/@layout.latte | 70 - .../app/Presenters/templates/@user.latte | 5 - .../app/Presenters/templates/Error/403.latte | 7 - .../app/Presenters/templates/Error/404.latte | 8 - .../app/Presenters/templates/Error/405.latte | 6 - .../app/Presenters/templates/Error/410.latte | 6 - .../app/Presenters/templates/Error/4xx.latte | 4 - .../app/Presenters/templates/Error/500.phtml | 20 - .../Presenters/templates/Note/create.latte | 8 - .../Presenters/templates/Note/default.latte | 36 - .../Presenters/templates/Note/delete.latte | 9 - .../Presenters/templates/Note/detail.latte | 10 - .../app/Presenters/templates/Note/edit.latte | 8 - .../app/Presenters/templates/Pad/create.latte | 5 - .../app/Presenters/templates/Pad/delete.latte | 9 - .../app/Presenters/templates/Pad/detail.latte | 37 - .../app/Presenters/templates/Pad/edit.latte | 6 - .../templates/User/forgottenPassword.latte | 10 - .../Presenters/templates/User/settings.latte | 10 - .../Presenters/templates/User/signIn.latte | 21 - .../Presenters/templates/User/signUp.latte | 20 - nette/doctrine/notejam/app/bootstrap.php | 21 - .../app/config/config.local.example.neon | 2 - nette/doctrine/notejam/app/config/config.neon | 42 - .../doctrine/notejam/app/config/services.neon | 21 - nette/doctrine/notejam/codeception.yml | 23 - nette/doctrine/notejam/composer.json | 39 - nette/doctrine/notejam/composer.lock | 3754 ----------------- nette/doctrine/notejam/log/.gitignore | 2 - .../src/Notejam/Http/RouterFactory.php | 40 - .../notejam/src/Notejam/Notes/Note.php | 168 - .../src/Notejam/Notes/NoteRepository.php | 34 - .../doctrine/notejam/src/Notejam/Pads/Pad.php | 105 - .../src/Notejam/Pads/PadRepository.php | 16 - .../src/Notejam/Templating/RuntimeFilters.php | 31 - .../notejam/src/Notejam/UI/FormFactory.php | 25 - .../notejam/src/Notejam/UI/FormRenderer.php | 29 - .../src/Notejam/Users/Authenticator.php | 49 - .../notejam/src/Notejam/Users/User.php | 162 - .../src/Notejam/Users/UserRepository.php | 16 - .../notejam/src/Notejam/exceptions.php | 22 - nette/doctrine/notejam/temp/.gitignore | 2 - nette/doctrine/notejam/tests/_bootstrap.php | 2 - nette/doctrine/notejam/tests/_data/dump.sql | 46 - .../doctrine/notejam/tests/_output/.gitignore | 2 - .../tests/_support/AcceptanceTester.php | 37 - .../tests/_support/FunctionalTester.php | 26 - .../tests/_support/Helper/Acceptance.php | 10 - .../tests/_support/Helper/Functional.php | 10 - .../notejam/tests/_support/Helper/Unit.php | 10 - .../notejam/tests/_support/UnitTester.php | 26 - .../tests/_support/_generated/.gitignore | 2 - .../notejam/tests/acceptance.suite.yml | 13 - .../tests/acceptance/CreateNoteCept.php | 10 - .../tests/acceptance/CreateNoteFailCept.php | 9 - .../tests/acceptance/CreatePadCept.php | 8 - .../tests/acceptance/CreatePadFailCept.php | 9 - .../tests/acceptance/DeleteNoteCept.php | 7 - .../acceptance/DeleteOtherOwnersNoteCept.php | 6 - .../acceptance/DeleteOtherOwnersPadCept.php | 6 - .../tests/acceptance/DeletePadCept.php | 7 - .../notejam/tests/acceptance/EditNoteCept.php | 12 - .../tests/acceptance/EditNoteFailCept.php | 11 - .../acceptance/EditOtherOwnersNoteCept.php | 6 - .../acceptance/EditOtherOwnersPadCept.php | 6 - .../notejam/tests/acceptance/EditPadCept.php | 8 - .../tests/acceptance/EditPadFailCept.php | 9 - .../acceptance/ForgottenPasswordCept.php | 7 - .../ForgottenPasswordInvalidEmailCept.php | 7 - ...ForgottenPasswordUnregisteredEmailCept.php | 7 - .../notejam/tests/acceptance/HomepageCept.php | 8 - .../tests/acceptance/NoteDetailCept.php | 7 - .../acceptance/OtherOwnersNoteDetailCept.php | 7 - .../acceptance/OtherOwnersPadDetailCept.php | 6 - .../tests/acceptance/PadDetailCept.php | 7 - .../tests/acceptance/SetNewPasswordCept.php | 10 - .../acceptance/SetNewPasswordFailCept.php | 11 - ...tNewPasswordInvalidCurrentPasswordCept.php | 10 - .../acceptance/SetNewPasswordMismatchCept.php | 10 - .../notejam/tests/acceptance/SignInCept.php | 5 - .../tests/acceptance/SignInFailCept.php | 10 - .../acceptance/SignInInvalidEmailCept.php | 5 - .../acceptance/SignInInvalidPasswordCept.php | 5 - .../acceptance/SignUpAlreadyExistsCept.php | 10 - .../notejam/tests/acceptance/SignUpCept.php | 13 - .../tests/acceptance/SignUpFailCept.php | 11 - .../acceptance/SignUpInvalidEmailCept.php | 10 - .../acceptance/SignUpPasswordMismatchCept.php | 10 - .../notejam/tests/acceptance/_bootstrap.php | 2 - .../notejam/tests/functional.suite.yml | 11 - .../notejam/tests/functional/_bootstrap.php | 2 - nette/doctrine/notejam/tests/unit.suite.yml | 9 - .../notejam/tests/unit/_bootstrap.php | 2 - nette/doctrine/notejam/www/.htaccess | 27 - nette/doctrine/notejam/www/.maintenance.php | 26 - nette/doctrine/notejam/www/css/style.css | 396 -- nette/doctrine/notejam/www/favicon.ico | Bin 2550 -> 0 bytes nette/doctrine/notejam/www/index.php | 8 - nette/doctrine/notejam/www/robots.txt | 0 nette/native_db/notejam/.gitignore | 7 - nette/native_db/notejam/app/bootstrap.php | 21 - .../app/components/Notes/INotesFactory.php | 18 - .../notejam/app/components/Notes/Notes.latte | 24 - .../notejam/app/components/Notes/Notes.php | 42 - .../app/components/Pads/IPadsFactory.php | 15 - .../notejam/app/components/Pads/Pads.latte | 11 - .../notejam/app/components/Pads/Pads.php | 35 - .../components/UserBar/IUserBarFactory.php | 14 - .../app/components/UserBar/UserBar.latte | 5 - .../app/components/UserBar/UserBar.php | 35 - .../notejam/app/config/config.example.neon | 3 - .../native_db/notejam/app/config/config.neon | 45 - .../Account/AccountSettingsFormFactory.php | 69 - .../app/forms/Note/DeleteNoteFormFactory.php | 45 - .../app/forms/Note/EditNoteFormFactory.php | 65 - .../app/forms/Note/NewNoteFormFactory.php | 68 - .../app/forms/Pad/DeletePadFormFactory.php | 46 - .../app/forms/Pad/EditPadFormFactory.php | 49 - .../app/forms/Pad/NewPadFormFactory.php | 54 - .../Sign/ForgottenPasswordFormFactory.php | 84 - .../app/forms/Sign/SignInFormFactory.php | 60 - .../app/forms/Sign/SignUpFormFactory.php | 65 - .../notejam/app/helpers/OrderHelper.php | 25 - .../notejam/app/model/NoteManager.php | 121 - .../notejam/app/model/PadManager.php | 100 - .../notejam/app/model/UserManager.php | 123 - .../app/presenters/AccountPresenter.php | 35 - .../notejam/app/presenters/BasePresenter.php | 47 - .../app/presenters/Error4xxPresenter.php | 21 - .../notejam/app/presenters/ErrorPresenter.php | 42 - .../app/presenters/HomepagePresenter.php | 51 - .../notejam/app/presenters/NotePresenter.php | 183 - .../notejam/app/presenters/PadPresenter.php | 189 - .../app/presenters/SecuredBasePresenter.php | 20 - .../notejam/app/presenters/SignPresenter.php | 116 - .../app/presenters/templates/@layout.latte | 74 - .../templates/Account/settings.latte | 13 - .../app/presenters/templates/Error/403.latte | 7 - .../app/presenters/templates/Error/404.latte | 8 - .../app/presenters/templates/Error/405.latte | 6 - .../app/presenters/templates/Error/410.latte | 6 - .../app/presenters/templates/Error/4xx.latte | 4 - .../app/presenters/templates/Error/500.phtml | 20 - .../templates/Homepage/default.latte | 6 - .../presenters/templates/Note/default.latte | 9 - .../presenters/templates/Note/delete.latte | 9 - .../app/presenters/templates/Note/edit.latte | 13 - .../app/presenters/templates/Note/new.latte | 13 - .../presenters/templates/Pad/default.latte | 8 - .../app/presenters/templates/Pad/delete.latte | 9 - .../app/presenters/templates/Pad/edit.latte | 11 - .../app/presenters/templates/Pad/new.latte | 9 - .../presenters/templates/Sign/forgotten.latte | 9 - .../app/presenters/templates/Sign/in.latte | 13 - .../app/presenters/templates/Sign/up.latte | 15 - .../notejam/app/router/RouterFactory.php | 40 - nette/native_db/notejam/bin/create-db.php | 29 - nette/native_db/notejam/codeception.yml | 23 - nette/native_db/notejam/composer.json | 39 - nette/native_db/notejam/composer.lock | 2697 ------------ nette/native_db/notejam/tests/_bootstrap.php | 2 - nette/native_db/notejam/tests/_data/dump.sql | 38 - .../notejam/tests/_output/.gitignore | 2 - .../tests/_support/AcceptanceTester.php | 36 - .../tests/_support/FunctionalTester.php | 26 - .../tests/_support/Helper/Acceptance.php | 10 - .../tests/_support/Helper/Functional.php | 10 - .../notejam/tests/_support/Helper/Unit.php | 10 - .../notejam/tests/_support/UnitTester.php | 26 - .../tests/_support/_generated/.gitignore | 2 - .../notejam/tests/acceptance.suite.yml | 13 - .../tests/acceptance/CreateNoteCept.php | 10 - .../tests/acceptance/CreateNoteFailCept.php | 9 - .../tests/acceptance/CreatePadCept.php | 8 - .../tests/acceptance/CreatePadFailCept.php | 9 - .../tests/acceptance/DeleteNoteCept.php | 7 - .../acceptance/DeleteOtherOwnersNoteCept.php | 6 - .../acceptance/DeleteOtherOwnersPadCept.php | 6 - .../tests/acceptance/DeletePadCept.php | 7 - .../notejam/tests/acceptance/EditNoteCept.php | 12 - .../tests/acceptance/EditNoteFailCept.php | 11 - .../acceptance/EditOtherOwnersNoteCept.php | 6 - .../acceptance/EditOtherOwnersPadCept.php | 6 - .../notejam/tests/acceptance/EditPadCept.php | 8 - .../tests/acceptance/EditPadFailCept.php | 9 - .../acceptance/ForgottenPasswordCept.php | 7 - .../ForgottenPasswordInvalidEmailCept.php | 7 - ...ForgottenPasswordUnregisteredEmailCept.php | 7 - .../notejam/tests/acceptance/HomepageCept.php | 8 - .../tests/acceptance/NoteDetailCept.php | 7 - .../acceptance/OtherOwnersNoteDetailCept.php | 7 - .../acceptance/OtherOwnersPadDetailCept.php | 6 - .../tests/acceptance/PadDetailCept.php | 7 - .../tests/acceptance/SetNewPasswordCept.php | 10 - .../acceptance/SetNewPasswordFailCept.php | 11 - ...tNewPasswordInvalidCurrentPasswordCept.php | 10 - .../acceptance/SetNewPasswordMismatchCept.php | 10 - .../notejam/tests/acceptance/SignInCept.php | 5 - .../tests/acceptance/SignInFailCept.php | 10 - .../acceptance/SignInInvalidEmailCept.php | 5 - .../acceptance/SignInInvalidPasswordCept.php | 5 - .../acceptance/SignUpAlreadyExistsCept.php | 10 - .../notejam/tests/acceptance/SignUpCept.php | 13 - .../tests/acceptance/SignUpFailCept.php | 11 - .../acceptance/SignUpInvalidEmailCept.php | 10 - .../acceptance/SignUpPasswordMismatchCept.php | 10 - .../notejam/tests/acceptance/_bootstrap.php | 2 - .../notejam/tests/functional.suite.yml | 11 - .../notejam/tests/functional/_bootstrap.php | 2 - nette/native_db/notejam/tests/unit.suite.yml | 9 - .../notejam/tests/unit/_bootstrap.php | 2 - nette/native_db/notejam/www/.maintenance.php | 26 - nette/native_db/notejam/www/css/style.css | 395 -- nette/native_db/notejam/www/favicon.ico | Bin 2550 -> 0 bytes .../native_db/notejam/www/images/spinner.gif | Bin 737 -> 0 bytes nette/native_db/notejam/www/index.php | 13 - nette/native_db/notejam/www/js/main.js | 2 - nette/native_db/notejam/www/robots.txt | 0 nette/native_db/readme.rst | 99 - padrino/README.rst | 73 - padrino/notejam/.components | 10 - padrino/notejam/.gitignore | 9 - padrino/notejam/Gemfile | 43 - padrino/notejam/Gemfile.lock | 144 - padrino/notejam/Rakefile | 6 - padrino/notejam/admin/app.rb | 43 - padrino/notejam/admin/controllers/accounts.rb | 90 - padrino/notejam/admin/controllers/base.rb | 5 - padrino/notejam/admin/controllers/sessions.rb | 25 - .../notejam/admin/views/accounts/_form.erb | 57 - padrino/notejam/admin/views/accounts/edit.erb | 10 - .../notejam/admin/views/accounts/index.erb | 74 - padrino/notejam/admin/views/accounts/new.erb | 9 - padrino/notejam/admin/views/base/index.erb | 15 - padrino/notejam/admin/views/errors/403.erb | 3 - padrino/notejam/admin/views/errors/404.erb | 3 - padrino/notejam/admin/views/errors/500.erb | 3 - .../admin/views/layouts/application.erb | 64 - padrino/notejam/admin/views/layouts/error.erb | 23 - padrino/notejam/admin/views/sessions/new.erb | 44 - padrino/notejam/app/app.rb | 84 - padrino/notejam/app/controllers/note.rb | 72 - padrino/notejam/app/controllers/pad.rb | 56 - padrino/notejam/app/controllers/user.rb | 79 - padrino/notejam/app/helpers.rb | 47 - padrino/notejam/app/helpers/user_helper.rb | 10 - padrino/notejam/app/mailers.rb | 44 - padrino/notejam/app/mailers/mailer.rb | 11 - .../notejam/app/views/layouts/layout.html.erb | 87 - .../notejam/app/views/layouts/user.html.erb | 63 - .../mailers/mailer/new_password_email.erb | 5 - .../notejam/app/views/note/create.html.erb | 18 - .../notejam/app/views/note/delete.html.erb | 9 - padrino/notejam/app/views/note/edit.html.erb | 19 - padrino/notejam/app/views/note/list.html.erb | 27 - padrino/notejam/app/views/note/view.html.erb | 11 - padrino/notejam/app/views/pad/create.html.erb | 10 - padrino/notejam/app/views/pad/delete.html.erb | 8 - padrino/notejam/app/views/pad/edit.html.erb | 12 - padrino/notejam/app/views/pad/view.html.erb | 19 - .../app/views/user/forgot-password.html.erb | 10 - .../notejam/app/views/user/settings.html.erb | 17 - .../notejam/app/views/user/signin.html.erb | 14 - .../notejam/app/views/user/signup.html.erb | 17 - padrino/notejam/config.ru | 9 - padrino/notejam/config/apps.rb | 39 - padrino/notejam/config/boot.rb | 47 - padrino/notejam/config/database.rb | 40 - .../notejam/db/migrate/001_create_users.rb | 14 - padrino/notejam/db/seeds.rb | 28 - padrino/notejam/models/note.rb | 21 - padrino/notejam/models/pad.rb | 16 - padrino/notejam/models/user.rb | 56 - .../notejam/public/admin/images/favicon.ico | Bin 3784 -> 0 bytes .../public/admin/images/font/FontAwesome.otf | Bin 61896 -> 0 bytes .../admin/images/font/fontawesome-webfont.eot | Bin 37405 -> 0 bytes .../admin/images/font/fontawesome-webfont.svg | 399 -- .../admin/images/font/fontawesome-webfont.ttf | Bin 79076 -> 0 bytes .../images/font/fontawesome-webfont.woff | Bin 43572 -> 0 bytes padrino/notejam/public/admin/images/logo.png | Bin 29343 -> 0 bytes .../public/admin/javascripts/application.js | 118 - .../admin/javascripts/bootstrap/affix.js | 126 - .../admin/javascripts/bootstrap/alert.js | 98 - .../javascripts/bootstrap/bootstrap.min.js | 6 - .../admin/javascripts/bootstrap/button.js | 109 - .../admin/javascripts/bootstrap/carousel.js | 217 - .../admin/javascripts/bootstrap/collapse.js | 179 - .../admin/javascripts/bootstrap/dropdown.js | 154 - .../admin/javascripts/bootstrap/modal.js | 246 -- .../admin/javascripts/bootstrap/popover.js | 117 - .../admin/javascripts/bootstrap/scrollspy.js | 158 - .../public/admin/javascripts/bootstrap/tab.js | 135 - .../admin/javascripts/bootstrap/tooltip.js | 386 -- .../admin/javascripts/bootstrap/transition.js | 56 - .../admin/javascripts/jquery-1.9.0.min.js | 4 - padrino/notejam/public/favicon.ico | Bin 3784 -> 0 bytes padrino/notejam/public/stylesheets/style.css | 395 -- .../app/controllers/note_controller_spec.rb | 174 - .../app/controllers/pad_controller_spec.rb | 140 - .../app/controllers/user_controller_spec.rb | 79 - padrino/notejam/spec/spec.rake | 20 - padrino/notejam/spec/spec_helper.rb | 42 - spring/pom.xml => pom.xml | 10 + pyramid/CHANGES.txt | 4 - pyramid/MANIFEST.in | 2 - pyramid/README.rst | 81 - pyramid/README.txt | 14 - pyramid/development.ini | 75 - pyramid/notejam/__init__.py | 56 - pyramid/notejam/forms.py | 91 - pyramid/notejam/models.py | 106 - pyramid/notejam/scripts/__init__.py | 1 - pyramid/notejam/scripts/initializedb.py | 32 - pyramid/notejam/static/css/base.css | 269 -- pyramid/notejam/static/css/layout.css | 58 - pyramid/notejam/static/css/skeleton.css | 242 -- pyramid/notejam/static/css/style.css | 350 -- pyramid/notejam/static/css/tables.css | 45 - pyramid/notejam/static/favicon.ico | Bin 1406 -> 0 bytes pyramid/notejam/static/footerbg.png | Bin 333 -> 0 bytes pyramid/notejam/static/headerbg.png | Bin 203 -> 0 bytes pyramid/notejam/static/ie6.css | 8 - pyramid/notejam/static/middlebg.png | Bin 2797 -> 0 bytes pyramid/notejam/static/pylons.css | 372 -- pyramid/notejam/static/pyramid-small.png | Bin 7044 -> 0 bytes pyramid/notejam/static/pyramid.png | Bin 33055 -> 0 bytes pyramid/notejam/static/transparent.gif | Bin 49 -> 0 bytes pyramid/notejam/templates/app_layout.pt | 14 - pyramid/notejam/templates/base.pt | 69 - pyramid/notejam/templates/notes/create.pt | 17 - pyramid/notejam/templates/notes/delete.pt | 22 - pyramid/notejam/templates/notes/edit.pt | 18 - pyramid/notejam/templates/notes/list.pt | 31 - pyramid/notejam/templates/notes/view.pt | 23 - pyramid/notejam/templates/pads/create.pt | 17 - pyramid/notejam/templates/pads/delete.pt | 23 - pyramid/notejam/templates/pads/edit.pt | 18 - pyramid/notejam/templates/pads/note_list.pt | 30 - pyramid/notejam/templates/snippets.pt | 37 - pyramid/notejam/templates/user_layout.pt | 16 - .../templates/users/forgot_password.pt | 23 - pyramid/notejam/templates/users/settings.pt | 30 - pyramid/notejam/templates/users/signin.pt | 27 - pyramid/notejam/templates/users/signup.pt | 29 - pyramid/notejam/tests.py | 333 -- pyramid/notejam/views.py | 289 -- pyramid/production.ini | 62 - pyramid/setup.cfg | 27 - pyramid/setup.py | 49 - rubyonrails/README.rst | 83 - rubyonrails/notejam/.gitignore | 16 - rubyonrails/notejam/Gemfile | 45 - rubyonrails/notejam/Gemfile.lock | 150 - rubyonrails/notejam/README.rdoc | 28 - rubyonrails/notejam/Rakefile | 6 - rubyonrails/notejam/app/assets/images/.keep | 0 .../app/assets/javascripts/application.js | 16 - .../app/assets/javascripts/note.js.coffee | 3 - .../app/assets/javascripts/pad.js.coffee | 3 - .../app/assets/javascripts/user.js.coffee | 3 - .../app/assets/stylesheets/application.css | 13 - .../notejam/app/assets/stylesheets/base.css | 269 -- .../notejam/app/assets/stylesheets/layout.css | 58 - .../app/assets/stylesheets/note.css.scss | 3 - .../app/assets/stylesheets/pad.css.scss | 3 - .../app/assets/stylesheets/skeleton.css | 242 -- .../notejam/app/assets/stylesheets/style.css | 350 -- .../notejam/app/assets/stylesheets/tables.css | 45 - .../app/assets/stylesheets/user.css.scss | 3 - .../app/controllers/application_controller.rb | 35 - .../app/controllers/notes_controller.rb | 51 - .../app/controllers/pads_controller.rb | 40 - .../app/controllers/users_controller.rb | 73 - .../notejam/app/helpers/application_helper.rb | 11 - .../notejam/app/helpers/note_helper.rb | 15 - rubyonrails/notejam/app/helpers/pad_helper.rb | 2 - .../notejam/app/helpers/user_helper.rb | 2 - rubyonrails/notejam/app/mailers/.keep | 0 .../notejam/app/mailers/user_mailer.rb | 9 - rubyonrails/notejam/app/models/.keep | 0 rubyonrails/notejam/app/models/note.rb | 6 - rubyonrails/notejam/app/models/pad.rb | 5 - rubyonrails/notejam/app/models/user.rb | 9 - .../app/views/layouts/application.html.erb | 84 - .../notejam/app/views/layouts/users.html.erb | 3 - .../notejam/app/views/notes/create.html.erb | 16 - .../notejam/app/views/notes/delete.html.erb | 7 - .../notejam/app/views/notes/edit.html.erb | 16 - .../notejam/app/views/notes/index.html.erb | 26 - .../notejam/app/views/notes/show.html.erb | 10 - .../notejam/app/views/pads/create.html.erb | 9 - .../notejam/app/views/pads/delete.html.erb | 7 - .../notejam/app/views/pads/edit.html.erb | 9 - .../notejam/app/views/pads/show.html.erb | 19 - .../user_mailer/send_new_password.text.erb | 4 - .../app/views/users/forgot_password.html.erb | 9 - .../notejam/app/views/users/settings.html.erb | 16 - .../notejam/app/views/users/signin.html.erb | 13 - .../notejam/app/views/users/signup.html.erb | 17 - rubyonrails/notejam/bin/bundle | 3 - rubyonrails/notejam/bin/rails | 4 - rubyonrails/notejam/bin/rake | 4 - rubyonrails/notejam/config.ru | 4 - rubyonrails/notejam/config/application.rb | 26 - rubyonrails/notejam/config/boot.rb | 3 - rubyonrails/notejam/config/database.yml | 25 - rubyonrails/notejam/config/environment.rb | 5 - .../config/environments/development.rb | 41 - .../notejam/config/environments/production.rb | 79 - .../notejam/config/environments/test.rb | 42 - .../notejam/config/initializers/assets.rb | 11 - .../initializers/backtrace_silencers.rb | 7 - .../config/initializers/cookies_serializer.rb | 3 - .../initializers/filter_parameter_logging.rb | 4 - .../config/initializers/inflections.rb | 16 - .../notejam/config/initializers/mime_types.rb | 4 - .../config/initializers/secret_token.rb | 12 - .../config/initializers/session_store.rb | 3 - .../config/initializers/wrap_parameters.rb | 14 - rubyonrails/notejam/config/locales/en.yml | 23 - rubyonrails/notejam/config/routes.rb | 94 - rubyonrails/notejam/config/secrets.yml | 22 - .../db/migrate/20140409143934_create_users.rb | 10 - .../db/migrate/20140414192524_create_pads.rb | 10 - .../db/migrate/20140418215526_create_notes.rb | 12 - rubyonrails/notejam/db/schema.rb | 44 - rubyonrails/notejam/db/seeds.rb | 7 - rubyonrails/notejam/log/.keep | 0 rubyonrails/notejam/public/404.html | 58 - rubyonrails/notejam/public/422.html | 58 - rubyonrails/notejam/public/500.html | 57 - rubyonrails/notejam/public/favicon.ico | 0 rubyonrails/notejam/public/robots.txt | 5 - rubyonrails/notejam/test/controllers/.keep | 0 .../test/controllers/notes_controller_test.rb | 90 - .../test/controllers/pads_controller_test.rb | 74 - .../test/controllers/users_controller_test.rb | 61 - rubyonrails/notejam/test/fixtures/.keep | 0 rubyonrails/notejam/test/fixtures/notes.yml | 4 - rubyonrails/notejam/test/fixtures/pads.yml | 3 - rubyonrails/notejam/test/fixtures/users.yml | 7 - rubyonrails/notejam/test/helpers/.keep | 0 .../notejam/test/helpers/note_helper_test.rb | 4 - .../notejam/test/helpers/pad_helper_test.rb | 4 - .../notejam/test/helpers/user_helper_test.rb | 4 - rubyonrails/notejam/test/integration/.keep | 0 rubyonrails/notejam/test/mailers/.keep | 0 .../notejam/test/mailers/user_mailer_test.rb | 7 - rubyonrails/notejam/test/models/.keep | 0 rubyonrails/notejam/test/models/note_test.rb | 7 - rubyonrails/notejam/test/models/pad_test.rb | 7 - rubyonrails/notejam/test/models/user_test.rb | 7 - rubyonrails/notejam/test/test_helper.rb | 18 - .../notejam/vendor/assets/javascripts/.keep | 0 .../notejam/vendor/assets/stylesheets/.keep | 0 screenshots.rst | 46 - spring/.gitignore | 3 - spring/README.rst | 103 - .../resources/application-test.properties | 1 - .../java/net/notejam/spring/Application.java | 0 .../java/net/notejam/spring/URITemplates.java | 0 .../spring/error/ForcedErrorController.java | 0 .../error/ResourceNotFoundException.java | 0 .../error/UnsupportedLocaleException.java | 0 .../notejam/spring/error/package-info.java | 0 .../converter/StringToPeriodConverter.java | 0 .../spring/helper/converter/package-info.java | 0 .../spring/helper/reflection/Annotated.java | 0 .../helper/reflection/ReflectionUtils.java | 0 .../helper/reflection/package-info.java | 0 .../java/net/notejam/spring/note/Note.java | 0 .../notejam/spring/note/NoteRepository.java | 0 .../net/notejam/spring/note/NoteService.java | 0 .../note/controller/AllNotesController.java | 0 .../note/controller/CreateNoteController.java | 0 .../note/controller/DeleteNoteController.java | 0 .../note/controller/EditNoteController.java | 0 .../note/controller/ViewNoteController.java | 0 .../spring/note/controller/package-info.java | 0 .../net/notejam/spring/note/package-info.java | 0 .../java/net/notejam/spring/package-info.java | 0 .../main/java/net/notejam/spring/pad/Pad.java | 0 .../net/notejam/spring/pad/PadRepository.java | 0 .../net/notejam/spring/pad/PadService.java | 0 .../pad/controller/CreatePadController.java | 0 .../pad/controller/DeletePadController.java | 0 .../pad/controller/EditPadController.java | 0 .../spring/pad/controller/PadsAdvice.java | 0 .../controller/ViewPadNotesController.java | 0 .../spring/pad/controller/package-info.java | 0 .../net/notejam/spring/pad/package-info.java | 0 .../spring/security/LoginController.java | 0 .../security/SecurityConfiguration.java | 0 .../spring/security/SecurityService.java | 0 .../security/UserDetailsServiceImpl.java | 0 .../notejam/spring/security/owner/Owned.java | 0 .../spring/security/owner/PermitOwner.java | 0 .../security/owner/PermitOwnerAspect.java | 0 .../spring/security/owner/package-info.java | 0 .../notejam/spring/security/package-info.java | 0 .../java/net/notejam/spring/user/User.java | 0 .../notejam/spring/user/UserRepository.java | 0 .../net/notejam/spring/user/UserService.java | 0 .../notejam/spring/user/account/Account.java | 0 .../user/account/AccountController.java | 0 .../account/constraints/CurrentPassword.java | 0 .../constraints/CurrentPasswordValidator.java | 0 .../account/constraints/package-info.java | 0 .../spring/user/account/package-info.java | 0 .../spring/user/constraints/Password.java | 0 .../spring/user/constraints/package-info.java | 0 .../spring/user/forgot/ForgotPassword.java | 0 .../user/forgot/ForgotPasswordController.java | 0 .../user/forgot/InvalidTokenException.java | 0 .../user/forgot/PasswordRecoveryService.java | 0 .../forgot/RecoverPasswordController.java | 0 .../spring/user/forgot/RecoveryToken.java | 0 .../user/forgot/RecoveryTokenRepository.java | 0 .../spring/user/forgot/package-info.java | 0 .../net/notejam/spring/user/package-info.java | 0 .../notejam/spring/user/signup/Signup.java | 0 .../spring/user/signup/SignupController.java | 0 .../user/signup/constraints/UniqueEmail.java | 0 .../constraints/UniqueEmailValidator.java | 0 .../user/signup/constraints/package-info.java | 0 .../spring/user/signup/package-info.java | 0 .../spring/view/ViewConfiguration.java | 0 .../dialect/NaturalLanguageDateProcessor.java | 0 .../view/dialect/NoteTextProcessor.java | 0 .../spring/view/dialect/NotejamDialect.java | 0 .../spring/view/dialect/ProcessorUtil.java | 0 .../spring/view/dialect/package-info.java | 0 .../net/notejam/spring/view/package-info.java | 0 .../main/resources/application.properties | 13 +- .../main/resources/messages_de.properties | 0 .../main/resources/messages_en.properties | 0 .../main/resources/static/css/style.css | 0 .../main/resources/templates/error.html | 0 .../main/resources/templates/layout.html | 0 .../main/resources/templates/note/create.html | 0 .../main/resources/templates/note/delete.html | 0 .../main/resources/templates/note/edit.html | 0 .../main/resources/templates/note/view.html | 0 .../main/resources/templates/notes.html | 0 .../main/resources/templates/pad/create.html | 0 .../main/resources/templates/pad/delete.html | 0 .../main/resources/templates/pad/edit.html | 0 .../resources/templates/user/account.html | 0 .../templates/user/forgot-password.html | 0 .../main/resources/templates/user/login.html | 0 .../templates/user/reveal-password.html | 0 .../main/resources/templates/user/signup.html | 0 .../StringToPeriodConverterTest.java | 0 .../spring/note/CreateNoteControllerTest.java | 0 .../spring/note/DeleteNoteControllerTest.java | 0 .../spring/note/EditNoteControllerTest.java | 0 .../notejam/spring/note/NoteServiceTest.java | 0 .../spring/note/ViewNoteControllerTest.java | 0 .../spring/pad/CreatePadControllerTest.java | 0 .../spring/pad/DeletePadControllerTest.java | 0 .../spring/pad/EditPadControllerTest.java | 0 .../spring/pad/ViewPadControllerTest.java | 0 .../spring/security/LoginControllerTest.java | 0 .../spring/security/SecurityServiceTest.java | 0 .../security/owner/PermitOwnerAspectTest.java | 0 .../owner/PermitOwnerIntegrationTest.java | 0 .../notejam/spring/test/IntegrationTest.java | 0 .../notejam/spring/test/MockMvcProvider.java | 0 .../java/net/notejam/spring/test/UriUtil.java | 0 .../spring/user/SignedUpUserProvider.java | 0 .../notejam/spring/user/UserServiceTest.java | 0 .../user/signup/SignupControllerTest.java | 0 .../resources/application-test.properties | 3 + symfony/README.rst | 90 - symfony/notejam/.gitignore | 11 - symfony/notejam/.travis.yml | 10 - symfony/notejam/LICENSE | 19 - symfony/notejam/app/.htaccess | 1 - symfony/notejam/app/AppCache.php | 9 - symfony/notejam/app/AppKernel.php | 43 - .../Resources/translations/messages.fr.xlf | 11 - .../app/Resources/views/base.html.twig | 75 - .../app/Resources/views/fields.html.twig | 13 - .../app/Resources/views/user.html.twig | 5 - symfony/notejam/app/SymfonyRequirements.php | 764 ---- symfony/notejam/app/autoload.php | 13 - symfony/notejam/app/cache/.gitkeep | 0 symfony/notejam/app/check.php | 142 - symfony/notejam/app/config/config.yml | 72 - symfony/notejam/app/config/config_dev.yml | 31 - symfony/notejam/app/config/config_prod.yml | 23 - symfony/notejam/app/config/config_test.yml | 33 - symfony/notejam/app/config/parameters.yml | 14 - .../notejam/app/config/parameters.yml.dist | 15 - symfony/notejam/app/config/routing.yml | 7 - symfony/notejam/app/config/routing_dev.yml | 14 - symfony/notejam/app/config/security.yml | 44 - symfony/notejam/app/config/services.yml | 15 - symfony/notejam/app/console | 27 - symfony/notejam/app/logs/.gitkeep | 0 symfony/notejam/app/phpunit.xml.dist | 42 - symfony/notejam/composer.json | 57 - symfony/notejam/composer.lock | 2725 ------------ symfony/notejam/src/.htaccess | 1 - symfony/notejam/src/AppBundle/AppBundle.php | 13 - .../AppBundle/Controller/NoteController.php | 176 - .../AppBundle/Controller/PadController.php | 175 - .../AppBundle/Controller/UserController.php | 211 - symfony/notejam/src/AppBundle/Entity/Note.php | 194 - symfony/notejam/src/AppBundle/Entity/Pad.php | 119 - symfony/notejam/src/AppBundle/Entity/User.php | 238 -- .../Form/Type/ChangePasswordType.php | 43 - .../src/AppBundle/Form/Type/NoteType.php | 57 - .../src/AppBundle/Form/Type/PadType.php | 40 - .../src/AppBundle/Form/Type/UserType.php | 54 - .../AppBundle/Repository/NoteRepository.php | 14 - .../AppBundle/Repository/PadRepository.php | 14 - .../Resources/views/Note/create.html.twig | 23 - .../Resources/views/Note/delete.html.twig | 13 - .../Resources/views/Note/edit.html.twig | 24 - .../Resources/views/Note/list.html.twig | 32 - .../Resources/views/Note/view.html.twig | 13 - .../Resources/views/Pad/create.html.twig | 14 - .../Resources/views/Pad/delete.html.twig | 12 - .../Resources/views/Pad/edit.html.twig | 15 - .../Resources/views/Pad/list.html.twig | 16 - .../Resources/views/Pad/notes.html.twig | 35 - .../views/User/forgot-password.html.twig | 15 - .../Resources/views/User/index.html.twig | 4 - .../Resources/views/User/settings.html.twig | 22 - .../Resources/views/User/signin.html.twig | 22 - .../Resources/views/User/signup.html.twig | 23 - .../Tests/Controller/NoteControllerTest.php | 40 - .../Tests/Controller/PadControllerTest.php | 183 - symfony/notejam/web/.htaccess | 52 - symfony/notejam/web/app.php | 25 - symfony/notejam/web/app_dev.php | 30 - symfony/notejam/web/apple-touch-icon.png | Bin 10784 -> 0 bytes symfony/notejam/web/config.php | 124 - symfony/notejam/web/css/style.css | 396 -- symfony/notejam/web/favicon.ico | Bin 1150 -> 0 bytes symfony/notejam/web/robots.txt | 4 - .../fixtures.us-east-2.tfvars | 123 - .../terraform-aws-ecs-codepipeline/main.tf | 110 - .../terraform-aws-ecs-codepipeline/outputs.tf | 150 - .../variables.tf | 237 -- .../versions.tf | 11 - .../fixtures.us-east-2.tfvars | 96 - .../main.tf | 99 - .../outputs.tf | 105 - .../variables.tf | 204 - .../versions.tf | 8 - yii/README.rst | 91 - yii/notejam/.gitignore | 27 - yii/notejam/assets/AppAsset.php | 19 - yii/notejam/codeception.yml | 19 - yii/notejam/composer.json | 53 - yii/notejam/composer.lock | 2640 ------------ yii/notejam/config/db.php | 9 - yii/notejam/config/params.php | 6 - yii/notejam/config/web.php | 81 - yii/notejam/controllers/BaseController.php | 26 - yii/notejam/controllers/NoteController.php | 145 - yii/notejam/controllers/PadController.php | 115 - yii/notejam/controllers/UserController.php | 126 - yii/notejam/mail/layouts/html.php | 22 - yii/notejam/mail/password.php | 5 - .../m140804_111205_create_tables.php | 38 - yii/notejam/models/ChangePassword.php | 57 - yii/notejam/models/ForgotPassword.php | 74 - yii/notejam/models/LoginForm.php | 75 - yii/notejam/models/Note.php | 97 - yii/notejam/models/Pad.php | 53 - yii/notejam/models/SigninForm.php | 76 - yii/notejam/models/SignupForm.php | 53 - yii/notejam/models/User.php | 127 - yii/notejam/requirements.php | 102 - yii/notejam/runtime/.gitignore | 2 - yii/notejam/tests/.gitignore | 4 - yii/notejam/tests/README.md | 33 - yii/notejam/tests/_bootstrap.php | 23 - yii/notejam/tests/_config.php | 14 - yii/notejam/tests/_console_bootstrap.php | 12 - yii/notejam/tests/_data/dump.sql | 31 - yii/notejam/tests/_log/.gitignore | 2 - yii/notejam/tests/_pages/CreateNotePage.php | 19 - yii/notejam/tests/_pages/CreatePadPage.php | 17 - yii/notejam/tests/_pages/DeleteNotePage.php | 22 - yii/notejam/tests/_pages/DeletePadPage.php | 21 - yii/notejam/tests/_pages/EditNotePage.php | 24 - yii/notejam/tests/_pages/EditPadPage.php | 21 - yii/notejam/tests/_pages/SignedInPage.php | 31 - yii/notejam/tests/_pages/SigninPage.php | 24 - yii/notejam/tests/_pages/SignupPage.php | 25 - yii/notejam/tests/_pages/ViewNotePage.php | 10 - yii/notejam/tests/_pages/ViewPadPage.php | 9 - yii/notejam/tests/acceptance.suite.yml | 26 - yii/notejam/tests/acceptance/_bootstrap.php | 3 - yii/notejam/tests/acceptance/_config.php | 13 - yii/notejam/tests/acceptance/_console.php | 13 - yii/notejam/tests/acceptance/yii | 17 - yii/notejam/tests/acceptance/yii.bat | 20 - yii/notejam/tests/functional.suite.yml | 28 - .../tests/functional/CreateNoteCept.php | 29 - .../tests/functional/CreatePadCept.php | 19 - .../tests/functional/DeleteNoteCept.php | 17 - .../tests/functional/DeletePadCept.php | 16 - yii/notejam/tests/functional/EditNoteCept.php | 28 - yii/notejam/tests/functional/EditPadCept.php | 25 - yii/notejam/tests/functional/SigninCept.php | 23 - yii/notejam/tests/functional/SignupCept.php | 37 - yii/notejam/tests/functional/ViewNoteCept.php | 16 - yii/notejam/tests/functional/ViewPadCept.php | 16 - yii/notejam/tests/functional/_bootstrap.php | 3 - yii/notejam/tests/functional/_config.php | 17 - yii/notejam/tests/functional/_console.php | 13 - yii/notejam/tests/functional/yii | 17 - yii/notejam/tests/functional/yii.bat | 20 - yii/notejam/tests/unit.suite.yml | 6 - yii/notejam/tests/unit/_bootstrap.php | 3 - yii/notejam/tests/unit/_config.php | 13 - yii/notejam/tests/unit/_console.php | 13 - yii/notejam/tests/unit/fixtures/.gitkeep | 0 yii/notejam/tests/unit/fixtures/data/.gitkeep | 0 .../tests/unit/templates/fixtures/.gitkeep | 0 yii/notejam/tests/unit/yii | 17 - yii/notejam/tests/unit/yii.bat | 20 - yii/notejam/views/layouts/app.php | 37 - yii/notejam/views/layouts/base.php | 68 - yii/notejam/views/layouts/user.php | 16 - yii/notejam/views/note/create.php | 5 - yii/notejam/views/note/delete.php | 16 - yii/notejam/views/note/edit.php | 5 - yii/notejam/views/note/error.php | 22 - yii/notejam/views/note/form.php | 29 - yii/notejam/views/note/list.php | 30 - yii/notejam/views/note/view.php | 14 - yii/notejam/views/pad/create.php | 5 - yii/notejam/views/pad/delete.php | 15 - yii/notejam/views/pad/edit.php | 5 - yii/notejam/views/pad/form.php | 23 - yii/notejam/views/pad/view.php | 25 - yii/notejam/views/partials/errors.php | 9 - yii/notejam/views/user/forgot-password.php | 21 - yii/notejam/views/user/settings.php | 28 - yii/notejam/views/user/signin.php | 27 - yii/notejam/views/user/signup.php | 28 - yii/notejam/web/assets/.gitignore | 2 - yii/notejam/web/css/site.css | 91 - yii/notejam/web/css/style.css | 397 -- yii/notejam/web/favicon.ico | Bin 318 -> 0 bytes yii/notejam/web/index-test.php | 16 - yii/notejam/web/index.php | 12 - yii/notejam/web/robots.txt | 2 - yii/notejam/yii | 24 - yii/notejam/yii.bat | 20 - 1089 files changed, 175 insertions(+), 54446 deletions(-) create mode 100644 .github/workflows/ci-notejam.yml delete mode 100644 CA_TECH create mode 100644 Dockerfile delete mode 100644 cakephp/README.rst delete mode 100644 cakephp/notejam/.editorconfig delete mode 100644 cakephp/notejam/.gitattributes delete mode 100644 cakephp/notejam/.gitignore delete mode 100644 cakephp/notejam/.htaccess delete mode 100644 cakephp/notejam/.travis.yml delete mode 100755 cakephp/notejam/bin/cake delete mode 100644 cakephp/notejam/bin/cake.bat delete mode 100644 cakephp/notejam/bin/cake.php delete mode 100644 cakephp/notejam/composer.json delete mode 100644 cakephp/notejam/config/Migrations/20150928200943_initial.php delete mode 100644 cakephp/notejam/config/app.default.php delete mode 100644 cakephp/notejam/config/app.php delete mode 100644 cakephp/notejam/config/bootstrap.php delete mode 100644 cakephp/notejam/config/bootstrap_cli.php delete mode 100644 cakephp/notejam/config/paths.php delete mode 100644 cakephp/notejam/config/routes.php delete mode 100644 cakephp/notejam/config/schema/i18n.sql delete mode 100644 cakephp/notejam/config/schema/sessions.sql delete mode 100644 cakephp/notejam/index.php delete mode 100644 cakephp/notejam/phpunit.xml.dist delete mode 100644 cakephp/notejam/src/Console/Installer.php delete mode 100644 cakephp/notejam/src/Controller/AppController.php delete mode 100644 cakephp/notejam/src/Controller/NotesController.php delete mode 100644 cakephp/notejam/src/Controller/PadsController.php delete mode 100644 cakephp/notejam/src/Controller/UsersController.php delete mode 100644 cakephp/notejam/src/Form/ForgotPasswordForm.php delete mode 100644 cakephp/notejam/src/Form/SettingsForm.php delete mode 100644 cakephp/notejam/src/Model/Entity/Note.php delete mode 100644 cakephp/notejam/src/Model/Entity/Pad.php delete mode 100644 cakephp/notejam/src/Model/Entity/User.php delete mode 100644 cakephp/notejam/src/Model/Table/NotesTable.php delete mode 100644 cakephp/notejam/src/Model/Table/PadsTable.php delete mode 100644 cakephp/notejam/src/Model/Table/UsersTable.php delete mode 100644 cakephp/notejam/src/Shell/ConsoleShell.php delete mode 100644 cakephp/notejam/src/Template/Cell/Pads/display.ctp delete mode 100644 cakephp/notejam/src/Template/Element/Flash/default.ctp delete mode 100644 cakephp/notejam/src/Template/Element/Flash/error.ctp delete mode 100644 cakephp/notejam/src/Template/Element/Flash/success.ctp delete mode 100644 cakephp/notejam/src/Template/Element/notes/form.ctp delete mode 100644 cakephp/notejam/src/Template/Element/pads/form.ctp delete mode 100644 cakephp/notejam/src/Template/Email/html/default.ctp delete mode 100644 cakephp/notejam/src/Template/Email/text/default.ctp delete mode 100644 cakephp/notejam/src/Template/Error/error400.ctp delete mode 100644 cakephp/notejam/src/Template/Error/error500.ctp delete mode 100644 cakephp/notejam/src/Template/Layout/Email/html/default.ctp delete mode 100644 cakephp/notejam/src/Template/Layout/Email/text/default.ctp delete mode 100644 cakephp/notejam/src/Template/Layout/ajax.ctp delete mode 100644 cakephp/notejam/src/Template/Layout/anonymous.ctp delete mode 100644 cakephp/notejam/src/Template/Layout/default.ctp delete mode 100644 cakephp/notejam/src/Template/Layout/error.ctp delete mode 100644 cakephp/notejam/src/Template/Layout/rss/default.ctp delete mode 100644 cakephp/notejam/src/Template/Layout/user.ctp delete mode 100644 cakephp/notejam/src/Template/Notes/create.ctp delete mode 100644 cakephp/notejam/src/Template/Notes/delete.ctp delete mode 100644 cakephp/notejam/src/Template/Notes/edit.ctp delete mode 100644 cakephp/notejam/src/Template/Notes/index.ctp delete mode 100644 cakephp/notejam/src/Template/Notes/view.ctp delete mode 100644 cakephp/notejam/src/Template/Pads/create.ctp delete mode 100644 cakephp/notejam/src/Template/Pads/delete.ctp delete mode 100644 cakephp/notejam/src/Template/Pads/edit.ctp delete mode 100644 cakephp/notejam/src/Template/Pads/view.ctp delete mode 100644 cakephp/notejam/src/Template/Users/forgotpassword.ctp delete mode 100644 cakephp/notejam/src/Template/Users/index.ctp delete mode 100644 cakephp/notejam/src/Template/Users/settings.ctp delete mode 100644 cakephp/notejam/src/Template/Users/signin.ctp delete mode 100644 cakephp/notejam/src/Template/Users/signup.ctp delete mode 100644 cakephp/notejam/src/View/AppView.php delete mode 100644 cakephp/notejam/src/View/Cell/PadsCell.php delete mode 100644 cakephp/notejam/tests/Fixture/NotesFixture.php delete mode 100644 cakephp/notejam/tests/Fixture/PadsFixture.php delete mode 100644 cakephp/notejam/tests/Fixture/UsersFixture.php delete mode 100644 cakephp/notejam/tests/TestCase/Controller/NotesControllerTest.php delete mode 100644 cakephp/notejam/tests/TestCase/Controller/PadsControllerTest.php delete mode 100644 cakephp/notejam/tests/TestCase/Controller/UsersControllerTest.php delete mode 100644 cakephp/notejam/tests/TestCase/NotejamTestCase.php delete mode 100644 cakephp/notejam/tests/bootstrap.php delete mode 100644 cakephp/notejam/webroot/.htaccess delete mode 100644 cakephp/notejam/webroot/css/style.css delete mode 100644 cakephp/notejam/webroot/favicon.ico delete mode 100644 cakephp/notejam/webroot/img/cake.icon.png delete mode 100644 cakephp/notejam/webroot/img/cake.power.gif delete mode 100644 cakephp/notejam/webroot/index.php delete mode 100644 cakephp/notejam/webroot/js/empty delete mode 100644 contribute.rst delete mode 100644 django/README.rst delete mode 100755 django/notejam/manage.py delete mode 100644 django/notejam/notejam/__init__.py delete mode 100644 django/notejam/notejam/settings.py delete mode 100644 django/notejam/notejam/tests.py delete mode 100644 django/notejam/notejam/urls.py delete mode 100644 django/notejam/notejam/wsgi.py delete mode 100644 django/notejam/notes/__init__.py delete mode 100644 django/notejam/notes/forms.py delete mode 100644 django/notejam/notes/migrations/0001_initial.py delete mode 100644 django/notejam/notes/migrations/__init__.py delete mode 100644 django/notejam/notes/models.py delete mode 100644 django/notejam/notes/templates/notes/note_confirm_delete.html delete mode 100644 django/notejam/notes/templates/notes/note_create.html delete mode 100644 django/notejam/notes/templates/notes/note_detail.html delete mode 100644 django/notejam/notes/templates/notes/note_edit.html delete mode 100644 django/notejam/notes/templates/notes/note_form.html delete mode 100644 django/notejam/notes/templates/notes/note_list.html delete mode 100644 django/notejam/notes/templatetags/__init__.py delete mode 100644 django/notejam/notes/templatetags/date_tags.py delete mode 100644 django/notejam/notes/tests.py delete mode 100644 django/notejam/notes/urls.py delete mode 100644 django/notejam/notes/views.py delete mode 100644 django/notejam/pads/__init__.py delete mode 100644 django/notejam/pads/forms.py delete mode 100644 django/notejam/pads/migrations/0001_initial.py delete mode 100644 django/notejam/pads/migrations/__init__.py delete mode 100644 django/notejam/pads/models.py delete mode 100644 django/notejam/pads/templates/pads/pad_confirm_delete.html delete mode 100644 django/notejam/pads/templates/pads/pad_create.html delete mode 100644 django/notejam/pads/templates/pads/pad_edit.html delete mode 100644 django/notejam/pads/templates/pads/pad_form.html delete mode 100644 django/notejam/pads/templates/pads/pad_note_list.html delete mode 100644 django/notejam/pads/templatetags/__init__.py delete mode 100644 django/notejam/pads/templatetags/pad_tags.py delete mode 100644 django/notejam/pads/tests.py delete mode 100644 django/notejam/pads/urls.py delete mode 100644 django/notejam/pads/views.py delete mode 100644 django/notejam/static_files/css/style.css delete mode 100644 django/notejam/templates/404.html delete mode 100644 django/notejam/templates/base.html delete mode 100644 django/notejam/templates/user.html delete mode 100644 django/notejam/users/__init__.py delete mode 100644 django/notejam/users/auth_backends.py delete mode 100644 django/notejam/users/forms.py delete mode 100644 django/notejam/users/models.py delete mode 100644 django/notejam/users/templates/forgot_password.html delete mode 100644 django/notejam/users/templates/settings.html delete mode 100644 django/notejam/users/templates/signin.html delete mode 100644 django/notejam/users/templates/signup.html delete mode 100644 django/notejam/users/tests.py delete mode 100644 django/notejam/users/views.py delete mode 100644 django/requirements.txt delete mode 100644 express/README.rst delete mode 100644 express/notejam/app.js delete mode 100755 express/notejam/bin/www delete mode 100644 express/notejam/db.js delete mode 100644 express/notejam/helpers.js delete mode 100644 express/notejam/models.js delete mode 100644 express/notejam/package.json delete mode 100644 express/notejam/public/stylesheets/style.css delete mode 100644 express/notejam/routes/notes.js delete mode 100644 express/notejam/routes/pads.js delete mode 100644 express/notejam/routes/users.js delete mode 100644 express/notejam/settings.js delete mode 100644 express/notejam/tests/config.js delete mode 100644 express/notejam/tests/notes.js delete mode 100644 express/notejam/tests/pads.js delete mode 100644 express/notejam/tests/users.js delete mode 100644 express/notejam/views/error.jade delete mode 100644 express/notejam/views/layout.jade delete mode 100644 express/notejam/views/main.jade delete mode 100644 express/notejam/views/mixins.jade delete mode 100644 express/notejam/views/notes/create.jade delete mode 100644 express/notejam/views/notes/delete.jade delete mode 100644 express/notejam/views/notes/edit.jade delete mode 100644 express/notejam/views/notes/list.jade delete mode 100644 express/notejam/views/notes/view.jade delete mode 100644 express/notejam/views/pads/create.jade delete mode 100644 express/notejam/views/pads/delete.jade delete mode 100644 express/notejam/views/pads/edit.jade delete mode 100644 express/notejam/views/pads/list.jade delete mode 100644 express/notejam/views/user.jade delete mode 100644 express/notejam/views/users/forgot-password.jade delete mode 100644 express/notejam/views/users/settings.jade delete mode 100644 express/notejam/views/users/signin.jade delete mode 100644 express/notejam/views/users/signup.jade delete mode 100644 flask/README.rst delete mode 100644 flask/db.py delete mode 100644 flask/notejam/__init__.py delete mode 100644 flask/notejam/config.py delete mode 100644 flask/notejam/forms.py delete mode 100755 flask/notejam/models.py delete mode 100644 flask/notejam/static/css/style.css delete mode 100644 flask/notejam/static/css/tables.css delete mode 100644 flask/notejam/templates/_helpers.html delete mode 100644 flask/notejam/templates/base.html delete mode 100644 flask/notejam/templates/notes/create.html delete mode 100644 flask/notejam/templates/notes/delete.html delete mode 100644 flask/notejam/templates/notes/edit.html delete mode 100644 flask/notejam/templates/notes/form.html delete mode 100644 flask/notejam/templates/notes/list.html delete mode 100644 flask/notejam/templates/notes/view.html delete mode 100644 flask/notejam/templates/pads/create.html delete mode 100644 flask/notejam/templates/pads/delete.html delete mode 100644 flask/notejam/templates/pads/edit.html delete mode 100644 flask/notejam/templates/pads/form.html delete mode 100644 flask/notejam/templates/pads/note_list.html delete mode 100644 flask/notejam/templates/user.html delete mode 100644 flask/notejam/templates/users/forgot_password.html delete mode 100644 flask/notejam/templates/users/settings.html delete mode 100644 flask/notejam/templates/users/signin.html delete mode 100644 flask/notejam/templates/users/signup.html delete mode 100644 flask/notejam/views.py delete mode 100644 flask/notejam/wsgi.py delete mode 100644 flask/requirements.txt delete mode 100755 flask/runserver.py delete mode 100644 flask/tests.py delete mode 100644 html/account-settings.html delete mode 100644 html/alerts-and-errors.html delete mode 100644 html/create-pad.html delete mode 100644 html/create.html delete mode 100644 html/css/style.css delete mode 100644 html/delete.html delete mode 100644 html/edit.html delete mode 100644 html/empty-list.html delete mode 100644 html/forgot-password.html delete mode 100644 html/index.html delete mode 100644 html/pad-notes.html delete mode 100644 html/screenshots/1.png delete mode 100644 html/screenshots/1p.png delete mode 100644 html/screenshots/2.png delete mode 100644 html/screenshots/2p.png delete mode 100644 html/screenshots/3.png delete mode 100644 html/screenshots/3p.png delete mode 100644 html/screenshots/4.png delete mode 100644 html/screenshots/5.png delete mode 100644 html/screenshots/6.png delete mode 100644 html/signin.html delete mode 100644 html/signup.html delete mode 100644 html/view.html delete mode 100644 index.html delete mode 100644 laravel/README.rst delete mode 100644 laravel/notejam/.gitattributes delete mode 100644 laravel/notejam/.gitignore delete mode 100644 laravel/notejam/app/commands/.gitkeep delete mode 100644 laravel/notejam/app/config/app.php delete mode 100644 laravel/notejam/app/config/auth.php delete mode 100644 laravel/notejam/app/config/cache.php delete mode 100644 laravel/notejam/app/config/compile.php delete mode 100644 laravel/notejam/app/config/database.php delete mode 100644 laravel/notejam/app/config/local/app.php delete mode 100644 laravel/notejam/app/config/mail.php delete mode 100644 laravel/notejam/app/config/packages/.gitkeep delete mode 100644 laravel/notejam/app/config/queue.php delete mode 100644 laravel/notejam/app/config/remote.php delete mode 100644 laravel/notejam/app/config/session.php delete mode 100644 laravel/notejam/app/config/testing/cache.php delete mode 100644 laravel/notejam/app/config/testing/database.php delete mode 100644 laravel/notejam/app/config/testing/session.php delete mode 100644 laravel/notejam/app/config/view.php delete mode 100644 laravel/notejam/app/config/workbench.php delete mode 100644 laravel/notejam/app/controllers/.gitkeep delete mode 100644 laravel/notejam/app/controllers/BaseController.php delete mode 100644 laravel/notejam/app/controllers/NoteController.php delete mode 100644 laravel/notejam/app/controllers/PadController.php delete mode 100644 laravel/notejam/app/controllers/UserController.php delete mode 100644 laravel/notejam/app/database/migrations/.gitkeep delete mode 100644 laravel/notejam/app/database/migrations/2014_05_14_215427_create_users_table.php delete mode 100644 laravel/notejam/app/database/migrations/2014_05_16_225623_create_pads_table.php delete mode 100644 laravel/notejam/app/database/migrations/2014_05_18_180146_create_notes_table.php delete mode 100644 laravel/notejam/app/database/production.sqlite delete mode 100644 laravel/notejam/app/database/seeds/.gitkeep delete mode 100644 laravel/notejam/app/database/seeds/DatabaseSeeder.php delete mode 100644 laravel/notejam/app/filters.php delete mode 100644 laravel/notejam/app/lang/en/pagination.php delete mode 100644 laravel/notejam/app/lang/en/reminders.php delete mode 100644 laravel/notejam/app/lang/en/validation.php delete mode 100644 laravel/notejam/app/models/Note.php delete mode 100644 laravel/notejam/app/models/Pad.php delete mode 100644 laravel/notejam/app/models/User.php delete mode 100644 laravel/notejam/app/routes.php delete mode 100644 laravel/notejam/app/start/artisan.php delete mode 100644 laravel/notejam/app/start/global.php delete mode 100644 laravel/notejam/app/start/local.php delete mode 100644 laravel/notejam/app/storage/.gitignore delete mode 100644 laravel/notejam/app/storage/cache/.gitignore delete mode 100644 laravel/notejam/app/storage/logs/.gitignore delete mode 100644 laravel/notejam/app/storage/meta/.gitignore delete mode 100644 laravel/notejam/app/storage/sessions/.gitignore delete mode 100644 laravel/notejam/app/storage/views/.gitignore delete mode 100644 laravel/notejam/app/tests/NoteTest.php delete mode 100644 laravel/notejam/app/tests/PadTest.php delete mode 100644 laravel/notejam/app/tests/TestCase.php delete mode 100644 laravel/notejam/app/tests/UserTest.php delete mode 100644 laravel/notejam/app/views/emails/auth/reminder.blade.php delete mode 100644 laravel/notejam/app/views/emails/password.blade.php delete mode 100644 laravel/notejam/app/views/layout.blade.php delete mode 100644 laravel/notejam/app/views/note/create.blade.php delete mode 100644 laravel/notejam/app/views/note/delete.blade.php delete mode 100644 laravel/notejam/app/views/note/edit.blade.php delete mode 100644 laravel/notejam/app/views/note/index.blade.php delete mode 100644 laravel/notejam/app/views/note/view.blade.php delete mode 100644 laravel/notejam/app/views/pad/create.blade.php delete mode 100644 laravel/notejam/app/views/pad/delete.blade.php delete mode 100644 laravel/notejam/app/views/pad/edit.blade.php delete mode 100644 laravel/notejam/app/views/pad/view.blade.php delete mode 100644 laravel/notejam/app/views/partials/error.blade.php delete mode 100644 laravel/notejam/app/views/user.blade.php delete mode 100644 laravel/notejam/app/views/user/forgot-password.blade.php delete mode 100644 laravel/notejam/app/views/user/settings.blade.php delete mode 100644 laravel/notejam/app/views/user/signin.blade.php delete mode 100644 laravel/notejam/app/views/user/signup.blade.php delete mode 100755 laravel/notejam/artisan delete mode 100644 laravel/notejam/bootstrap/autoload.php delete mode 100644 laravel/notejam/bootstrap/paths.php delete mode 100644 laravel/notejam/bootstrap/start.php delete mode 100644 laravel/notejam/composer.json delete mode 100644 laravel/notejam/phpunit.xml delete mode 100644 laravel/notejam/public/.htaccess delete mode 100644 laravel/notejam/public/css/style.css delete mode 100644 laravel/notejam/public/favicon.ico delete mode 100644 laravel/notejam/public/index.php delete mode 100644 laravel/notejam/public/packages/.gitkeep delete mode 100644 laravel/notejam/public/robots.txt delete mode 100644 laravel/notejam/server.php delete mode 100644 nette/doctrine/README.rst delete mode 100644 nette/doctrine/notejam/.gitignore delete mode 100644 nette/doctrine/notejam/app/Components/ConfirmationControl.php delete mode 100644 nette/doctrine/notejam/app/Components/ForgottenPasswordControl.php delete mode 100644 nette/doctrine/notejam/app/Components/NoteControl.php delete mode 100644 nette/doctrine/notejam/app/Components/PadsControl.php delete mode 100644 nette/doctrine/notejam/app/Components/PadsList/PadsListControl.php delete mode 100644 nette/doctrine/notejam/app/Components/PadsList/default.latte delete mode 100644 nette/doctrine/notejam/app/Components/SettingsControl.php delete mode 100644 nette/doctrine/notejam/app/Components/SignInControl.php delete mode 100644 nette/doctrine/notejam/app/Components/SignUpControl.php delete mode 100644 nette/doctrine/notejam/app/Presenters/BasePresenter.php delete mode 100644 nette/doctrine/notejam/app/Presenters/Error4xxPresenter.php delete mode 100644 nette/doctrine/notejam/app/Presenters/ErrorPresenter.php delete mode 100644 nette/doctrine/notejam/app/Presenters/NotePresenter.php delete mode 100644 nette/doctrine/notejam/app/Presenters/PadPresenter.php delete mode 100644 nette/doctrine/notejam/app/Presenters/UserPresenter.php delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/@layout.latte delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/@user.latte delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Error/403.latte delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Error/404.latte delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Error/405.latte delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Error/410.latte delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Error/4xx.latte delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Error/500.phtml delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Note/create.latte delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Note/default.latte delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Note/delete.latte delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Note/detail.latte delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Note/edit.latte delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Pad/create.latte delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Pad/delete.latte delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Pad/detail.latte delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Pad/edit.latte delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/User/forgottenPassword.latte delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/User/settings.latte delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/User/signIn.latte delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/User/signUp.latte delete mode 100644 nette/doctrine/notejam/app/bootstrap.php delete mode 100644 nette/doctrine/notejam/app/config/config.local.example.neon delete mode 100644 nette/doctrine/notejam/app/config/config.neon delete mode 100644 nette/doctrine/notejam/app/config/services.neon delete mode 100644 nette/doctrine/notejam/codeception.yml delete mode 100644 nette/doctrine/notejam/composer.json delete mode 100644 nette/doctrine/notejam/composer.lock delete mode 100644 nette/doctrine/notejam/log/.gitignore delete mode 100644 nette/doctrine/notejam/src/Notejam/Http/RouterFactory.php delete mode 100644 nette/doctrine/notejam/src/Notejam/Notes/Note.php delete mode 100644 nette/doctrine/notejam/src/Notejam/Notes/NoteRepository.php delete mode 100644 nette/doctrine/notejam/src/Notejam/Pads/Pad.php delete mode 100644 nette/doctrine/notejam/src/Notejam/Pads/PadRepository.php delete mode 100644 nette/doctrine/notejam/src/Notejam/Templating/RuntimeFilters.php delete mode 100644 nette/doctrine/notejam/src/Notejam/UI/FormFactory.php delete mode 100644 nette/doctrine/notejam/src/Notejam/UI/FormRenderer.php delete mode 100644 nette/doctrine/notejam/src/Notejam/Users/Authenticator.php delete mode 100644 nette/doctrine/notejam/src/Notejam/Users/User.php delete mode 100644 nette/doctrine/notejam/src/Notejam/Users/UserRepository.php delete mode 100644 nette/doctrine/notejam/src/Notejam/exceptions.php delete mode 100644 nette/doctrine/notejam/temp/.gitignore delete mode 100644 nette/doctrine/notejam/tests/_bootstrap.php delete mode 100644 nette/doctrine/notejam/tests/_data/dump.sql delete mode 100644 nette/doctrine/notejam/tests/_output/.gitignore delete mode 100644 nette/doctrine/notejam/tests/_support/AcceptanceTester.php delete mode 100644 nette/doctrine/notejam/tests/_support/FunctionalTester.php delete mode 100644 nette/doctrine/notejam/tests/_support/Helper/Acceptance.php delete mode 100644 nette/doctrine/notejam/tests/_support/Helper/Functional.php delete mode 100644 nette/doctrine/notejam/tests/_support/Helper/Unit.php delete mode 100644 nette/doctrine/notejam/tests/_support/UnitTester.php delete mode 100644 nette/doctrine/notejam/tests/_support/_generated/.gitignore delete mode 100644 nette/doctrine/notejam/tests/acceptance.suite.yml delete mode 100644 nette/doctrine/notejam/tests/acceptance/CreateNoteCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/CreateNoteFailCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/CreatePadCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/CreatePadFailCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/DeleteNoteCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/DeleteOtherOwnersNoteCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/DeleteOtherOwnersPadCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/DeletePadCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/EditNoteCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/EditNoteFailCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/EditOtherOwnersNoteCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/EditOtherOwnersPadCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/EditPadCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/EditPadFailCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/ForgottenPasswordCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/ForgottenPasswordInvalidEmailCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/ForgottenPasswordUnregisteredEmailCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/HomepageCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/NoteDetailCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/OtherOwnersNoteDetailCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/OtherOwnersPadDetailCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/PadDetailCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/SetNewPasswordCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/SetNewPasswordFailCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/SetNewPasswordInvalidCurrentPasswordCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/SetNewPasswordMismatchCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/SignInCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/SignInFailCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/SignInInvalidEmailCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/SignInInvalidPasswordCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/SignUpAlreadyExistsCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/SignUpCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/SignUpFailCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/SignUpInvalidEmailCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/SignUpPasswordMismatchCept.php delete mode 100644 nette/doctrine/notejam/tests/acceptance/_bootstrap.php delete mode 100644 nette/doctrine/notejam/tests/functional.suite.yml delete mode 100644 nette/doctrine/notejam/tests/functional/_bootstrap.php delete mode 100644 nette/doctrine/notejam/tests/unit.suite.yml delete mode 100644 nette/doctrine/notejam/tests/unit/_bootstrap.php delete mode 100644 nette/doctrine/notejam/www/.htaccess delete mode 100644 nette/doctrine/notejam/www/.maintenance.php delete mode 100644 nette/doctrine/notejam/www/css/style.css delete mode 100644 nette/doctrine/notejam/www/favicon.ico delete mode 100644 nette/doctrine/notejam/www/index.php delete mode 100644 nette/doctrine/notejam/www/robots.txt delete mode 100644 nette/native_db/notejam/.gitignore delete mode 100644 nette/native_db/notejam/app/bootstrap.php delete mode 100644 nette/native_db/notejam/app/components/Notes/INotesFactory.php delete mode 100644 nette/native_db/notejam/app/components/Notes/Notes.latte delete mode 100644 nette/native_db/notejam/app/components/Notes/Notes.php delete mode 100644 nette/native_db/notejam/app/components/Pads/IPadsFactory.php delete mode 100644 nette/native_db/notejam/app/components/Pads/Pads.latte delete mode 100644 nette/native_db/notejam/app/components/Pads/Pads.php delete mode 100644 nette/native_db/notejam/app/components/UserBar/IUserBarFactory.php delete mode 100644 nette/native_db/notejam/app/components/UserBar/UserBar.latte delete mode 100644 nette/native_db/notejam/app/components/UserBar/UserBar.php delete mode 100644 nette/native_db/notejam/app/config/config.example.neon delete mode 100644 nette/native_db/notejam/app/config/config.neon delete mode 100644 nette/native_db/notejam/app/forms/Account/AccountSettingsFormFactory.php delete mode 100644 nette/native_db/notejam/app/forms/Note/DeleteNoteFormFactory.php delete mode 100644 nette/native_db/notejam/app/forms/Note/EditNoteFormFactory.php delete mode 100644 nette/native_db/notejam/app/forms/Note/NewNoteFormFactory.php delete mode 100644 nette/native_db/notejam/app/forms/Pad/DeletePadFormFactory.php delete mode 100644 nette/native_db/notejam/app/forms/Pad/EditPadFormFactory.php delete mode 100644 nette/native_db/notejam/app/forms/Pad/NewPadFormFactory.php delete mode 100644 nette/native_db/notejam/app/forms/Sign/ForgottenPasswordFormFactory.php delete mode 100644 nette/native_db/notejam/app/forms/Sign/SignInFormFactory.php delete mode 100644 nette/native_db/notejam/app/forms/Sign/SignUpFormFactory.php delete mode 100644 nette/native_db/notejam/app/helpers/OrderHelper.php delete mode 100644 nette/native_db/notejam/app/model/NoteManager.php delete mode 100644 nette/native_db/notejam/app/model/PadManager.php delete mode 100644 nette/native_db/notejam/app/model/UserManager.php delete mode 100644 nette/native_db/notejam/app/presenters/AccountPresenter.php delete mode 100644 nette/native_db/notejam/app/presenters/BasePresenter.php delete mode 100644 nette/native_db/notejam/app/presenters/Error4xxPresenter.php delete mode 100644 nette/native_db/notejam/app/presenters/ErrorPresenter.php delete mode 100644 nette/native_db/notejam/app/presenters/HomepagePresenter.php delete mode 100644 nette/native_db/notejam/app/presenters/NotePresenter.php delete mode 100644 nette/native_db/notejam/app/presenters/PadPresenter.php delete mode 100644 nette/native_db/notejam/app/presenters/SecuredBasePresenter.php delete mode 100644 nette/native_db/notejam/app/presenters/SignPresenter.php delete mode 100644 nette/native_db/notejam/app/presenters/templates/@layout.latte delete mode 100644 nette/native_db/notejam/app/presenters/templates/Account/settings.latte delete mode 100644 nette/native_db/notejam/app/presenters/templates/Error/403.latte delete mode 100644 nette/native_db/notejam/app/presenters/templates/Error/404.latte delete mode 100644 nette/native_db/notejam/app/presenters/templates/Error/405.latte delete mode 100644 nette/native_db/notejam/app/presenters/templates/Error/410.latte delete mode 100644 nette/native_db/notejam/app/presenters/templates/Error/4xx.latte delete mode 100644 nette/native_db/notejam/app/presenters/templates/Error/500.phtml delete mode 100644 nette/native_db/notejam/app/presenters/templates/Homepage/default.latte delete mode 100644 nette/native_db/notejam/app/presenters/templates/Note/default.latte delete mode 100644 nette/native_db/notejam/app/presenters/templates/Note/delete.latte delete mode 100644 nette/native_db/notejam/app/presenters/templates/Note/edit.latte delete mode 100644 nette/native_db/notejam/app/presenters/templates/Note/new.latte delete mode 100644 nette/native_db/notejam/app/presenters/templates/Pad/default.latte delete mode 100644 nette/native_db/notejam/app/presenters/templates/Pad/delete.latte delete mode 100644 nette/native_db/notejam/app/presenters/templates/Pad/edit.latte delete mode 100644 nette/native_db/notejam/app/presenters/templates/Pad/new.latte delete mode 100644 nette/native_db/notejam/app/presenters/templates/Sign/forgotten.latte delete mode 100644 nette/native_db/notejam/app/presenters/templates/Sign/in.latte delete mode 100644 nette/native_db/notejam/app/presenters/templates/Sign/up.latte delete mode 100644 nette/native_db/notejam/app/router/RouterFactory.php delete mode 100644 nette/native_db/notejam/bin/create-db.php delete mode 100644 nette/native_db/notejam/codeception.yml delete mode 100644 nette/native_db/notejam/composer.json delete mode 100644 nette/native_db/notejam/composer.lock delete mode 100644 nette/native_db/notejam/tests/_bootstrap.php delete mode 100644 nette/native_db/notejam/tests/_data/dump.sql delete mode 100644 nette/native_db/notejam/tests/_output/.gitignore delete mode 100644 nette/native_db/notejam/tests/_support/AcceptanceTester.php delete mode 100644 nette/native_db/notejam/tests/_support/FunctionalTester.php delete mode 100644 nette/native_db/notejam/tests/_support/Helper/Acceptance.php delete mode 100644 nette/native_db/notejam/tests/_support/Helper/Functional.php delete mode 100644 nette/native_db/notejam/tests/_support/Helper/Unit.php delete mode 100644 nette/native_db/notejam/tests/_support/UnitTester.php delete mode 100644 nette/native_db/notejam/tests/_support/_generated/.gitignore delete mode 100644 nette/native_db/notejam/tests/acceptance.suite.yml delete mode 100644 nette/native_db/notejam/tests/acceptance/CreateNoteCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/CreateNoteFailCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/CreatePadCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/CreatePadFailCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/DeleteNoteCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/DeleteOtherOwnersNoteCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/DeleteOtherOwnersPadCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/DeletePadCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/EditNoteCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/EditNoteFailCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/EditOtherOwnersNoteCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/EditOtherOwnersPadCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/EditPadCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/EditPadFailCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/ForgottenPasswordCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/ForgottenPasswordInvalidEmailCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/ForgottenPasswordUnregisteredEmailCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/HomepageCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/NoteDetailCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/OtherOwnersNoteDetailCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/OtherOwnersPadDetailCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/PadDetailCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/SetNewPasswordCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/SetNewPasswordFailCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/SetNewPasswordInvalidCurrentPasswordCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/SetNewPasswordMismatchCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/SignInCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/SignInFailCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/SignInInvalidEmailCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/SignInInvalidPasswordCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/SignUpAlreadyExistsCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/SignUpCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/SignUpFailCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/SignUpInvalidEmailCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/SignUpPasswordMismatchCept.php delete mode 100644 nette/native_db/notejam/tests/acceptance/_bootstrap.php delete mode 100644 nette/native_db/notejam/tests/functional.suite.yml delete mode 100644 nette/native_db/notejam/tests/functional/_bootstrap.php delete mode 100644 nette/native_db/notejam/tests/unit.suite.yml delete mode 100644 nette/native_db/notejam/tests/unit/_bootstrap.php delete mode 100644 nette/native_db/notejam/www/.maintenance.php delete mode 100644 nette/native_db/notejam/www/css/style.css delete mode 100644 nette/native_db/notejam/www/favicon.ico delete mode 100644 nette/native_db/notejam/www/images/spinner.gif delete mode 100644 nette/native_db/notejam/www/index.php delete mode 100644 nette/native_db/notejam/www/js/main.js delete mode 100644 nette/native_db/notejam/www/robots.txt delete mode 100644 nette/native_db/readme.rst delete mode 100644 padrino/README.rst delete mode 100644 padrino/notejam/.components delete mode 100644 padrino/notejam/.gitignore delete mode 100644 padrino/notejam/Gemfile delete mode 100644 padrino/notejam/Gemfile.lock delete mode 100644 padrino/notejam/Rakefile delete mode 100644 padrino/notejam/admin/app.rb delete mode 100644 padrino/notejam/admin/controllers/accounts.rb delete mode 100644 padrino/notejam/admin/controllers/base.rb delete mode 100644 padrino/notejam/admin/controllers/sessions.rb delete mode 100644 padrino/notejam/admin/views/accounts/_form.erb delete mode 100644 padrino/notejam/admin/views/accounts/edit.erb delete mode 100644 padrino/notejam/admin/views/accounts/index.erb delete mode 100644 padrino/notejam/admin/views/accounts/new.erb delete mode 100644 padrino/notejam/admin/views/base/index.erb delete mode 100644 padrino/notejam/admin/views/errors/403.erb delete mode 100644 padrino/notejam/admin/views/errors/404.erb delete mode 100644 padrino/notejam/admin/views/errors/500.erb delete mode 100644 padrino/notejam/admin/views/layouts/application.erb delete mode 100644 padrino/notejam/admin/views/layouts/error.erb delete mode 100644 padrino/notejam/admin/views/sessions/new.erb delete mode 100644 padrino/notejam/app/app.rb delete mode 100644 padrino/notejam/app/controllers/note.rb delete mode 100644 padrino/notejam/app/controllers/pad.rb delete mode 100644 padrino/notejam/app/controllers/user.rb delete mode 100644 padrino/notejam/app/helpers.rb delete mode 100644 padrino/notejam/app/helpers/user_helper.rb delete mode 100644 padrino/notejam/app/mailers.rb delete mode 100644 padrino/notejam/app/mailers/mailer.rb delete mode 100644 padrino/notejam/app/views/layouts/layout.html.erb delete mode 100644 padrino/notejam/app/views/layouts/user.html.erb delete mode 100644 padrino/notejam/app/views/mailers/mailer/new_password_email.erb delete mode 100644 padrino/notejam/app/views/note/create.html.erb delete mode 100644 padrino/notejam/app/views/note/delete.html.erb delete mode 100644 padrino/notejam/app/views/note/edit.html.erb delete mode 100644 padrino/notejam/app/views/note/list.html.erb delete mode 100644 padrino/notejam/app/views/note/view.html.erb delete mode 100644 padrino/notejam/app/views/pad/create.html.erb delete mode 100644 padrino/notejam/app/views/pad/delete.html.erb delete mode 100644 padrino/notejam/app/views/pad/edit.html.erb delete mode 100644 padrino/notejam/app/views/pad/view.html.erb delete mode 100644 padrino/notejam/app/views/user/forgot-password.html.erb delete mode 100644 padrino/notejam/app/views/user/settings.html.erb delete mode 100644 padrino/notejam/app/views/user/signin.html.erb delete mode 100644 padrino/notejam/app/views/user/signup.html.erb delete mode 100644 padrino/notejam/config.ru delete mode 100644 padrino/notejam/config/apps.rb delete mode 100644 padrino/notejam/config/boot.rb delete mode 100644 padrino/notejam/config/database.rb delete mode 100644 padrino/notejam/db/migrate/001_create_users.rb delete mode 100644 padrino/notejam/db/seeds.rb delete mode 100644 padrino/notejam/models/note.rb delete mode 100644 padrino/notejam/models/pad.rb delete mode 100644 padrino/notejam/models/user.rb delete mode 100644 padrino/notejam/public/admin/images/favicon.ico delete mode 100644 padrino/notejam/public/admin/images/font/FontAwesome.otf delete mode 100644 padrino/notejam/public/admin/images/font/fontawesome-webfont.eot delete mode 100644 padrino/notejam/public/admin/images/font/fontawesome-webfont.svg delete mode 100644 padrino/notejam/public/admin/images/font/fontawesome-webfont.ttf delete mode 100644 padrino/notejam/public/admin/images/font/fontawesome-webfont.woff delete mode 100644 padrino/notejam/public/admin/images/logo.png delete mode 100644 padrino/notejam/public/admin/javascripts/application.js delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/affix.js delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/alert.js delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/bootstrap.min.js delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/button.js delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/carousel.js delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/collapse.js delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/dropdown.js delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/modal.js delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/popover.js delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/scrollspy.js delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/tab.js delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/tooltip.js delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/transition.js delete mode 100644 padrino/notejam/public/admin/javascripts/jquery-1.9.0.min.js delete mode 100644 padrino/notejam/public/favicon.ico delete mode 100644 padrino/notejam/public/stylesheets/style.css delete mode 100644 padrino/notejam/spec/app/controllers/note_controller_spec.rb delete mode 100644 padrino/notejam/spec/app/controllers/pad_controller_spec.rb delete mode 100644 padrino/notejam/spec/app/controllers/user_controller_spec.rb delete mode 100644 padrino/notejam/spec/spec.rake delete mode 100644 padrino/notejam/spec/spec_helper.rb rename spring/pom.xml => pom.xml (92%) delete mode 100644 pyramid/CHANGES.txt delete mode 100644 pyramid/MANIFEST.in delete mode 100644 pyramid/README.rst delete mode 100644 pyramid/README.txt delete mode 100644 pyramid/development.ini delete mode 100644 pyramid/notejam/__init__.py delete mode 100644 pyramid/notejam/forms.py delete mode 100644 pyramid/notejam/models.py delete mode 100644 pyramid/notejam/scripts/__init__.py delete mode 100644 pyramid/notejam/scripts/initializedb.py delete mode 100644 pyramid/notejam/static/css/base.css delete mode 100644 pyramid/notejam/static/css/layout.css delete mode 100644 pyramid/notejam/static/css/skeleton.css delete mode 100644 pyramid/notejam/static/css/style.css delete mode 100644 pyramid/notejam/static/css/tables.css delete mode 100644 pyramid/notejam/static/favicon.ico delete mode 100644 pyramid/notejam/static/footerbg.png delete mode 100644 pyramid/notejam/static/headerbg.png delete mode 100644 pyramid/notejam/static/ie6.css delete mode 100644 pyramid/notejam/static/middlebg.png delete mode 100644 pyramid/notejam/static/pylons.css delete mode 100644 pyramid/notejam/static/pyramid-small.png delete mode 100644 pyramid/notejam/static/pyramid.png delete mode 100644 pyramid/notejam/static/transparent.gif delete mode 100644 pyramid/notejam/templates/app_layout.pt delete mode 100644 pyramid/notejam/templates/base.pt delete mode 100644 pyramid/notejam/templates/notes/create.pt delete mode 100644 pyramid/notejam/templates/notes/delete.pt delete mode 100644 pyramid/notejam/templates/notes/edit.pt delete mode 100644 pyramid/notejam/templates/notes/list.pt delete mode 100644 pyramid/notejam/templates/notes/view.pt delete mode 100644 pyramid/notejam/templates/pads/create.pt delete mode 100644 pyramid/notejam/templates/pads/delete.pt delete mode 100644 pyramid/notejam/templates/pads/edit.pt delete mode 100644 pyramid/notejam/templates/pads/note_list.pt delete mode 100644 pyramid/notejam/templates/snippets.pt delete mode 100644 pyramid/notejam/templates/user_layout.pt delete mode 100644 pyramid/notejam/templates/users/forgot_password.pt delete mode 100644 pyramid/notejam/templates/users/settings.pt delete mode 100644 pyramid/notejam/templates/users/signin.pt delete mode 100644 pyramid/notejam/templates/users/signup.pt delete mode 100644 pyramid/notejam/tests.py delete mode 100644 pyramid/notejam/views.py delete mode 100644 pyramid/production.ini delete mode 100644 pyramid/setup.cfg delete mode 100644 pyramid/setup.py delete mode 100644 rubyonrails/README.rst delete mode 100644 rubyonrails/notejam/.gitignore delete mode 100644 rubyonrails/notejam/Gemfile delete mode 100644 rubyonrails/notejam/Gemfile.lock delete mode 100644 rubyonrails/notejam/README.rdoc delete mode 100644 rubyonrails/notejam/Rakefile delete mode 100644 rubyonrails/notejam/app/assets/images/.keep delete mode 100644 rubyonrails/notejam/app/assets/javascripts/application.js delete mode 100644 rubyonrails/notejam/app/assets/javascripts/note.js.coffee delete mode 100644 rubyonrails/notejam/app/assets/javascripts/pad.js.coffee delete mode 100644 rubyonrails/notejam/app/assets/javascripts/user.js.coffee delete mode 100644 rubyonrails/notejam/app/assets/stylesheets/application.css delete mode 100644 rubyonrails/notejam/app/assets/stylesheets/base.css delete mode 100644 rubyonrails/notejam/app/assets/stylesheets/layout.css delete mode 100644 rubyonrails/notejam/app/assets/stylesheets/note.css.scss delete mode 100644 rubyonrails/notejam/app/assets/stylesheets/pad.css.scss delete mode 100644 rubyonrails/notejam/app/assets/stylesheets/skeleton.css delete mode 100644 rubyonrails/notejam/app/assets/stylesheets/style.css delete mode 100644 rubyonrails/notejam/app/assets/stylesheets/tables.css delete mode 100644 rubyonrails/notejam/app/assets/stylesheets/user.css.scss delete mode 100644 rubyonrails/notejam/app/controllers/application_controller.rb delete mode 100644 rubyonrails/notejam/app/controllers/notes_controller.rb delete mode 100644 rubyonrails/notejam/app/controllers/pads_controller.rb delete mode 100644 rubyonrails/notejam/app/controllers/users_controller.rb delete mode 100644 rubyonrails/notejam/app/helpers/application_helper.rb delete mode 100644 rubyonrails/notejam/app/helpers/note_helper.rb delete mode 100644 rubyonrails/notejam/app/helpers/pad_helper.rb delete mode 100644 rubyonrails/notejam/app/helpers/user_helper.rb delete mode 100644 rubyonrails/notejam/app/mailers/.keep delete mode 100644 rubyonrails/notejam/app/mailers/user_mailer.rb delete mode 100644 rubyonrails/notejam/app/models/.keep delete mode 100644 rubyonrails/notejam/app/models/note.rb delete mode 100644 rubyonrails/notejam/app/models/pad.rb delete mode 100644 rubyonrails/notejam/app/models/user.rb delete mode 100644 rubyonrails/notejam/app/views/layouts/application.html.erb delete mode 100644 rubyonrails/notejam/app/views/layouts/users.html.erb delete mode 100644 rubyonrails/notejam/app/views/notes/create.html.erb delete mode 100644 rubyonrails/notejam/app/views/notes/delete.html.erb delete mode 100644 rubyonrails/notejam/app/views/notes/edit.html.erb delete mode 100644 rubyonrails/notejam/app/views/notes/index.html.erb delete mode 100644 rubyonrails/notejam/app/views/notes/show.html.erb delete mode 100644 rubyonrails/notejam/app/views/pads/create.html.erb delete mode 100644 rubyonrails/notejam/app/views/pads/delete.html.erb delete mode 100644 rubyonrails/notejam/app/views/pads/edit.html.erb delete mode 100644 rubyonrails/notejam/app/views/pads/show.html.erb delete mode 100644 rubyonrails/notejam/app/views/user_mailer/send_new_password.text.erb delete mode 100644 rubyonrails/notejam/app/views/users/forgot_password.html.erb delete mode 100644 rubyonrails/notejam/app/views/users/settings.html.erb delete mode 100644 rubyonrails/notejam/app/views/users/signin.html.erb delete mode 100644 rubyonrails/notejam/app/views/users/signup.html.erb delete mode 100755 rubyonrails/notejam/bin/bundle delete mode 100755 rubyonrails/notejam/bin/rails delete mode 100755 rubyonrails/notejam/bin/rake delete mode 100644 rubyonrails/notejam/config.ru delete mode 100644 rubyonrails/notejam/config/application.rb delete mode 100644 rubyonrails/notejam/config/boot.rb delete mode 100644 rubyonrails/notejam/config/database.yml delete mode 100644 rubyonrails/notejam/config/environment.rb delete mode 100644 rubyonrails/notejam/config/environments/development.rb delete mode 100644 rubyonrails/notejam/config/environments/production.rb delete mode 100644 rubyonrails/notejam/config/environments/test.rb delete mode 100644 rubyonrails/notejam/config/initializers/assets.rb delete mode 100644 rubyonrails/notejam/config/initializers/backtrace_silencers.rb delete mode 100644 rubyonrails/notejam/config/initializers/cookies_serializer.rb delete mode 100644 rubyonrails/notejam/config/initializers/filter_parameter_logging.rb delete mode 100644 rubyonrails/notejam/config/initializers/inflections.rb delete mode 100644 rubyonrails/notejam/config/initializers/mime_types.rb delete mode 100644 rubyonrails/notejam/config/initializers/secret_token.rb delete mode 100644 rubyonrails/notejam/config/initializers/session_store.rb delete mode 100644 rubyonrails/notejam/config/initializers/wrap_parameters.rb delete mode 100644 rubyonrails/notejam/config/locales/en.yml delete mode 100644 rubyonrails/notejam/config/routes.rb delete mode 100644 rubyonrails/notejam/config/secrets.yml delete mode 100644 rubyonrails/notejam/db/migrate/20140409143934_create_users.rb delete mode 100644 rubyonrails/notejam/db/migrate/20140414192524_create_pads.rb delete mode 100644 rubyonrails/notejam/db/migrate/20140418215526_create_notes.rb delete mode 100644 rubyonrails/notejam/db/schema.rb delete mode 100644 rubyonrails/notejam/db/seeds.rb delete mode 100644 rubyonrails/notejam/log/.keep delete mode 100644 rubyonrails/notejam/public/404.html delete mode 100644 rubyonrails/notejam/public/422.html delete mode 100644 rubyonrails/notejam/public/500.html delete mode 100644 rubyonrails/notejam/public/favicon.ico delete mode 100644 rubyonrails/notejam/public/robots.txt delete mode 100644 rubyonrails/notejam/test/controllers/.keep delete mode 100644 rubyonrails/notejam/test/controllers/notes_controller_test.rb delete mode 100644 rubyonrails/notejam/test/controllers/pads_controller_test.rb delete mode 100644 rubyonrails/notejam/test/controllers/users_controller_test.rb delete mode 100644 rubyonrails/notejam/test/fixtures/.keep delete mode 100644 rubyonrails/notejam/test/fixtures/notes.yml delete mode 100644 rubyonrails/notejam/test/fixtures/pads.yml delete mode 100644 rubyonrails/notejam/test/fixtures/users.yml delete mode 100644 rubyonrails/notejam/test/helpers/.keep delete mode 100644 rubyonrails/notejam/test/helpers/note_helper_test.rb delete mode 100644 rubyonrails/notejam/test/helpers/pad_helper_test.rb delete mode 100644 rubyonrails/notejam/test/helpers/user_helper_test.rb delete mode 100644 rubyonrails/notejam/test/integration/.keep delete mode 100644 rubyonrails/notejam/test/mailers/.keep delete mode 100644 rubyonrails/notejam/test/mailers/user_mailer_test.rb delete mode 100644 rubyonrails/notejam/test/models/.keep delete mode 100644 rubyonrails/notejam/test/models/note_test.rb delete mode 100644 rubyonrails/notejam/test/models/pad_test.rb delete mode 100644 rubyonrails/notejam/test/models/user_test.rb delete mode 100644 rubyonrails/notejam/test/test_helper.rb delete mode 100644 rubyonrails/notejam/vendor/assets/javascripts/.keep delete mode 100644 rubyonrails/notejam/vendor/assets/stylesheets/.keep delete mode 100644 screenshots.rst delete mode 100644 spring/.gitignore delete mode 100644 spring/README.rst delete mode 100644 spring/src/test/resources/application-test.properties rename {spring/src => src}/main/java/net/notejam/spring/Application.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/URITemplates.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/error/ForcedErrorController.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/error/ResourceNotFoundException.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/error/UnsupportedLocaleException.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/error/package-info.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/helper/converter/StringToPeriodConverter.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/helper/converter/package-info.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/helper/reflection/Annotated.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/helper/reflection/ReflectionUtils.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/helper/reflection/package-info.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/note/Note.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/note/NoteRepository.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/note/NoteService.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/note/controller/AllNotesController.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/note/controller/CreateNoteController.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/note/controller/DeleteNoteController.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/note/controller/EditNoteController.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/note/controller/ViewNoteController.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/note/controller/package-info.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/note/package-info.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/package-info.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/pad/Pad.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/pad/PadRepository.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/pad/PadService.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/pad/controller/CreatePadController.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/pad/controller/DeletePadController.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/pad/controller/EditPadController.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/pad/controller/PadsAdvice.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/pad/controller/ViewPadNotesController.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/pad/controller/package-info.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/pad/package-info.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/security/LoginController.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/security/SecurityConfiguration.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/security/SecurityService.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/security/UserDetailsServiceImpl.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/security/owner/Owned.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/security/owner/PermitOwner.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/security/owner/PermitOwnerAspect.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/security/owner/package-info.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/security/package-info.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/User.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/UserRepository.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/UserService.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/account/Account.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/account/AccountController.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/account/constraints/CurrentPassword.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/account/constraints/CurrentPasswordValidator.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/account/constraints/package-info.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/account/package-info.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/constraints/Password.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/constraints/package-info.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/forgot/ForgotPassword.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/forgot/ForgotPasswordController.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/forgot/InvalidTokenException.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/forgot/PasswordRecoveryService.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/forgot/RecoverPasswordController.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/forgot/RecoveryToken.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/forgot/RecoveryTokenRepository.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/forgot/package-info.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/package-info.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/signup/Signup.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/signup/SignupController.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/signup/constraints/UniqueEmail.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/signup/constraints/UniqueEmailValidator.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/signup/constraints/package-info.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/user/signup/package-info.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/view/ViewConfiguration.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/view/dialect/NaturalLanguageDateProcessor.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/view/dialect/NoteTextProcessor.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/view/dialect/NotejamDialect.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/view/dialect/ProcessorUtil.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/view/dialect/package-info.java (100%) rename {spring/src => src}/main/java/net/notejam/spring/view/package-info.java (100%) rename {spring/src => src}/main/resources/application.properties (54%) rename {spring/src => src}/main/resources/messages_de.properties (100%) rename {spring/src => src}/main/resources/messages_en.properties (100%) rename {spring/src => src}/main/resources/static/css/style.css (100%) rename {spring/src => src}/main/resources/templates/error.html (100%) rename {spring/src => src}/main/resources/templates/layout.html (100%) rename {spring/src => src}/main/resources/templates/note/create.html (100%) rename {spring/src => src}/main/resources/templates/note/delete.html (100%) rename {spring/src => src}/main/resources/templates/note/edit.html (100%) rename {spring/src => src}/main/resources/templates/note/view.html (100%) rename {spring/src => src}/main/resources/templates/notes.html (100%) rename {spring/src => src}/main/resources/templates/pad/create.html (100%) rename {spring/src => src}/main/resources/templates/pad/delete.html (100%) rename {spring/src => src}/main/resources/templates/pad/edit.html (100%) rename {spring/src => src}/main/resources/templates/user/account.html (100%) rename {spring/src => src}/main/resources/templates/user/forgot-password.html (100%) rename {spring/src => src}/main/resources/templates/user/login.html (100%) rename {spring/src => src}/main/resources/templates/user/reveal-password.html (100%) rename {spring/src => src}/main/resources/templates/user/signup.html (100%) rename {spring/src => src}/test/java/net/notejam/spring/helper/converter/StringToPeriodConverterTest.java (100%) rename {spring/src => src}/test/java/net/notejam/spring/note/CreateNoteControllerTest.java (100%) rename {spring/src => src}/test/java/net/notejam/spring/note/DeleteNoteControllerTest.java (100%) rename {spring/src => src}/test/java/net/notejam/spring/note/EditNoteControllerTest.java (100%) rename {spring/src => src}/test/java/net/notejam/spring/note/NoteServiceTest.java (100%) rename {spring/src => src}/test/java/net/notejam/spring/note/ViewNoteControllerTest.java (100%) rename {spring/src => src}/test/java/net/notejam/spring/pad/CreatePadControllerTest.java (100%) rename {spring/src => src}/test/java/net/notejam/spring/pad/DeletePadControllerTest.java (100%) rename {spring/src => src}/test/java/net/notejam/spring/pad/EditPadControllerTest.java (100%) rename {spring/src => src}/test/java/net/notejam/spring/pad/ViewPadControllerTest.java (100%) rename {spring/src => src}/test/java/net/notejam/spring/security/LoginControllerTest.java (100%) rename {spring/src => src}/test/java/net/notejam/spring/security/SecurityServiceTest.java (100%) rename {spring/src => src}/test/java/net/notejam/spring/security/owner/PermitOwnerAspectTest.java (100%) rename {spring/src => src}/test/java/net/notejam/spring/security/owner/PermitOwnerIntegrationTest.java (100%) rename {spring/src => src}/test/java/net/notejam/spring/test/IntegrationTest.java (100%) rename {spring/src => src}/test/java/net/notejam/spring/test/MockMvcProvider.java (100%) rename {spring/src => src}/test/java/net/notejam/spring/test/UriUtil.java (100%) rename {spring/src => src}/test/java/net/notejam/spring/user/SignedUpUserProvider.java (100%) rename {spring/src => src}/test/java/net/notejam/spring/user/UserServiceTest.java (100%) rename {spring/src => src}/test/java/net/notejam/spring/user/signup/SignupControllerTest.java (100%) create mode 100644 src/test/resources/application-test.properties delete mode 100644 symfony/README.rst delete mode 100644 symfony/notejam/.gitignore delete mode 100644 symfony/notejam/.travis.yml delete mode 100644 symfony/notejam/LICENSE delete mode 100644 symfony/notejam/app/.htaccess delete mode 100644 symfony/notejam/app/AppCache.php delete mode 100644 symfony/notejam/app/AppKernel.php delete mode 100644 symfony/notejam/app/Resources/translations/messages.fr.xlf delete mode 100644 symfony/notejam/app/Resources/views/base.html.twig delete mode 100644 symfony/notejam/app/Resources/views/fields.html.twig delete mode 100644 symfony/notejam/app/Resources/views/user.html.twig delete mode 100644 symfony/notejam/app/SymfonyRequirements.php delete mode 100644 symfony/notejam/app/autoload.php delete mode 100644 symfony/notejam/app/cache/.gitkeep delete mode 100644 symfony/notejam/app/check.php delete mode 100644 symfony/notejam/app/config/config.yml delete mode 100644 symfony/notejam/app/config/config_dev.yml delete mode 100644 symfony/notejam/app/config/config_prod.yml delete mode 100644 symfony/notejam/app/config/config_test.yml delete mode 100644 symfony/notejam/app/config/parameters.yml delete mode 100644 symfony/notejam/app/config/parameters.yml.dist delete mode 100644 symfony/notejam/app/config/routing.yml delete mode 100644 symfony/notejam/app/config/routing_dev.yml delete mode 100644 symfony/notejam/app/config/security.yml delete mode 100644 symfony/notejam/app/config/services.yml delete mode 100755 symfony/notejam/app/console delete mode 100644 symfony/notejam/app/logs/.gitkeep delete mode 100644 symfony/notejam/app/phpunit.xml.dist delete mode 100644 symfony/notejam/composer.json delete mode 100644 symfony/notejam/composer.lock delete mode 100644 symfony/notejam/src/.htaccess delete mode 100644 symfony/notejam/src/AppBundle/AppBundle.php delete mode 100644 symfony/notejam/src/AppBundle/Controller/NoteController.php delete mode 100644 symfony/notejam/src/AppBundle/Controller/PadController.php delete mode 100644 symfony/notejam/src/AppBundle/Controller/UserController.php delete mode 100644 symfony/notejam/src/AppBundle/Entity/Note.php delete mode 100644 symfony/notejam/src/AppBundle/Entity/Pad.php delete mode 100644 symfony/notejam/src/AppBundle/Entity/User.php delete mode 100644 symfony/notejam/src/AppBundle/Form/Type/ChangePasswordType.php delete mode 100644 symfony/notejam/src/AppBundle/Form/Type/NoteType.php delete mode 100644 symfony/notejam/src/AppBundle/Form/Type/PadType.php delete mode 100644 symfony/notejam/src/AppBundle/Form/Type/UserType.php delete mode 100644 symfony/notejam/src/AppBundle/Repository/NoteRepository.php delete mode 100644 symfony/notejam/src/AppBundle/Repository/PadRepository.php delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Note/create.html.twig delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Note/delete.html.twig delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Note/edit.html.twig delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Note/list.html.twig delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Note/view.html.twig delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Pad/create.html.twig delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Pad/delete.html.twig delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Pad/edit.html.twig delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Pad/list.html.twig delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Pad/notes.html.twig delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/User/forgot-password.html.twig delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/User/index.html.twig delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/User/settings.html.twig delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/User/signin.html.twig delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/User/signup.html.twig delete mode 100644 symfony/notejam/src/AppBundle/Tests/Controller/NoteControllerTest.php delete mode 100644 symfony/notejam/src/AppBundle/Tests/Controller/PadControllerTest.php delete mode 100644 symfony/notejam/web/.htaccess delete mode 100644 symfony/notejam/web/app.php delete mode 100644 symfony/notejam/web/app_dev.php delete mode 100644 symfony/notejam/web/apple-touch-icon.png delete mode 100644 symfony/notejam/web/config.php delete mode 100644 symfony/notejam/web/css/style.css delete mode 100644 symfony/notejam/web/favicon.ico delete mode 100644 symfony/notejam/web/robots.txt delete mode 100644 terraform/modules/terraform-aws-ecs-codepipeline/fixtures.us-east-2.tfvars delete mode 100644 terraform/modules/terraform-aws-ecs-codepipeline/main.tf delete mode 100644 terraform/modules/terraform-aws-ecs-codepipeline/outputs.tf delete mode 100644 terraform/modules/terraform-aws-ecs-codepipeline/variables.tf delete mode 100644 terraform/modules/terraform-aws-ecs-codepipeline/versions.tf delete mode 100644 terraform/modules/terraform-aws-elastic-beanstalk-environment/fixtures.us-east-2.tfvars delete mode 100644 terraform/modules/terraform-aws-elastic-beanstalk-environment/main.tf delete mode 100644 terraform/modules/terraform-aws-elastic-beanstalk-environment/outputs.tf delete mode 100644 terraform/modules/terraform-aws-elastic-beanstalk-environment/variables.tf delete mode 100644 terraform/modules/terraform-aws-elastic-beanstalk-environment/versions.tf delete mode 100644 yii/README.rst delete mode 100644 yii/notejam/.gitignore delete mode 100644 yii/notejam/assets/AppAsset.php delete mode 100644 yii/notejam/codeception.yml delete mode 100644 yii/notejam/composer.json delete mode 100644 yii/notejam/composer.lock delete mode 100644 yii/notejam/config/db.php delete mode 100644 yii/notejam/config/params.php delete mode 100644 yii/notejam/config/web.php delete mode 100644 yii/notejam/controllers/BaseController.php delete mode 100644 yii/notejam/controllers/NoteController.php delete mode 100644 yii/notejam/controllers/PadController.php delete mode 100644 yii/notejam/controllers/UserController.php delete mode 100644 yii/notejam/mail/layouts/html.php delete mode 100644 yii/notejam/mail/password.php delete mode 100644 yii/notejam/migrations/m140804_111205_create_tables.php delete mode 100644 yii/notejam/models/ChangePassword.php delete mode 100644 yii/notejam/models/ForgotPassword.php delete mode 100644 yii/notejam/models/LoginForm.php delete mode 100644 yii/notejam/models/Note.php delete mode 100644 yii/notejam/models/Pad.php delete mode 100644 yii/notejam/models/SigninForm.php delete mode 100644 yii/notejam/models/SignupForm.php delete mode 100644 yii/notejam/models/User.php delete mode 100644 yii/notejam/requirements.php delete mode 100644 yii/notejam/runtime/.gitignore delete mode 100644 yii/notejam/tests/.gitignore delete mode 100644 yii/notejam/tests/README.md delete mode 100644 yii/notejam/tests/_bootstrap.php delete mode 100644 yii/notejam/tests/_config.php delete mode 100644 yii/notejam/tests/_console_bootstrap.php delete mode 100644 yii/notejam/tests/_data/dump.sql delete mode 100644 yii/notejam/tests/_log/.gitignore delete mode 100644 yii/notejam/tests/_pages/CreateNotePage.php delete mode 100644 yii/notejam/tests/_pages/CreatePadPage.php delete mode 100644 yii/notejam/tests/_pages/DeleteNotePage.php delete mode 100644 yii/notejam/tests/_pages/DeletePadPage.php delete mode 100644 yii/notejam/tests/_pages/EditNotePage.php delete mode 100644 yii/notejam/tests/_pages/EditPadPage.php delete mode 100644 yii/notejam/tests/_pages/SignedInPage.php delete mode 100644 yii/notejam/tests/_pages/SigninPage.php delete mode 100644 yii/notejam/tests/_pages/SignupPage.php delete mode 100644 yii/notejam/tests/_pages/ViewNotePage.php delete mode 100644 yii/notejam/tests/_pages/ViewPadPage.php delete mode 100644 yii/notejam/tests/acceptance.suite.yml delete mode 100644 yii/notejam/tests/acceptance/_bootstrap.php delete mode 100644 yii/notejam/tests/acceptance/_config.php delete mode 100644 yii/notejam/tests/acceptance/_console.php delete mode 100644 yii/notejam/tests/acceptance/yii delete mode 100644 yii/notejam/tests/acceptance/yii.bat delete mode 100644 yii/notejam/tests/functional.suite.yml delete mode 100644 yii/notejam/tests/functional/CreateNoteCept.php delete mode 100644 yii/notejam/tests/functional/CreatePadCept.php delete mode 100644 yii/notejam/tests/functional/DeleteNoteCept.php delete mode 100644 yii/notejam/tests/functional/DeletePadCept.php delete mode 100644 yii/notejam/tests/functional/EditNoteCept.php delete mode 100644 yii/notejam/tests/functional/EditPadCept.php delete mode 100644 yii/notejam/tests/functional/SigninCept.php delete mode 100644 yii/notejam/tests/functional/SignupCept.php delete mode 100644 yii/notejam/tests/functional/ViewNoteCept.php delete mode 100644 yii/notejam/tests/functional/ViewPadCept.php delete mode 100644 yii/notejam/tests/functional/_bootstrap.php delete mode 100644 yii/notejam/tests/functional/_config.php delete mode 100644 yii/notejam/tests/functional/_console.php delete mode 100755 yii/notejam/tests/functional/yii delete mode 100644 yii/notejam/tests/functional/yii.bat delete mode 100644 yii/notejam/tests/unit.suite.yml delete mode 100644 yii/notejam/tests/unit/_bootstrap.php delete mode 100644 yii/notejam/tests/unit/_config.php delete mode 100644 yii/notejam/tests/unit/_console.php delete mode 100644 yii/notejam/tests/unit/fixtures/.gitkeep delete mode 100644 yii/notejam/tests/unit/fixtures/data/.gitkeep delete mode 100644 yii/notejam/tests/unit/templates/fixtures/.gitkeep delete mode 100644 yii/notejam/tests/unit/yii delete mode 100644 yii/notejam/tests/unit/yii.bat delete mode 100644 yii/notejam/views/layouts/app.php delete mode 100644 yii/notejam/views/layouts/base.php delete mode 100644 yii/notejam/views/layouts/user.php delete mode 100644 yii/notejam/views/note/create.php delete mode 100644 yii/notejam/views/note/delete.php delete mode 100644 yii/notejam/views/note/edit.php delete mode 100644 yii/notejam/views/note/error.php delete mode 100644 yii/notejam/views/note/form.php delete mode 100644 yii/notejam/views/note/list.php delete mode 100644 yii/notejam/views/note/view.php delete mode 100644 yii/notejam/views/pad/create.php delete mode 100644 yii/notejam/views/pad/delete.php delete mode 100644 yii/notejam/views/pad/edit.php delete mode 100644 yii/notejam/views/pad/form.php delete mode 100644 yii/notejam/views/pad/view.php delete mode 100644 yii/notejam/views/partials/errors.php delete mode 100644 yii/notejam/views/user/forgot-password.php delete mode 100644 yii/notejam/views/user/settings.php delete mode 100644 yii/notejam/views/user/signin.php delete mode 100644 yii/notejam/views/user/signup.php delete mode 100644 yii/notejam/web/assets/.gitignore delete mode 100644 yii/notejam/web/css/site.css delete mode 100644 yii/notejam/web/css/style.css delete mode 100644 yii/notejam/web/favicon.ico delete mode 100644 yii/notejam/web/index-test.php delete mode 100644 yii/notejam/web/index.php delete mode 100644 yii/notejam/web/robots.txt delete mode 100755 yii/notejam/yii delete mode 100644 yii/notejam/yii.bat diff --git a/.github/workflows/ci-notejam.yml b/.github/workflows/ci-notejam.yml new file mode 100644 index 000000000..d9e335e1d --- /dev/null +++ b/.github/workflows/ci-notejam.yml @@ -0,0 +1,75 @@ +name: ms-cloud-config CI + +# Triggers the workflow on push or pull request events +on: [push, pull_request] + +#on: +# push: +# branches: +# - master +# pull_request: +# branches: +# - master + +defaults: + run: + working-directory: . + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Cache Maven packages + uses: actions/cache@v2 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-m2 + - name: Build with Maven + run: mvn --batch-mode --update-snapshots install + - name: 'Tar files' + run: tar -cvf app.tar target/*.jar + - uses: actions/upload-artifact@v2 + with: + name: app + path: app.tar + + docker: + name: docker ms-cloud-config + runs-on: ubuntu-latest + needs: build + if: github.ref == 'refs/heads/master' + + steps: + - name: Checkout + uses: actions/checkout@v2.3.4 + # share artifact across jobs + - uses: actions/download-artifact@v2 + with: + name: app + - name: 'Untar files' + run: mkdir -p target && tar -xvf app.tar target + # build + push docker img + - name: Set up QEMU + uses: docker/setup-qemu-action@v1.1.0 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1.3.0 + - name: Login to DockerHub + uses: docker/login-action@v1.9.0 + with: + username: ${{ secrets.ECR_USERNAME }} + password: ${{ secrets.ECR_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v2.4.0 + with: + context: . + push: true +# tags: 441604169807.dkr.ecr.eu-west-1.amazonaws.com/notejam:${{ github.sha }},441604169807.dkr.ecr.eu-west-1.amazonaws.com/notejam:latest + tags: 441604169807.dkr.ecr.eu-west-1.amazonaws.com/notejam:latest \ No newline at end of file diff --git a/.gitignore b/.gitignore index aba103733..bccac361c 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,9 @@ bower_components .bak +# maven +target/ + +#idea +.idea/ +*.iml \ No newline at end of file diff --git a/CA_TECH b/CA_TECH deleted file mode 100644 index 3ef2665c8..000000000 --- a/CA_TECH +++ /dev/null @@ -1,84 +0,0 @@ -#!groovy - -node('slave_CA_notejam') { - /*stage('Clean Environment') { - cleanWs() - } - - stage('Code Check Out') { - withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', accessKeyVariable: 'AWS_ACCESS_KEY_ID', credentialsId: 'jenkins-service-account', secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) { - sh label: '', script: '''git config --global credential.helper \'!aws --profile assume_mobile codecommit credential-helper $@\'''' - */// checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'jenkins-service-codecommit', url: 'https://git-codecommit.eu-central-1.amazonaws.com/v1/repos/ma_android-platform']]]) - /* } - }*/ - - /*stage('SonarQube Code Analysis') { - echo 'Analysing code...' - withSonarQubeEnv('SonarQube') { - sh returnStdout: true, script: ''' - gradle wrapper - ./gradlew sonarqube -x compileDebugAndroidTestKotlin -x compileDebugUnitTestKotlin -Dsonar.host.url=${SONAR_HOST_URL} -Dsonar.projectKey=${JOB_BASE_NAME} -Dsonar.projectName=$JOB_BASE_NAME -Dsonar.projectVersion=1.0-SNAPSHOT - ''' - sleep 10; - } - }*/ - - stage('SonarQube Code Analysis') { - echo 'Analysing code...' - withSonarQubeEnv('SonarQube') { - sh returnStdout: true, script: ''' - gradle wrapper - ./gradlew sonarqube -Dsonar.host.url=${SONAR_HOST_URL} -Dsonar.projectKey=${JOB_BASE_NAME} -Dsonar.projectName=$JOB_BASE_NAME -Dsonar.projectVersion=1.0-SNAPSHOT - ''' - sleep 10; - } - } - - stage("SonarQube Quality-Gate Validation") { - echo 'Quality Gate Verification...' - timeout(time: 1, unit: 'MINUTES') { - def qg = waitForQualityGate() - if (qg.status != 'OK') { - error "Pipeline aborted due to quality gate failure: ${qg.status}" - } - } - } - - stage('Build') { - echo 'Building ..' - sh returnStdout: true, script: ''' - ./gradlew clean assembleDebug - ''' - } - - stage('Push .APK to Nexus') { - withEnv([ - 'NEXUS_CREDS=nexus-service-account', - 'NEXUS_URL=artifacts.le.tnt.bank.ikano', - 'NEXUS_REPO=maven-snapshots', - 'NEXUS_PROTOCOL=https', - 'NEXUS_VERSION=nexus3' - ]) { - filesByGlob = findFiles(glob: "app/build/outputs/apk/debug/*.apk"); - artifactPath = filesByGlob[0].path; - artifactExists = fileExists artifactPath - if(artifactExists) { - nexusArtifactUploader( - nexusVersion: NEXUS_VERSION, - protocol: NEXUS_PROTOCOL, - nexusUrl: NEXUS_URL, - groupId: 'com.ikano.ipay.mobile', - version: '1.0-SNAPSHOT', - repository: NEXUS_REPO, - credentialsId: NEXUS_CREDS, - artifacts: [ - [artifactId: 'ma_android-platform', - type: 'apk', - file: artifactPath, - classifier: ''] - ] - ) - } - } - } -} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..4f1f5af6e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,4 @@ +FROM openjdk:8-jdk-alpine +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file diff --git a/README.rst b/README.rst index 07f28807c..2e3b57aa3 100644 --- a/README.rst +++ b/README.rst @@ -1,143 +1,103 @@ -******* -Notejam -******* +*************** +Notejam: Spring +*************** -**The easy way to learn web frameworks** +Notejam application implemented using `Spring `_ framework. -Do you know framework X and want to try framework Y? -The easy way to start with a new framework is to compare it with frameworks you already know. -The goal of the project is to help developers easily learn new frameworks by examples. +Spring version: 4.2.3 -Notejam is a unified sample web application (more than just "Hello World") implemented using different server-side frameworks. -Currently python, php, ruby and javascript frameworks are supported. +The full stack is: +- `Spring Boot `_ (Spring configuration) +- `Thymeleaf `_ (View) +- `Spring Security `_ (Security framework) +- `Spring`_ (DI and MVC framework) +- `Spring Data `_ (Persistence abstraction) +- `JPA `_ (Persistence API) +- `Hibernate `_ (JPA implementation) -==================== -Supported frameworks -==================== +The application is maintained by `@malkusch `_. -**Python** +========================== +Installation and launching +========================== +----- +Clone +----- -* `Django `_ -* `Flask `_ -* `Pyramid `_ +Clone the repo: -**PHP** +.. code-block:: bash -* `Laravel `_ -* `Yii `_ -* `CakePHP `_ -* `Nette `_ / `Nette + Doctrine `_ -* `Symfony `_ + $ git clone https://github.com/komarserjio/notejam YOUR_PROJECT_DIR/ -**Ruby** +------- +Install +------- -* `Padrino `_ -* `Ruby on Rails `_ +Install a `JDK `_ and `Maven `_. -**Java** +------------- +Configuration +------------- -* `Spring `_ +The application has a password recovery process which involves sending an email. +If you want to enable that, you have to create a local application.properties file +and set there the property spring.mail.host to your SMTP server (e.g. spring.mail.host = smtp.example.net). -**Javascript (node.js)** +.. code-block:: bash -* `Express `_ + $ cd YOUR_PROJECT_DIR/spring/ + $ vi application.properties +See `MailProperties `_ +for more mail properties. -In progress ------------ +------ +Launch +------ -**Scala** +Compile and launch the application: -* Play +.. code-block:: bash -**Clojure** + $ cd YOUR_PROJECT_DIR/spring/ + $ mvn spring-boot:run -* Compojure +Go to http://localhost:8080/ in your browser. -... and more frameworks are coming soon. +~~~~~~~~~~~~ +Localization +~~~~~~~~~~~~ -==================== -Application overview -==================== +This application comes with support for the languages German and English. The locale is +determined by the Accept-Language request header. If the header is not present the +content will be served with the default locale of the JVM. The application will not +start if the default locale is non of the supported languages. -Notejam is a web application which offers user to sign up/in/out and create/view/edit/delete notes. -Notes are grouped in pads. +--------- +Run tests +--------- -**Screenshots** +Run functional and unit tests: -.. image:: https://github.com/komarserjio/notejam/blob/master/html/screenshots/1p.png - :alt: Sign in - :width: 400 - :align: center - :target: https://github.com/komarserjio/notejam/tree/master/screenshots.rst +.. code-block:: bash -.. image:: https://github.com/komarserjio/notejam/blob/master/html/screenshots/2p.png - :alt: All notes - :width: 400 - :align: center - :target: https://github.com/komarserjio/notejam/tree/master/screenshots.rst - -.. image:: https://github.com/komarserjio/notejam/blob/master/html/screenshots/3p.png - :alt: New note - :width: 400 - :align: center - :target: https://github.com/komarserjio/notejam/tree/master/screenshots.rst - -See `more screenshots `_ -for look and feel. - -See `detailed overview `_. - -Typical application covers following topics: - -* Request/Response handling -* Routing -* Templates -* Configuration -* Authentication -* Forms -* Error handling -* Database/ORM -* Mailing -* Functional/unit testing - -============= -How to launch -============= - -All implementations are SQLite based and quickly launchable by built-in web servers. -Each implementation has instruction describing easy steps to install environment, launch and run tests. + $ cd YOUR_PROJECT_DIR/spring/ + $ mvn test ============ Contribution ============ -Contribution is more than welcome! -Contribute improvements to existing applications to help them follow best practices -or provide new implementation for unsupported framework. +Do you have Java/Spring experience? Help the application to follow Java and Spring best practices. +Please send your pull requests in the ``master`` branch. +Always prepend your commits with framework name: -**Do you want to improve one of the existing implementations?** +.. code-block:: bash -Each implementation has its own README with contribution details. - -**Do you want to add new framework?** + Spring: Implement sign in functionality Read `contribution guide `_ for details. - -======== -Contacts -======== - -* Twitter: `@komarserjio `_ -* Email: komarserjio gmail.com - -======= -License -======= - -MIT © Serhii Komar. - -See `license `_. diff --git a/cakephp/README.rst b/cakephp/README.rst deleted file mode 100644 index 606fd5e89..000000000 --- a/cakephp/README.rst +++ /dev/null @@ -1,88 +0,0 @@ -**************** -Notejam: CakePHP -**************** - -Notejam application implemented using `CakePHP `_ framework. - -CakePHP version: 3.1 - -PHP version required: 5.5+ - -========================== -Installation and launching -========================== - ------ -Clone ------ - -Clone the repo: - -.. code-block:: bash - - $ git clone git@github.com:komarserjio/notejam.git YOUR_PROJECT_DIR/ - -------- -Install -------- - -Install `composer `_ - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/cakephp/notejam - $ curl -s https://getcomposer.org/installer | php - -Install dependencies - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/cakephp/notejam - $ php composer.phar install - -Create database schema - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/cakephp/notejam - $ ./bin/cake migrations migrate - - ------- -Launch ------- - -Start built-in php web server: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/cakephp/notejam - $ ./bin/cake server - -Go to http://localhost:8765 in your browser. - ---------- -Run tests ---------- - -Run functional tests: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/cakephp/notejam/ - $ ./vendor/bin/phpunit - - -============ -Contribution -============ -Do you have CakePHP experience? Help the app to follow PHP and CakePHP best practices. - -Please send your pull requests in the ``master`` branch. -Always prepend your commits with framework name: - -.. code-block:: bash - - CakePHP: Implemented sign in functionality - -Read `contribution guide `_ for details. diff --git a/cakephp/notejam/.editorconfig b/cakephp/notejam/.editorconfig deleted file mode 100644 index 706190175..000000000 --- a/cakephp/notejam/.editorconfig +++ /dev/null @@ -1,18 +0,0 @@ -; This file is for unifying the coding style for different editors and IDEs. -; More information at http://editorconfig.org - -root = true - -[*] -indent_style = space -indent_size = 4 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true - -[*.bat] -end_of_line = crlf - -[*.yml] -indent_style = space -indent_size = 2 diff --git a/cakephp/notejam/.gitattributes b/cakephp/notejam/.gitattributes deleted file mode 100644 index 926a808fc..000000000 --- a/cakephp/notejam/.gitattributes +++ /dev/null @@ -1,36 +0,0 @@ -# Define the line ending behavior of the different file extensions -# Set default behaviour, in case users don't have core.autocrlf set. -* text=auto -* text eol=lf - -# Explicitly declare text files we want to always be normalized and converted -# to native line endings on checkout. -*.php text -*.default text -*.ctp text -*.sql text -*.md text -*.po text -*.js text -*.css text -*.ini text -*.properties text -*.txt text -*.xml text -*.yml text -.htaccess text - -# Declare files that will always have CRLF line endings on checkout. -*.bat eol=crlf - -# Declare files that will always have LF line endings on checkout. -*.pem eol=lf - -# Denote all files that are truly binary and should not be modified. -*.png binary -*.jpg binary -*.gif binary -*.ico binary -*.mo binary -*.pdf binary -*.phar binary diff --git a/cakephp/notejam/.gitignore b/cakephp/notejam/.gitignore deleted file mode 100644 index 46bc8c5c9..000000000 --- a/cakephp/notejam/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/vendor/* -/tmp/* -/logs/* -composer.lock diff --git a/cakephp/notejam/.htaccess b/cakephp/notejam/.htaccess deleted file mode 100644 index fc3aac4b2..000000000 --- a/cakephp/notejam/.htaccess +++ /dev/null @@ -1,5 +0,0 @@ - - RewriteEngine on - RewriteRule ^$ webroot/ [L] - RewriteRule (.*) webroot/$1 [L] - \ No newline at end of file diff --git a/cakephp/notejam/.travis.yml b/cakephp/notejam/.travis.yml deleted file mode 100644 index b9b337904..000000000 --- a/cakephp/notejam/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -language: php - -sudo: false - -php: - - 5.4 - - 5.5 - - 5.6 - -before_script: - - sh -c "composer require 'cakephp/cakephp-codesniffer:dev-master'" - - phpenv rehash - -script: - - sh -c "vendor/bin/phpcs -p --extensions=php --standard=vendor/cakephp/cakephp-codesniffer/CakePHP ./src ./tests ./config ./webroot" - -notifications: - email: false diff --git a/cakephp/notejam/bin/cake b/cakephp/notejam/bin/cake deleted file mode 100755 index ffdacace9..000000000 --- a/cakephp/notejam/bin/cake +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env bash -################################################################################ -# -# Bake is a shell script for running CakePHP bake script -# -# CakePHP(tm) : Rapid Development Framework (http://cakephp.org) -# Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) -# -# Licensed under The MIT License -# For full copyright and license information, please see the LICENSE.txt -# Redistributions of files must retain the above copyright notice. -# -# @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) -# @link http://cakephp.org CakePHP(tm) Project -# @since 1.2.0 -# @license http://www.opensource.org/licenses/mit-license.php MIT License -# -################################################################################ - -# Canonicalize by following every symlink of the given name recursively -canonicalize() { - NAME="$1" - if [ -f "$NAME" ] - then - DIR=$(dirname -- "$NAME") - NAME=$(cd -P "$DIR" > /dev/null && pwd -P)/$(basename -- "$NAME") - fi - while [ -h "$NAME" ]; do - DIR=$(dirname -- "$NAME") - SYM=$(readlink "$NAME") - NAME=$(cd "$DIR" > /dev/null && cd $(dirname -- "$SYM") > /dev/null && pwd)/$(basename -- "$SYM") - done - echo "$NAME" -} - -CONSOLE=$(dirname -- "$(canonicalize "$0")") -APP=$(dirname "$CONSOLE") - -exec php "$CONSOLE"/cake.php "$@" -exit diff --git a/cakephp/notejam/bin/cake.bat b/cakephp/notejam/bin/cake.bat deleted file mode 100644 index dd1d9a821..000000000 --- a/cakephp/notejam/bin/cake.bat +++ /dev/null @@ -1,30 +0,0 @@ -:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: -:: Bake is a shell script for running CakePHP bake script -:: -:: CakePHP(tm) : Rapid Development Framework (http://cakephp.org) -:: Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) -:: -:: Licensed under The MIT License -:: Redistributions of files must retain the above copyright notice. -:: -:: @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) -:: @link http://cakephp.org CakePHP(tm) Project -:: @since 2.0.0 -:: @license http://www.opensource.org/licenses/mit-license.php MIT License -:: -:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - -:: In order for this script to work as intended, the cake\console\ folder must be in your PATH - -@echo. -@echo off - -SET app=%0 -SET lib=%~dp0 - -php "%lib%cake.php" %* - -echo. - -exit /B %ERRORLEVEL% diff --git a/cakephp/notejam/bin/cake.php b/cakephp/notejam/bin/cake.php deleted file mode 100644 index 4c7d7cef8..000000000 --- a/cakephp/notejam/bin/cake.php +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/php -q -require->php)) { - $minVersion = preg_replace('/([^0-9\.])/', '', $composer->require->php); - } -} -if (version_compare(phpversion(), $minVersion, '<')) { - fwrite(STDERR, sprintf("Minimum PHP version: %s. You are using: %s.\n", $minVersion, phpversion())); - exit(-1); -} - -include dirname(__DIR__) . '/config/bootstrap.php'; - -exit(Cake\Console\ShellDispatcher::run($argv)); diff --git a/cakephp/notejam/composer.json b/cakephp/notejam/composer.json deleted file mode 100644 index 6f1107153..000000000 --- a/cakephp/notejam/composer.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "cakephp/app", - "description": "Notejam app", - "homepage": "https://github.com/komarserjio/notejam", - "type": "project", - "license": "MIT", - "require": { - "php": ">=5.6.0", - "cakephp/cakephp": "^3.5", - "mobiledetect/mobiledetectlib": "2.*", - "cakephp/migrations": "~1.0", - "cakephp/plugin-installer": "*" - }, - "require-dev": { - "psy/psysh": "@stable", - "cakephp/debug_kit": "~3.0", - "cakephp/bake": "~1.0", - "phpunit/phpunit": "^5.7|^6.0" - }, - "suggest": { - "phpunit/phpunit": "Allows automated tests to be run without system-wide install.", - "cakephp/cakephp-codesniffer": "Allows to check the code against the coding standards used in CakePHP." - }, - "autoload": { - "psr-4": { - "App\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "App\\Test\\": "tests", - "Cake\\Test\\": "./vendor/cakephp/cakephp/tests" - } - }, - "scripts": { - "post-install-cmd": "App\\Console\\Installer::postInstall", - "post-autoload-dump": "Cake\\Composer\\Installer\\PluginInstaller::postAutoloadDump" - }, - "minimum-stability": "dev", - "prefer-stable": true -} diff --git a/cakephp/notejam/config/Migrations/20150928200943_initial.php b/cakephp/notejam/config/Migrations/20150928200943_initial.php deleted file mode 100644 index 7ba3488b1..000000000 --- a/cakephp/notejam/config/Migrations/20150928200943_initial.php +++ /dev/null @@ -1,141 +0,0 @@ -table('notes'); - $table - ->addColumn('pad_id', 'integer', [ - 'default' => null, - 'limit' => null, - 'null' => true, - ]) - ->addColumn('user_id', 'integer', [ - 'default' => null, - 'limit' => null, - 'null' => false, - ]) - ->addColumn('name', 'string', [ - 'default' => null, - 'limit' => 100, - 'null' => false, - ]) - ->addColumn('text', 'text', [ - 'default' => null, - 'limit' => null, - 'null' => false, - ]) - ->addColumn('created_at', 'datetime', [ - 'default' => null, - 'limit' => null, - 'null' => false, - ]) - ->addColumn('updated_at', 'datetime', [ - 'default' => null, - 'limit' => null, - 'null' => false, - ]) - ->addIndex( - [ - 'pad_id', - ] - ) - ->addIndex( - [ - 'user_id', - ] - ) - ->create(); - - $table = $this->table('pads'); - $table - ->addColumn('name', 'string', [ - 'default' => null, - 'limit' => 100, - 'null' => false, - ]) - ->addColumn('user_id', 'integer', [ - 'default' => null, - 'limit' => null, - 'null' => false, - ]) - ->addIndex( - [ - 'user_id', - ] - ) - ->create(); - - $table = $this->table('users'); - $table - ->addColumn('email', 'string', [ - 'default' => null, - 'limit' => 75, - 'null' => false, - ]) - ->addColumn('password', 'string', [ - 'default' => null, - 'limit' => 128, - 'null' => false, - ]) - ->create(); - - $this->table('notes') - ->addForeignKey( - 'pad_id', - 'pads', - 'id', - [ - 'update' => 'NO_ACTION', - 'delete' => 'NO_ACTION' - ] - ) - ->addForeignKey( - 'user_id', - 'users', - 'id', - [ - 'update' => 'NO_ACTION', - 'delete' => 'NO_ACTION' - ] - ) - ->update(); - - $this->table('pads') - ->addForeignKey( - 'user_id', - 'users', - 'id', - [ - 'update' => 'NO_ACTION', - 'delete' => 'NO_ACTION' - ] - ) - ->update(); - - } - - public function down() - { - $this->table('notes') - ->dropForeignKey( - 'pad_id' - ) - ->dropForeignKey( - 'user_id' - ) - ->update(); - - $this->table('pads') - ->dropForeignKey( - 'user_id' - ) - ->update(); - - $this->dropTable('notes'); - $this->dropTable('pads'); - $this->dropTable('users'); - } -} diff --git a/cakephp/notejam/config/app.default.php b/cakephp/notejam/config/app.default.php deleted file mode 100644 index 52722ccaf..000000000 --- a/cakephp/notejam/config/app.default.php +++ /dev/null @@ -1,326 +0,0 @@ - true, - - /** - * Configure basic information about the application. - * - * - namespace - The namespace to find app classes under. - * - encoding - The encoding used for HTML + database connections. - * - base - The base directory the app resides in. If false this - * will be auto detected. - * - dir - Name of app directory. - * - webroot - The webroot directory. - * - wwwRoot - The file path to webroot. - * - baseUrl - To configure CakePHP to *not* use mod_rewrite and to - * use CakePHP pretty URLs, remove these .htaccess - * files: - * /.htaccess - * /webroot/.htaccess - * And uncomment the baseUrl key below. - * - fullBaseUrl - A base URL to use for absolute links. - * - imageBaseUrl - Web path to the public images directory under webroot. - * - cssBaseUrl - Web path to the public css directory under webroot. - * - jsBaseUrl - Web path to the public js directory under webroot. - * - paths - Configure paths for non class based resources. Supports the - * `plugins`, `templates`, `locales` subkeys, which allow the definition of - * paths for plugins, view templates and locale files respectively. - */ - 'App' => [ - 'namespace' => 'App', - 'encoding' => 'UTF-8', - 'base' => false, - 'dir' => 'src', - 'webroot' => 'webroot', - 'wwwRoot' => WWW_ROOT, - // 'baseUrl' => env('SCRIPT_NAME'), - 'fullBaseUrl' => false, - 'imageBaseUrl' => 'img/', - 'cssBaseUrl' => 'css/', - 'jsBaseUrl' => 'js/', - 'paths' => [ - 'plugins' => [ROOT . DS . 'plugins' . DS], - 'templates' => [APP . 'Template' . DS], - 'locales' => [APP . 'Locale' . DS], - ], - ], - - /** - * Security and encryption configuration - * - * - salt - A random string used in security hashing methods. - * The salt value is also used as the encryption key. - * You should treat it as extremely sensitive data. - */ - 'Security' => [ - 'salt' => '__SALT__', - ], - - /** - * Apply timestamps with the last modified time to static assets (js, css, images). - * Will append a querystring parameter containing the time the file was modified. - * This is useful for busting browser caches. - * - * Set to true to apply timestamps when debug is true. Set to 'force' to always - * enable timestamping regardless of debug value. - */ - 'Asset' => [ - // 'timestamp' => true, - ], - - /** - * Configure the cache adapters. - */ - 'Cache' => [ - 'default' => [ - 'className' => 'File', - 'path' => CACHE, - ], - - /** - * Configure the cache used for general framework caching. Path information, - * object listings, and translation cache files are stored with this - * configuration. - */ - '_cake_core_' => [ - 'className' => 'File', - 'prefix' => 'myapp_cake_core_', - 'path' => CACHE . 'persistent/', - 'serialize' => true, - 'duration' => '+2 minutes', - ], - - /** - * Configure the cache for model and datasource caches. This cache - * configuration is used to store schema descriptions, and table listings - * in connections. - */ - '_cake_model_' => [ - 'className' => 'File', - 'prefix' => 'myapp_cake_model_', - 'path' => CACHE . 'models/', - 'serialize' => true, - 'duration' => '+2 minutes', - ], - ], - - /** - * Configure the Error and Exception handlers used by your application. - * - * By default errors are displayed using Debugger, when debug is true and logged - * by Cake\Log\Log when debug is false. - * - * In CLI environments exceptions will be printed to stderr with a backtrace. - * In web environments an HTML page will be displayed for the exception. - * With debug true, framework errors like Missing Controller will be displayed. - * When debug is false, framework errors will be coerced into generic HTTP errors. - * - * Options: - * - * - `errorLevel` - int - The level of errors you are interested in capturing. - * - `trace` - boolean - Whether or not backtraces should be included in - * logged errors/exceptions. - * - `log` - boolean - Whether or not you want exceptions logged. - * - `exceptionRenderer` - string - The class responsible for rendering - * uncaught exceptions. If you choose a custom class you should place - * the file for that class in src/Error. This class needs to implement a - * render method. - * - `skipLog` - array - List of exceptions to skip for logging. Exceptions that - * extend one of the listed exceptions will also be skipped for logging. - * E.g.: - * `'skipLog' => ['Cake\Network\Exception\NotFoundException', 'Cake\Network\Exception\UnauthorizedException']` - */ - 'Error' => [ - 'errorLevel' => E_ALL & ~E_DEPRECATED, - 'exceptionRenderer' => 'Cake\Error\ExceptionRenderer', - 'skipLog' => [], - 'log' => true, - 'trace' => true, - ], - - /** - * Email configuration. - * - * You can configure email transports and email delivery profiles here. - * - * By defining transports separately from delivery profiles you can easily - * re-use transport configuration across multiple profiles. - * - * You can specify multiple configurations for production, development and - * testing. - * - * ### Configuring transports - * - * Each transport needs a `className`. Valid options are as follows: - * - * Mail - Send using PHP mail function - * Smtp - Send using SMTP - * Debug - Do not send the email, just return the result - * - * You can add custom transports (or override existing transports) by adding the - * appropriate file to src/Network/Email. Transports should be named - * 'YourTransport.php', where 'Your' is the name of the transport. - * - * ### Configuring delivery profiles - * - * Delivery profiles allow you to predefine various properties about email - * messages from your application and give the settings a name. This saves - * duplication across your application and makes maintenance and development - * easier. Each profile accepts a number of keys. See `Cake\Network\Email\Email` - * for more information. - */ - 'EmailTransport' => [ - 'default' => [ - 'className' => 'Mail', - // The following keys are used in SMTP transports - 'host' => 'localhost', - 'port' => 25, - 'timeout' => 30, - 'username' => 'user', - 'password' => 'secret', - 'client' => null, - 'tls' => null, - ], - ], - - 'Email' => [ - 'default' => [ - 'transport' => 'default', - 'from' => 'you@localhost', - //'charset' => 'utf-8', - //'headerCharset' => 'utf-8', - ], - ], - - /** - * Connection information used by the ORM to connect - * to your application's datastores. - * Drivers include Mysql Postgres Sqlite Sqlserver - * See vendor\cakephp\cakephp\src\Database\Driver for complete list - */ - 'Datasources' => [ - 'default' => [ - 'className' => 'Cake\Database\Connection', - 'driver' => 'Cake\Database\Driver\Mysql', - 'persistent' => false, - 'host' => 'localhost', - /** - * CakePHP will use the default DB port based on the driver selected - * MySQL on MAMP uses port 8889, MAMP users will want to uncomment - * the following line and set the port accordingly - */ - //'port' => 'nonstandard_port_number', - 'username' => 'my_app', - 'password' => 'secret', - 'database' => 'my_app', - 'encoding' => 'utf8', - 'timezone' => 'UTC', - 'cacheMetadata' => true, - - /** - * Set identifier quoting to true if you are using reserved words or - * special characters in your table or column names. Enabling this - * setting will result in queries built using the Query Builder having - * identifiers quoted when creating SQL. It should be noted that this - * decreases performance because each query needs to be traversed and - * manipulated before being executed. - */ - 'quoteIdentifiers' => false, - - /** - * During development, if using MySQL < 5.6, uncommenting the - * following line could boost the speed at which schema metadata is - * fetched from the database. It can also be set directly with the - * mysql configuration directive 'innodb_stats_on_metadata = 0' - * which is the recommended value in production environments - */ - //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'], - ], - - /** - * The test connection is used during the test suite. - */ - 'test' => [ - 'className' => 'Cake\Database\Connection', - 'driver' => 'Cake\Database\Driver\Mysql', - 'persistent' => false, - 'host' => 'localhost', - //'port' => 'nonstandard_port_number', - 'username' => 'my_app', - 'password' => 'secret', - 'database' => 'test_myapp', - 'encoding' => 'utf8', - 'timezone' => 'UTC', - 'cacheMetadata' => true, - 'quoteIdentifiers' => false, - //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'], - ], - ], - - /** - * Configures logging options - */ - 'Log' => [ - 'debug' => [ - 'className' => 'Cake\Log\Engine\FileLog', - 'path' => LOGS, - 'file' => 'debug', - 'levels' => ['notice', 'info', 'debug'], - ], - 'error' => [ - 'className' => 'Cake\Log\Engine\FileLog', - 'path' => LOGS, - 'file' => 'error', - 'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'], - ], - ], - - /** - * - * Session configuration. - * - * Contains an array of settings to use for session configuration. The - * `defaults` key is used to define a default preset to use for sessions, any - * settings declared here will override the settings of the default config. - * - * ## Options - * - * - `cookie` - The name of the cookie to use. Defaults to 'CAKEPHP'. - * - `cookiePath` - The url path for which session cookie is set. Maps to the - * `session.cookie_path` php.ini config. Defaults to base path of app. - * - `timeout` - The time in minutes the session should be valid for. - * Pass 0 to disable checking timeout. - * - `defaults` - The default configuration set to use as a basis for your session. - * There are four built-in options: php, cake, cache, database. - * - `handler` - Can be used to enable a custom session handler. Expects an - * array with at least the `engine` key, being the name of the Session engine - * class to use for managing the session. CakePHP bundles the `CacheSession` - * and `DatabaseSession` engines. - * - `ini` - An associative array of additional ini values to set. - * - * The built-in `defaults` options are: - * - * - 'php' - Uses settings defined in your php.ini. - * - 'cake' - Saves session files in CakePHP's /tmp directory. - * - 'database' - Uses CakePHP's database sessions. - * - 'cache' - Use the Cache class to save sessions. - * - * To define a custom session handler, save it at src/Network/Session/.php. - * Make sure the class implements PHP's `SessionHandlerInterface` and set - * Session.handler to - * - * To use database sessions, load the SQL file located at config/Schema/sessions.sql - */ - 'Session' => [ - 'defaults' => 'php', - ], -]; diff --git a/cakephp/notejam/config/app.php b/cakephp/notejam/config/app.php deleted file mode 100644 index 3c36cdb55..000000000 --- a/cakephp/notejam/config/app.php +++ /dev/null @@ -1,313 +0,0 @@ - true, - - /** - * Configure basic information about the application. - * - * - namespace - The namespace to find app classes under. - * - encoding - The encoding used for HTML + database connections. - * - base - The base directory the app resides in. If false this - * will be auto detected. - * - dir - Name of app directory. - * - webroot - The webroot directory. - * - wwwRoot - The file path to webroot. - * - baseUrl - To configure CakePHP to *not* use mod_rewrite and to - * use CakePHP pretty URLs, remove these .htaccess - * files: - * /.htaccess - * /webroot/.htaccess - * And uncomment the baseUrl key below. - * - fullBaseUrl - A base URL to use for absolute links. - * - imageBaseUrl - Web path to the public images directory under webroot. - * - cssBaseUrl - Web path to the public css directory under webroot. - * - jsBaseUrl - Web path to the public js directory under webroot. - * - paths - Configure paths for non class based resources. Supports the - * `plugins`, `templates`, `locales` subkeys, which allow the definition of - * paths for plugins, view templates and locale files respectively. - */ - 'App' => [ - 'namespace' => 'App', - 'encoding' => 'UTF-8', - 'base' => false, - 'dir' => 'src', - 'webroot' => 'webroot', - 'wwwRoot' => WWW_ROOT, - // 'baseUrl' => env('SCRIPT_NAME'), - 'fullBaseUrl' => false, - 'imageBaseUrl' => 'img/', - 'cssBaseUrl' => 'css/', - 'jsBaseUrl' => 'js/', - 'paths' => [ - 'plugins' => [ROOT . DS . 'plugins' . DS], - 'templates' => [APP . 'Template' . DS], - 'locales' => [APP . 'Locale' . DS], - ], - ], - - /** - * Security and encryption configuration - * - * - salt - A random string used in security hashing methods. - * The salt value is also used as the encryption key. - * You should treat it as extremely sensitive data. - */ - 'Security' => [ - 'salt' => '5a7f2d28c26b43c1eca92cd2fabb1a18bbba049f43799f6399f701a0c3f074d3', - ], - - /** - * Apply timestamps with the last modified time to static assets (js, css, images). - * Will append a querystring parameter containing the time the file was modified. - * This is useful for busting browser caches. - * - * Set to true to apply timestamps when debug is true. Set to 'force' to always - * enable timestamping regardless of debug value. - */ - 'Asset' => [ - // 'timestamp' => true, - ], - - /** - * Configure the cache adapters. - */ - 'Cache' => [ - 'default' => [ - 'className' => 'File', - 'path' => CACHE, - ], - - /** - * Configure the cache used for general framework caching. Path information, - * object listings, and translation cache files are stored with this - * configuration. - */ - '_cake_core_' => [ - 'className' => 'File', - 'prefix' => 'myapp_cake_core_', - 'path' => CACHE . 'persistent/', - 'serialize' => true, - 'duration' => '+2 minutes', - ], - - /** - * Configure the cache for model and datasource caches. This cache - * configuration is used to store schema descriptions, and table listings - * in connections. - */ - '_cake_model_' => [ - 'className' => 'File', - 'prefix' => 'myapp_cake_model_', - 'path' => CACHE . 'models/', - 'serialize' => true, - 'duration' => '+2 minutes', - ], - ], - - /** - * Configure the Error and Exception handlers used by your application. - * - * By default errors are displayed using Debugger, when debug is true and logged - * by Cake\Log\Log when debug is false. - * - * In CLI environments exceptions will be printed to stderr with a backtrace. - * In web environments an HTML page will be displayed for the exception. - * With debug true, framework errors like Missing Controller will be displayed. - * When debug is false, framework errors will be coerced into generic HTTP errors. - * - * Options: - * - * - `errorLevel` - int - The level of errors you are interested in capturing. - * - `trace` - boolean - Whether or not backtraces should be included in - * logged errors/exceptions. - * - `log` - boolean - Whether or not you want exceptions logged. - * - `exceptionRenderer` - string - The class responsible for rendering - * uncaught exceptions. If you choose a custom class you should place - * the file for that class in src/Error. This class needs to implement a - * render method. - * - `skipLog` - array - List of exceptions to skip for logging. Exceptions that - * extend one of the listed exceptions will also be skipped for logging. - * E.g.: - * `'skipLog' => ['Cake\Network\Exception\NotFoundException', 'Cake\Network\Exception\UnauthorizedException']` - */ - 'Error' => [ - 'errorLevel' => E_ALL & ~E_DEPRECATED, - 'exceptionRenderer' => 'Cake\Error\ExceptionRenderer', - 'skipLog' => [], - 'log' => true, - 'trace' => true, - ], - - /** - * Email configuration. - * - * You can configure email transports and email delivery profiles here. - * - * By defining transports separately from delivery profiles you can easily - * re-use transport configuration across multiple profiles. - * - * You can specify multiple configurations for production, development and - * testing. - * - * ### Configuring transports - * - * Each transport needs a `className`. Valid options are as follows: - * - * Mail - Send using PHP mail function - * Smtp - Send using SMTP - * Debug - Do not send the email, just return the result - * - * You can add custom transports (or override existing transports) by adding the - * appropriate file to src/Network/Email. Transports should be named - * 'YourTransport.php', where 'Your' is the name of the transport. - * - * ### Configuring delivery profiles - * - * Delivery profiles allow you to predefine various properties about email - * messages from your application and give the settings a name. This saves - * duplication across your application and makes maintenance and development - * easier. Each profile accepts a number of keys. See `Cake\Network\Email\Email` - * for more information. - */ - 'EmailTransport' => [ - 'default' => [ - 'className' => 'Mail', - // The following keys are used in SMTP transports - 'host' => 'localhost', - 'port' => 25, - 'timeout' => 30, - 'username' => 'user', - 'password' => 'secret', - 'client' => null, - 'tls' => null, - ], - ], - - 'Email' => [ - 'default' => [ - 'transport' => 'default', - 'from' => 'you@localhost', - //'charset' => 'utf-8', - //'headerCharset' => 'utf-8', - ], - ], - - /** - * Connection information used by the ORM to connect - * to your application's datastores. - * Drivers include Mysql Postgres Sqlite Sqlserver - * See vendor\cakephp\cakephp\src\Database\Driver for complete list - */ - 'Datasources' => [ - 'default' => [ - 'className' => 'Cake\Database\Connection', - 'driver' => 'Cake\Database\Driver\Sqlite', - 'persistent' => false, - 'database' => 'notejam.db', - 'encoding' => 'utf8', - 'timezone' => 'UTC', - 'cacheMetadata' => true, - - /** - * Set identifier quoting to true if you are using reserved words or - * special characters in your table or column names. Enabling this - * setting will result in queries built using the Query Builder having - * identifiers quoted when creating SQL. It should be noted that this - * decreases performance because each query needs to be traversed and - * manipulated before being executed. - */ - 'quoteIdentifiers' => false, - - /** - * During development, if using MySQL < 5.6, uncommenting the - * following line could boost the speed at which schema metadata is - * fetched from the database. It can also be set directly with the - * mysql configuration directive 'innodb_stats_on_metadata = 0' - * which is the recommended value in production environments - */ - //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'], - ], - - /** - * The test connection is used during the test suite. - */ - 'test' => [ - 'className' => 'Cake\Database\Connection', - 'driver' => 'Cake\Database\Driver\Sqlite', - 'persistent' => false, - 'database' => 'tests/notejam.db', - 'encoding' => 'utf8', - 'timezone' => 'UTC', - 'cacheMetadata' => true, - 'quoteIdentifiers' => false, - //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'], - ], - ], - - /** - * Configures logging options - */ - 'Log' => [ - 'debug' => [ - 'className' => 'Cake\Log\Engine\FileLog', - 'path' => LOGS, - 'file' => 'debug', - 'levels' => ['notice', 'info', 'debug'], - ], - 'error' => [ - 'className' => 'Cake\Log\Engine\FileLog', - 'path' => LOGS, - 'file' => 'error', - 'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'], - ], - ], - - /** - * - * Session configuration. - * - * Contains an array of settings to use for session configuration. The - * `defaults` key is used to define a default preset to use for sessions, any - * settings declared here will override the settings of the default config. - * - * ## Options - * - * - `cookie` - The name of the cookie to use. Defaults to 'CAKEPHP'. - * - `cookiePath` - The url path for which session cookie is set. Maps to the - * `session.cookie_path` php.ini config. Defaults to base path of app. - * - `timeout` - The time in minutes the session should be valid for. - * Pass 0 to disable checking timeout. - * - `defaults` - The default configuration set to use as a basis for your session. - * There are four built-in options: php, cake, cache, database. - * - `handler` - Can be used to enable a custom session handler. Expects an - * array with at least the `engine` key, being the name of the Session engine - * class to use for managing the session. CakePHP bundles the `CacheSession` - * and `DatabaseSession` engines. - * - `ini` - An associative array of additional ini values to set. - * - * The built-in `defaults` options are: - * - * - 'php' - Uses settings defined in your php.ini. - * - 'cake' - Saves session files in CakePHP's /tmp directory. - * - 'database' - Uses CakePHP's database sessions. - * - 'cache' - Use the Cache class to save sessions. - * - * To define a custom session handler, save it at src/Network/Session/.php. - * Make sure the class implements PHP's `SessionHandlerInterface` and set - * Session.handler to - * - * To use database sessions, load the SQL file located at config/Schema/sessions.sql - */ - 'Session' => [ - 'defaults' => 'php', - ], -]; diff --git a/cakephp/notejam/config/bootstrap.php b/cakephp/notejam/config/bootstrap.php deleted file mode 100644 index 62d662ece..000000000 --- a/cakephp/notejam/config/bootstrap.php +++ /dev/null @@ -1,202 +0,0 @@ -getMessage() . "\n"); -} - -// Load an environment local configuration file. -// You can use a file like app_local.php to provide local overrides to your -// shared configuration. -//Configure::load('app_local', 'default'); - -// When debug = false the metadata cache should last -// for a very very long time, as we don't want -// to refresh the cache while users are doing requests. -if (!Configure::read('debug')) { - Configure::write('Cache._cake_model_.duration', '+1 years'); - Configure::write('Cache._cake_core_.duration', '+1 years'); -} - -/** - * Set server timezone to UTC. You can change it to another timezone of your - * choice but using UTC makes time calculations / conversions easier. - */ -date_default_timezone_set('UTC'); - -/** - * Configure the mbstring extension to use the correct encoding. - */ -mb_internal_encoding(Configure::read('App.encoding')); - -/** - * Set the default locale. This controls how dates, number and currency is - * formatted and sets the default language to use for translations. - */ -ini_set('intl.default_locale', 'en_US'); - -/** - * Register application error and exception handlers. - */ -$isCli = php_sapi_name() === 'cli'; -if ($isCli) { - (new ConsoleErrorHandler(Configure::read('Error')))->register(); -} else { - (new ErrorHandler(Configure::read('Error')))->register(); -} - -// Include the CLI bootstrap overrides. -if ($isCli) { - require __DIR__ . '/bootstrap_cli.php'; -} - -/** - * Set the full base URL. - * This URL is used as the base of all absolute links. - * - * If you define fullBaseUrl in your config file you can remove this. - */ -if (!Configure::read('App.fullBaseUrl')) { - $s = null; - if (env('HTTPS')) { - $s = 's'; - } - - $httpHost = env('HTTP_HOST'); - if (isset($httpHost)) { - Configure::write('App.fullBaseUrl', 'http' . $s . '://' . $httpHost); - } - unset($httpHost, $s); -} - -Cache::config(Configure::consume('Cache')); -ConnectionManager::config(Configure::consume('Datasources')); -Email::configTransport(Configure::consume('EmailTransport')); -Email::config(Configure::consume('Email')); -Log::config(Configure::consume('Log')); -Security::salt(Configure::consume('Security.salt')); - -/** - * The default crypto extension in 3.0 is OpenSSL. - * If you are migrating from 2.x uncomment this code to - * use a more compatible Mcrypt based implementation - */ -// Security::engine(new \Cake\Utility\Crypto\Mcrypt()); - -/** - * Setup detectors for mobile and tablet. - */ -Request::addDetector('mobile', function ($request) { - $detector = new \Detection\MobileDetect(); - return $detector->isMobile(); -}); -Request::addDetector('tablet', function ($request) { - $detector = new \Detection\MobileDetect(); - return $detector->isTablet(); -}); - -/** - * Custom Inflector rules, can be set to correctly pluralize or singularize - * table, model, controller names or whatever other string is passed to the - * inflection functions. - * - * Inflector::rules('plural', ['/^(inflect)or$/i' => '\1ables']); - * Inflector::rules('irregular', ['red' => 'redlings']); - * Inflector::rules('uninflected', ['dontinflectme']); - * Inflector::rules('transliteration', ['/å/' => 'aa']); - */ - -/** - * Plugins need to be loaded manually, you can either load them one by one or all of them in a single call - * Uncomment one of the lines below, as you need. make sure you read the documentation on Plugin to use more - * advanced ways of loading plugins - * - * Plugin::loadAll(); // Loads all plugins at once - * Plugin::load('Migrations'); //Loads a single plugin named Migrations - * - */ - -Plugin::load('Migrations'); - -// Only try to load DebugKit in development mode -// Debug Kit should not be installed on a production system -if (Configure::read('debug')) { - Plugin::load('DebugKit', ['bootstrap' => true]); -} - -/** - * Connect middleware/dispatcher filters. - */ -DispatcherFactory::add('Asset'); -DispatcherFactory::add('Routing'); -DispatcherFactory::add('ControllerFactory'); - -/** - * Enable default locale format parsing. - * This is needed for matching the auto-localized string output of Time() class when parsing dates. - */ -Type::build('datetime')->useLocaleParser(); diff --git a/cakephp/notejam/config/bootstrap_cli.php b/cakephp/notejam/config/bootstrap_cli.php deleted file mode 100644 index 13cf979fa..000000000 --- a/cakephp/notejam/config/bootstrap_cli.php +++ /dev/null @@ -1,32 +0,0 @@ -connect('/', ['controller' => 'Notes', 'action' => 'index'], ['_name' => 'index']); - - $routes->connect('/signup', ['controller' => 'Users', 'action' => 'signup'], ['_name' => 'signup']); - $routes->connect('/signin', ['controller' => 'Users', 'action' => 'signin'], ['_name' => 'signin']); - $routes->connect('/signout', ['controller' => 'Users', 'action' => 'signout'], ['_name' => 'signout']); - $routes->connect('/settings', ['controller' => 'Users', 'action' => 'settings'], ['_name' => 'settings']); - $routes->connect('/forgot-password', ['controller' => 'Users', 'action' => 'forgotpassword'], ['_name' => 'forgot_password']); - - - $routes->scope('/pads', ['controller' => 'Pads'], function($routes) { - $routes->connect('/create', ['controller' => 'Pads', 'action' => 'create'], ['_name' => 'create_pad']); - $routes->connect('/:id/edit', ['controller' => 'Pads', 'action' => 'edit'], ['id' => '\d+', 'pass' => ['id'], '_name' => 'edit_pad']); - $routes->connect('/:id/delete', ['controller' => 'Pads', 'action' => 'delete'], ['id' => '\d+', 'pass' => ['id'], '_name' => 'delete_pad']); - $routes->connect('/:id', ['controller' => 'Pads', 'action' => 'view'], ['id' => '\d+', 'pass' => ['id'], '_name' => 'view_pad']); - }); - - $routes->scope('/notes', ['controller' => 'Notes'], function($routes) { - $routes->connect('/create', ['controller' => 'Notes', 'action' => 'create'], ['_name' => 'create_note']); - $routes->connect('/:id/edit', ['controller' => 'Notes', 'action' => 'edit'], ['id' => '\d+', 'pass' => ['id'], '_name' => 'edit_note']); - $routes->connect('/:id', ['controller' => 'Notes', 'action' => 'view'], ['id' => '\d+', 'pass' => ['id'], '_name' => 'view_note']); - $routes->connect('/:id/delete', ['controller' => 'Notes', 'action' => 'delete'], ['id' => '\d+', 'pass' => ['id'], '_name' => 'delete_note']); - }); -}); - -/** - * Load all plugin routes. See the Plugin documentation on - * how to customize the loading of plugin routes. - */ -Plugin::routes(); diff --git a/cakephp/notejam/config/schema/i18n.sql b/cakephp/notejam/config/schema/i18n.sql deleted file mode 100644 index 66a42bd19..000000000 --- a/cakephp/notejam/config/schema/i18n.sql +++ /dev/null @@ -1,27 +0,0 @@ -# $Id$ -# -# Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) -# -# Licensed under The MIT License -# For full copyright and license information, please see the LICENSE.txt -# Redistributions of files must retain the above copyright notice. -# MIT License (http://www.opensource.org/licenses/mit-license.php) - -CREATE TABLE i18n ( - id int(10) NOT NULL auto_increment, - locale varchar(6) NOT NULL, - model varchar(255) NOT NULL, - foreign_key int(10) NOT NULL, - field varchar(255) NOT NULL, - content mediumtext, - PRIMARY KEY (id), -# UNIQUE INDEX I18N_LOCALE_FIELD(locale, model, foreign_key, field), -# INDEX I18N_LOCALE_ROW(locale, model, foreign_key), -# INDEX I18N_LOCALE_MODEL(locale, model), -# INDEX I18N_FIELD(model, foreign_key, field), -# INDEX I18N_ROW(model, foreign_key), - INDEX locale (locale), - INDEX model (model), - INDEX row_id (foreign_key), - INDEX field (field) -); \ No newline at end of file diff --git a/cakephp/notejam/config/schema/sessions.sql b/cakephp/notejam/config/schema/sessions.sql deleted file mode 100644 index 434e1aa1c..000000000 --- a/cakephp/notejam/config/schema/sessions.sql +++ /dev/null @@ -1,17 +0,0 @@ -# $Id$ -# -# Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) -# 1785 E. Sahara Avenue, Suite 490-204 -# Las Vegas, Nevada 89104 -# -# Licensed under The MIT License -# For full copyright and license information, please see the LICENSE.txt -# Redistributions of files must retain the above copyright notice. -# MIT License (http://www.opensource.org/licenses/mit-license.php) - -CREATE TABLE sessions ( - id varchar(40) NOT NULL default '', - data text, - expires INT(11) NOT NULL, - PRIMARY KEY (id) -); diff --git a/cakephp/notejam/index.php b/cakephp/notejam/index.php deleted file mode 100644 index fc5e39ccb..000000000 --- a/cakephp/notejam/index.php +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - ./tests/TestCase - - - - - - - - - - - - - - diff --git a/cakephp/notejam/src/Console/Installer.php b/cakephp/notejam/src/Console/Installer.php deleted file mode 100644 index 06d1115f7..000000000 --- a/cakephp/notejam/src/Console/Installer.php +++ /dev/null @@ -1,192 +0,0 @@ -getIO(); - - $rootDir = dirname(dirname(__DIR__)); - - static::createAppConfig($rootDir, $io); - static::createWritableDirectories($rootDir, $io); - - // ask if the permissions should be changed - if ($io->isInteractive()) { - $validator = function ($arg) { - if (in_array($arg, ['Y', 'y', 'N', 'n'])) { - return $arg; - } - throw new Exception('This is not a valid answer. Please choose Y or n.'); - }; - $setFolderPermissions = $io->askAndValidate( - 'Set Folder Permissions ? (Default to Y) [Y,n]? ', - $validator, - 10, - 'Y' - ); - - if (in_array($setFolderPermissions, ['Y', 'y'])) { - static::setFolderPermissions($rootDir, $io); - } - } else { - static::setFolderPermissions($rootDir, $io); - } - - static::setSecuritySalt($rootDir, $io); - - if (class_exists('\Cake\Codeception\Console\Installer')) { - \Cake\Codeception\Console\Installer::customizeCodeceptionBinary($event); - } - } - - /** - * Create the config/app.php file if it does not exist. - * - * @param string $dir The application's root directory. - * @param \Composer\IO\IOInterface $io IO interface to write to console. - * @return void - */ - public static function createAppConfig($dir, $io) - { - $appConfig = $dir . '/config/app.php'; - $defaultConfig = $dir . '/config/app.default.php'; - if (!file_exists($appConfig)) { - copy($defaultConfig, $appConfig); - $io->write('Created `config/app.php` file'); - } - } - - /** - * Create the `logs` and `tmp` directories. - * - * @param string $dir The application's root directory. - * @param \Composer\IO\IOInterface $io IO interface to write to console. - * @return void - */ - public static function createWritableDirectories($dir, $io) - { - $paths = [ - 'logs', - 'tmp', - 'tmp/cache', - 'tmp/cache/models', - 'tmp/cache/persistent', - 'tmp/cache/views', - 'tmp/sessions', - 'tmp/tests' - ]; - - foreach ($paths as $path) { - $path = $dir . '/' . $path; - if (!file_exists($path)) { - mkdir($path); - $io->write('Created `' . $path . '` directory'); - } - } - } - - /** - * Set globally writable permissions on the "tmp" and "logs" directory. - * - * This is not the most secure default, but it gets people up and running quickly. - * - * @param string $dir The application's root directory. - * @param \Composer\IO\IOInterface $io IO interface to write to console. - * @return void - */ - public static function setFolderPermissions($dir, $io) - { - // Change the permissions on a path and output the results. - $changePerms = function ($path, $perms, $io) { - // Get current permissions in decimal format so we can bitmask it. - $currentPerms = octdec(substr(sprintf('%o', fileperms($path)), -4)); - if (($currentPerms & $perms) == $perms) { - return; - } - - $res = chmod($path, $currentPerms | $perms); - if ($res) { - $io->write('Permissions set on ' . $path); - } else { - $io->write('Failed to set permissions on ' . $path); - } - }; - - $walker = function ($dir, $perms, $io) use (&$walker, $changePerms) { - $files = array_diff(scandir($dir), ['.', '..']); - foreach ($files as $file) { - $path = $dir . '/' . $file; - - if (!is_dir($path)) { - continue; - } - - $changePerms($path, $perms, $io); - $walker($path, $perms, $io); - } - }; - - $worldWritable = bindec('0000000111'); - $walker($dir . '/tmp', $worldWritable, $io); - $changePerms($dir . '/tmp', $worldWritable, $io); - $changePerms($dir . '/logs', $worldWritable, $io); - } - - /** - * Set the security.salt value in the application's config file. - * - * @param string $dir The application's root directory. - * @param \Composer\IO\IOInterface $io IO interface to write to console. - * @return void - */ - public static function setSecuritySalt($dir, $io) - { - $config = $dir . '/config/app.php'; - $content = file_get_contents($config); - - $newKey = hash('sha256', $dir . php_uname() . microtime(true)); - $content = str_replace('__SALT__', $newKey, $content, $count); - - if ($count == 0) { - $io->write('No Security.salt placeholder to replace.'); - return; - } - - $result = file_put_contents($config, $content); - if ($result) { - $io->write('Updated Security.salt value in config/app.php'); - return; - } - $io->write('Unable to update Security.salt value.'); - } -} diff --git a/cakephp/notejam/src/Controller/AppController.php b/cakephp/notejam/src/Controller/AppController.php deleted file mode 100644 index 2207fda8d..000000000 --- a/cakephp/notejam/src/Controller/AppController.php +++ /dev/null @@ -1,88 +0,0 @@ -loadComponent('Flash'); - $this->loadComponent('Auth', [ - 'authenticate' => [ - 'Form' => [ - 'fields' => [ - 'username' => 'email', - 'password' => 'password' - ] - ] - ], - 'loginAction' => [ - 'controller' => 'Users', - 'action' => 'signin' - ] - ]); - $this->Auth->allow(['signup', 'forgotpassword']); - } - - /** - * Get authenticated user - * - * @return App\Model\Entity\User - */ - protected function getUser() - { - $id = $this->request->session()->read('Auth.User.id'); - return TableRegistry::get('Users')->get($id, [ - 'contain' => ['Pads', 'Notes'] - ]); - } - - /** - * Build order statetment - * - * @param string $order Order param - * @return array - */ - public function buildOrderBy($order) - { - $config = [ - 'name' => ['Notes.name' => 'ASC'], - '-name' => ['Notes.name' => 'DESC'], - 'updated_at' => ['Notes.updated_at' => 'ASC'], - '-updated_at' => ['Notes.updated_at' => 'DESC'], - ]; - return $config[$order ? $order : 'updated_at']; - } -} diff --git a/cakephp/notejam/src/Controller/NotesController.php b/cakephp/notejam/src/Controller/NotesController.php deleted file mode 100644 index 18740fc06..000000000 --- a/cakephp/notejam/src/Controller/NotesController.php +++ /dev/null @@ -1,138 +0,0 @@ -viewBuilder()->layout('user'); - } - - /** - * Index method - * - * @return void - */ - public function index() - { - $this->set( - 'notes', - $this->Notes->find('all', ['contain' => 'Pads']) - ->where(['Notes.user_id' => $this->getUser()->id]) - ->order($this->buildOrderBy($this->request->query('order'))) - ); - } - - /** - * View note - * - * @param string|null $id Note id. - * @return void - * @throws \Cake\Network\Exception\NotFoundException When record not found. - */ - public function view($id = null) - { - $note = $this->getNote($id); - $this->set('note', $note); - } - - /** - * Create note action - * - * @return void Redirects on successful add, renders view otherwise. - */ - public function create() - { - $note = $this->Notes->newEntity(); - if ($this->request->is('post')) { - $note = $this->Notes->patchEntity($note, array_merge( - $this->request->data, - ['user_id' => $this->getUser()->id] - )); - if ($this->Notes->save($note)) { - $this->Flash->success(__('The note has been saved.')); - return $this->redirect(['action' => 'index']); - } else { - $this->Flash->error(__('The note could not be saved. Please, try again.')); - } - } - // current pad - $pad = $this->request->query('pad'); - - $pads = collection($this->getUser()->pads)->combine('id', 'name')->toArray(); - $this->set(compact('note', 'pads', 'pad')); - } - - - /** - * Edit note - * - * @param string|null $id Note id. - * @return void Redirects on successful edit, renders view otherwise. - * @throws \Cake\Network\Exception\NotFoundException When record not found. - */ - public function edit($id = null) - { - $note = $this->getNote($id); - if ($this->request->is(['patch', 'post', 'put'])) { - $note = $this->Notes->patchEntity($note, $this->request->data); - if ($this->Notes->save($note)) { - $this->Flash->success(__('The note has been saved.')); - return $this->redirect(['action' => 'view', 'id' => $note->id]); - } else { - $this->Flash->error(__('The note could not be saved. Please, try again.')); - } - } - $pads = collection($this->getUser()->pads)->combine('id', 'name')->toArray(); - $this->set(compact('note', 'pads')); - } - - /** - * Delete method - * - * @param string|null $id Note id. - * @return void Redirects to index. - * @throws \Cake\Network\Exception\NotFoundException When record not found. - */ - public function delete($id = null) - { - $note = $this->getNote($id); - if ($this->request->is('post')) { - $this->Notes->delete($note); - $this->Flash->success(__('The note has been deleted.')); - return $this->redirect(['action' => 'index']); - } - $this->set(compact('note')); - } - - /** - * Get note - * - * @param int $id Note id - * @return Note - */ - protected function getNote($id) - { - return TableRegistry::get('Notes')->find() - ->contain(['Pads', 'Users']) - ->where(['Notes.id' => $id]) - ->where(['Notes.user_id' => $this->getUser()->id]) - ->firstOrFail(); - } -} diff --git a/cakephp/notejam/src/Controller/PadsController.php b/cakephp/notejam/src/Controller/PadsController.php deleted file mode 100644 index 246b98430..000000000 --- a/cakephp/notejam/src/Controller/PadsController.php +++ /dev/null @@ -1,121 +0,0 @@ -viewBuilder()->layout('user'); - } - - /** - * View pad - * - * @param string|null $id Pad id. - * @return void - * @throws \Cake\Network\Exception\NotFoundException When record not found. - */ - public function view($id = null) - { - $pad = $this->getPad($id); - $notes = TableRegistry::get('Notes')->find('all', ['contain' => 'Pads']) - ->where(['Notes.pad_id' => $id]) - ->where(['Notes.user_id' => $this->getUser()->id]) - ->order($this->buildOrderBy($this->request->query('order'))); - - $this->set('pad', $pad); - $this->set('notes', $notes); - } - - /** - * Create a pad - * - * @return void Redirects on successful add, renders view otherwise. - */ - public function create() - { - $pad = $this->Pads->newEntity(); - if ($this->request->is('post')) { - $pad = $this->Pads->patchEntity($pad, array_merge( - $this->request->data, - ['user_id' => $this->Auth->user('id')] - )); - if ($this->Pads->save($pad)) { - $this->Flash->success(__('The pad has been created.')); - return $this->redirect(['action' => 'view', 'id' => $pad->id]); - } - } - $this->set(compact('pad')); - } - - /** - * Edit pad - * - * @param string|null $id Pad id. - * @return void Redirects on successful edit, renders view otherwise. - * @throws \Cake\Network\Exception\NotFoundException When record not found. - */ - public function edit($id = null) - { - $pad = $this->getPad($id); - if ($this->request->is(['patch', 'post', 'put'])) { - $pad = $this->Pads->patchEntity($pad, $this->request->data); - if ($this->Pads->save($pad)) { - $this->Flash->success(__('The pad has been saved.')); - return $this->redirect(['action' => 'view', 'id' => $pad->id]); - } else { - $this->Flash->error(__('The pad could not be saved. Please, try again.')); - } - } - $this->set(compact('pad')); - } - - /** - * Delete method - * - * @param string|null $id Pad id. - * @return void Redirects to index. - * @throws \Cake\Network\Exception\NotFoundException When record not found. - */ - public function delete($id = null) - { - $pad = $this->getPad($id); - if ($this->request->is('post')) { - $this->Pads->delete($pad); - $this->Flash->success(__('The pad has been deleted.')); - return $this->redirect(['_name' => 'index']); - } - $this->set(compact('pad')); - } - - /** - * Get pad - * - * @param int $id Pad id - * @return Pad - */ - protected function getPad($id) - { - return TableRegistry::get('Pads')->find() - ->contain(['Users']) - ->where(['Pads.id' => $id]) - ->where(['Pads.user_id' => $this->getUser()->id]) - ->firstOrFail(); - } -} diff --git a/cakephp/notejam/src/Controller/UsersController.php b/cakephp/notejam/src/Controller/UsersController.php deleted file mode 100644 index 00b1afb37..000000000 --- a/cakephp/notejam/src/Controller/UsersController.php +++ /dev/null @@ -1,145 +0,0 @@ -viewBuilder()->layout('anonymous'); - } - - /** - * Signup action - * - * @return void Redirects on successful signup, renders errors otherwise. - */ - public function signup() - { - $user = $this->Users->newEntity(); - if ($this->request->is('post')) { - $user = $this->Users->patchEntity($user, $this->request->data); - if ($this->Users->save($user)) { - $this->Flash->success(__('Now you can signin')); - return $this->redirect(['action' => 'signin']); - } else { - $this->Flash->error(__('The user could not be saved. Please, try again.')); - } - } - $this->set(compact('user')); - } - - /** - * Signin action - * - * @return void Redirects on successful signup, renders errors otherwise. - */ - public function signin() - { - if ($this->request->is('post')) { - $user = $this->Auth->identify(); - if ($user) { - $this->Auth->setUser($user); - return $this->redirect($this->Auth->redirectUrl()); - } - $this->Flash->error('Your username or password is incorrect.'); - } - } - - /** - * Sign out action - * - * @return void Redirects on successful signin - */ - public function signout() - { - return $this->redirect($this->Auth->logout()); - } - - /** - * Account settings action - * - * @return void - */ - public function settings() - { - $settings = new SettingsForm(); - if ($this->request->is('post') && - $settings->validate($this->request->data)) { - - $user = $this->getUser(); - if ($user->checkPassword($this->request->data['current_password'])) { - $user->password = $this->request->data['new_password']; - $this->Users->save($user); - $this->Flash->success('Password is successfully changed.'); - return $this->redirect(['_name' => 'index']); - } - $this->Flash->error('Current password is not correct.'); - } - $this->set(compact('settings')); - } - - /** - * Forgot password action - * - * @return void - */ - public function forgotPassword() - { - $form = new ForgotPasswordForm(); - if ($this->request->is('post') && - $form->validate($this->request->data)) { - - $user = $this->Users->find() - ->where(['email' => $this->request->data['email']]) - ->first(); - if ($user) { - $this->resetPassword($user); - $this->Flash->success('New temp password is sent to your inbox.'); - return $this->redirect(['_name' => 'index']); - } - $this->Flash->error('User with given email does not exist.'); - } - $this->set(compact('form')); - } - - /** - * Reset user's password - * - * @param App\Model\Entity\User $user User - * @return void - */ - protected function resetPassword($user) - { - // primitive way to generate temporary password - $user->password = $password = substr( - sha1(time() . rand() . Configure::read('Security.salt')), 0, 8 - ); - $this->Users->save($user); - - Email::deliver( - $user->email, - "New notejam password", - "Your new temporary password is {$password}. - We recommend you to change it after signing in.", - ["from" => "noreply@notejamapp.com", "transport" => "default"] - ); - } -} diff --git a/cakephp/notejam/src/Form/ForgotPasswordForm.php b/cakephp/notejam/src/Form/ForgotPasswordForm.php deleted file mode 100644 index 5b7a3d2c8..000000000 --- a/cakephp/notejam/src/Form/ForgotPasswordForm.php +++ /dev/null @@ -1,35 +0,0 @@ -addField('email', ['type' => 'string']); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - protected function _buildValidator(Validator $validator) - { - return $validator - ->requirePresence('email', 'create') - ->add('email', 'valid', ['rule' => 'email']); - } -} - diff --git a/cakephp/notejam/src/Form/SettingsForm.php b/cakephp/notejam/src/Form/SettingsForm.php deleted file mode 100644 index ef7391a58..000000000 --- a/cakephp/notejam/src/Form/SettingsForm.php +++ /dev/null @@ -1,47 +0,0 @@ -addField('current_password', ['type' => 'password']) - ->addField('new_password', ['type' => 'password']) - ->addField('confirm_new_password', ['type' => 'password']); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - protected function _buildValidator(Validator $validator) - { - return $validator - ->requirePresence('current_password', 'create') - ->notEmpty('current_password') - ->requirePresence('new_password', 'create') - ->notEmpty('new_password') - ->add('new_password', [ - 'length' => [ - 'rule' => ['minLength', 6] - ], - 'compare' => [ - 'rule' => ['compareWith', 'confirm_new_password'], - 'message' => 'Passwords do not match' - ], - ]); - } -} diff --git a/cakephp/notejam/src/Model/Entity/Note.php b/cakephp/notejam/src/Model/Entity/Note.php deleted file mode 100644 index 56c772790..000000000 --- a/cakephp/notejam/src/Model/Entity/Note.php +++ /dev/null @@ -1,41 +0,0 @@ - true, - 'user_id' => true, - 'name' => true, - 'text' => true, - 'created_at' => true, - 'updated_at' => true, - 'pad' => true, - 'user' => true, - ]; - - /** - * Get pretty date like "Yesterday", "2 days ago", "etc" - * - * @return string - */ - public function getPrettyDate() - { - $time = new Time($this->_properties['updated_at']); - return $time->timeAgoInWords([ - 'format' => 'd' - ]); - } -} diff --git a/cakephp/notejam/src/Model/Entity/Pad.php b/cakephp/notejam/src/Model/Entity/Pad.php deleted file mode 100644 index 30163e110..000000000 --- a/cakephp/notejam/src/Model/Entity/Pad.php +++ /dev/null @@ -1,23 +0,0 @@ - true, - 'user_id' => true, - 'user' => true, - 'notes' => true, - ]; -} diff --git a/cakephp/notejam/src/Model/Entity/User.php b/cakephp/notejam/src/Model/Entity/User.php deleted file mode 100644 index 14dc77f42..000000000 --- a/cakephp/notejam/src/Model/Entity/User.php +++ /dev/null @@ -1,50 +0,0 @@ - true, - 'password' => true, - 'notes' => true, - 'pads' => true, - ]; - - - /** - * Password setter - * - * @param string $value password - * @return string - */ - protected function _setPassword($value) - { - $hasher = new DefaultPasswordHasher(); - return $hasher->hash($value); - } - - /** - * Check if passwords matches - * - * @param string $password Password - * @return boolean - */ - public function checkPassword($password) - { - $hasher = new DefaultPasswordHasher(); - return $hasher->check($password, $this->password); - } -} diff --git a/cakephp/notejam/src/Model/Table/NotesTable.php b/cakephp/notejam/src/Model/Table/NotesTable.php deleted file mode 100644 index bcf9415a2..000000000 --- a/cakephp/notejam/src/Model/Table/NotesTable.php +++ /dev/null @@ -1,82 +0,0 @@ -table('notes'); - $this->displayField('name'); - $this->primaryKey('id'); - $this->addBehavior('Timestamp', [ - 'events' => [ - 'Model.beforeSave' => [ - 'created_at' => 'new', - 'updated_at' => 'always' - ] - ] - ]); - $this->belongsTo('Pads', [ - 'foreignKey' => 'pad_id' - ]); - $this->belongsTo('Users', [ - 'foreignKey' => 'user_id', - 'joinType' => 'INNER' - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->add('id', 'valid', ['rule' => 'numeric']) - ->allowEmpty('id', 'create'); - - $validator - ->requirePresence('name', 'create') - ->notEmpty('name'); - - $validator - ->requirePresence('text', 'create') - ->notEmpty('text'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->existsIn(['user_id'], 'Users')); - return $rules; - } -} diff --git a/cakephp/notejam/src/Model/Table/PadsTable.php b/cakephp/notejam/src/Model/Table/PadsTable.php deleted file mode 100644 index 921e2a328..000000000 --- a/cakephp/notejam/src/Model/Table/PadsTable.php +++ /dev/null @@ -1,70 +0,0 @@ -table('pads'); - $this->displayField('name'); - $this->primaryKey('id'); - $this->belongsTo('Users', [ - 'foreignKey' => 'user_id', - 'joinType' => 'INNER' - ]); - $this->hasMany('Notes', [ - 'foreignKey' => 'pad_id' - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->add('id', 'valid', ['rule' => 'numeric']) - ->allowEmpty('id', 'create'); - - $validator - ->requirePresence('name', 'create') - ->notEmpty('name'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->existsIn(['user_id'], 'Users')); - return $rules; - } -} diff --git a/cakephp/notejam/src/Model/Table/UsersTable.php b/cakephp/notejam/src/Model/Table/UsersTable.php deleted file mode 100644 index ba359d614..000000000 --- a/cakephp/notejam/src/Model/Table/UsersTable.php +++ /dev/null @@ -1,80 +0,0 @@ -table('users'); - $this->displayField('id'); - $this->primaryKey('id'); - $this->hasMany('Notes', [ - 'foreignKey' => 'user_id' - ]); - $this->hasMany('Pads', [ - 'foreignKey' => 'user_id' - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->add('email', 'valid', ['rule' => 'email']) - ->requirePresence('email', 'create') - ->notEmpty('email'); - - $validator - ->requirePresence('password', 'create') - ->notEmpty('password') - ->add('password', [ - 'length' => [ - 'rule' => ['minLength', 6] - ], - 'compare' => [ - 'rule' => ['compareWith', 'confirm_password'], - 'message' => 'Passwords do not match' - ], - ]); - - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->isUnique(['email'])); - return $rules; - } -} diff --git a/cakephp/notejam/src/Shell/ConsoleShell.php b/cakephp/notejam/src/Shell/ConsoleShell.php deleted file mode 100644 index 97c797443..000000000 --- a/cakephp/notejam/src/Shell/ConsoleShell.php +++ /dev/null @@ -1,79 +0,0 @@ -err('Unable to load Psy\Shell.'); - $this->err(''); - $this->err('Make sure you have installed psysh as a dependency,'); - $this->err('and that Psy\Shell is registered in your autoloader.'); - $this->err(''); - $this->err('If you are using composer run'); - $this->err(''); - $this->err('$ php composer.phar require --dev psy/psysh'); - $this->err(''); - return 1; - } - - $this->out("You can exit with `CTRL-C` or `exit`"); - $this->out(''); - - Log::drop('debug'); - Log::drop('error'); - $this->_io->setLoggers(false); - restore_error_handler(); - restore_exception_handler(); - - $psy = new PsyShell(); - $psy->run(); - } - - /** - * Display help for this console. - * - * @return ConsoleOptionParser - */ - public function getOptionParser() - { - $parser = new ConsoleOptionParser('console', false); - $parser->description( - 'This shell provides a REPL that you can use to interact ' . - 'with your application in an interactive fashion. You can use ' . - 'it to run adhoc queries with your models, or experiment ' . - 'and explore the features of CakePHP and your application.' . - "\n\n" . - 'You will need to have psysh installed for this Shell to work.' - ); - return $parser; - } -} diff --git a/cakephp/notejam/src/Template/Cell/Pads/display.ctp b/cakephp/notejam/src/Template/Cell/Pads/display.ctp deleted file mode 100644 index 51181b443..000000000 --- a/cakephp/notejam/src/Template/Cell/Pads/display.ctp +++ /dev/null @@ -1,16 +0,0 @@ -
- - -
diff --git a/cakephp/notejam/src/Template/Element/Flash/default.ctp b/cakephp/notejam/src/Template/Element/Flash/default.ctp deleted file mode 100644 index bc1e2c369..000000000 --- a/cakephp/notejam/src/Template/Element/Flash/default.ctp +++ /dev/null @@ -1,7 +0,0 @@ - -
diff --git a/cakephp/notejam/src/Template/Element/Flash/error.ctp b/cakephp/notejam/src/Template/Element/Flash/error.ctp deleted file mode 100644 index d3995ad10..000000000 --- a/cakephp/notejam/src/Template/Element/Flash/error.ctp +++ /dev/null @@ -1,3 +0,0 @@ -
-
-
diff --git a/cakephp/notejam/src/Template/Element/Flash/success.ctp b/cakephp/notejam/src/Template/Element/Flash/success.ctp deleted file mode 100644 index 3ce1cc159..000000000 --- a/cakephp/notejam/src/Template/Element/Flash/success.ctp +++ /dev/null @@ -1,3 +0,0 @@ -
-
-
diff --git a/cakephp/notejam/src/Template/Element/notes/form.ctp b/cakephp/notejam/src/Template/Element/notes/form.ctp deleted file mode 100644 index 8351ee735..000000000 --- a/cakephp/notejam/src/Template/Element/notes/form.ctp +++ /dev/null @@ -1,6 +0,0 @@ -Form->create($note, ['class' => 'note']); ?> - Form->input('name'); ?> - Form->textarea('text'); ?> - Form->input('pad_id', ['type' => 'select', 'empty' => '---------', 'options' => $pads, 'default' => !empty($pad) ? $pad : 0]); ?> - Form->submit(__('Save')); ?> -Form->end(); ?> diff --git a/cakephp/notejam/src/Template/Element/pads/form.ctp b/cakephp/notejam/src/Template/Element/pads/form.ctp deleted file mode 100644 index dc9460c87..000000000 --- a/cakephp/notejam/src/Template/Element/pads/form.ctp +++ /dev/null @@ -1,4 +0,0 @@ -Form->create($pad, ['class' => 'pad']); ?> - Form->input('name'); ?> - Form->submit(__('Save')); ?> -Form->end(); ?> diff --git a/cakephp/notejam/src/Template/Email/html/default.ctp b/cakephp/notejam/src/Template/Email/html/default.ctp deleted file mode 100644 index 386674a1a..000000000 --- a/cakephp/notejam/src/Template/Email/html/default.ctp +++ /dev/null @@ -1,22 +0,0 @@ - - ' . $line . "

\n"; -endforeach; -?> diff --git a/cakephp/notejam/src/Template/Email/text/default.ctp b/cakephp/notejam/src/Template/Email/text/default.ctp deleted file mode 100644 index 704b46f03..000000000 --- a/cakephp/notejam/src/Template/Email/text/default.ctp +++ /dev/null @@ -1,16 +0,0 @@ - - diff --git a/cakephp/notejam/src/Template/Error/error400.ctp b/cakephp/notejam/src/Template/Error/error400.ctp deleted file mode 100644 index 5cd7ce6ee..000000000 --- a/cakephp/notejam/src/Template/Error/error400.ctp +++ /dev/null @@ -1,38 +0,0 @@ -layout = 'dev_error'; - - $this->assign('title', $message); - $this->assign('templateName', 'error400.ctp'); - - $this->start('file'); -?> -queryString)) : ?> -

- SQL Query: - queryString) ?> -

- -params)) : ?> - SQL Query Params: - params) ?> - -element('auto_table_warning') ?> -end(); -endif; -?> -

-

- : - '{$url}'" - ) ?> -

diff --git a/cakephp/notejam/src/Template/Error/error500.ctp b/cakephp/notejam/src/Template/Error/error500.ctp deleted file mode 100644 index d2b7d92a1..000000000 --- a/cakephp/notejam/src/Template/Error/error500.ctp +++ /dev/null @@ -1,37 +0,0 @@ -layout = 'dev_error'; - - $this->assign('title', $message); - $this->assign('templateName', 'error500.ctp'); - - $this->start('file'); -?> -queryString)) : ?> -

- SQL Query: - queryString) ?> -

- -params)) : ?> - SQL Query Params: - params) ?> - -element('auto_table_warning'); - - if (extension_loaded('xdebug')): - xdebug_print_function_stack(); - endif; - - $this->end(); -endif; -?> -

-

- : - -

diff --git a/cakephp/notejam/src/Template/Layout/Email/html/default.ctp b/cakephp/notejam/src/Template/Layout/Email/html/default.ctp deleted file mode 100644 index 2b4397008..000000000 --- a/cakephp/notejam/src/Template/Layout/Email/html/default.ctp +++ /dev/null @@ -1,24 +0,0 @@ - - - - - <?= $this->fetch('title') ?> - - - fetch('content') ?> - - diff --git a/cakephp/notejam/src/Template/Layout/Email/text/default.ctp b/cakephp/notejam/src/Template/Layout/Email/text/default.ctp deleted file mode 100644 index 871dcfb48..000000000 --- a/cakephp/notejam/src/Template/Layout/Email/text/default.ctp +++ /dev/null @@ -1,16 +0,0 @@ - -fetch('content') ?> diff --git a/cakephp/notejam/src/Template/Layout/ajax.ctp b/cakephp/notejam/src/Template/Layout/ajax.ctp deleted file mode 100644 index 871dcfb48..000000000 --- a/cakephp/notejam/src/Template/Layout/ajax.ctp +++ /dev/null @@ -1,16 +0,0 @@ - -fetch('content') ?> diff --git a/cakephp/notejam/src/Template/Layout/anonymous.ctp b/cakephp/notejam/src/Template/Layout/anonymous.ctp deleted file mode 100644 index 42db077f5..000000000 --- a/cakephp/notejam/src/Template/Layout/anonymous.ctp +++ /dev/null @@ -1,6 +0,0 @@ -extend('/Layout/default'); ?> - -
- Flash->render() ?> - fetch('content') ?> -
diff --git a/cakephp/notejam/src/Template/Layout/default.ctp b/cakephp/notejam/src/Template/Layout/default.ctp deleted file mode 100644 index 9c9a7cc8d..000000000 --- a/cakephp/notejam/src/Template/Layout/default.ctp +++ /dev/null @@ -1,39 +0,0 @@ - - - - Html->charset() ?> - <?= $this->fetch('title') ?> - - Html->css('http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/base.min.css') ?> - Html->css('http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/skeleton.min.css') ?> - Html->css('http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/layout.css') ?> - Html->css('style.css') ?> - - fetch('css') ?> - - -
-
- -
-
-

notejam: fetch('title') ?>

-
- - fetch('content') ?> - - - -
- Fork me on GitHub - - diff --git a/cakephp/notejam/src/Template/Layout/error.ctp b/cakephp/notejam/src/Template/Layout/error.ctp deleted file mode 100644 index e6945a8ad..000000000 --- a/cakephp/notejam/src/Template/Layout/error.ctp +++ /dev/null @@ -1,55 +0,0 @@ - - - - - Html->charset() ?> - - <?= $cakeDescription ?>: - <?= $this->fetch('title') ?> - - Html->meta('icon') ?> - - Html->css('base.css') ?> - Html->css('cake.css') ?> - - fetch('meta') ?> - fetch('css') ?> - fetch('script') ?> - - -
- -
- Flash->render() ?> - - fetch('content') ?> -
- -
- - diff --git a/cakephp/notejam/src/Template/Layout/rss/default.ctp b/cakephp/notejam/src/Template/Layout/rss/default.ctp deleted file mode 100644 index fdadcbf78..000000000 --- a/cakephp/notejam/src/Template/Layout/rss/default.ctp +++ /dev/null @@ -1,14 +0,0 @@ -fetch('title'); -endif; - -echo $this->Rss->document( - $this->Rss->channel( - array(), $channel, $this->fetch('content') - ) -); -?> diff --git a/cakephp/notejam/src/Template/Layout/user.ctp b/cakephp/notejam/src/Template/Layout/user.ctp deleted file mode 100644 index 0ae6e9478..000000000 --- a/cakephp/notejam/src/Template/Layout/user.ctp +++ /dev/null @@ -1,8 +0,0 @@ -extend('/Layout/default'); ?> - -cell('Pads', ['auth' => 'auth_param']); ?> - -
- Flash->render() ?> - fetch('content') ?> -
diff --git a/cakephp/notejam/src/Template/Notes/create.ctp b/cakephp/notejam/src/Template/Notes/create.ctp deleted file mode 100644 index 8c191f354..000000000 --- a/cakephp/notejam/src/Template/Notes/create.ctp +++ /dev/null @@ -1,3 +0,0 @@ -assign('title', __('New note')); ?> - -element('notes/form'); ?> diff --git a/cakephp/notejam/src/Template/Notes/delete.ctp b/cakephp/notejam/src/Template/Notes/delete.ctp deleted file mode 100644 index cc79d7d9e..000000000 --- a/cakephp/notejam/src/Template/Notes/delete.ctp +++ /dev/null @@ -1,7 +0,0 @@ -

name};") ?>

-Form->create(); ?> - - " ?> -   - Html->link(__('Cancel'), ['_name' => 'view_note', 'id' => $note->id]) ?> -Form->end(); ?> diff --git a/cakephp/notejam/src/Template/Notes/edit.ctp b/cakephp/notejam/src/Template/Notes/edit.ctp deleted file mode 100644 index 24faf5dee..000000000 --- a/cakephp/notejam/src/Template/Notes/edit.ctp +++ /dev/null @@ -1,3 +0,0 @@ -assign('title', __('Edit ' . $note->name)); ?> - -element('notes/form'); ?> diff --git a/cakephp/notejam/src/Template/Notes/index.ctp b/cakephp/notejam/src/Template/Notes/index.ctp deleted file mode 100644 index db767a984..000000000 --- a/cakephp/notejam/src/Template/Notes/index.ctp +++ /dev/null @@ -1,20 +0,0 @@ -assign('title', __("All notes ({$notes->count()})")); ?> -count()): ?> - - - - - - - - - - - - - -
Html->link('↑', ['_name' => 'index', 'order' => '-name'], ['class' => 'sort_arrow']) ?>Html->link('↓', ['_name' => 'index', 'order' => 'name'], ['class' => 'sort_arrow']) ?> Html->link('↑', ['_name' => 'index', 'order' => '-updated_at'], ['class' => 'sort_arrow']) ?>Html->link('↓', ['_name' => 'index', 'order' => 'updated_at'], ['class' => 'sort_arrow']) ?>
Html->link($note->name, ['id' => $note->id, '_name' => 'view_note']) ?>pad) ? $this->Html->link($note->pad->name, ['id' => $note->pad->id, '_name' => 'view_pad']) : 'No pad'; ?>getPrettyDate(); ?>
- -

- -Html->link(__("New note"), ["_name" => "create_note"], ["class" => "button"]); ?> diff --git a/cakephp/notejam/src/Template/Notes/view.ctp b/cakephp/notejam/src/Template/Notes/view.ctp deleted file mode 100644 index 3c48c2362..000000000 --- a/cakephp/notejam/src/Template/Notes/view.ctp +++ /dev/null @@ -1,9 +0,0 @@ -assign('title', h($note->name)); ?> -

Last edited at getPrettyDate(); ?>

-
-

- text); ?> -

-
-Html->link('Edit note', ['id' => $note->id, '_name' => 'edit_note'], ['class' => 'button']) ?> -Html->link('Delete it', ['id' => $note->id, '_name' => 'delete_note'], ['class' => 'delete-note']) ?> diff --git a/cakephp/notejam/src/Template/Pads/create.ctp b/cakephp/notejam/src/Template/Pads/create.ctp deleted file mode 100644 index 236e80839..000000000 --- a/cakephp/notejam/src/Template/Pads/create.ctp +++ /dev/null @@ -1,3 +0,0 @@ -assign('title', __('New pad')); ?> - -element('pads/form'); ?> diff --git a/cakephp/notejam/src/Template/Pads/delete.ctp b/cakephp/notejam/src/Template/Pads/delete.ctp deleted file mode 100644 index b6f307d19..000000000 --- a/cakephp/notejam/src/Template/Pads/delete.ctp +++ /dev/null @@ -1,6 +0,0 @@ -

name};") ?>

-Form->create(); ?> - " ?> -   - Html->link(__('Cancel'), ['_name' => 'index']) ?> -Form->end(); ?> diff --git a/cakephp/notejam/src/Template/Pads/edit.ctp b/cakephp/notejam/src/Template/Pads/edit.ctp deleted file mode 100644 index 7fba45ec6..000000000 --- a/cakephp/notejam/src/Template/Pads/edit.ctp +++ /dev/null @@ -1,4 +0,0 @@ -assign('title', __('Edit ' . $pad->name)); ?> - -element('pads/form'); ?> -Html->link('Delete pad', ['id' => $pad->id, '_name' => 'delete_pad'], ['class' => 'small-red']) ?> diff --git a/cakephp/notejam/src/Template/Pads/view.ctp b/cakephp/notejam/src/Template/Pads/view.ctp deleted file mode 100644 index 4766dc3f1..000000000 --- a/cakephp/notejam/src/Template/Pads/view.ctp +++ /dev/null @@ -1,19 +0,0 @@ -assign('title', __($pad->name . " ({$notes->count()})")); ?> -count()): ?> - - - - - - - - - - - -
Html->link('↑', ['_name' => 'view_pad', 'order' => '-name', 'id' => $pad->id], ['class' => 'sort_arrow']) ?>Html->link('↓', ['_name' => 'view_pad', 'order' => 'name', 'id' => $pad->id], ['class' => 'sort_arrow']) ?> Html->link('↑', ['_name' => 'view_pad', 'order' => '-updated_at', 'id' => $pad->id], ['class' => 'sort_arrow']) ?>Html->link('↓', ['_name' => 'view_pad', 'order' => 'updated_at', 'id' => $pad->id], ['class' => 'sort_arrow']) ?>
Html->link($note->name, ['id' => $note->id, '_name' => 'view_note']) ?>getPrettyDate(); ?>
- -

- -Html->link(__("New note"), ["_name" => "create_note", "pad" => $pad->id], ["class" => "button"]); ?>
-Html->link(__("Pad settings"), ["_name" => "edit_pad", "id" => $pad->id]); ?> diff --git a/cakephp/notejam/src/Template/Users/forgotpassword.ctp b/cakephp/notejam/src/Template/Users/forgotpassword.ctp deleted file mode 100644 index da2eafa98..000000000 --- a/cakephp/notejam/src/Template/Users/forgotpassword.ctp +++ /dev/null @@ -1,6 +0,0 @@ -assign('title', __('Forgot password?')); ?> - -Form->create($form, ['class' => 'offset-by-six sign-in']); ?> - Form->input('email', ['type' => 'text']); ?> - Form->submit(__('Generate password')); ?> -Form->end(); ?> diff --git a/cakephp/notejam/src/Template/Users/index.ctp b/cakephp/notejam/src/Template/Users/index.ctp deleted file mode 100644 index 7a4b50039..000000000 --- a/cakephp/notejam/src/Template/Users/index.ctp +++ /dev/null @@ -1,45 +0,0 @@ -
-

-
    -
  • Html->link(__('New User'), ['action' => 'add']) ?>
  • -
  • Html->link(__('List Notes'), ['controller' => 'Notes', 'action' => 'index']) ?>
  • -
  • Html->link(__('New Note'), ['controller' => 'Notes', 'action' => 'add']) ?>
  • -
  • Html->link(__('List Pads'), ['controller' => 'Pads', 'action' => 'index']) ?>
  • -
  • Html->link(__('New Pad'), ['controller' => 'Pads', 'action' => 'add']) ?>
  • -
-
-
- - - - - - - - - - - - - - - - - - - - -
Paginator->sort('id') ?>Paginator->sort('email') ?>Paginator->sort('password') ?>
Number->format($user->id) ?>email) ?>password) ?> - Html->link(__('View'), ['action' => 'view', $user->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $user->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $user->id], ['confirm' => __('Are you sure you want to delete # {0}?', $user->id)]) ?> -
-
-
    - Paginator->prev('< ' . __('previous')) ?> - Paginator->numbers() ?> - Paginator->next(__('next') . ' >') ?> -
-

Paginator->counter() ?>

-
-
diff --git a/cakephp/notejam/src/Template/Users/settings.ctp b/cakephp/notejam/src/Template/Users/settings.ctp deleted file mode 100644 index 9e6424874..000000000 --- a/cakephp/notejam/src/Template/Users/settings.ctp +++ /dev/null @@ -1,8 +0,0 @@ -assign('title', __('Account settings')); ?> - -Form->create($settings, ['class' => 'offset-by-six sign-in']); ?> - Form->input('current_password', ['type' => 'password']); ?> - Form->input('new_password', ['type' => 'password']); ?> - Form->input('confirm_new_password', ['type' => 'password']); ?> - Form->submit(__('Save')); ?> -Form->end(); ?> diff --git a/cakephp/notejam/src/Template/Users/signin.ctp b/cakephp/notejam/src/Template/Users/signin.ctp deleted file mode 100644 index 7138e35eb..000000000 --- a/cakephp/notejam/src/Template/Users/signin.ctp +++ /dev/null @@ -1,9 +0,0 @@ -assign('title', __('Sign in')); ?> - -Form->create(null, ['class' => 'offset-by-six sign-in']); ?> - Form->input('email'); ?> - Form->input('password', ['label' => __('Password')]); ?> - or Html->link(__('Sign Up'), ['_name' => 'signup']) ?> -
-

Html->link(__('Forgot password?'), ['_name' => 'forgot_password'], ['class' => 'small-red']) ?>

-Form->end(); ?> diff --git a/cakephp/notejam/src/Template/Users/signup.ctp b/cakephp/notejam/src/Template/Users/signup.ctp deleted file mode 100644 index 770953124..000000000 --- a/cakephp/notejam/src/Template/Users/signup.ctp +++ /dev/null @@ -1,7 +0,0 @@ -assign('title', __('Sign up')); ?> -Form->create($user, ['class' => 'offset-by-six sign-in']); ?> - Form->input('email'); ?> - Form->input('password', ['label' => __('Password')]); ?> - Form->input('confirm_password', ['label' => __('Confirm password'), 'type' => 'password']); ?> - or Html->link(__('Sign In'), ['_name' => 'signin']) ?> -Form->end(); ?> diff --git a/cakephp/notejam/src/View/AppView.php b/cakephp/notejam/src/View/AppView.php deleted file mode 100644 index e8bb1118c..000000000 --- a/cakephp/notejam/src/View/AppView.php +++ /dev/null @@ -1,35 +0,0 @@ -loadHelper('Html');` - * - * @return void - */ - public function initialize() - { - } -} diff --git a/cakephp/notejam/src/View/Cell/PadsCell.php b/cakephp/notejam/src/View/Cell/PadsCell.php deleted file mode 100644 index 10d2d301a..000000000 --- a/cakephp/notejam/src/View/Cell/PadsCell.php +++ /dev/null @@ -1,33 +0,0 @@ -request->session()->read('Auth.User.id'); - $user = \Cake\ORM\TableRegistry::get('Users')->get($id, [ - 'contain' => ['Pads'] - ]); - $this->set('pads', $user->pads); - } -} diff --git a/cakephp/notejam/tests/Fixture/NotesFixture.php b/cakephp/notejam/tests/Fixture/NotesFixture.php deleted file mode 100644 index 5252801d2..000000000 --- a/cakephp/notejam/tests/Fixture/NotesFixture.php +++ /dev/null @@ -1,51 +0,0 @@ - ['type' => 'integer', 'length' => null, 'unsigned' => false, 'null' => false, 'default' => null, 'autoIncrement' => true, 'precision' => null, 'comment' => null], - 'pad_id' => ['type' => 'integer', 'length' => null, 'unsigned' => false, 'null' => true, 'default' => null, 'precision' => null, 'comment' => null, 'autoIncrement' => null], - 'user_id' => ['type' => 'integer', 'length' => null, 'unsigned' => false, 'null' => false, 'default' => null, 'precision' => null, 'comment' => null, 'autoIncrement' => null], - 'name' => ['type' => 'string', 'length' => 100, 'null' => false, 'default' => null, 'precision' => null, 'comment' => null, 'fixed' => null], - 'text' => ['type' => 'text', 'length' => null, 'null' => false, 'default' => null, 'precision' => null, 'comment' => null], - 'created_at' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'precision' => null, 'comment' => null], - 'updated_at' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'precision' => null, 'comment' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - 'user_id_fk' => ['type' => 'foreign', 'columns' => ['user_id'], 'references' => ['users', 'id'], 'update' => 'noAction', 'delete' => 'noAction', 'length' => []], - 'pad_id_fk' => ['type' => 'foreign', 'columns' => ['pad_id'], 'references' => ['pads', 'id'], 'update' => 'noAction', 'delete' => 'noAction', 'length' => []], - ], - ]; - // @codingStandardsIgnoreEnd - - /** - * Records - * - * @var array - */ - public $records = [ - [ - 'id' => 1, - 'pad_id' => 1, - 'user_id' => 1, - 'name' => 'Note #1', - 'text' => 'Lorem ipsum dolor sit amet, aliquet feugiat. Convallis morbi fringilla gravida, phasellus feugiat dapibus velit nunc, pulvinar eget sollicitudin venenatis cum nullam, vivamus ut a sed, mollitia lectus. Nulla vestibulum massa neque ut et, id hendrerit sit, feugiat in taciti enim proin nibh, tempor dignissim, rhoncus duis vestibulum nunc mattis convallis.', - 'created_at' => '2015-07-12 19:07:40', - 'updated_at' => '2015-07-12 19:07:40' - ], - ]; -} diff --git a/cakephp/notejam/tests/Fixture/PadsFixture.php b/cakephp/notejam/tests/Fixture/PadsFixture.php deleted file mode 100644 index 27da918d4..000000000 --- a/cakephp/notejam/tests/Fixture/PadsFixture.php +++ /dev/null @@ -1,42 +0,0 @@ - ['type' => 'integer', 'length' => null, 'unsigned' => false, 'null' => false, 'default' => null, 'autoIncrement' => true, 'precision' => null, 'comment' => null], - 'name' => ['type' => 'string', 'length' => 100, 'null' => false, 'default' => null, 'precision' => null, 'comment' => null, 'fixed' => null], - 'user_id' => ['type' => 'integer', 'length' => null, 'unsigned' => false, 'null' => false, 'default' => null, 'precision' => null, 'comment' => null, 'autoIncrement' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - 'user_id_fk' => ['type' => 'foreign', 'columns' => ['user_id'], 'references' => ['users', 'id'], 'update' => 'noAction', 'delete' => 'noAction', 'length' => []], - ], - ]; - // @codingStandardsIgnoreEnd - - /** - * Records - * - * @var array - */ - public $records = [ - [ - 'id' => 1, - 'name' => 'Pad', - 'user_id' => 1 - ], - ]; -} diff --git a/cakephp/notejam/tests/Fixture/UsersFixture.php b/cakephp/notejam/tests/Fixture/UsersFixture.php deleted file mode 100644 index 6731d3a4f..000000000 --- a/cakephp/notejam/tests/Fixture/UsersFixture.php +++ /dev/null @@ -1,48 +0,0 @@ - ['type' => 'integer', 'length' => null, 'unsigned' => false, 'null' => false, 'default' => null, 'autoIncrement' => true, 'precision' => null, 'comment' => null], - 'email' => ['type' => 'string', 'length' => 75, 'null' => false, 'default' => null, 'precision' => null, 'comment' => null, 'fixed' => null], - 'password' => ['type' => 'string', 'length' => 128, 'null' => false, 'default' => null, 'precision' => null, 'comment' => null, 'fixed' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - ]; - // @codingStandardsIgnoreEnd - - /** - * Records - * - * @var array - */ - public $records = [ - [ - 'id' => 1, - 'email' => 'user1@example.com', - // password is 111111 - 'password' => '$2y$10$0hoGWxcL.dC6WWrhCDQUVezLFlxMkguhXDziDi.yQSLjhoBaI9FDO' - ], - [ - 'id' => 2, - 'email' => 'user2@example.com', - // password is 111111 - 'password' => '$2y$10$0hoGWxcL.dC6WWrhCDQUVezLFlxMkguhXDziDi.yQSLjhoBaI9FDO' - ], - ]; -} diff --git a/cakephp/notejam/tests/TestCase/Controller/NotesControllerTest.php b/cakephp/notejam/tests/TestCase/Controller/NotesControllerTest.php deleted file mode 100644 index 5fc33976f..000000000 --- a/cakephp/notejam/tests/TestCase/Controller/NotesControllerTest.php +++ /dev/null @@ -1,151 +0,0 @@ -signin($this->user); - $data = ['name' => 'New note', 'text' => 'Text']; - $this->post('/notes/create', $data); - $this->assertResponseSuccess(); - $this->assertRedirect('/'); - $this->assertEquals( - TableRegistry::get('Notes')->get(2)->name, - $data['name'] - ); - } - - /** - * Test if validation works when create a note - * - * @return void - */ - public function testCreateFailRequiredFields() - { - $this->signin($this->user); - $this->post('/notes/create', ['name' => '']); - $this->assertResponseContains('This field cannot be left empty'); - } - - /** - * Test if note can be successfully edited - * - * @return void - */ - public function testEditSuccess() - { - $this->signin($this->user); - $data = ['name' => 'New note name']; - $this->post('/notes/1/edit', $data); - $this->assertResponseSuccess(); - $this->assertRedirect('/notes/1'); - $this->assertEquals( - TableRegistry::get('Notes')->get(1)->name, - $data['name'] - ); - } - - /** - * Test if validation works when edit a note - * - * @return void - */ - public function testEditFailRequiredFields() - { - $this->signin($this->user); - $this->post('/notes/1/edit', ['name' => '']); - $this->assertResponseContains('This field cannot be left empty'); - } - - /** - * Test if note cannot be successfully viewed by not an owner - * - * @return void - */ - public function testEditFailNotAnOwner() - { - $this->signin(['id' => 2, 'email' => 'user2@example.com']); - $data = ['name' => 'New note name']; - $this->post('/notes/1/edit', $data); - $this->assertResponseError(); - } - - /** - * Test if note can be successfully viewed - * - * @return void - */ - public function testViewSuccess() - { - $this->signin($this->user); - $this->get('/notes/1'); - $this->assertResponseSuccess(); - $this->assertResponseContains('Note #1'); - } - - /** - * Test if note cannot be viewed by not an owner - * - * @return void - */ - public function testViewFailNotAnOwner() - { - $this->signin(['id' => 2, 'email' => 'user2@example.com']); - $this->get('/notes/1/'); - $this->assertResponseError(); - } - - /** - * Test if note can be successfully deleted - * - * @return void - */ - public function testDeleteSuccess() - { - $this->signin($this->user); - $this->post('/notes/1/delete', []); - $this->assertResponseSuccess(); - $this->assertRedirect('/'); - $this->assertEquals( - TableRegistry::get('Notes')->find('all')->count(), - 0 - ); - } - - /** - * Test if note cannot be deleted by not an owner - * - * @return void - */ - public function testDeleteFailNotAnOwner() - { - $this->signin(['id' => 2, 'email' => 'user2@example.com']); - $this->post('/notes/1/delete', []); - $this->assertResponseError(); - } -} diff --git a/cakephp/notejam/tests/TestCase/Controller/PadsControllerTest.php b/cakephp/notejam/tests/TestCase/Controller/PadsControllerTest.php deleted file mode 100644 index d1921f7cb..000000000 --- a/cakephp/notejam/tests/TestCase/Controller/PadsControllerTest.php +++ /dev/null @@ -1,151 +0,0 @@ -signin($this->user); - $data = ['name' => 'New pad']; - $this->post('/pads/create', $data); - $this->assertResponseSuccess(); - $this->assertRedirect('/pads/2'); - $this->assertEquals( - TableRegistry::get('Pads')->get(2)->name, - $data['name'] - ); - } - - /** - * Test if validation works when create a pad - * - * @return void - */ - public function testCreateFailRequiredFields() - { - $this->signin($this->user); - $this->post('/pads/create', ['name' => '']); - $this->assertResponseContains('This field cannot be left empty'); - } - - /** - * Test if pad can be successfully edited - * - * @return void - */ - public function testEditSuccess() - { - $this->signin($this->user); - $data = ['name' => 'New pad name']; - $this->post('/pads/1/edit', $data); - $this->assertResponseSuccess(); - $this->assertRedirect('/pads/1'); - $this->assertEquals( - TableRegistry::get('Pads')->get(1)->name, - $data['name'] - ); - } - - /** - * Test if validation works when edit a pad - * - * @return void - */ - public function testEditFailRequiredFields() - { - $this->signin($this->user); - $this->post('/pads/1/edit', ['name' => '']); - $this->assertResponseContains('This field cannot be left empty'); - } - - /** - * Test if pad cannot be edited by not an owner - * - * @return void - */ - public function testEditFailNotAnOwner() - { - $this->signin(['id' => 2, 'email' => 'user2@example.com']); - $data = ['name' => 'New pad name']; - $this->post('/pads/1/edit', $data); - $this->assertResponseError(); - } - - /** - * Test if pad can be successfully viewed - * - * @return void - */ - public function testViewSuccess() - { - $this->signin($this->user); - $this->get('/pads/1'); - $this->assertResponseSuccess(); - $this->assertResponseContains('Pad (1)'); - } - - /** - * Test if pad cannot be viewed by not an owner - * - * @return void - */ - public function testViewFailNotAnOwner() - { - $this->signin(['id' => 2, 'email' => 'user2@example.com']); - $this->get('/pads/1'); - $this->assertResponseError(); - } - - /** - * Test if pad can be successfully deleted - * - * @return void - */ - public function testDeleteSuccess() - { - $this->signin($this->user); - $this->post('/pads/1/delete', []); - $this->assertResponseSuccess(); - $this->assertRedirect('/'); - $this->assertEquals( - TableRegistry::get('Pads')->find('all')->count(), - 0 - ); - } - - /** - * Test if pad cannot be deleted by not an owner - * - * @return void - */ - public function testDeleteFailNotAnOwner() - { - $this->signin(['id' => 2, 'email' => 'user2@example.com']); - $this->post('/pads/1/delete', []); - $this->assertResponseError(); - } -} diff --git a/cakephp/notejam/tests/TestCase/Controller/UsersControllerTest.php b/cakephp/notejam/tests/TestCase/Controller/UsersControllerTest.php deleted file mode 100644 index 15ce28ec3..000000000 --- a/cakephp/notejam/tests/TestCase/Controller/UsersControllerTest.php +++ /dev/null @@ -1,139 +0,0 @@ - 'user@example.com', - 'password' => 'pa$$word', - 'confirm_password' => 'pa$$word' - ]; - $this->post('/signup', $data); - $this->assertResponseSuccess(); - $users = TableRegistry::get('Users'); - $query = $users->find()->where(['email' => $data['email']]); - $this->assertEquals(1, $query->count()); - } - - /** - * Test if signup fails if required fields are missing - * - * @return void - */ - public function testSignupFailRequiredFields() - { - $data = [ - 'email' => '', - 'password' => '', - 'confirm_password' => '' - ]; - $this->post('/signup', $data); - $this->assertResponseSuccess(); - $this->assertResponseContains('This field cannot be left empty'); - } - - /** - * Test if signup fails if email is invalid - * - * @return void - */ - public function testSignupFailInvalidEmail() - { - $data = [ - 'email' => 'invalid email' - ]; - $this->post('/signup', $data); - $this->assertResponseSuccess(); - $this->assertResponseContains('The provided value is invalid'); - } - - /** - * Test if signup fails if email already exists - * - * @return void - */ - public function testSignupFailEmailExists() - { - $data = [ - 'email' => 'user1@example.com', - 'password' => 'pa$$word', - 'confirm_password' => 'pa$$word' - ]; - $this->post('/signup', $data); - $this->assertResponseSuccess(); - $this->assertResponseContains('This value is already in use'); - } - - /** - * Test if signup fails if passwords do not match - * - * @return void - */ - public function testSignupFailPasswordsNotMatch() - { - $data = [ - 'email' => 'user1@example.com', - 'password' => 'pa$$word1', - 'confirm_password' => 'pa$$word2' - ]; - $this->post('/signup', $data); - $this->assertResponseSuccess(); - $this->assertResponseContains('Passwords do not match'); - } - - /** - * Test if signin success - * - * @return void - */ - public function testSigninSuccess() - { - $data = [ - 'email' => 'user1@example.com', - 'password' => '111111' - ]; - $this->post('/signin', $data); - $this->assertResponseSuccess(); - $this->assertRedirect(['controller' => 'Notes', 'action' => 'index']); - $this->assertSession('user1@example.com', 'Auth.User.email'); - - } - - /** - * Test if signin fails if provided credentials are wroing - * - * @return void - */ - public function testSigninFailWrongCredentials() - { - $data = [ - 'email' => 'user2@example.com', - 'password' => 'wrong password' - ]; - $this->post('/signin', $data); - $this->assertResponseContains('Your username or password is incorrect.'); - } -} diff --git a/cakephp/notejam/tests/TestCase/NotejamTestCase.php b/cakephp/notejam/tests/TestCase/NotejamTestCase.php deleted file mode 100644 index d8d5f468c..000000000 --- a/cakephp/notejam/tests/TestCase/NotejamTestCase.php +++ /dev/null @@ -1,44 +0,0 @@ - 1, - 'email' => 'user@example.com' - ]; - - /** - * Sign in user - * - * @param array $user User - * @return void - */ - public function signin($user) - { - $this->session([ - 'Auth' => [ - 'User' => [ - 'id' => $user['id'], - 'username' => $user['email'] - ] - ] - ]); - } - - /** - * Create a user - * - * @param array $userData User data - * @return User - */ - public function createUser($userData) - { - $user = TableRegistry::get('Users')->newEntity($userData); - TableRegistry::get('Users')->save($user); - return $user; - } -} diff --git a/cakephp/notejam/tests/bootstrap.php b/cakephp/notejam/tests/bootstrap.php deleted file mode 100644 index e56aa9df2..000000000 --- a/cakephp/notejam/tests/bootstrap.php +++ /dev/null @@ -1,8 +0,0 @@ - - RewriteEngine On - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^ index.php [L] - diff --git a/cakephp/notejam/webroot/css/style.css b/cakephp/notejam/webroot/css/style.css deleted file mode 100644 index 5748e0390..000000000 --- a/cakephp/notejam/webroot/css/style.css +++ /dev/null @@ -1,396 +0,0 @@ -/* -* Skeleton V1.0.3 -* Copyright 2011, Dave Gamache -* www.getskeleton.com -* Free to use under the MIT license. -* http://www.opensource.org/licenses/mit-license.php -* 7/17/2011 -*/ - - -/* Documentation Styles -================================================== */ - div.container { - padding-top: 40px; } - - /* Doc nav */ - nav { - width: 160px; } - #logo, .bold-header { - margin-bottom: 30px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - letter-spacing: -1px; - color: #555; - font-weight: bold; } - .bold-header span { - font-weight: normal; - font-size: 23px; - } - .bold-header a.header { - text-decoration: none; - color: inherit; - } - .bold-header span.jam { - font-size: 46px; - line-height: 50px; - } - nav ul { - float: left; } - nav ul li { - display: block; - margin-bottom: 10px; } - nav ul li a, - nav ul li a:visited, - nav ul li a:active { - font-size: 14px; - color: #555; - text-decoration: none; - font-weight: bold; } - nav ul li a:hover, - nav ul li a:focus { - color: #222; } - header h1 { - font-size: 52px; - line-height: 61px; - letter-spacing: -1px; - font-weight: normal; - font-family: "Georgia", "Times New Roman", Helvetica, Arial, sans-serif; } - hr.large { - border: none; - height: 8px; - background: #ebebeb; - margin: 50px 0; } - div.doc-section { - margin: 30px 0; } - - #whatAndWhy .row { - padding: 30px 0 0; } - - #typography blockquote { - margin-top: 20px; } - - .hidden-code a { - font-size: 12px; - color: #999; } - .hidden-code>div { - display: none; } - - - /* Grid */ - #grid .column, - #grid .columns { - background: #ddd; - height: 25px; - line-height: 25px; - margin-bottom: 10px; - text-align: center; - text-transform: uppercase; - color: #555; - font-size: 12px; - font-weight: bold; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; } - #grid .column:hover, - #grid .columns:hover { - background: #bbb; - color: #333; } - #grid .example-grid { overflow: hidden; } - - .post-button-note, - .post-button-note a { - font-size: 11px; - color: #999; } - - #examples .four.columns a { - text-decoration: none; - } - #examples .four.columns a:hover { - text-decoration: underline; - } - - - .resize { - position: fixed; - bottom: 0; - right: 0; - height: 80px; - width: 80px; - background: url(images/resize.png); } - - - img { - max-width: 100%; - height: auto; } - - .gist-meta { display: none !important;} - - ul ul ul li { margin-bottom: 3px; } - - .twitter-share-button { margin-bottom: -18px; } - - /* Table stylesheets */ - table { - width: 100%; - border-collapse: collapse; - } - - table th, table td { - padding: 10px 10px 9px; - font-size: 13px; - line-height: 18px; - text-align: left; - } - - table td { - vertical-align: top; - border-top: solid 1px #ddd; - } - - table th { - padding-top: 9px; - font-weight: bold; - vertical-align: middle; - } - - table.condensed th, table.condensed td { - padding: 5px 5px 4px; - } - - table.bordered { - border-collapse: separate; - border: solid 1px #ddd; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - } - - table.bordered th + th, - table.bordered th + td, - table.bordered td + td { - border-left: solid 1px #ddd; - } - - .zebra-striped tbody tr:nth-child(odd) td, - .zebra-striped tbody tr:nth-child(odd) th { - background: #f5f5f5; - } - -.carbonad, -.carbonad-image, -.carbonad-text, -.carbonad-tag { - background: none !important; - border: none !important; - margin-left: 0 !important; -} -.carbonad-tag { - margin-top: 6px !important; - padding-top: 0 !important; -} -.carbonad-text { - height: auto !important; -} -.carbonad-image { - margin-top: 0 !important; -} - -.hidden-text { - font-size: 12px; - color: #999; -} - -td.date, th.date { - text-align: right; -} - -td.date { - font-style: italic; -} - -form.note input[type="text"], form.note textarea { - width: 100%; -} - -form hr { - width: 218px; - margin: 10px 0px; -} - -form.note textarea { - height: 250px; -} - -div.content-area { - min-height: 600px; -} - -hr.footer { - margin-bottom: 10px; -} - -div.footer { - margin-bottom: 10px; - text-align: center; - font-size: 12px; -} - -form.sign-in { - margin: 50px 0 0 0; -} - -.sort_arrow { - text-decoration: none; -} - -.sort_arrow:hover { - text-decoration: none; - color: red; -} - -div.sign-in-out-block { - position: absolute; - right: 14px; - top: 8px; - font-size: 12px; -} - -div.sign-in-out-block a { - /*text-decoration: none;*/ -} - -a.small-red { - color: red; - font-size: 12px; -} - -table.notes { - margin: 0 0 20px 0; -} - -table.notes th.note { - width: 72%; -} - -table.notes td.pad { - color: grey; -} - -table.notes td.pad a { - color: grey; - text-decoration: underline; - font-style: normal; -} - - -table.notes td.pad a:hover { - color: black; -} - -p.empty { - color: grey; - font-style: italic; -} - -a.delete-note { - float: right; - font-size: 12px; - color: red; -} - -.red, input.red { - color: red !important; -} - -ul.errorlist, ul.errors, .error-message { - margin: -18px 0 0 0; -} - -ul.errorlist li, ul.errors li, .error-message { - color: red; -} - -.alert-area { - text-align: center; -} - -.alert { - padding: 5px 8px; - margin: 0 0 12px 0; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border: 1px solid #d6e9c6; -} - -.alert-error { - color: #b94a48; - background-color: #f2dede; - border: 1px solid #eed3d7; -} - - /* Mobile */ - @media only screen and (max-width: 767px) { - header h1 { font-size: 34px; line-height: 37px; } - nav { position: relative; } - nav ul, - .carbonad { - display: none; - } - #logo { text-align: left; } - #examples .four.columns { - padding-top: 30px; - } - } - - /* Mobile Landscape */ - @media only screen and (min-width: 480px) and (max-width: 767px) { - nav ul { - display: none; - } - } - - /* Non 960 */ - @media only screen and (max-width: 959px) { - #logo { - font-size: 21px; - margin-bottom: 15px; } - nav .button { - padding: 9px 20px 11px; } - } - - /* iPad Portrait/Browser */ - @media only screen and (min-width: 768px) and (max-width: 959px) { - nav { - width: 124px; } - } - - /* Mobile/Browser */ - @media only screen and (max-width: 767px) {} - - /* Mobile Landscape/Browser */ - @media only screen and (min-width: 480px) and (max-width: 767px) {} - - /* Anything smaller than standard 960 */ - @media only screen and (max-width: 959px) {} - - - /* iPad Portrait Only */ - @media only screen and (min-width: 768px) and (max-width: 959px) and (max-device-width: 1000px) {} - - /* Mobile Only */ - @media only screen and (max-width: 767px) and (max-device-width: 1000px) {} - - /* Mobile Landscape Only */ - @media only screen and (min-width: 480px) and (max-width: 767px) and (max-device-width: 1000px) {} - - /* Anything smaller than standard 960 on a device */ - @media only screen and (max-width: 959px) and (max-device-width: 1000px) { - .resize { display: none; } - } - diff --git a/cakephp/notejam/webroot/favicon.ico b/cakephp/notejam/webroot/favicon.ico deleted file mode 100644 index aaac9c853a085a151ef0b2ded6f03ecd88f88899..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1782 zcmZuxc{H2(8vck{YH2L3U6I6Ci{zs&X;D#QrZ*&^i{84XI(0j$xRmxXt*IrVEw@F7 z+uEv@*w=$BB$il$kZ35^Qn3tU=~#l=<}*Ea{<`P9=l8tpAMbgd-wOZ|fFuBi0}#pr z2ND2a1OR}({+F091pr7%0HAo{-4u^&9fwMa?qB1G5JD3GTowks#ug_?5R7?V@^Xc+ z*}%H~v}J{^c^3lwVjYGU$f?$|_%lYZU5qWiP`8H5XL1GKO@bkLp9V|}jig5&7zyPTS^5n9mvAcYk~WabC%ir3gh_ZWG% zD$_ms>m%x||H3BV2cxfchuo++1AeTHsj#x0=!{w{DxMom7B&QIe;8kxC>F2sJMWWr zrWTfF2X+qECkLp@CFR?DE7foA?rzPu6#t7;@raumG{FuXX-%w*Oiex7Ih=?m0cQVh zO)*WEo_=NCnmi$zX#M`TV^FQt9p~(&AvnjIJ@v#1er$?BkO)jDSULrx(?$C^T@q=l zo!QLDt-CQ_WxrCM4cC$EmO4Pbe1!kbc-DsD8)$x({B1rb3h-(#DZC?2C!4-KuJX2T zePuoL{C#EA)OvuHgOYTE`sA@hJKwvJk-LIOu}-70N3W2!84<UQ4$(~ zL;}g98v*tpK&~M;PndfMERw5v=GF2+# zJrsWuY_9aotmF4L*1Ifh=SQ1ft0~r{V#RB}WQ3?SzBCqiT*)<7t$E?VK5g;#5xPCl zVSi7Ys|kMrllmm$wnSSt-$ShL|KsB?t_xc}Yx8swg|ag>{)yK38>^e=i=X5bcO*G> zI$L&7{d>K!Jx+F&Pi>yvgjHTQqH{fjtfw>qp)SL|>CL6uDqH~(G1Nvbh%xFc0OuIw zeunvSDT^9l-a*va*_&S9XelkT{mA>d--XoKq`tZJt~pkVl_opRBdu=5_fzhS{udk- z*p%99jnt8bdoi3`P0_;D3OD`T-O)V7cY6@)I)CUNourP%dFr8TO^U8NSFcCW>~J}{fUbJAengd7wot}smH>`oZ#`iWcLKC`dVhH`E@jgo?sQGb-NIa!C*{!yQq4B)0pO7_Q zZ|PP~+f zzPQM(X5rbSW0p$na0Z(|9#YE1K1R9XtkvMgc|+4Rlc!sh$`U9X);EmktX{IAvH@I) z45Q{|EYbpCrWx1xWt_dJ(D3kJJI9xObF~K*+fG$E-cvT9Oo#-F?!7lMaXw|?VfmuzF_PH2>WxRtJg zJiotCAc}er#jch1bAG0!AeRy~KgRoRbtGeWcePZ|uo6mN&H|oyh>Qjn>K;$*qvAee zGA+&UIpgyY9v>cD31jE};0fDMP@I)MSV~Sw2@WR2W-V7@!ir_#Rh#7}%J;Wlb7xOs z#ngTj%aeevi&OmZZRIXlK>y0w#W3#d>0~B8|2$gUm@UvG$k|{`jCbwNuZgNyfv>%! vNX3^}e9zJgoz!XVI;{2C>Dyj9q)cr7> zIGsQFGn3| zCzs2iP$-yfVPOGVTU&6sT(-5fwHb2tVsLP9#{Vr9Ct?R7q(rf?v2A5#W$OI=e1YUJ zQ1YRnA&iWSQ1XYAm__>aYb6XIhMiYVD+-z8_pYi6+CsH{*^m;vOjqvbr=H&DFkeqxHQBh$Scsoy0Glw(T zsaSG*ok62V;~yXYNgP*DUw;o98^+0@vGFb{HC+As}XJ=;xg=B7N_;-mKbHH{|lXs_o+aPcs5~J?s%^P2Odb)Uz z$GvY6^!N9(C2-h?28B$qx7%_yHnt2eU%nQ0qThbl6a_+b)EirjBgQ`g1_07Fr&6R? RzIgxu002ovPDHLkV1mdlwUYn< diff --git a/cakephp/notejam/webroot/img/cake.power.gif b/cakephp/notejam/webroot/img/cake.power.gif deleted file mode 100644 index 8f8d570a2e24d86f0ad7730ee8f2435fd49f152c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmV;)05<&ZTq0L2I(c1A@d@rg`ENj#vn zcl`yi#iKX*jb2F7vd0WQgUq5Tw}Jp}g+ZnCeBY3dYNI+m71%bHRfx4UCkD2th(Q*@ zmd5r+MJNYn7dispatch( - Request::createFromGlobals(), - new Response() -); diff --git a/cakephp/notejam/webroot/js/empty b/cakephp/notejam/webroot/js/empty deleted file mode 100644 index e69de29bb..000000000 diff --git a/contribute.rst b/contribute.rst deleted file mode 100644 index 4272d6c7f..000000000 --- a/contribute.rst +++ /dev/null @@ -1,152 +0,0 @@ -****************** -Contribution guide -****************** - -========================= -Pull requests and commits -========================= - -Send your pull requests in the ``master`` branch. - -Please prepend commit messages with framework name. - -**Good** commit messages: - -.. code-block:: - - Django: Implemented signout functionality - -.. code-block:: - - Symfony: Fixed broken pad tests - -**Bad** commit messages: - -.. code-block:: - - Implemented signout functionality in django - -.. code-block:: - - Fixed broken symfony pad tests - - -========== -Code style -========== - -Please follow code style guidelines and best practices for your programming language and framework. -Specify guidelines in a README file in a code style section. - - -==================== -Application overview -==================== - -Notejam is a web application which allows user to sign up/in/out and create/view/edit/delete notes. -Notes are grouped in pads. See `screenshots `_ -for look and feel. - ------------------------ -Objects/Models/Entities ------------------------ - -Structure of objects (aka models or entities) used in the app: - -* Note: id, pad_id, user_id, name, text, created_at, updated_at -* Pad: id, user_id, name -* User: id, email, password - -See recommended `database schema `_ for details. - - ------ -Pages ------ - -All html layouts are sliced and available in the `html `_ folder. - -**User pages** - -* ``GET /signup/`` - Show Sign Up form -* ``POST /signup/`` - Sign Up -* ``GET /signin/`` - Show Sign In form -* ``POST /signin/`` - Sign In -* ``GET /signout/`` - Sign out -* ``GET /forgot-password/`` - Show Forgot password form -* ``POST /forgot-password/`` - Forgot Password request -* ``GET /settings/`` - Show user settings form -* ``POST /settings/`` - Change user settings - - -**Note pages** - - -* ``GET /notes/create/`` - Show Create note form -* ``POST /notes/create/`` - Create note -* ``GET /notes//`` - View note -* ``GET /notes//edit/`` - Show Edit note form -* ``POST /notes//edit/`` - Edit note -* ``GET /notes//delete/`` - Show confirmation delete page -* ``POST /notes//delete/`` - Delete note - - -**Pad pages** - - -* ``GET /pads/create/`` - Show Create pad form -* ``POST /pads/create/`` - Create pad -* ``GET /pads//`` - View pad notes -* ``GET /pads//edit/`` - Show Edit pad form -* ``POST /pads//edit/`` - Edit pad -* ``GET /pads//delete/`` - Show confirmation delete page -* ``POST /pads//delete/`` - Delete pad - - ---------------------- -Functional/unit tests ---------------------- - -Any kind of tests are very desirable. - -**Recommended test cases** - -Sign Up: - -* user can successfully sign up -* user can't sign up if required fields are missing -* user can't sign up if email is invalid -* user can't sign up if email already exists -* user can't sign up if passwords do not match - -Sign In: - -* user can successfully sign in -* user can't sign in if required fields are missing -* user can't sign in if credentials are wrong - -Notes: - -* note can be successfully created -* note can't be created by anonymous user -* note can't be created if required fields are missing -* note can be edited by its owner -* note can't be edited if required fields are missing -* note can't be edited by not an owner -* note can't be added into another's user pad -* note can be viewed by its owner -* note can't be viewed by not an owner -* note can be deleted by its owner -* note can't be deleted by not an owner - -Pads: - -* pad can be successfully created -* pad can't be created if required fields are missing -* pad can be edited by its owner -* pad can't be edited if required fields are missing -* pad can't be edited by not an owner -* pad can be viewed by its owner -* pad can't be viewed by not an owner -* pad can be deleted by its owner -* pad can't be deleted by not an owner diff --git a/django/README.rst b/django/README.rst deleted file mode 100644 index bfcdd1ba2..000000000 --- a/django/README.rst +++ /dev/null @@ -1,83 +0,0 @@ -*************** -Notejam: Django -*************** - -Notejam application implemented using `Django `_ framework. - -Django version: 1.6 - -========================== -Installation and launching -========================== - ------ -Clone ------ - -Clone the repo: - -.. code-block:: bash - - $ git clone git@github.com:komarserjio/notejam.git YOUR_PROJECT_DIR/ - -------- -Install -------- -Use `virtualenv `_ or `virtualenvwrapper `_ -for `environment management `_. - -Install dependencies: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/django/ - $ virtualenv .venv -p python2.7 # This version of Django only works on python2 - $ source .venv/bin/activate - $ pip install -r requirements.txt - -Create database schema: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/django/notejam/ - $ ./manage.py syncdb - $ ./manage.py migrate - ------- -Launch ------- - -Start django web server: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/django/notejam/ - $ ./manage.py runserver - -Go to http://127.0.0.1:8000/ in your browser. - ---------- -Run tests ---------- - -Run functional and unit tests: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/django/notejam/ - $ ./manage.py test - - -============ -Contribution -============ -Do you have python/django experience? Help the app to follow python and django best practices. - -Please send your pull requests in the ``master`` branch. -Always prepend your commits with framework name: - -.. code-block:: bash - - Django: Implemented sign in functionality - -Read `contribution guide `_ for details. diff --git a/django/notejam/manage.py b/django/notejam/manage.py deleted file mode 100755 index 6b90f3bb6..000000000 --- a/django/notejam/manage.py +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env python -import os -import sys - -if __name__ == "__main__": - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "notejam.settings") - - from django.core.management import execute_from_command_line - - execute_from_command_line(sys.argv) diff --git a/django/notejam/notejam/__init__.py b/django/notejam/notejam/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/django/notejam/notejam/settings.py b/django/notejam/notejam/settings.py deleted file mode 100644 index 19991825b..000000000 --- a/django/notejam/notejam/settings.py +++ /dev/null @@ -1,184 +0,0 @@ -import os - -DEBUG = True -TEMPLATE_DEBUG = DEBUG -ALLOWED_HOSTS = [] - -PROJECT_DIR = "{}/../".format(os.path.dirname(__file__)) - -ADMINS = ( - ('Sergey Komar', 'komarserjio@gmail.com'), -) - -MANAGERS = ADMINS - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': 'notejam.db', - 'USER': '', - 'PASSWORD': '', - 'HOST': '', - 'PORT': '', - } -} - -# Local time zone for this installation. Choices can be found here: -# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name -# although not all choices may be available on all operating systems. -# In a Windows environment this must be set to your system time zone. -TIME_ZONE = 'Europe/Kiev' - -# Language code for this installation. All choices can be found here: -# http://www.i18nguy.com/unicode/language-identifiers.html -LANGUAGE_CODE = 'en-us' - -SITE_ID = 1 - -# If you set this to False, Django will make some optimizations so as not -# to load the internationalization machinery. -USE_I18N = True - -# If you set this to False, Django will not format dates, numbers and -# calendars according to the current locale. -USE_L10N = True - -# If you set this to False, Django will not use timezone-aware datetimes. -USE_TZ = True - -# Absolute filesystem path to the directory that will hold user-uploaded files. -# Example: "/home/media/media.lawrence.com/media/" -MEDIA_ROOT = os.path.join(PROJECT_DIR, 'media/') - -# URL that handles the media served from MEDIA_ROOT. Make sure to use a -# trailing slash. -# Examples: "http://media.lawrence.com/media/", "http://example.com/media/" -MEDIA_URL = '' - -# Absolute path to the directory static files should be collected to. -# Don't put anything in this directory yourself; store your static files -# in apps' "static/" subdirectories and in STATICFILES_DIRS. -# Example: "/home/media/media.lawrence.com/static/" -STATIC_ROOT = os.path.join(PROJECT_DIR, 'static/') - -# URL prefix for static files. -# Example: "http://media.lawrence.com/static/" -STATIC_URL = '/static/' - -# Additional locations of static files -STATICFILES_DIRS = ( - os.path.join(PROJECT_DIR, 'static_files/'), -) - -# List of finder classes that know how to find static files in -# various locations. -STATICFILES_FINDERS = ( - 'django.contrib.staticfiles.finders.FileSystemFinder', - 'django.contrib.staticfiles.finders.AppDirectoriesFinder', -# 'django.contrib.staticfiles.finders.DefaultStorageFinder', -) - -# Make this unique, and don't share it with anybody. -SECRET_KEY = 'g+cy2q816xje*f#k=9z!e*t%h-7tt(tbo$q^1n)l0gd1=x8$65' - -# List of callables that know how to import templates from various sources. -TEMPLATE_LOADERS = ( - 'django.template.loaders.filesystem.Loader', - 'django.template.loaders.app_directories.Loader', -# 'django.template.loaders.eggs.Loader', -) - -TEMPLATE_CONTEXT_PROCESSORS = ( - "django.contrib.auth.context_processors.auth", - "django.core.context_processors.debug", - "django.core.context_processors.i18n", - "django.core.context_processors.media", - "django.core.context_processors.static", - "django.core.context_processors.tz", - "django.core.context_processors.request", - "django.contrib.messages.context_processors.messages" -) - -MIDDLEWARE_CLASSES = ( - 'django.middleware.common.CommonMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - # Uncomment the next line for simple clickjacking protection: - # 'django.middleware.clickjacking.XFrameOptionsMiddleware', -) - -ROOT_URLCONF = 'notejam.urls' - -APPEND_SLASH = True - -# Python dotted path to the WSGI application used by Django's runserver. -WSGI_APPLICATION = 'notejam.wsgi.application' - -TEMPLATE_DIRS = ( - os.path.join(PROJECT_DIR, 'templates/'), -) - -INSTALLED_APPS = ( - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.sites', - 'django.contrib.messages', - 'django.contrib.staticfiles', - #'django.contrib.admin', - 'pads', - 'notes', - 'users', - 'south', -) - -AUTHENTICATION_BACKENDS = ( - 'users.auth_backends.EmailModelBackend', - 'django.contrib.auth.backends.ModelBackend', -) - -LOGIN_URL = '/signin/' -LOGOUT_URL = '/signout/' - -# development email file-based backend -EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend' -EMAIL_FILE_PATH = '/tmp' - -# A sample logging configuration. The only tangible logging -# performed by this configuration is to send an email to -# the site admins on every HTTP 500 error when DEBUG=False. -# See http://docs.djangoproject.com/en/dev/topics/logging for -# more details on how to customize your logging configuration. -LOGGING = { - 'version': 1, - 'disable_existing_loggers': False, - 'filters': { - 'require_debug_false': { - '()': 'django.utils.log.RequireDebugFalse' - } - }, - 'handlers': { - 'mail_admins': { - 'level': 'ERROR', - 'filters': ['require_debug_false'], - 'class': 'django.utils.log.AdminEmailHandler' - } - }, - 'loggers': { - 'django.request': { - 'handlers': ['mail_admins'], - 'level': 'ERROR', - 'propagate': True, - }, - } -} - -# custom test runner -TEST_RUNNER = 'notejam.tests.AdvancedTestSuiteRunner' - -# exclude non app tests -TEST_EXCLUDE = ( - 'django', -) diff --git a/django/notejam/notejam/tests.py b/django/notejam/notejam/tests.py deleted file mode 100644 index af2615253..000000000 --- a/django/notejam/notejam/tests.py +++ /dev/null @@ -1,36 +0,0 @@ -from django.test.simple import DjangoTestSuiteRunner -from django.conf import settings -from django.contrib.auth.models import User - - -EXCLUDED_APPS = getattr(settings, 'TEST_EXCLUDE', []) - - -# based on http://djangosnippets.org/snippets/2211/ -# main approach is to ignore library tests -class AdvancedTestSuiteRunner(DjangoTestSuiteRunner): - def __init__(self, *args, **kwargs): - # to avoid circular import - from django.conf import settings - settings.TESTING = True - super(AdvancedTestSuiteRunner, self).__init__(*args, **kwargs) - - def build_suite(self, *args, **kwargs): - suite = super(AdvancedTestSuiteRunner, self).build_suite(*args, - **kwargs) - if not args[0] and not getattr(settings, 'RUN_ALL_TESTS', False): - tests = [] - for case in suite: - pkg = case.__class__.__module__.split('.')[0] - if pkg not in EXCLUDED_APPS: - tests.append(case) - suite._tests = tests - return suite - - -# helper test functions -def create_user(user_data): - user = User.objects.create(username=user_data['email'], **user_data) - user.set_password(user_data['password']) - user.save() - return user diff --git a/django/notejam/notejam/urls.py b/django/notejam/notejam/urls.py deleted file mode 100644 index d3be6875b..000000000 --- a/django/notejam/notejam/urls.py +++ /dev/null @@ -1,25 +0,0 @@ -from django.conf.urls import patterns, include, url -from django.contrib.auth.decorators import login_required - -from users.views import (SignupView, SigninView, AccountSettingsView, -ForgotPasswordView) -from notes.views import NoteListView - -urlpatterns = patterns('', - # user relates urls - url(r'^signup/', SignupView.as_view(), name='signup'), - url(r'^signin/', SigninView.as_view(), name='signin'), - url(r'^account/', login_required(AccountSettingsView.as_view()), - name='account_settings'), - url(r'^forgot-password/', ForgotPasswordView.as_view(), - name='forgot_password'), - url(r'^signout/$', 'django.contrib.auth.views.logout', - {'next_page': '/'}, name='signout'), - - # notes - url(r'^notes/', include('notes.urls')), - # pads - url(r'^pads/', include('pads.urls')), - - url(r'^$', login_required(NoteListView.as_view()), name='home'), -) diff --git a/django/notejam/notejam/wsgi.py b/django/notejam/notejam/wsgi.py deleted file mode 100644 index 1a69fe50f..000000000 --- a/django/notejam/notejam/wsgi.py +++ /dev/null @@ -1,28 +0,0 @@ -""" -WSGI config for notejam project. - -This module contains the WSGI application used by Django's development server -and any production WSGI deployments. It should expose a module-level variable -named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover -this application via the ``WSGI_APPLICATION`` setting. - -Usually you will have the standard Django WSGI application here, but it also -might make sense to replace the whole Django WSGI application with a custom one -that later delegates to the Django one. For example, you could introduce WSGI -middleware here, or combine a Django application with an application of another -framework. - -""" -import os - -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "notejam.settings") - -# This application object is used by any WSGI server configured to use this -# file. This includes Django's development server, if the WSGI_APPLICATION -# setting points here. -from django.core.wsgi import get_wsgi_application -application = get_wsgi_application() - -# Apply WSGI middleware here. -# from helloworld.wsgi import HelloWorldApplication -# application = HelloWorldApplication(application) diff --git a/django/notejam/notes/__init__.py b/django/notejam/notes/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/django/notejam/notes/forms.py b/django/notejam/notes/forms.py deleted file mode 100644 index f42e6a4bc..000000000 --- a/django/notejam/notes/forms.py +++ /dev/null @@ -1,9 +0,0 @@ -from django import forms - -from notes.models import Note - - -class NoteForm(forms.ModelForm): - class Meta: - model = Note - exclude = ('created_at', 'updated_at', 'user') diff --git a/django/notejam/notes/migrations/0001_initial.py b/django/notejam/notes/migrations/0001_initial.py deleted file mode 100644 index 9c1489759..000000000 --- a/django/notejam/notes/migrations/0001_initial.py +++ /dev/null @@ -1,84 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding model 'Note' - db.create_table('notes_note', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('pad', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['pads.Pad'], null=True)), - ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), - ('name', self.gf('django.db.models.fields.CharField')(max_length=100)), - ('text', self.gf('django.db.models.fields.TextField')()), - ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), - ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)), - )) - db.send_create_signal('notes', ['Note']) - - - def backwards(self, orm): - # Deleting model 'Note' - db.delete_table('notes_note') - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - 'notes.note': { - 'Meta': {'object_name': 'Note'}, - 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'pad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['pads.Pad']", 'null': 'True'}), - 'text': ('django.db.models.fields.TextField', [], {}), - 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'pads.pad': { - 'Meta': {'object_name': 'Pad'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - } - } - - complete_apps = ['notes'] \ No newline at end of file diff --git a/django/notejam/notes/migrations/__init__.py b/django/notejam/notes/migrations/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/django/notejam/notes/models.py b/django/notejam/notes/models.py deleted file mode 100644 index 055ab8000..000000000 --- a/django/notejam/notes/models.py +++ /dev/null @@ -1,13 +0,0 @@ -from django.contrib.auth.models import User -from django.db import models - -from pads.models import Pad - - -class Note(models.Model): - pad = models.ForeignKey(Pad, null=True, blank=True) - user = models.ForeignKey(User) - name = models.CharField(max_length=100) - text = models.TextField() - created_at = models.DateTimeField(auto_now_add=True) - updated_at = models.DateTimeField(auto_now=True) diff --git a/django/notejam/notes/templates/notes/note_confirm_delete.html b/django/notejam/notes/templates/notes/note_confirm_delete.html deleted file mode 100644 index c06b5f5e5..000000000 --- a/django/notejam/notes/templates/notes/note_confirm_delete.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ note.name }}{% endblock %} -{% block page_title %}{{ note.name }}{% endblock %} - -{% block content %} -

Are you sure you want to delete {{ note.name }}?

-
- {% csrf_token %} -   - Cancel -
-{% endblock %} diff --git a/django/notejam/notes/templates/notes/note_create.html b/django/notejam/notes/templates/notes/note_create.html deleted file mode 100644 index fd38ecb14..000000000 --- a/django/notejam/notes/templates/notes/note_create.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends "base.html" %} - -{% block title %}New note{% endblock %} -{% block page_title %}New note{% endblock %} - -{% block content %} - {% include "notes/note_form.html" %} -{% endblock %} diff --git a/django/notejam/notes/templates/notes/note_detail.html b/django/notejam/notes/templates/notes/note_detail.html deleted file mode 100644 index 2390b9df9..000000000 --- a/django/notejam/notes/templates/notes/note_detail.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "base.html" %} -{% load date_tags %} - -{% block title %}{{note.name}}{%endblock%} -{% block page_title %}{{note.name}}{%endblock%} - -{% block content %} -

Last edited {{ note.updated_at|smart_date }}

-
- {{ note.text }} -
- Edit - Delete it -{% endblock %} diff --git a/django/notejam/notes/templates/notes/note_edit.html b/django/notejam/notes/templates/notes/note_edit.html deleted file mode 100644 index 145216fa0..000000000 --- a/django/notejam/notes/templates/notes/note_edit.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ note.name }}{% endblock %} -{% block page_title %}{{ note.name }}{% endblock %} - -{% block content %} - {% include "notes/note_form.html" %} -{% endblock %} diff --git a/django/notejam/notes/templates/notes/note_form.html b/django/notejam/notes/templates/notes/note_form.html deleted file mode 100644 index 120e87efc..000000000 --- a/django/notejam/notes/templates/notes/note_form.html +++ /dev/null @@ -1,13 +0,0 @@ -
- {% csrf_token %} - - {{ form.name }} - {{ form.name.errors }} - - {{ form.text }} - {{ form.text.errors }} - - {{ form.pad }} - {{ form.pad.errors }} - -
diff --git a/django/notejam/notes/templates/notes/note_list.html b/django/notejam/notes/templates/notes/note_list.html deleted file mode 100644 index f1c9f5080..000000000 --- a/django/notejam/notes/templates/notes/note_list.html +++ /dev/null @@ -1,33 +0,0 @@ -{% extends "base.html" %} -{% load date_tags %} - -{% block title %}All notes ({{ notes.count }}){% endblock %} -{% block page_title %}All notes ({{ notes.count }}){% endblock %} - -{% block content %} - {% if notes %} - - - - - - - {% for note in notes %} - - - - - - {% endfor %} -
Note PadLast modified
{{ note.name }} - {% if note.pad %} - {{ note.pad.name }} - {% else %} - No pad - {% endif %} - {{ note.updated_at|smart_date }}
- {% else %} -

Create your first note.

- {% endif %} - New note -{% endblock %} diff --git a/django/notejam/notes/templatetags/__init__.py b/django/notejam/notes/templatetags/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/django/notejam/notes/templatetags/date_tags.py b/django/notejam/notes/templatetags/date_tags.py deleted file mode 100644 index acc17a0c0..000000000 --- a/django/notejam/notes/templatetags/date_tags.py +++ /dev/null @@ -1,17 +0,0 @@ -from datetime import date -from django import template - -register = template.Library() - - -@register.filter -def smart_date(updated_at): - delta = date.today() - updated_at.date() - if delta.days == 0: - return 'Today at {}'.format(updated_at.strftime("%H:%M")) - elif delta.days == 1: - return 'Yesterday at {}'.format(updated_at.strftime("%H:%M")) - elif 1 > delta.days > 4: - return '{} days ago'.format(abs(delta.days)) - else: - return updated_at.date() diff --git a/django/notejam/notes/tests.py b/django/notejam/notes/tests.py deleted file mode 100644 index e99e18798..000000000 --- a/django/notejam/notes/tests.py +++ /dev/null @@ -1,110 +0,0 @@ -from django.core.urlresolvers import reverse -from django.test import TestCase, Client - -from notejam.tests import create_user -from notes.models import Note - - -class NoteTest(TestCase): - def setUp(self): - user_data = { - 'email': 'user@example.com', - 'password': 'secure_password' - } - self.user = create_user(user_data) - self.client.login(**user_data) - - def test_create_success(self): - self.client.post( - reverse('create_note'), {'name': 'pad', 'text': 'pad text'}) - self.assertEqual(1, Note.objects.count()) - - def test_create_fail_required_fields(self): - response = self.client.post(reverse('create_note'), {}) - self.assertEqual( - set(['name', 'text']), set(response.context['form'].errors.keys())) - - def test_edit_success(self): - note_data = { - 'name': 'note name', - 'text': 'note text' - } - note = Note.objects.create(user=self.user, **note_data) - - note_data['name'] = 'new name' - response = self.client.post( - reverse('edit_note', args=(note.id,)), note_data) - self.assertRedirects(response, reverse('home')) - self.assertEqual(note_data['name'], Note.objects.get(id=note.id).name) - - def test_another_user_cant_edit(self): - user_data = { - 'email': 'another_user@example.com', - 'password': 'another_secure_password' - } - create_user(user_data) - - note_data = { - 'name': 'note name', - 'text': 'note text' - } - note = Note.objects.create(user=self.user, **note_data) - - client = Client() - client.login(**user_data) - response = client.post(reverse('edit_note', args=(note.id,)), {}) - self.assertEqual(404, response.status_code) - - def test_view_success(self): - note_data = { - 'name': 'note name', - 'text': 'note text' - } - note = Note.objects.create(user=self.user, **note_data) - response = self.client.get(reverse('view_note', args=(note.id,)), {}) - self.assertEqual(note, response.context['note']) - - def test_another_user_cant_view(self): - user_data = { - 'email': 'another_user@example.com', - 'password': 'another_secure_password' - } - create_user(user_data) - - note_data = { - 'name': 'note name', - 'text': 'note text' - } - note = Note.objects.create(user=self.user, **note_data) - - client = Client() - client.login(**user_data) - response = client.get(reverse('view_note', args=(note.id,)), {}) - self.assertEqual(404, response.status_code) - - def test_delete_success(self): - note_data = { - 'name': 'note name', - 'text': 'note text' - } - note = Note.objects.create(user=self.user, **note_data) - self.client.post(reverse('delete_note', args=(note.id,)), {}) - self.assertEqual(0, Note.objects.count()) - - def test_another_user_cant_delete(self): - user_data = { - 'email': 'another_user@example.com', - 'password': 'another_secure_password' - } - create_user(user_data) - - note_data = { - 'name': 'note name', - 'text': 'note text' - } - note = Note.objects.create(user=self.user, **note_data) - - client = Client() - client.login(**user_data) - response = client.get(reverse('view_note', args=(note.id,)), {}) - self.assertEqual(404, response.status_code) diff --git a/django/notejam/notes/urls.py b/django/notejam/notes/urls.py deleted file mode 100644 index 8f12af5c5..000000000 --- a/django/notejam/notes/urls.py +++ /dev/null @@ -1,21 +0,0 @@ -from django.conf.urls import patterns, url -from django.contrib.auth.decorators import login_required - -from notes.views import (NoteCreateView, NoteDeleteView, -NoteDetailView, NoteUpdateView) - - -# Uncomment the next two lines to enable the admin: -# from django.contrib import admin -# admin.autodiscover() - -urlpatterns = patterns('notes.views', - url(r'^create/$', login_required(NoteCreateView.as_view()), - name='create_note'), - url(r'^(?P\d+)/$', login_required(NoteDetailView.as_view()), - name='view_note'), - url(r'^(?P\d+)/edit/$', login_required(NoteUpdateView.as_view()), - name='edit_note'), - url(r'^(?P\d+)/delete/$', login_required(NoteDeleteView.as_view()), - name='delete_note'), -) diff --git a/django/notejam/notes/views.py b/django/notejam/notes/views.py deleted file mode 100644 index 36fa8ebe2..000000000 --- a/django/notejam/notes/views.py +++ /dev/null @@ -1,110 +0,0 @@ -from django.contrib import messages -from django.core.urlresolvers import reverse_lazy -from django.shortcuts import redirect -from django.views.generic.edit import CreateView, UpdateView, DeleteView -from django.views.generic.detail import DetailView -from django.views.generic import ListView - - -from notes.models import Note, Pad -from notes.forms import NoteForm - - -class NoteCreateView(CreateView): - model = Note - form_class = NoteForm - template_name_suffix = '_create' - success_message = 'Note is successfully created' - - def get_initial(self): - return {'pad': self.request.GET.get('pad', None)} - - def get_form(self, form_class): - form = super(NoteCreateView, self).get_form(self.get_form_class()) - # limit pad choice - form.fields['pad'].queryset = Pad.objects.filter( - user=self.request.user - ) - return form - - def form_valid(self, form): - self.object = form.save(commit=False) - self.object.user = self.request.user - self.object.save() - messages.success(self.request, self.success_message) - return redirect(self.get_success_url()) - - def get_success_url(self): - if self.object.pad is not None: - return reverse_lazy( - 'view_pad_notes', kwargs={'pk': self.object.pad.id} - ) - else: - return reverse_lazy('home') - - -class NoteUpdateView(UpdateView): - model = Note - form_class = NoteForm - success_url = reverse_lazy('home') - template_name_suffix = '_edit' - success_message = 'Note is successfully updated' - - def form_valid(self, form): - messages.success(self.request, self.success_message) - return super(NoteUpdateView, self).form_valid(form) - - def get_queryset(self): - qs = super(NoteUpdateView, self).get_queryset() - return qs.filter(user=self.request.user) - - def get_form(self, form_class): - form = super(NoteUpdateView, self).get_form(self.get_form_class()) - # limit pad choice - form.fields['pad'].queryset = Pad.objects.filter( - user=self.request.user - ) - return form - - def get_success_url(self): - if self.object.pad is not None: - return reverse_lazy( - 'view_pad_notes', kwargs={'pk': self.object.pad.id} - ) - else: - return reverse_lazy('home') - - -class NoteDeleteView(DeleteView): - model = Note - - def get_queryset(self): - qs = super(NoteDeleteView, self).get_queryset() - return qs.filter(user=self.request.user) - - def get_success_url(self): - if self.object.pad is not None: - return reverse_lazy( - 'view_pad_notes', kwargs={'pk': self.object.pad.id} - ) - else: - return reverse_lazy('home') - - -class NoteDetailView(DetailView): - model = Note - - def get_queryset(self): - qs = super(NoteDetailView, self).get_queryset() - return qs.filter(user=self.request.user) - - -class NoteListView(ListView): - model = Note - context_object_name = 'notes' - order_by = '-updated_at' - - def get_queryset(self): - qs = super(NoteListView, self).get_queryset() - order_by = self.request.GET.get('order', self.order_by) - return qs.filter(user=self.request.user).order_by(order_by) diff --git a/django/notejam/pads/__init__.py b/django/notejam/pads/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/django/notejam/pads/forms.py b/django/notejam/pads/forms.py deleted file mode 100644 index b2bf2665a..000000000 --- a/django/notejam/pads/forms.py +++ /dev/null @@ -1,9 +0,0 @@ -from django import forms - -from pads.models import Pad - - -class PadForm(forms.ModelForm): - class Meta: - model = Pad - exclude = ('user',) diff --git a/django/notejam/pads/migrations/0001_initial.py b/django/notejam/pads/migrations/0001_initial.py deleted file mode 100644 index 095fb8c12..000000000 --- a/django/notejam/pads/migrations/0001_initial.py +++ /dev/null @@ -1,70 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding model 'Pad' - db.create_table('pads_pad', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=100)), - ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), - )) - db.send_create_signal('pads', ['Pad']) - - - def backwards(self, orm): - # Deleting model 'Pad' - db.delete_table('pads_pad') - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - 'pads.pad': { - 'Meta': {'object_name': 'Pad'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - } - } - - complete_apps = ['pads'] \ No newline at end of file diff --git a/django/notejam/pads/migrations/__init__.py b/django/notejam/pads/migrations/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/django/notejam/pads/models.py b/django/notejam/pads/models.py deleted file mode 100644 index 673c1e9ce..000000000 --- a/django/notejam/pads/models.py +++ /dev/null @@ -1,10 +0,0 @@ -from django.contrib.auth.models import User -from django.db import models - - -class Pad(models.Model): - name = models.CharField(max_length=100) - user = models.ForeignKey(User) - - def __unicode__(self): - return self.name diff --git a/django/notejam/pads/templates/pads/pad_confirm_delete.html b/django/notejam/pads/templates/pads/pad_confirm_delete.html deleted file mode 100644 index 4a2270905..000000000 --- a/django/notejam/pads/templates/pads/pad_confirm_delete.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "base.html" %} - -{% block breadcrumbs %}Delete {{ pad.name }}{% endblock %} -{% block content %} -

Are you sure you want to delete {{ pad.name }} and all related notes?

-
- {% csrf_token %} -   - Cancel -
-{% endblock %} - - - diff --git a/django/notejam/pads/templates/pads/pad_create.html b/django/notejam/pads/templates/pads/pad_create.html deleted file mode 100644 index 77506cf8c..000000000 --- a/django/notejam/pads/templates/pads/pad_create.html +++ /dev/null @@ -1,9 +0,0 @@ -{% extends "base.html" %} - -{% block title %}New pad{% endblock %} -{% block page_title %}New pad{% endblock %} - -{% block content %} - {% include "pads/pad_form.html" %} -{% endblock %} - diff --git a/django/notejam/pads/templates/pads/pad_edit.html b/django/notejam/pads/templates/pads/pad_edit.html deleted file mode 100644 index 1e7fa62cf..000000000 --- a/django/notejam/pads/templates/pads/pad_edit.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ pad.name }}{% endblock %} -{% block page_title %}{{ pad.name }}{% endblock %} - -{% block content %} - {% include "pads/pad_form.html" %} - Delete pad -{% endblock %} - - diff --git a/django/notejam/pads/templates/pads/pad_form.html b/django/notejam/pads/templates/pads/pad_form.html deleted file mode 100644 index fd678c0b9..000000000 --- a/django/notejam/pads/templates/pads/pad_form.html +++ /dev/null @@ -1,7 +0,0 @@ -
- {% csrf_token %} - - {{ form.name }} - {{ form.name.errors }} - -
diff --git a/django/notejam/pads/templates/pads/pad_note_list.html b/django/notejam/pads/templates/pads/pad_note_list.html deleted file mode 100644 index c04602836..000000000 --- a/django/notejam/pads/templates/pads/pad_note_list.html +++ /dev/null @@ -1,29 +0,0 @@ -{% extends "base.html" %} -{% load date_tags %} - -{% block title %}{{ pad.name }} ({{ notes.count }}){%endblock%} -{% block page_title %}{{ pad.name }} ({{ notes.count }}){%endblock%} - -{% block content %} - {% if notes %} - - - - - - {% for note in notes %} - - - - - {% endfor %} -
Note Last modified
{{ note.name }}{{ note.updated_at|smart_date }}
- {% else %} -

Create your first note in the pad.

- {% endif %} - New note  - Pad settings -{% endblock %} - - - diff --git a/django/notejam/pads/templatetags/__init__.py b/django/notejam/pads/templatetags/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/django/notejam/pads/templatetags/pad_tags.py b/django/notejam/pads/templatetags/pad_tags.py deleted file mode 100644 index eb029b146..000000000 --- a/django/notejam/pads/templatetags/pad_tags.py +++ /dev/null @@ -1,31 +0,0 @@ -from django import template - -from pads.models import Pad - -register = template.Library() - - -def do_get_pads(parser, token): - try: - tag_name, as_, var_name = token.split_contents() - except ValueError: - raise template.TemplateSyntaxError( - "%r tag requires a single argument - var name" - % token.contents.split()[0] - ) - if as_ != 'as': - raise template.TemplateSyntaxError( - "Format is: %r as VARNAME" % tag_name - ) - return GetPadsNode(var_name) - - -class GetPadsNode(template.Node): - def __init__(self, var_name): - self.var_name = var_name - - def render(self, context): - context[self.var_name] = Pad.objects.filter(user=context['user']) - return '' - -register.tag('get_pads', do_get_pads) diff --git a/django/notejam/pads/tests.py b/django/notejam/pads/tests.py deleted file mode 100644 index d76e87109..000000000 --- a/django/notejam/pads/tests.py +++ /dev/null @@ -1,49 +0,0 @@ -from django.core.urlresolvers import reverse -from django.test import TestCase, Client - -from notejam.tests import create_user -from pads.models import Pad - - -class PadTest(TestCase): - def setUp(self): - user_data = { - 'email': 'user@example.com', - 'password': 'secure_password' - } - self.user = create_user(user_data) - self.client.login(**user_data) - - def _create_pads(self, pads): - return [ - (lambda pad: Pad.objects.create(name=pad, user=self.user).id)(pad) - for pad in pads - ] - - def test_create_success(self): - self.client.post(reverse('create_pad'), {'name': 'pad'}) - self.assertEqual(1, Pad.objects.count()) - - def test_create_fail_required_name(self): - response = self.client.post(reverse('create_pad'), {}) - self.assertIn('name', response.context['form'].errors) - - def test_edit_success(self): - id = self._create_pads(['pad'])[0] - data = {'name': 'new name'} - response = self.client.post(reverse('edit_pad', args=(id,)), data) - self.assertRedirects(response, reverse('view_pad_notes', args=(id,))) - self.assertEqual(data['name'], Pad.objects.get(id=id).name) - - def test_another_user_cant_edit_pad(self): - user_data = { - 'email': 'another_user@example.com', - 'password': 'another_secure_password' - } - create_user(user_data) - - client = Client() - client.login(**user_data) - id = self._create_pads(['pad'])[0] - response = client.post(reverse('edit_pad', args=(id,)), {}) - self.assertEqual(404, response.status_code) diff --git a/django/notejam/pads/urls.py b/django/notejam/pads/urls.py deleted file mode 100644 index bec671a6a..000000000 --- a/django/notejam/pads/urls.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.conf.urls import patterns, url -from django.contrib.auth.decorators import login_required - -from pads.views import (PadCreateView, PadNotesListView, PadUpdateView, -PadDeleteView) - -urlpatterns = patterns('', - url(r'^create/$', login_required(PadCreateView.as_view()), - name='create_pad'), - url(r'^(?P\d+)/$', login_required(PadNotesListView.as_view()), - name='view_pad_notes'), - url(r'^(?P\d+)/edit/$', login_required(PadUpdateView.as_view()), - name='edit_pad'), - url(r'^(?P\d+)/delete/$', login_required(PadDeleteView.as_view()), - name='delete_pad'), -) diff --git a/django/notejam/pads/views.py b/django/notejam/pads/views.py deleted file mode 100644 index 8d3211462..000000000 --- a/django/notejam/pads/views.py +++ /dev/null @@ -1,79 +0,0 @@ -from django.contrib import messages -from django.core.urlresolvers import reverse_lazy -from django.shortcuts import redirect -from django.shortcuts import get_object_or_404 -from django.views.generic.edit import CreateView, UpdateView, DeleteView -from django.views.generic import ListView - - -from pads.models import Pad -from notes.models import Note -from pads.forms import PadForm - - -class PadCreateView(CreateView): - model = Pad - form_class = PadForm - template_name_suffix = '_create' - success_url = reverse_lazy('home') - success_message = 'Pad is successfully created' - - def form_valid(self, form): - self.object = form.save(commit=False) - self.object.user = self.request.user - self.object.save() - messages.success(self.request, self.success_message) - return redirect(self.get_success_url()) - - def get_success_url(self): - return reverse_lazy("view_pad_notes", kwargs={'pk': self.object.pk}) - - -class PadUpdateView(UpdateView): - model = Pad - form_class = PadForm - template_name_suffix = '_edit' - success_url = reverse_lazy('home') - success_message = 'Pad is successfully updated' - - def form_valid(self, form): - messages.success(self.request, self.success_message) - return super(PadUpdateView, self).form_valid(form) - - def get_queryset(self): - qs = super(PadUpdateView, self).get_queryset() - return qs.filter(user=self.request.user) - - def get_success_url(self): - return reverse_lazy("view_pad_notes", kwargs={'pk': self.object.pk}) - - -# Note list mixed with pad details data -class PadNotesListView(ListView): - model = Note - context_object_name = 'notes' - order_by = '-updated_at' - template_name = 'pads/pad_note_list.html' - - def get_queryset(self): - order_by = self.request.GET.get('order', self.order_by) - return self.get_pad().note_set.all().order_by(order_by) - - def get_pad(self): - return get_object_or_404( - Pad, pk=int(self.kwargs.get('pk')), user=self.request.user - ) - - def get_context_data(self, **kwargs): - context = super(PadNotesListView, self).get_context_data(**kwargs) - context['pad'] = self.get_pad() - return context - - -class PadDeleteView(DeleteView): - model = Pad - success_url = reverse_lazy("home") - - def get_queryset(self): - qs = super(PadDeleteView, self).get_queryset() - return qs.filter(user=self.request.user) diff --git a/django/notejam/static_files/css/style.css b/django/notejam/static_files/css/style.css deleted file mode 100644 index 86cd131ff..000000000 --- a/django/notejam/static_files/css/style.css +++ /dev/null @@ -1,395 +0,0 @@ -/* -* Skeleton V1.0.3 -* Copyright 2011, Dave Gamache -* www.getskeleton.com -* Free to use under the MIT license. -* http://www.opensource.org/licenses/mit-license.php -* 7/17/2011 -*/ - - -/* Documentation Styles -================================================== */ - div.container { - padding-top: 40px; } - - /* Doc nav */ - nav { - width: 160px; } - #logo, .bold-header { - margin-bottom: 30px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - letter-spacing: -1px; - color: #555; - font-weight: bold; } - .bold-header span { - font-weight: normal; - font-size: 23px; - } - .bold-header a.header { - text-decoration: none; - color: inherit; - } - .bold-header span.jam { - font-size: 46px; - line-height: 50px; - } - nav ul { - float: left; } - nav ul li { - display: block; - margin-bottom: 10px; } - nav ul li a, - nav ul li a:visited, - nav ul li a:active { - font-size: 14px; - color: #555; - text-decoration: none; - font-weight: bold; } - nav ul li a:hover, - nav ul li a:focus { - color: #222; } - header h1 { - font-size: 52px; - line-height: 61px; - letter-spacing: -1px; - font-weight: normal; - font-family: "Georgia", "Times New Roman", Helvetica, Arial, sans-serif; } - hr.large { - border: none; - height: 8px; - background: #ebebeb; - margin: 50px 0; } - div.doc-section { - margin: 30px 0; } - - #whatAndWhy .row { - padding: 30px 0 0; } - - #typography blockquote { - margin-top: 20px; } - - .hidden-code a { - font-size: 12px; - color: #999; } - .hidden-code>div { - display: none; } - - - /* Grid */ - #grid .column, - #grid .columns { - background: #ddd; - height: 25px; - line-height: 25px; - margin-bottom: 10px; - text-align: center; - text-transform: uppercase; - color: #555; - font-size: 12px; - font-weight: bold; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; } - #grid .column:hover, - #grid .columns:hover { - background: #bbb; - color: #333; } - #grid .example-grid { overflow: hidden; } - - .post-button-note, - .post-button-note a { - font-size: 11px; - color: #999; } - - #examples .four.columns a { - text-decoration: none; - } - #examples .four.columns a:hover { - text-decoration: underline; - } - - - .resize { - position: fixed; - bottom: 0; - right: 0; - height: 80px; - width: 80px; - background: url(images/resize.png); } - - - img { - max-width: 100%; - height: auto; } - - .gist-meta { display: none !important;} - - ul ul ul li { margin-bottom: 3px; } - - .twitter-share-button { margin-bottom: -18px; } - - /* Table stylesheets */ - table { - width: 100%; - border-collapse: collapse; - } - - table th, table td { - padding: 10px 10px 9px; - font-size: 13px; - line-height: 18px; - text-align: left; - } - - table td { - vertical-align: top; - border-top: solid 1px #ddd; - } - - table th { - padding-top: 9px; - font-weight: bold; - vertical-align: middle; - } - - table.condensed th, table.condensed td { - padding: 5px 5px 4px; - } - - table.bordered { - border-collapse: separate; - border: solid 1px #ddd; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - } - - table.bordered th + th, - table.bordered th + td, - table.bordered td + td { - border-left: solid 1px #ddd; - } - - .zebra-striped tbody tr:nth-child(odd) td, - .zebra-striped tbody tr:nth-child(odd) th { - background: #f5f5f5; - } - -.carbonad, -.carbonad-image, -.carbonad-text, -.carbonad-tag { - background: none !important; - border: none !important; - margin-left: 0 !important; -} -.carbonad-tag { - margin-top: 6px !important; - padding-top: 0 !important; -} -.carbonad-text { - height: auto !important; -} -.carbonad-image { - margin-top: 0 !important; -} - -.hidden-text { - font-size: 12px; - color: #999; -} - -td.date, th.date { - text-align: right; -} - -td.date { - font-style: italic; -} - -form.note input[type="text"], form.note textarea { - width: 100%; -} - -form hr { - width: 218px; - margin: 10px 0px; -} - -form.note textarea { - height: 250px; -} - -div.content-area { - min-height: 600px; -} - -hr.footer { - margin-bottom: 10px; -} - -div.footer { - margin-bottom: 10px; - text-align: center; - font-size: 12px; -} - -form.sign-in { - margin: 50px 0 0 0; -} - -.sort_arrow { - text-decoration: none; -} - -.sort_arrow:hover { - text-decoration: none; - color: red; -} - -div.sign-in-out-block { - position: absolute; - right: 14px; - top: 8px; - font-size: 12px; -} - -div.sign-in-out-block a { - /*text-decoration: none;*/ -} - -a.small-red { - color: red; - font-size: 12px; -} - -table.notes { - margin: 0 0 20px 0; -} - -table.notes th.note { - width: 72%; -} - -table.notes td.pad { - color: grey; -} - -table.notes td.pad a { - color: grey; - text-decoration: underline; - font-style: normal; -} - - -table.notes td.pad a:hover { - color: black; -} - -p.empty { - color: grey; - font-style: italic; -} - -a.delete-note { - float: right; - font-size: 12px; - color: red; -} - -.red, input.red { - color: red !important; -} - -ul.errorlist, ul.errors { - margin: -18px 0 0 0; -} - -ul.errorlist li, ul.errors li { - color: red; -} - -.alert-area { - text-align: center; -} - -.alert { - padding: 5px 8px; - margin: 0 0 12px 0; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border: 1px solid #d6e9c6; -} - -.alert-error { - color: #b94a48; - background-color: #f2dede; - border: 1px solid #eed3d7; -} - - /* Mobile */ - @media only screen and (max-width: 767px) { - header h1 { font-size: 34px; line-height: 37px; } - nav { position: relative; } - nav ul, - .carbonad { - display: none; - } - #logo { text-align: left; } - #examples .four.columns { - padding-top: 30px; - } - } - - /* Mobile Landscape */ - @media only screen and (min-width: 480px) and (max-width: 767px) { - nav ul { - display: none; - } - } - - /* Non 960 */ - @media only screen and (max-width: 959px) { - #logo { - font-size: 21px; - margin-bottom: 15px; } - nav .button { - padding: 9px 20px 11px; } - } - - /* iPad Portrait/Browser */ - @media only screen and (min-width: 768px) and (max-width: 959px) { - nav { - width: 124px; } - } - - /* Mobile/Browser */ - @media only screen and (max-width: 767px) {} - - /* Mobile Landscape/Browser */ - @media only screen and (min-width: 480px) and (max-width: 767px) {} - - /* Anything smaller than standard 960 */ - @media only screen and (max-width: 959px) {} - - - /* iPad Portrait Only */ - @media only screen and (min-width: 768px) and (max-width: 959px) and (max-device-width: 1000px) {} - - /* Mobile Only */ - @media only screen and (max-width: 767px) and (max-device-width: 1000px) {} - - /* Mobile Landscape Only */ - @media only screen and (min-width: 480px) and (max-width: 767px) and (max-device-width: 1000px) {} - - /* Anything smaller than standard 960 on a device */ - @media only screen and (max-width: 959px) and (max-device-width: 1000px) { - .resize { display: none; } - } diff --git a/django/notejam/templates/404.html b/django/notejam/templates/404.html deleted file mode 100644 index e69de29bb..000000000 diff --git a/django/notejam/templates/base.html b/django/notejam/templates/base.html deleted file mode 100644 index 5b84e65d2..000000000 --- a/django/notejam/templates/base.html +++ /dev/null @@ -1,92 +0,0 @@ -{% load pad_tags %} - - - - - - - - - - {% block title %}Notejam{% endblock %} - - - - - - - - - - - - - - - {% block extrahead %}{% endblock %} - - -
-
- -
-
-

- notejam: - {% block page_title %} - All notes - {% endblock %} -

-
- {% block pads %} -
- - - - -
- {% endblock %} -
- {% if messages %} -
- {% for message in messages %} -
{{ message }}
- {% endfor %} -
- {% endif %} - {% block content %} - {% endblock %} -
- - -
- Fork me on GitHub - - diff --git a/django/notejam/templates/user.html b/django/notejam/templates/user.html deleted file mode 100644 index 39a93a045..000000000 --- a/django/notejam/templates/user.html +++ /dev/null @@ -1,5 +0,0 @@ -{% extends "base.html" %} - -{% block pads %}{% endblock %} - -{% block content_class %}sixteen columns content-area{% endblock %} diff --git a/django/notejam/users/__init__.py b/django/notejam/users/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/django/notejam/users/auth_backends.py b/django/notejam/users/auth_backends.py deleted file mode 100644 index ada5ecd92..000000000 --- a/django/notejam/users/auth_backends.py +++ /dev/null @@ -1,18 +0,0 @@ -from django.contrib.auth.models import User - - -class EmailModelBackend(object): - ''' Custom backend to be able to use email for authentication ''' - def authenticate(self, email=None, password=None): - try: - user = User.objects.get(email=email) - if user.check_password(password): - return user - except User.DoesNotExist: - return None - - def get_user(self, user_id): - try: - return User.objects.get(pk=user_id) - except User.DoesNotExist: - return None diff --git a/django/notejam/users/forms.py b/django/notejam/users/forms.py deleted file mode 100644 index 0079708fb..000000000 --- a/django/notejam/users/forms.py +++ /dev/null @@ -1,56 +0,0 @@ -from django import forms -from django.contrib.auth.models import User - - -class SignupForm(forms.ModelForm): - email = forms.EmailField() - password = forms.CharField(widget=forms.PasswordInput()) - repeat_password = forms.CharField(widget=forms.PasswordInput()) - - class Meta: - model = User - fields = ('email',) - - def save(self, force_insert=False, force_update=False, commit=True): - user = super(SignupForm, self).save(commit=False) - # username hack (we don't need username, but django requires it ?) - user.username = user.email - - user.set_password(self.cleaned_data['password']) - if commit: - user.save() - return user - - def clean_email(self): - email = self.cleaned_data.get('email') - - if User.objects.filter(email=email).count(): - raise forms.ValidationError( - 'User with this email is already signed up' - ) - - return email - - def clean_repeat_password(self): - password = self.cleaned_data.get('password') - repeat_password = self.cleaned_data.get('repeat_password') - - if password != repeat_password: - raise forms.ValidationError("Your passwords do not match") - - -class SigninForm(forms.Form): - email = forms.EmailField() - password = forms.CharField(widget=forms.PasswordInput()) - - -class ForgotPasswordForm(forms.Form): - email = forms.EmailField() - - def clean_email(self): - email = self.cleaned_data.get('email') - try: - User.objects.get(email=email) - return email - except User.DoesNotExist: - raise forms.ValidationError("No user with given email") diff --git a/django/notejam/users/models.py b/django/notejam/users/models.py deleted file mode 100644 index 71a836239..000000000 --- a/django/notejam/users/models.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/django/notejam/users/templates/forgot_password.html b/django/notejam/users/templates/forgot_password.html deleted file mode 100644 index 8851e0f07..000000000 --- a/django/notejam/users/templates/forgot_password.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "user.html" %} - -{% block title %}Forgot password?{% endblock %} -{% block page_title %}Forgot password?{% endblock %} - -{% block content %} - -{% endblock %} - diff --git a/django/notejam/users/templates/settings.html b/django/notejam/users/templates/settings.html deleted file mode 100644 index 699e780ee..000000000 --- a/django/notejam/users/templates/settings.html +++ /dev/null @@ -1,20 +0,0 @@ -{% extends "user.html" %} - -{% block title %}Account Settings{% endblock %} -{% block page_title %}Account Settings{% endblock %} - -{% block content %} -
- {% csrf_token %} - - {{ form.old_password }} - {{ form.old_password.errors }} - - {{ form.new_password1 }} - {{ form.new_password1.errors }} - - {{ form.new_password2 }} - {{ form.new_password2.errors }} - -
-{% endblock %} diff --git a/django/notejam/users/templates/signin.html b/django/notejam/users/templates/signin.html deleted file mode 100644 index faee87030..000000000 --- a/django/notejam/users/templates/signin.html +++ /dev/null @@ -1,19 +0,0 @@ -{% extends "user.html" %} - -{% block title %}Sign In{% endblock %} -{% block page_title %}Sign In{% endblock %} - -{% block content %} - -{% endblock %} diff --git a/django/notejam/users/templates/signup.html b/django/notejam/users/templates/signup.html deleted file mode 100644 index ba717ced7..000000000 --- a/django/notejam/users/templates/signup.html +++ /dev/null @@ -1,21 +0,0 @@ -{% extends "user.html" %} - -{% block title %}Sign Up{% endblock %} -{% block page_title %}Sign Up{% endblock %} - -{% block content %} - -{% endblock %} - diff --git a/django/notejam/users/tests.py b/django/notejam/users/tests.py deleted file mode 100644 index 5923a6a83..000000000 --- a/django/notejam/users/tests.py +++ /dev/null @@ -1,83 +0,0 @@ -from django.contrib.auth.models import User -from django.core.urlresolvers import reverse -from django.test import TestCase - - -class SignUpTest(TestCase): - def _get_user_data(self, **kwargs): - user_data = { - 'email': 'email@example.com', - 'password': 'secure_password', - 'repeat_password': 'secure_password' - } - user_data.update(**kwargs) - return user_data - - def test_signup_success(self): - response = self.client.post( - reverse('signup'), self._get_user_data()) - self.assertRedirects(response, reverse('signin')) - self.assertEqual(1, User.objects.all().count()) - - def test_signup_fail_required_fields(self): - response = self.client.post(reverse('signup'), {}) - self.assertEqual( - response.context['form'].errors.keys(), - self._get_user_data().keys() - ) - - def test_signup_fail_invalid_email(self): - invalid_data = self._get_user_data(email='invalid email') - response = self.client.post(reverse('signup'), invalid_data) - self.assertIn('email', response.context['form'].errors) - - def test_signup_fail_passwords_dont_match(self): - invalid_data = self._get_user_data(password='another pass') - response = self.client.post(reverse('signup'), invalid_data) - self.assertIn('repeat_password', response.context['form'].errors) - - def test_signup_fail_email_exists(self): - data = self._get_user_data() - User.objects.create( - email=data['email'], - username=data['email'], - password=data['password'] - ) - - response = self.client.post(reverse('signup'), data) - self.assertIn('email', response.context['form'].errors) - - -class SignInTest(TestCase): - def _get_user_data(self, **kwargs): - user_data = { - 'email': 'email@example.com', - 'password': 'secure_password' - } - user_data.update(**kwargs) - return user_data - - def test_signin_success(self): - data = self._get_user_data() - user = User.objects.create(email=data['email'], username=data['email']) - user.set_password(data['password']) - user.save() - - response = self.client.post(reverse('signin'), data) - self.assertRedirects(response, reverse('home')) - - def test_signin_fail(self): - response = self.client.post(reverse('signin'), self._get_user_data()) - self.assertContains(response, 'Wrong email or password') - - def test_signin_fail_required_fields(self): - response = self.client.post(reverse('signin'), {}) - self.assertEqual( - response.context['form'].errors.keys(), - self._get_user_data().keys() - ) - - def test_signin_fail_invalid_email(self): - invalid_data = self._get_user_data(email='invalid email') - response = self.client.post(reverse('signin'), invalid_data) - self.assertIn('email', response.context['form'].errors) diff --git a/django/notejam/users/views.py b/django/notejam/users/views.py deleted file mode 100644 index 51ac56d38..000000000 --- a/django/notejam/users/views.py +++ /dev/null @@ -1,106 +0,0 @@ -import hashlib -from datetime import datetime - -from django.conf import settings -from django.contrib import messages -from django.contrib.auth import authenticate, login -from django.contrib.auth.forms import PasswordChangeForm -from django.contrib.auth.models import User -from django.core.mail import send_mail -from django.core.urlresolvers import reverse_lazy -from django.shortcuts import redirect -from django.views.generic.edit import FormView -from django.views.generic.edit import CreateView - -from users.forms import SignupForm, SigninForm, ForgotPasswordForm - - -class SignupView(CreateView): - model = User - form_class = SignupForm - template_name = "signup.html" - success_url = reverse_lazy('signin') - success_message = "Account is created. Now you can sign in." - - def form_valid(self, form): - messages.success(self.request, self.success_message) - return super(SignupView, self).form_valid(form) - - -class SigninView(FormView): - template_name = "signin.html" - form_class = SigninForm - success_url = reverse_lazy('home') - error_message = "Wrong email or password" - - def post(self, request, *args, **kwargs): - form_class = self.get_form_class() - form = self.get_form(form_class) - if form.is_valid(): - user = authenticate( - email=form.cleaned_data['email'], - password=form.cleaned_data['password'] - ) - if user is not None: - login(request, user) - return redirect(reverse_lazy('home')) - else: - messages.error(request, self.error_message) - - return self.render_to_response( - self.get_context_data(form=form) - ) - else: - return self.form_invalid(form, **kwargs) - - -class ForgotPasswordView(FormView): - form_class = ForgotPasswordForm - template_name = 'forgot_password.html' - success_url = reverse_lazy('signin') - success_message = 'New password is sent in your email inbox' - - def form_valid(self, form): - m = hashlib.md5() - m.update( - "{email}{secret}{date}".format( - email=form.cleaned_data['email'], - secret=settings.SECRET_KEY, - date=str(datetime.today()) - ) - ) - new_password = m.hexdigest()[:8] - - user = User.objects.get(email=form.cleaned_data['email']) - user.set_password(new_password) - user.save() - - send_mail( - 'Notejam password reset', - 'Hi, {}. Your new password is {}.'.format( - form.cleaned_data['email'], - new_password - ), - 'from@notejamapp.com', - [form.cleaned_data['email']], - fail_silently=False - ) - messages.success(self.request, self.success_message) - - return super(ForgotPasswordView, self).form_valid(form) - - -class AccountSettingsView(FormView): - form_class = PasswordChangeForm - template_name = 'settings.html' - success_url = reverse_lazy('home') - success_message = 'Password is successfully changed' - - def get_form_kwargs(self): - kwargs = super(AccountSettingsView, self).get_form_kwargs() - kwargs['user'] = self.request.user - return kwargs - - def form_valid(self, form): - messages.success(self.request, self.success_message) - return super(AccountSettingsView, self).form_valid(form) diff --git a/django/requirements.txt b/django/requirements.txt deleted file mode 100644 index 4c05c817f..000000000 --- a/django/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -Django==1.6.5 -South==1.0 diff --git a/express/README.rst b/express/README.rst deleted file mode 100644 index a851fa182..000000000 --- a/express/README.rst +++ /dev/null @@ -1,83 +0,0 @@ -**************** -Notejam: Express -**************** - -Notejam application implemented using `Express.js `_ microframework. - -Express version: 4.2 - -Middlewares/extentions used: - -* `Passport.js `_ for authentication -* `Node ORM 2 `_ for database -* `Mocha `_ and `Superagent `_ for testing -* ... and `others `_ - -========================== -Installation and launching -========================== - -------- -Cloning -------- - -Clone the repo: - -.. code-block:: bash - - $ git clone git@github.com:komarserjio/notejam.git YOUR_PROJECT_DIR/ - -------------------- -Install environment -------------------- -Use `npm `_ to manage dependencies. - -Install dependencies - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/express/notejam/ - $ npm install - -Create database schema - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/express/notejam/ - $ node db.js - ------- -Launch ------- - -Start built-in web server: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/express/notejam/ - $ DEBUG=* ./bin/www - -Go to http://127.0.0.1:3000/ in your browser - ------------------- -Running unit tests ------------------- - -Run unit tests: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/express/notejam/ - $ ./node_modules/mocha/bin/mocha tests - -============ -Contribution -============ - -Please send your pull requests in the ``master`` branch. - -Always prepend your commits with a framework name: - -.. code-block:: bash - - Express: Implemented sign in functionality diff --git a/express/notejam/app.js b/express/notejam/app.js deleted file mode 100644 index f78635800..000000000 --- a/express/notejam/app.js +++ /dev/null @@ -1,110 +0,0 @@ -var express = require('express'); -var session = require('express-session'); -var path = require('path'); -var favicon = require('static-favicon'); -var logger = require('morgan'); -var cookieParser = require('cookie-parser'); -var flash = require('connect-flash'); -var bodyParser = require('body-parser'); -var orm = require('orm'); -var expressValidator = require('express-validator'); -var passport = require('passport'); -var LocalStrategy = require('passport-local').Strategy; - -var users = require('./routes/users'); -var pads = require('./routes/pads'); -var notes = require('./routes/notes'); -var settings = require('./settings') - -var app = express(); - - -// view engine setup -app.set('views', path.join(__dirname, 'views')); -app.set('view engine', 'jade'); - -app.use(favicon()); -app.use(logger('dev')); -app.use(bodyParser.json()); -app.use(bodyParser.urlencoded()); -app.use(expressValidator()); -app.use(cookieParser()); -app.use(session({cookie: { maxAge: 60000 }, secret: 'secret'})); -app.use(flash()); -app.use(passport.initialize()); -app.use(passport.session()); -app.use(express.static(path.join(__dirname, 'public'))); - -// DB configuration -var sqlite3 = require('sqlite3').verbose(); -var db = new sqlite3.Database(settings.db); - -orm.settings.set("instance.returnAllErrors", true); -app.use(orm.express(settings.dsn, { - define: function (db, models, next) { - db.load("./models", function (err) { - models.User = db.models.users; - models.Pad = db.models.pads; - models.Note = db.models.notes; - next(); - }); - } -})); - -// Flash Messages configuration -app.use(function(req, res, next){ - res.locals.flash_messages = { - 'success': req.flash('success'), - 'error': req.flash('error') - } - next(); -}); - -// Inject request object and user pads in view scope -app.use(function(req, res, next){ - res.locals.req = req; - - if (req.isAuthenticated()) { - req.user.getPads(function(i, pads) { - res.locals.pads = pads; - next(); - }); - } else { - next(); - } -}); - -app.use('/', users); -app.use('/', pads); -app.use('/', notes); - -/// catch 404 and forward to error handler -app.use(function(req, res, next) { - var err = new Error('Not Found'); - err.status = 404; - next(err); -}); - -// development error handler -// will print stacktrace -if (app.get('env') === 'development') { - app.use(function(err, req, res, next) { - res.status(err.status || 500); - res.render('error', { - message: err.message, - error: err - }); - }); -} - -// production error handler -// no stacktraces leaked to user -app.use(function(err, req, res, next) { - res.status(err.status || 500); - res.render('error', { - message: err.message, - error: {} - }); -}); - -module.exports = app; diff --git a/express/notejam/bin/www b/express/notejam/bin/www deleted file mode 100755 index 5e193192b..000000000 --- a/express/notejam/bin/www +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env node -var debug = require('debug')('notejam'); -var app = require('../app'); - -app.set('port', process.env.PORT || 3000); - -var server = app.listen(app.get('port'), function() { - debug('Express server listening on port ' + server.address().port); -}); diff --git a/express/notejam/db.js b/express/notejam/db.js deleted file mode 100644 index d0d4a0dec..000000000 --- a/express/notejam/db.js +++ /dev/null @@ -1,105 +0,0 @@ -var sqlite3 = require('sqlite3').verbose(); -var async = require('async'); - -var settings = require('./settings'); -var db = new sqlite3.Database(settings.db); - -var functions = { - createTables: function(next) { - async.series({ - createUsers: function(callback) { - db.run("CREATE TABLE IF NOT EXISTS users (" + - "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + - "email VARCHAR(75) NOT NULL," + - "password VARCHAR(128) NOT NULL);", [], - function() { callback(null); }); - }, - createPads: function(callback) { - db.run("CREATE TABLE IF NOT EXISTS pads (" + - "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + - "name VARCHAR(100) NOT NULL," + - "user_id INTEGER NOT NULL REFERENCES users(id));", [], - function() { callback(null); }) - }, - createNotes: function(callback) { - db.run("CREATE TABLE IF NOT EXISTS notes (" + - "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + - "pad_id INTEGER REFERENCES pads(id)," + - "user_id INTEGER NOT NULL REFERENCES users(id)," + - "name VARCHAR(100) NOT NULL," + - "text text NOT NULL," + - "created_at default current_timestamp," + - "updated_at default current_timestamp);", [], - function() { callback(null); }); - } - }, - function(err, results) { - next(); - }); - }, - - applyFixtures: function(next) { - this.truncateTables(function() { - async.series([ - function(callback) { - db.run("INSERT INTO users VALUES (1, 'user1@example.com', " + - "'$2a$10$mhkqpUvPPs.zoRSTiGAEKODOJMljkOY96zludIIw.Pop1UvQCTx8u')", [], - function() { callback(null) }); - }, - function(callback) { - db.run("INSERT INTO users VALUES (2, 'user2@example.com', " + - "'$2a$10$mhkqpUvPPs.zoRSTiGAEKODOJMljkOY96zludIIw.Pop1UvQCTx8u')", [], - function() { callback(null) }); - - }, - function(callback) { - db.run("INSERT INTO pads VALUES (1, 'Pad 1', 1)", [], - function() { callback(null) }); - }, - function(callback) { - db.run("INSERT INTO pads VALUES (2, 'Pad 2', 1)", [], - function() { callback(null) }); - }, - function(callback) { - db.run("INSERT INTO notes VALUES (1, 1, 1, 'Note 1', 'Text', 1, 1)", [], - function() { callback(null) }); - }, - function(callback) { - db.run("INSERT INTO notes VALUES (2, 1, 1, 'Note 2', 'Text', 1, 1)", [], - function() { callback(null) }); - } - ], function(err, results) { - next(); - }) - }); - }, - - truncateTables: function(next) { - async.series([ - function(callback) { - db.run("DELETE FROM users;", [], - function() { callback(null) }); - }, - function(callback) { - db.run("DELETE FROM notes;", [], - function() { callback(null) }); - - }, - function(callback) { - db.run("DELETE FROM pads;", [], - function(result) { callback(null); }); - } - ], function(err, results) { - next(); - }) - } -} - - -if (require.main === module) { - functions.createTables(function() { - console.log("DB successfully initialized"); - }); -} - -module.exports = functions; diff --git a/express/notejam/helpers.js b/express/notejam/helpers.js deleted file mode 100644 index 21fe0a575..000000000 --- a/express/notejam/helpers.js +++ /dev/null @@ -1,22 +0,0 @@ -module.exports = { - formatFormErrors: function(errors) { - formatted = {}; - errors.forEach(function(e) { - formatted[e.param] = e.msg; - }); - return formatted; - }, - - formatModelErrors: function(errors) { - formatted = {}; - errors.forEach(function(e) { - formatted[e.property] = e.msg; - }); - return formatted; - }, - - loginRequired: function (req, res, next) { - if (req.isAuthenticated()) { return next(); } - res.redirect('/signin') - } -} diff --git a/express/notejam/models.js b/express/notejam/models.js deleted file mode 100644 index aa5b3ab11..000000000 --- a/express/notejam/models.js +++ /dev/null @@ -1,49 +0,0 @@ -var orm = require('orm'); -var moment = require('moment'); - -module.exports = function (db, cb) { - var User = db.define("users", { - id : { type: "serial", key: true }, - email : { type: "text" }, - password: { type: "text" } - }, { - validations: { - email: [orm.enforce.unique("User with given email already exists!"), - orm.enforce.patterns.email("Invalid email")], - password: orm.enforce.notEmptyString("Password is required"), - // @TODO add "match passwords" validation - } - }); - - var Pad = db.define("pads", { - id : { type: "serial", key: true }, - name : { type: "text" }, - }, { - validations: { - name: orm.enforce.notEmptyString("Name is required"), - } - }); - Pad.hasOne("user", User, { required: true, reverse: 'pads' }); - - var Note = db.define("notes", { - id : { type: "serial", key: true }, - name : { type: "text" }, - text : { type: "text" }, - created_at : { type: "date", time: true }, - updated_at : { type: "date", time: true } - }, { - methods: { - updatedAt: function () { - return moment(this.updated_at).fromNow(); - } - }, - validations: { - name: orm.enforce.notEmptyString("Name is required"), - text: orm.enforce.notEmptyString("Text is required"), - } - }); - Note.hasOne("user", User, { required: true, reverse: 'notes' }); - Note.hasOne("pad", Pad, { required: false, reverse: 'notes' }); - - return cb(); -}; diff --git a/express/notejam/package.json b/express/notejam/package.json deleted file mode 100644 index cd4cb3a00..000000000 --- a/express/notejam/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "notejam", - "version": "0.0.1", - "private": true, - "scripts": { - "start": "node ./bin/www" - }, - "dependencies": { - "express": "~4.2.0", - "sqlite3": "*", - "static-favicon": "~1.0.0", - "morgan": "~1.0.0", - "cookie-parser": "~1.0.1", - "body-parser": "~1.0.0", - "debug": "~0.7.4", - "jade": "~1.3.0", - "orm": "~2.1.19", - "connect-flash": "~0.1.1", - "express-session": "~1.0.2", - "express-validator": "~2.6.0", - "passport": "0.2.1", - "passport-local": "1.0.0", - "mocha": "1.*.*", - "supertest": "0.*.*", - "superagent": "*", - "should": "*", - "should-http": "*", - "async": "*", - "moment": "*", - "bcrypt": "*", - "nodemailer": "*", - "nodemailer-stub-transport": "*" - } -} diff --git a/express/notejam/public/stylesheets/style.css b/express/notejam/public/stylesheets/style.css deleted file mode 100644 index f2cf7f5de..000000000 --- a/express/notejam/public/stylesheets/style.css +++ /dev/null @@ -1,397 +0,0 @@ -/* -* Skeleton V1.0.3 -* Copyright 2011, Dave Gamache -* www.getskeleton.com -* Free to use under the MIT license. -* http://www.opensource.org/licenses/mit-license.php -* 7/17/2011 -*/ - - -/* Documentation Styles -================================================== */ - div.container { - padding-top: 40px; } - - /* Doc nav */ - nav { - width: 160px; } - #logo, .bold-header { - margin-bottom: 30px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - letter-spacing: -1px; - color: #555; - font-weight: bold; } - .bold-header span { - font-weight: normal; - font-size: 23px; - } - .bold-header a.header { - text-decoration: none; - color: inherit; - } - .bold-header span.jam { - font-size: 46px; - line-height: 50px; - } - nav ul { - float: left; } - nav ul li { - display: block; - margin-bottom: 10px; } - nav ul li a, - nav ul li a:visited, - nav ul li a:active { - font-size: 14px; - color: #555; - text-decoration: none; - font-weight: bold; } - nav ul li a:hover, - nav ul li a:focus { - color: #222; } - header h1 { - font-size: 52px; - line-height: 61px; - letter-spacing: -1px; - font-weight: normal; - font-family: "Georgia", "Times New Roman", Helvetica, Arial, sans-serif; } - hr.large { - border: none; - height: 8px; - background: #ebebeb; - margin: 50px 0; } - div.doc-section { - margin: 30px 0; } - - #whatAndWhy .row { - padding: 30px 0 0; } - - #typography blockquote { - margin-top: 20px; } - - .hidden-code a { - font-size: 12px; - color: #999; } - .hidden-code>div { - display: none; } - - - /* Grid */ - #grid .column, - #grid .columns { - background: #ddd; - height: 25px; - line-height: 25px; - margin-bottom: 10px; - text-align: center; - text-transform: uppercase; - color: #555; - font-size: 12px; - font-weight: bold; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; } - #grid .column:hover, - #grid .columns:hover { - background: #bbb; - color: #333; } - #grid .example-grid { overflow: hidden; } - - .post-button-note, - .post-button-note a { - font-size: 11px; - color: #999; } - - #examples .four.columns a { - text-decoration: none; - } - #examples .four.columns a:hover { - text-decoration: underline; - } - - - .resize { - position: fixed; - bottom: 0; - right: 0; - height: 80px; - width: 80px; - background: url(images/resize.png); } - - - img { - max-width: 100%; - height: auto; } - - .gist-meta { display: none !important;} - - ul ul ul li { margin-bottom: 3px; } - - .twitter-share-button { margin-bottom: -18px; } - - /* Table stylesheets */ - table { - width: 100%; - border-collapse: collapse; - } - - table th, table td { - padding: 10px 10px 9px; - font-size: 13px; - line-height: 18px; - text-align: left; - } - - table td { - vertical-align: top; - border-top: solid 1px #ddd; - } - - table th { - padding-top: 9px; - font-weight: bold; - vertical-align: middle; - } - - table.condensed th, table.condensed td { - padding: 5px 5px 4px; - } - - table.bordered { - border-collapse: separate; - border: solid 1px #ddd; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - } - - table.bordered th + th, - table.bordered th + td, - table.bordered td + td { - border-left: solid 1px #ddd; - } - - .zebra-striped tbody tr:nth-child(odd) td, - .zebra-striped tbody tr:nth-child(odd) th { - background: #f5f5f5; - } - -.carbonad, -.carbonad-image, -.carbonad-text, -.carbonad-tag { - background: none !important; - border: none !important; - margin-left: 0 !important; -} -.carbonad-tag { - margin-top: 6px !important; - padding-top: 0 !important; -} -.carbonad-text { - height: auto !important; -} -.carbonad-image { - margin-top: 0 !important; -} - -.hidden-text { - font-size: 12px; - color: #999; -} - -td.date, th.date { - text-align: right; -} - -td.date { - font-style: italic; -} - -form.note input[type="text"], form.note textarea { - width: 100%; -} - -form hr { - width: 218px; - margin: 10px 0px; -} - -form.note textarea { - height: 250px; -} - -div.content-area { - min-height: 600px; -} - -hr.footer { - margin-bottom: 10px; -} - -div.footer { - margin-bottom: 10px; - text-align: center; - font-size: 12px; -} - -form.sign-in { - margin: 50px 0 0 0; -} - -.sort_arrow { - text-decoration: none; -} - -.sort_arrow:hover { - text-decoration: none; - color: red; -} - -div.sign-in-out-block { - position: absolute; - right: 14px; - top: 8px; - font-size: 12px; -} - -div.sign-in-out-block a { - /*text-decoration: none;*/ -} - -a.small-red { - color: red; - font-size: 12px; -} - -table.notes { - margin: 0 0 20px 0; -} - -table.notes th.note { - width: 72%; -} - -table.notes td.pad { - color: grey; -} - -table.notes td.pad a { - color: grey; - text-decoration: underline; - font-style: normal; -} - - -table.notes td.pad a:hover { - color: black; -} - -p.empty { - color: grey; - font-style: italic; -} - -a.delete-note { - float: right; - font-size: 12px; - color: red; -} - -.red, input.red { - color: red !important; -} - -ul.errorlist, ul.errors { - margin: -18px 0 0 0; -} - -ul.errorlist li, ul.errors li { - color: red; -} - -.alert-area { - text-align: center; -} - -.alert { - padding: 5px 8px; - margin: 0 0 12px 0; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border: 1px solid #d6e9c6; -} - -.alert-error { - color: #b94a48; - background-color: #f2dede; - border: 1px solid #eed3d7; -} - - /* Mobile */ - @media only screen and (max-width: 767px) { - header h1 { font-size: 34px; line-height: 37px; } - nav { position: relative; } - nav ul, - .carbonad { - display: none; - } - #logo { text-align: left; } - #examples .four.columns { - padding-top: 30px; - } - } - - /* Mobile Landscape */ - @media only screen and (min-width: 480px) and (max-width: 767px) { - nav ul { - display: none; - } - } - - /* Non 960 */ - @media only screen and (max-width: 959px) { - #logo { - font-size: 21px; - margin-bottom: 15px; } - nav .button { - padding: 9px 20px 11px; } - } - - /* iPad Portrait/Browser */ - @media only screen and (min-width: 768px) and (max-width: 959px) { - nav { - width: 124px; } - } - - /* Mobile/Browser */ - @media only screen and (max-width: 767px) {} - - /* Mobile Landscape/Browser */ - @media only screen and (min-width: 480px) and (max-width: 767px) {} - - /* Anything smaller than standard 960 */ - @media only screen and (max-width: 959px) {} - - - /* iPad Portrait Only */ - @media only screen and (min-width: 768px) and (max-width: 959px) and (max-device-width: 1000px) {} - - /* Mobile Only */ - @media only screen and (max-width: 767px) and (max-device-width: 1000px) {} - - /* Mobile Landscape Only */ - @media only screen and (min-width: 480px) and (max-width: 767px) and (max-device-width: 1000px) {} - - /* Anything smaller than standard 960 on a device */ - @media only screen and (max-width: 959px) and (max-device-width: 1000px) { - .resize { display: none; } - } - - diff --git a/express/notejam/routes/notes.js b/express/notejam/routes/notes.js deleted file mode 100644 index 339e21228..000000000 --- a/express/notejam/routes/notes.js +++ /dev/null @@ -1,108 +0,0 @@ -var express = require('express'); -var router = express.Router(); -var orm = require('orm'); -var async = require('async'); - -var helpers = require('../helpers'); - -// All notes (main page) -router.get('/', helpers.loginRequired, function(req, res) { - req.user.getNotes(req.param("order", "-updated_at"), function(i, notes) { - async.map(notes, function(item, cb) { - item.getPad(function(err, pad) { - item.pad = pad; - return cb(null, item); - }) - }, function(err, results) { - res.render( - 'notes/list', - {title: 'All notes (' + results.length + ')', notes: results} - ); - }); - }) -}); - -// Create new note -router.get('/notes/create', helpers.loginRequired, function(req, res) { - res.render('notes/create', {padId: req.param('pad')}); -}); - -router.post('/notes/create', helpers.loginRequired, function(req, res) { - var data = req.body; - data['user_id'] = req.user.id; - req.models.Note.create(data, function(err, message) { - if (err) { - res.locals.errors = helpers.formatModelErrors(err); - } else { - req.flash( - 'success', - 'Note is successfully created' - ); - return res.redirect('/'); - } - res.render('notes/create'); - }); -}); - -// Inject note in request -router.use('/notes/:id', function(req, res, next) { - if (req.user) { - req.models.Note.one( - {id: req.param('id'), user_id: req.user.id}, - function(err, note) { - if (note == null) { - res.send(404); - return; - }; - req.note = note; - next(); - }); - } else { - next(); - } -}); - - -// View note -router.get('/notes/:id', helpers.loginRequired, function(req, res) { - res.render('notes/view', {note: req.note}); -}); - - - -// Edit note -router.get('/notes/:id/edit', helpers.loginRequired, function(req, res) { - res.render('notes/edit', {note: req.note}); -}); - -router.post('/notes/:id/edit', helpers.loginRequired, function(req, res) { - req.note.save(req.body, function(err) { - if (err) { - res.locals.errors = helpers.formatModelErrors(err); - res.render('notes/edit', {note: req.note}); - } else { - req.flash( - 'success', - 'Note is successfully updated' - ); - res.redirect('/notes/' + req.note.id); - } - }); -}); - -// Delete note -router.get('/notes/:id/delete', helpers.loginRequired, function(req, res) { - res.render('notes/delete', {note: req.note}); -}); - -router.post('/notes/:id/delete', helpers.loginRequired, function(req, res) { - req.note.remove(function(err) { - req.flash( - 'success', - 'Note is successfully deleted' - ); - res.redirect('/'); - }); -}); - -module.exports = router; diff --git a/express/notejam/routes/pads.js b/express/notejam/routes/pads.js deleted file mode 100644 index c9d1ceee4..000000000 --- a/express/notejam/routes/pads.js +++ /dev/null @@ -1,93 +0,0 @@ -var express = require('express'); -var router = express.Router(); -var orm = require('orm'); - -var helpers = require('../helpers') - -// Create new pad -router.get('/pads/create', helpers.loginRequired, function(req, res) { - res.render('pads/create'); -}); - -router.post('/pads/create', helpers.loginRequired, function(req, res) { - var data = req.body; - data['user_id'] = req.user.id; - req.models.Pad.create(data, function(err, message) { - if (err) { - res.locals.errors = helpers.formatModelErrors(err); - } else { - req.flash( - 'success', - 'Pad is successfully created' - ); - return res.redirect('/'); - } - res.render('pads/create'); - }); -}); - -// Inject pad in request -router.use('/pads/:id', function(req, res, next) { - if (req.user) { - req.models.Pad.one( - {id: req.param('id'), user_id: req.user.id}, - function(err, pad) { - if (pad == null) { - res.send(404); - return; - }; - req.pad = pad; - next(); - }); - } else { - next(); - } -}); - -// Pad notes -router.get('/pads/:id', helpers.loginRequired, function(req, res) { - req.pad.getNotes(req.param("order", "-updated_at"), function(i, notes) { - res.render( - 'pads/list', - {title: req.pad.name + ' (' + notes.length + ')', - pad: req.pad, notes: notes} - ); - }); -}); - -// Edit pad -router.get('/pads/:id/edit', helpers.loginRequired, function(req, res) { - res.render('pads/edit', {pad: req.pad}); -}); - -router.post('/pads/:id/edit', helpers.loginRequired, function(req, res) { - req.pad.save({name: req.param('name')}, function(err) { - if (err) { - res.locals.errors = helpers.formatModelErrors(err); - res.render('pads/edit', {pad: req.pad}); - } else { - req.flash( - 'success', - 'Pad is successfully updated' - ); - res.redirect('/'); - } - }); -}); - -// Delete pad -router.get('/pads/:id/delete', helpers.loginRequired, function(req, res) { - res.render('pads/delete', {pad: req.pad}); -}); - -router.post('/pads/:id/delete', helpers.loginRequired, function(req, res) { - req.pad.remove(function(err) { - req.flash( - 'success', - 'Pad is successfully deleted' - ); - res.redirect('/'); - }); -}); - -module.exports = router; diff --git a/express/notejam/routes/users.js b/express/notejam/routes/users.js deleted file mode 100644 index e1e72dc06..000000000 --- a/express/notejam/routes/users.js +++ /dev/null @@ -1,230 +0,0 @@ -var express = require('express'); -var router = express.Router(); -var debug = require('debug')('http') -var orm = require('orm'); -var passport = require('passport'); -var LocalStrategy = require('passport-local').Strategy; -var bcrypt = require('bcrypt'); -var nodemailer = require('nodemailer'); -var stubTransport = require('nodemailer-stub-transport'); - -var helpers = require('../helpers') -var settings = require('../settings'); - -// Sign Up -router.get('/signup', function(req, res) { - res.render('users/signup'); -}); - -router.post('/signup', function(req, res) { - var data = req.body; - if (data['password']) { - data['password'] = generateHash(data['password']); - }; - req.models.User.create(data, function(err, message) { - if (err) { - res.locals.errors = helpers.formatModelErrors(err); - } else { - req.flash( - 'success', - 'User is successfully created. Now you can sign in.' - ); - return res.redirect('/signin'); - } - res.render('users/signup'); - }); -}); - -// Sign In -router.get('/signin', function(req, res) { - res.render('users/signin'); -}); - -router.post('/signin', function(req, res, next) { - req.checkBody('email', 'Email is required').notEmpty(); - req.checkBody('password', 'Password is required').notEmpty(); - if (req.validationErrors()) { - var errors = helpers.formatFormErrors(req.validationErrors()); - } - - if (!errors) { - passport.authenticate('local', function(err, user, info) { - if (err) { return next(err) } - if (!user) { - req.flash('error', info.message); - return res.redirect('/signin') - } - req.logIn(user, function(err) { - if (err) { return next(err); } - return res.redirect('/'); - }); - })(req, res, next); - } else { - res.locals.errors = errors; - res.render('users/signin'); - } -}); - -// Account settings -router.get('/settings', helpers.loginRequired, function(req, res) { - res.render('users/settings'); -}); - -router.post('/settings', function(req, res, next) { - req.checkBody('password', 'Password is required').notEmpty(); - req.checkBody('new_password', 'New password is required').notEmpty(); - req.checkBody('confirm_new_password', 'Passwords do not match').equals( - req.body.new_password - ); - if (req.validationErrors()) { - var errors = helpers.formatFormErrors(req.validationErrors()); - } - - if (!errors) { - if (!checkPassword(req.user, req.param('password'))) { - req.flash( - 'error', - 'Current password is not correct' - ); - return res.redirect('/settings'); - } - var hash = generateHash(req.param('password')); - req.user.save({password: hash}, function(err) { - req.flash( - 'success', - 'Password is successfully changed' - ); - return res.redirect('/'); - }) - } else { - res.locals.errors = errors; - res.render('users/settings'); - } -}); - -// Forgot password -router.get('/forgot-password', function(req, res) { - res.render('users/forgot-password'); -}); - -router.post('/forgot-password', function(req, res) { - req.checkBody('email', 'Email is required').notEmpty(); - if (req.validationErrors()) { - res.locals.errors = helpers.formatFormErrors(req.validationErrors()); - res.render('users/forgot-password'); - return; - } - if (req.models.User.one({email: req.param('email')}, function(err, user) { - if (user) { - var password = generateRandomPassword(); - var hash = generateHash(password); - user.save({password: hash}, function() { - sendNewPassword(user, password); - req.flash( - 'success', - 'New password sent to your inbox' - ); - return res.redirect('/signin'); - }); - } else { - req.flash( - 'error', - 'No user with given email found' - ); - return res.redirect('/forgot-password'); - } - })); -}); - -// Sign Out -router.get('/signout', function(req, res) { - req.logout(); - res.redirect('/signin'); -}); - - -// Helper user functions -// Auth settings -passport.serializeUser(function(user, done) { - done(null, user.id); -}); - -passport.deserializeUser(function(id, done) { - findById(id, function (err, user) { - done(err, user); - }); -}); - -passport.use(new LocalStrategy( - {usernameField: 'email', passwordField: 'password'}, - function(username, password, done) { - findByUsername(username, function(err, user) { - if (err) { - return done(err); - } - if (!user) { - return done(null, false, { message: 'Unknown user ' + username }); - } - if (!checkPassword(user, password)) { - return done(null, false, { message: 'Invalid password' }); - } - return done(null, user); - }) - } -)); - -function findByUsername(username, fn) { - orm.connect(settings.dsn, function(err, db) { - db.load("../models", function (err) { - var User = db.models.users; - db.models.users.find({email: username}, function (err, users) { - if (users.length) { - return fn(null, users[0]); - } else { - return fn(null, null); - } - }); - }); - }); -} - -function findById(id, fn) { - orm.connect(settings.dsn, function(err, db) { - db.load("../models", function (err) { - var User = db.models.users; - User.get(id, function (err, user) { - if (err) { - fn(new Error('User ' + id + ' does not exist')); - } - return fn(null, user); - }); - }); - }); -} - -function generateHash(password) { - return bcrypt.hashSync(password, bcrypt.genSaltSync(10)); -} - -function checkPassword(user, password) { - return bcrypt.compareSync(password, user.password); -} - -function generateRandomPassword() { - return Math.random().toString(36).replace(/[^a-z]+/g, ''); -} - -function sendNewPassword(user, password) { - var mailer = nodemailer.createTransport(stubTransport()); - mailer.sendMail({ - from: 'norepy@notejamapp.com', - to: user.email, - subject: 'New notejam password', - text: 'Your new password: ' + password - }, function(err, info) { - // sent mail to console output - console.log(info.response.toString()); - }); -} - -module.exports = router; diff --git a/express/notejam/settings.js b/express/notejam/settings.js deleted file mode 100644 index 0350717b8..000000000 --- a/express/notejam/settings.js +++ /dev/null @@ -1,17 +0,0 @@ -var settings = { - development: { - db: "notejam.db", - dsn: "sqlite://notejam.db" - }, - test: { - db: "notejam_test.db", - dsn: "sqlite://notejam_test.db" - } -}; - - -var env = process.env.NODE_ENV -if (!env) { - env = 'development' -}; -module.exports = settings[env]; diff --git a/express/notejam/tests/config.js b/express/notejam/tests/config.js deleted file mode 100644 index dfd5a09c9..000000000 --- a/express/notejam/tests/config.js +++ /dev/null @@ -1,25 +0,0 @@ -module.exports = { - host: 'http://localhost', - port: 3000, - - // build absolute url - url: function(url) { - return this.host + ":" + this.port + url; - }, - - // sign in user/agent - signInUser: function (agent, user) { - var self = this; - return function(done) { - agent - .post(self.url('/signin')) - .send(user) - .end(onResponse); - - function onResponse(err, res) { - res.should.have.status(200); - return done(); - } - }; - } -} diff --git a/express/notejam/tests/notes.js b/express/notejam/tests/notes.js deleted file mode 100644 index da60c9aac..000000000 --- a/express/notejam/tests/notes.js +++ /dev/null @@ -1,141 +0,0 @@ -// Enable test environment -process.env.NODE_ENV = 'test'; - -var request = require('superagent'); -var should = require('should'); -require('should-http'); - -var db = require('../db'); -var config = require('./config') -var app = require('../app'); - -app.listen(config.port); - -before(function(done) { - db.createTables(function() { - db.applyFixtures(done); - }); -}); - -describe('Note', function() { - - var agent = request.agent(); - before( - config.signInUser( - agent, {email: 'user1@example.com', password: 'password'} - ) - ); - - describe('can be', function() { - it('successfully created', function(done) { - agent - .post(config.url('/notes/create')) - .send({name: 'New note', text: 'text', pad_id: 1}) - .end(function(error, res){ - res.redirects.should.eql([config.url('/')]); - res.text.should.containEql('Note is successfully created'); - done(); - }); - }); - - it('successfully edited', function(done) { - agent - .post(config.url('/notes/1/edit')) - .send({name: 'New name', text: 'New text'}) - .end(function(error, res){ - res.redirects.should.eql([config.url('/notes/1')]); - res.text.should.containEql('Note is successfully updated'); - done(); - }); - }); - - it('successfully deleted', function(done) { - agent - .post(config.url('/notes/2/delete')) - .end(function(error, res){ - res.redirects.should.eql([config.url('/')]); - res.text.should.containEql('Note is successfully deleted'); - done(); - }); - }); - - it('successfully viewed', function(done) { - agent - .get(config.url('/notes/1')) - .end(function(error, res){ - res.should.have.status(200); - done(); - }); - }); - }); - - describe('can not be', function() { - it('created if required fields are missing', function(done) { - agent - .post(config.url('/notes/create')) - .send({name: '', text: ''}) - .end(function(error, res){ - res.text.should.containEql('Name is required'); - res.text.should.containEql('Text is required'); - done(); - }); - }); - - it('edited if required fields are missing', function(done) { - agent - .post(config.url('/notes/1/edit')) - .send({name: '', text: ''}) - .end(function(error, res){ - res.text.should.containEql('Name is required'); - res.text.should.containEql('Text is required'); - done(); - }); - }); - - it('edited by not an owner', function(done) { - var agent = request.agent(); - var signed = config.signInUser( - agent, {email: 'user2@example.com', password: 'password'} - ); - signed(function() { - agent - .post(config.url('/notes/1/edit')) - .send({name: 'new name', text: 'new text'}) - .end(function(error, res){ - res.should.have.status(404); - done(); - }); - }) - }); - - it('deleted by not an owner', function(done) { - var agent = request.agent(); - var signed = config.signInUser( - agent, {email: 'user2@example.com', password: 'password'} - ); - signed(function() { - agent - .post(config.url('/notes/1/delete')) - .end(function(error, res){ - res.should.have.status(404); - done(); - }); - }) - }); - - it('viewed by not an owner', function(done) { - var agent = request.agent(); - var signed = config.signInUser( - agent, {email: 'user2@example.com', password: 'password'} - ); - signed(function() { - agent - .get(config.url('/notes/1')) - .end(function(error, res){ - res.should.have.status(404); - done(); - }); - }) - }); - }); -}); diff --git a/express/notejam/tests/pads.js b/express/notejam/tests/pads.js deleted file mode 100644 index 00f1dab2c..000000000 --- a/express/notejam/tests/pads.js +++ /dev/null @@ -1,138 +0,0 @@ -// Enable test environment -process.env.NODE_ENV = 'test'; - -var request = require('superagent'); -var should = require('should'); -require('should-http'); - -var db = require('../db'); -var config = require('./config'); -var app = require('../app'); - -app.listen(3000); - -before(function(done) { - db.createTables(function() { - db.applyFixtures(done); - }); -}); - -describe('Pad', function() { - - var agent = request.agent(); - before( - config.signInUser(agent, {email: 'user1@example.com', password: 'password'}) - ); - - describe('can be', function() { - it('successfully created', function(done) { - agent - .post(config.url('/pads/create')) - .send({name: 'New pad'}) - .end(function(error, res){ - res.redirects.should.eql([config.url('/')]); - res.text.should.containEql('Pad is successfully created'); - done(); - }); - }); - - it('successfully edited', function(done) { - agent - .post(config.url('/pads/1/edit')) - .send({name: 'New pad name'}) - .end(function(error, res){ - res.redirects.should.eql([config.url('/')]); - res.text.should.containEql('Pad is successfully updated'); - done(); - }); - }); - - it('successfully deleted', function(done) { - agent - .post(config.url('/pads/2/delete')) - .end(function(error, res){ - res.redirects.should.eql([config.url('/')]); - res.text.should.containEql('Pad is successfully deleted'); - done(); - }); - }); - - it('successfully viewed', function(done) { - agent - .get(config.url('/pads/1')) - .end(function(error, res){ - res.should.have.status(200); - res.text.should.containEql('Pad settings'); - done(); - }); - }); - }); - - describe('can not be', function() { - it('created if required fields are missing', function(done) { - agent - .post(config.url('/pads/create')) - .send({name: ''}) - .end(function(error, res){ - res.text.should.containEql('Name is required'); - done(); - }); - }); - - it('edited if required fields are missing', function(done) { - agent - .post(config.url('/pads/1/edit')) - .send({name: ''}) - .end(function(error, res){ - res.text.should.containEql('Name is required'); - done(); - }); - }); - - it('edited by not an owner', function(done) { - var agent = request.agent(); - var signed = config.signInUser( - agent, {email: 'user2@example.com', password: 'password'} - ); - signed(function() { - agent - .post(config.url('/pads/1/edit')) - .send({name: 'new name'}) - .end(function(error, res){ - res.should.have.status(404); - done(); - }); - }) - }); - - it('deleted by not an owner', function(done) { - var agent = request.agent(); - var signed = config.signInUser( - agent, {email: 'user2@example.com', password: 'password'} - ); - signed(function() { - agent - .post(config.url('/pads/1/delete')) - .end(function(error, res){ - res.should.have.status(404); - done(); - }); - }) - }); - - it('viewed by not an owner', function(done) { - var agent = request.agent(); - var signed = config.signInUser( - agent, {email: 'user2@example.com', password: 'password'} - ); - signed(function() { - agent - .get(config.url('/pads/1')) - .end(function(error, res){ - res.should.have.status(404); - done(); - }); - }) - }); - }); -}); diff --git a/express/notejam/tests/users.js b/express/notejam/tests/users.js deleted file mode 100644 index 958f6caaa..000000000 --- a/express/notejam/tests/users.js +++ /dev/null @@ -1,106 +0,0 @@ -// Enable test environment -process.env.NODE_ENV = 'test'; - -var request = require('superagent'); -var should = require('should'); -require('should-http'); - -var db = require('../db'); -var config = require('./config'); -var app = require('../app'); - -app.listen(3000); - -before(function(done) { - db.createTables(function() { - db.applyFixtures(done); - }); -}); - -describe('User', function(){ - - it('can successfully sign in', function(done){ - var agent = request.agent(); - agent - .post(config.url('/signin')) - .send({email: 'user1@example.com', password: 'password' }) - .end(function(error, res){ - res.redirects.should.eql([config.url('/')]); - done(); - }); - }); - - describe('cant sign in', function() { - it('with wrong credentials', function(done) { - var agent = request.agent(); - agent - .post(config.url('/signin')) - .send({email: 'unknown@email.com', password: 'unknown' }) - .end(function(error, res){ - res.text.should.containEql('Unknown user'); - done(); - }); - }); - - it('if required fields are missing', function(done){ - var agent = request.agent(); - agent - .post(config.url('/signin')) - .send({email: '', password: '' }) - .end(function(error, res){ - res.text.should.containEql('Email is required'); - res.text.should.containEql('Password is required'); - done(); - }); - }); - }); - - it('can successfully sign up', function(done) { - var agent = request.agent(); - agent - .post(config.url('/signup')) - .send({email: 'usersadfasdf@example.com', password: 'password'}) - .end(function(error, res){ - res.redirects.should.eql([config.url('/signin')]); - done(); - }); - }); - - describe('cant signup', function() { - it('if email is invalid', function(done) { - var agent = request.agent(); - agent - .post(config.url('/signup')) - .send({email: 'invalid', password: 'password' }) - .end(function(error, res){ - res.text.should.containEql('Invalid email'); - done(); - }); - }); - - it('if required fields are missing', function(done) { - var agent = request.agent(); - agent - .post(config.url('/signup')) - .send({email: '', password: '' }) - .end(function(error, res){ - res.text.should.containEql('Invalid email'); - res.text.should.containEql('Password is required'); - done(); - }); - }); - - it('if user already exists', function(done) { - var agent = request.agent(); - agent - .post(config.url('/signup')) - .send({email: 'user1@example.com', password: 'password' }) - .end(function(error, res){ - res.text.should.containEql('User with given email already exists'); - done(); - }); - }); - - // @TODO implement "if passwords do not match" case - }); -}) diff --git a/express/notejam/views/error.jade b/express/notejam/views/error.jade deleted file mode 100644 index db0601f24..000000000 --- a/express/notejam/views/error.jade +++ /dev/null @@ -1,6 +0,0 @@ -extends layout - -block content_area - h1= message - h2= error.status - pre #{error.stack} diff --git a/express/notejam/views/layout.jade b/express/notejam/views/layout.jade deleted file mode 100644 index f94fa8bcb..000000000 --- a/express/notejam/views/layout.jade +++ /dev/null @@ -1,44 +0,0 @@ -include mixins.jade - -doctype html -html(lang='en') - meta(charset='utf-8') - title - block title - meta(name='description', content='Notejam: Unified sample app') - meta(name='author', content='Notejam') - meta(name='viewport', content='width=device-width, initial-scale=1, maximum-scale=1') - link(rel='stylesheet', href='http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/base.min.css') - link(rel='stylesheet', href='http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/skeleton.min.css') - link(rel='stylesheet', href='http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/layout.css') - link(rel='stylesheet', href='/stylesheets/style.css') - body - .container - .sixteen.columns - .sign-in-out-block - if req.isAuthenticated() - | #{req.user.email}:   - a(href='/settings') Account settings - |     - a(href='/signout') Sign out - else - a(href='/signup') Sign up - |     - a(href='/signin') Sign in - .sixteen.columns - h1.bold-header - a.header(href="/") - | note - span.jam - | jam:  - span - block title - block content_area - hr.footer - .footer - div - | Notejam: Express application - div - Github, Twitter, created by Serhii Komar - a(href='https://github.com/komarserjio/notejam') - img(style='position: absolute; top: 0; right: 0; border: 0;', src='https://s3.amazonaws.com/github/ribbons/forkme_right_gray_6d6d6d.png', alt='Fork me on GitHub') diff --git a/express/notejam/views/main.jade b/express/notejam/views/main.jade deleted file mode 100644 index 2441f8ff2..000000000 --- a/express/notejam/views/main.jade +++ /dev/null @@ -1,18 +0,0 @@ -extends layout - -block content_area - .three.columns - h4#logo My pads - nav - if pads.length - ul - each pad in pads - li - a(href='/pads/#{pad.id}') #{pad.name} - else - p.empty= 'No pads yet' - hr - a(href='/pads/create') New pad - .thirteen.columns.content-area - +render_flash_messages(flash_messages) - block content diff --git a/express/notejam/views/mixins.jade b/express/notejam/views/mixins.jade deleted file mode 100644 index acfb1a12d..000000000 --- a/express/notejam/views/mixins.jade +++ /dev/null @@ -1,13 +0,0 @@ -mixin error(field, errors) - if errors && (field in errors) - ul.errors - li= errors[field] - -// render flash messages -mixin render_flash_messages(messages) - if messages.success.length || messages.error.length - div.alert-area - each message in messages.success - div.alert.alert-success= message - each message in messages.error - div.alert.alert-error= message diff --git a/express/notejam/views/notes/create.jade b/express/notejam/views/notes/create.jade deleted file mode 100644 index 8a3dd27f4..000000000 --- a/express/notejam/views/notes/create.jade +++ /dev/null @@ -1,19 +0,0 @@ -extends ../main - -block title - | New note - -block content - form.note(method='POST') - label(for='name') Name - input#name(type='text', name='name') - +error('name', errors) - label(for='text') Text - textarea(name='text') - +error('text', errors) - label(for='pad_id') Pad - select(name='pad_id') - option -------------- - each pad in req.user.pads - option(value=pad.id, selected=pad.id == padId) #{pad.name} - input(type='submit', value='Save') diff --git a/express/notejam/views/notes/delete.jade b/express/notejam/views/notes/delete.jade deleted file mode 100644 index 61224f24d..000000000 --- a/express/notejam/views/notes/delete.jade +++ /dev/null @@ -1,12 +0,0 @@ -extends ../main - -block title - | #{note.name} - -block content - p Are you sure you want to delete the note? - form(method='post') - input(type='submit', class="red", value='Yes, delete I want to delete this note') - |   - a(href='/notes/#{note.id}') Cancel - diff --git a/express/notejam/views/notes/edit.jade b/express/notejam/views/notes/edit.jade deleted file mode 100644 index 95b1233e6..000000000 --- a/express/notejam/views/notes/edit.jade +++ /dev/null @@ -1,20 +0,0 @@ -extends ../main - -block title - | #{note.name} - -block content - form.note(method='POST') - label(for='name') Name - input#name(type='text', name='name', value='#{note.name}') - +error('name', errors) - label(for='text') Text - textarea(name='text') #{note.text} - +error('text', errors) - label(for='pad_id') Pad - select(name='pad_id') - option ---------- - each pad in req.user.pads - option(value=pad.id, selected=pad.id == note.pad_id) #{pad.name} - input(type='submit', value='Save') - diff --git a/express/notejam/views/notes/list.jade b/express/notejam/views/notes/list.jade deleted file mode 100644 index 868dfa47b..000000000 --- a/express/notejam/views/notes/list.jade +++ /dev/null @@ -1,33 +0,0 @@ -extends ../main - -block title - | #{title} - -block content - if notes.length - table.notes - tr - th.note - | Note - a.sort_arrow(href='/?order=-name') ↑ - a.sort_arrow(href='/?order=name') ↓ - th - | Pad - th.date - | Last modified - a.sort_arrow(href='/?order=-updated_at') ↑ - a.sort_arrow(href='/?order=updated_at') ↓ - each note in notes - tr - td - a(href='/notes/#{note.id}') #{note.name} - td.pad - if note.pad - a(href='/pads/#{note.pad.id}') #{note.pad.name} - else - | No pad - td.hidden-text.date #{note.updatedAt()} - else - p.empty Create your first note - a.button(href='/notes/create') New note - diff --git a/express/notejam/views/notes/view.jade b/express/notejam/views/notes/view.jade deleted file mode 100644 index 79a7c933a..000000000 --- a/express/notejam/views/notes/view.jade +++ /dev/null @@ -1,12 +0,0 @@ -extends ../main - -block title - | #{note.name} - -block content - p.hidden-text Last edited #{note.updatedAt()} - div.note - p #{note.text} - - a.button(href='/notes/#{note.id}/edit') Edit - a.delete-note(href='/notes/#{note.id}/delete') Delete it diff --git a/express/notejam/views/pads/create.jade b/express/notejam/views/pads/create.jade deleted file mode 100644 index 416c94bce..000000000 --- a/express/notejam/views/pads/create.jade +++ /dev/null @@ -1,11 +0,0 @@ -extends ../main - -block title - | New pad - -block content - form(method='POST') - label(for='name') Name - input#name(type='text', name='name') - +error('name', errors) - input(type='submit', value='Save') diff --git a/express/notejam/views/pads/delete.jade b/express/notejam/views/pads/delete.jade deleted file mode 100644 index 09597cc8e..000000000 --- a/express/notejam/views/pads/delete.jade +++ /dev/null @@ -1,11 +0,0 @@ -extends ../main - -block title - | #{pad.name} - -block content - p Are you sure you want to delete the pad? - form(method='post') - input(type='submit', class="red", value='Yes, delete I want to delete this pad') - |   - a(href="/pads/#{pad.id}/edit") Cancel diff --git a/express/notejam/views/pads/edit.jade b/express/notejam/views/pads/edit.jade deleted file mode 100644 index 0d6b013b0..000000000 --- a/express/notejam/views/pads/edit.jade +++ /dev/null @@ -1,14 +0,0 @@ -extends ../main - -block title - | #{pad.name} - -block content - form(method='POST') - label(for='name') Name - input#name(type='text', name='name', value='#{pad.name}') - +error('name', errors) - input(type='submit', value='Save') - div - a.red(href="/pads/#{pad.id}/delete") Delete pad - diff --git a/express/notejam/views/pads/list.jade b/express/notejam/views/pads/list.jade deleted file mode 100644 index 95f248233..000000000 --- a/express/notejam/views/pads/list.jade +++ /dev/null @@ -1,27 +0,0 @@ -extends ../main - -block title - | #{title} - -block content - if notes.length - table.notes - tr - th.note - | Note - a.sort_arrow(href='/pads/#{pad.id}/?order=-name') ↑ - a.sort_arrow(href='/pads/#{pad.id}/?order=name') ↓ - th.date - | Last modified - a.sort_arrow(href='/pads/#{pad.id}/?order=-updated_at') ↑ - a.sort_arrow(href='/pads/#{pad.id}/?order=updated_at') ↓ - each note in notes - tr - td - a(href='/notes/#{note.id}') #{note.name} - td.hidden-text.date #{note.updatedAt()} - else - p.empty Create your first note in the pad - a.button(href='/notes/create?pad=#{pad.id}') New note - |   - a(href="/pads/#{pad.id}/edit") Pad settings diff --git a/express/notejam/views/user.jade b/express/notejam/views/user.jade deleted file mode 100644 index f6c3513d2..000000000 --- a/express/notejam/views/user.jade +++ /dev/null @@ -1,6 +0,0 @@ -extends layout - -block content_area - .sixteen.columns.content-area - +render_flash_messages(flash_messages) - block content diff --git a/express/notejam/views/users/forgot-password.jade b/express/notejam/views/users/forgot-password.jade deleted file mode 100644 index 70a856e3d..000000000 --- a/express/notejam/views/users/forgot-password.jade +++ /dev/null @@ -1,11 +0,0 @@ -extends ../user - -block title - | Forgot password? - -block content - form.offset-by-six.sign-in(method='POST') - label(for='email') Email - input#email(type='text', name='email') - +error('email', errors) - input(type='submit', value='Get new password') diff --git a/express/notejam/views/users/settings.jade b/express/notejam/views/users/settings.jade deleted file mode 100644 index bda9ec5f3..000000000 --- a/express/notejam/views/users/settings.jade +++ /dev/null @@ -1,18 +0,0 @@ -extends ../user - -block title - | Account settings - -block content - form.offset-by-six.sign-in(method='POST') - label(for='password') Current password - input#email(type='password', name='password') - +error('password', errors) - label(for='new_password') New Password - input#password(type='password', name='new_password') - +error('new_password', errors) - label(for='confirm_new_password') Confirm New Password - input#confirm_password(type='password', name='confirm_new_password') - +error('confirm_new_password', errors) - input(type='submit', value='Change password') - diff --git a/express/notejam/views/users/signin.jade b/express/notejam/views/users/signin.jade deleted file mode 100644 index dcd13b36f..000000000 --- a/express/notejam/views/users/signin.jade +++ /dev/null @@ -1,18 +0,0 @@ -extends ../user - -block title - | Sign In - -block content - form.offset-by-six.sign-in(method='POST') - label(for='email') Email - input#email(type='text', name='email') - +error('email', errors) - label(for='password') Password - input#password(type='password', name='password') - +error('password', errors) - input(type='submit', value='Sign In') - | or Sign Up - hr - p - a.small-red(href='/forgot-password') Forgot password? diff --git a/express/notejam/views/users/signup.jade b/express/notejam/views/users/signup.jade deleted file mode 100644 index c7e487d80..000000000 --- a/express/notejam/views/users/signup.jade +++ /dev/null @@ -1,22 +0,0 @@ -extends ../user - -block title - | Sign Up - -block content - form.offset-by-six.sign-in(method='POST') - label(for='email') Email - input#email(type='text', name='email') - +error('email', errors) - label(for='password') Password - input#password(type='password', name='password') - +error('password', errors) - label(for='confirm_password') Confirm Password - input#confirm_password(type='password', name='confirm_password') - +error('confirm_password', errors) - input(type='submit', value='Sign Up') - | or Sign In - hr - p - a.small-red(href='#forgot-password') Forgot password? - diff --git a/flask/README.rst b/flask/README.rst deleted file mode 100644 index f9924f074..000000000 --- a/flask/README.rst +++ /dev/null @@ -1,89 +0,0 @@ -************** -Notejam: Flask -************** - -Notejam application implemented using `Flask `_ microframework. - -Flask version: 1.1.1 - -Flask extension used: - -* Flask-Login -* Flask-Mail -* Flask-SQLAlchemy -* Flask-Testing -* Flask-WTF - -========================== -Installation and launching -========================== - ------ -Clone ------ - -Clone the repo: - -.. code-block:: bash - - $ git clone git@github.com:nordcloud/notejam.git YOUR_PROJECT_DIR/ - -------- -Install -------- -Use `virtualenv `_ or `virtualenvwrapper `_ -for `environment management `_. - -Install dependencies: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/flask/ - $ pip install -r requirements.txt - -Create database schema: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/flask/ - $ python db.py - ------- -Launch ------- - -Start flask web server: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/flask/ - $ python runserver.py - -Go to http://127.0.0.1:5000/ in your browser - ---------- -Run tests ---------- - -Run functional and unit tests: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/flask/ - $ python tests.py - - -============ -Contribution -============ - -Do you have python/flask experience? Help the app to follow python and flask best practices. - -Please send your pull requests in the ``master`` branch. -Always prepend your commits with framework name: - -.. code-block:: bash - - Flask: Implemented sign in functionality - -Read `contribution guide `_ for details. diff --git a/flask/db.py b/flask/db.py deleted file mode 100644 index 4190c769a..000000000 --- a/flask/db.py +++ /dev/null @@ -1,4 +0,0 @@ -from notejam import db - -# Create db schema -db.create_all() diff --git a/flask/notejam/__init__.py b/flask/notejam/__init__.py deleted file mode 100644 index 4257505a3..000000000 --- a/flask/notejam/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -from flask import Flask -from flask_sqlalchemy import SQLAlchemy -from flask_login import LoginManager -from flask_mail import Mail - -# @TODO use application factory approach -app = Flask(__name__) -app.config.from_object('notejam.config.Config') -app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False -db = SQLAlchemy(app) - -login_manager = LoginManager() -login_manager.login_view = "signin" -login_manager.init_app(app) - -mail = Mail() -mail.init_app(app) - -from notejam import views diff --git a/flask/notejam/config.py b/flask/notejam/config.py deleted file mode 100644 index de9c901fd..000000000 --- a/flask/notejam/config.py +++ /dev/null @@ -1,24 +0,0 @@ -import os -basedir = os.path.abspath(os.path.dirname(__file__)) - -class Config(object): - DEBUG = False - TESTING = False - SECRET_KEY = 'notejam-flask-secret-key' - WTF_CSRF_ENABLED = True - CSRF_SESSION_KEY = 'notejam-flask-secret-key' - SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'notejam.db') - - -class ProductionConfig(Config): - DEBUG = False - - -class DevelopmentConfig(Config): - DEVELOPMENT = True - DEBUG = True - - -class TestingConfig(Config): - TESTING = True - WTF_CSRF_ENABLED = False diff --git a/flask/notejam/forms.py b/flask/notejam/forms.py deleted file mode 100644 index 6b13bc53a..000000000 --- a/flask/notejam/forms.py +++ /dev/null @@ -1,84 +0,0 @@ -from flask_wtf import FlaskForm -from wtforms import StringField, PasswordField, SelectField, TextAreaField -from wtforms.validators import Required, Email, EqualTo, ValidationError - -from notejam.models import User, Pad - - -class SigninForm(FlaskForm): - email = StringField('Email', validators=[Required(), Email()]) - password = PasswordField('Password', validators=[Required()]) - - -class SignupForm(FlaskForm): - email = StringField('Email', validators=[Required(), Email()]) - password = PasswordField('Password', validators=[Required()]) - repeat_password = PasswordField( - 'Repeat Password', - validators=[ - Required(), EqualTo( - 'password', message="Your passwords do not match" - ) - ] - ) - - def validate_email(self, field): - if User.query.filter_by(email=field.data).count(): - raise ValidationError( - 'User with this email is already signed up' - ) - - -class NoteForm(FlaskForm): - name = StringField('Name', validators=[Required()]) - text = TextAreaField('Note', validators=[Required()]) - pad = SelectField('Pad', choices=[], coerce=int) - - # @TODO use wtforms.ext.sqlalchemy.fields.QuerySelectField? - def __init__(self, user=None, **kwargs): - super(NoteForm, self).__init__(**kwargs) - self.pad.choices = [(0, '---------')] + [ - (p.id, p.name) for p in Pad.query.filter_by(user=user) - ] - - -class PadForm(FlaskForm): - name = StringField('Name', validators=[Required()]) - - -# dummy form -class DeleteForm(FlaskForm): - pass - - -class ChangePasswordForm(FlaskForm): - old_password = PasswordField('Old Password', validators=[Required()]) - new_password = PasswordField('New Password', validators=[Required()]) - repeat_new_password = PasswordField( - 'Repeat New Password', - validators=[ - Required(), EqualTo( - 'new_password', message="Your passwords don't match" - ) - ] - ) - - def __init__(self, **kwargs): - super(ChangePasswordForm, self).__init__(**kwargs) - self.user = kwargs['user'] - - def validate_old_password(self, field): - if not self.user.check_password(field.data): - raise ValidationError( - 'Incorrect old password' - ) - - -class ForgotPasswordForm(FlaskForm): - email = StringField('Email', validators=[Required(), Email()]) - - def validate_email(self, field): - if not User.query.filter_by(email=field.data).count(): - raise ValidationError( - 'No user with given email found' - ) diff --git a/flask/notejam/models.py b/flask/notejam/models.py deleted file mode 100755 index fa717ffba..000000000 --- a/flask/notejam/models.py +++ /dev/null @@ -1,66 +0,0 @@ -import datetime - -from werkzeug.security import (generate_password_hash, -check_password_hash) -from flask_login import UserMixin - -from notejam import db - - -class User(db.Model, UserMixin): - id = db.Column(db.Integer, primary_key=True) - email = db.Column(db.String(120), unique=True) - password = db.Column(db.String(100)) - - @staticmethod - def authenticate(email, password): - user = User.query.filter_by(email=email).first() - if user and user.check_password(password): - return user - - def set_password(self, password): - self.password = generate_password_hash(password) - - def check_password(self, password): - return check_password_hash(self.password, password) - - def __repr__(self): - return '' % self.email - - -class Note(db.Model): - id = db.Column(db.Integer, primary_key=True) - name = db.Column(db.String(100)) - text = db.Column(db.Text) - created_at = db.Column(db.DateTime, default=datetime.datetime.now) - updated_at = db.Column( - db.DateTime, - default=datetime.datetime.now, - onupdate=datetime.datetime.now - ) - - user_id = db.Column(db.Integer, db.ForeignKey('user.id')) - user = db.relationship('User', backref=db.backref('notes', lazy='dynamic')) - - pad_id = db.Column(db.Integer, db.ForeignKey('pad.id')) - pad = db.relationship( - 'Pad', - backref=db.backref('notes', lazy='dynamic', cascade='all') - ) - - def __repr__(self): - return '' % self.name - - -class Pad(db.Model): - id = db.Column(db.Integer, primary_key=True) - name = db.Column(db.String(100)) - - user_id = db.Column(db.Integer, db.ForeignKey('user.id')) - user = db.relationship( - 'User', - backref=db.backref('pads', lazy='dynamic', cascade='all') - ) - - def __repr__(self): - return '' % self.name diff --git a/flask/notejam/static/css/style.css b/flask/notejam/static/css/style.css deleted file mode 100644 index b800e615d..000000000 --- a/flask/notejam/static/css/style.css +++ /dev/null @@ -1,350 +0,0 @@ -/* -* Skeleton V1.0.3 -* Copyright 2011, Dave Gamache -* www.getskeleton.com -* Free to use under the MIT license. -* http://www.opensource.org/licenses/mit-license.php -* 7/17/2011 -*/ - - -/* Documentation Styles -================================================== */ - div.container { - padding-top: 40px; } - - /* Doc nav */ - nav { - width: 160px; } - #logo, .bold-header { - margin-bottom: 30px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - letter-spacing: -1px; - color: #555; - font-weight: bold; } - .bold-header span { - font-weight: normal; - font-size: 23px; - } - .bold-header a.header { - text-decoration: none; - color: inherit; - } - .bold-header span.jam { - font-size: 46px; - line-height: 50px; - } - nav ul { - float: left; } - nav ul li { - display: block; - margin-bottom: 10px; } - nav ul li a, - nav ul li a:visited, - nav ul li a:active { - font-size: 14px; - color: #555; - text-decoration: none; - font-weight: bold; } - nav ul li a:hover, - nav ul li a:focus { - color: #222; } - header h1 { - font-size: 52px; - line-height: 61px; - letter-spacing: -1px; - font-weight: normal; - font-family: "Georgia", "Times New Roman", Helvetica, Arial, sans-serif; } - hr.large { - border: none; - height: 8px; - background: #ebebeb; - margin: 50px 0; } - div.doc-section { - margin: 30px 0; } - - #whatAndWhy .row { - padding: 30px 0 0; } - - #typography blockquote { - margin-top: 20px; } - - .hidden-code a { - font-size: 12px; - color: #999; } - .hidden-code>div { - display: none; } - - - /* Grid */ - #grid .column, - #grid .columns { - background: #ddd; - height: 25px; - line-height: 25px; - margin-bottom: 10px; - text-align: center; - text-transform: uppercase; - color: #555; - font-size: 12px; - font-weight: bold; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; } - #grid .column:hover, - #grid .columns:hover { - background: #bbb; - color: #333; } - #grid .example-grid { overflow: hidden; } - - .post-button-note, - .post-button-note a { - font-size: 11px; - color: #999; } - - #examples .four.columns a { - text-decoration: none; - } - #examples .four.columns a:hover { - text-decoration: underline; - } - - - .resize { - position: fixed; - bottom: 0; - right: 0; - height: 80px; - width: 80px; - background: url(images/resize.png); } - - - img { - max-width: 100%; - height: auto; } - - .gist-meta { display: none !important;} - - ul ul ul li { margin-bottom: 3px; } - - .twitter-share-button { margin-bottom: -18px; } - -.carbonad, -.carbonad-image, -.carbonad-text, -.carbonad-tag { - background: none !important; - border: none !important; - margin-left: 0 !important; -} -.carbonad-tag { - margin-top: 6px !important; - padding-top: 0 !important; -} -.carbonad-text { - height: auto !important; -} -.carbonad-image { - margin-top: 0 !important; -} - -.hidden-text { - font-size: 12px; - color: #999; -} - -td.date, th.date { - text-align: right; -} - -td.date { - font-style: italic; -} - -form.note input[type="text"], form.note textarea { - width: 100%; -} - -form hr { - width: 218px; - margin: 10px 0px; -} - -form.note textarea { - height: 250px; -} - -div.content-area { - min-height: 600px; -} - -hr.footer { - margin-bottom: 10px; -} - -div.footer { - margin-bottom: 10px; - text-align: center; - font-size: 12px; -} - -form.sign-in { - margin: 50px 0 0 0; -} - -.sort_arrow { - text-decoration: none; -} - -.sort_arrow:hover { - text-decoration: none; - color: red; -} - -div.sign-in-out-block { - position: absolute; - right: 14px; - top: 8px; - font-size: 12px; -} - -div.sign-in-out-block a { - /*text-decoration: none;*/ -} - -a.small-red { - color: red; - font-size: 12px; -} - -table.notes { - margin: 0 0 20px 0; -} - -table.notes th.note { - width: 72%; -} - -table.notes td.pad { - color: grey; -} - -table.notes td.pad a { - color: grey; - text-decoration: underline; - font-style: normal; -} - - -table.notes td.pad a:hover { - color: black; -} - -p.empty { - color: grey; - font-style: italic; -} - -a.delete-note { - float: right; - font-size: 12px; - color: red; -} - -.red, input.red { - color: red !important; -} - -ul.errorlist, ul.errors { - margin: -18px 0 0 0; -} - -ul.errorlist li, ul.errors li { - color: red; -} - -.alert-area { - text-align: center; -} - -.alert { - padding: 5px 8px; - margin: 0 0 12px 0; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border: 1px solid #d6e9c6; -} - -.alert-error { - color: #b94a48; - background-color: #f2dede; - border: 1px solid #eed3d7; -} - - /* Mobile */ - @media only screen and (max-width: 767px) { - header h1 { font-size: 34px; line-height: 37px; } - nav { position: relative; } - nav ul, - .carbonad { - display: none; - } - #logo { text-align: left; } - #examples .four.columns { - padding-top: 30px; - } - } - - /* Mobile Landscape */ - @media only screen and (min-width: 480px) and (max-width: 767px) { - nav ul { - display: none; - } - } - - /* Non 960 */ - @media only screen and (max-width: 959px) { - #logo { - font-size: 21px; - margin-bottom: 15px; } - nav .button { - padding: 9px 20px 11px; } - } - - /* iPad Portrait/Browser */ - @media only screen and (min-width: 768px) and (max-width: 959px) { - nav { - width: 124px; } - } - - /* Mobile/Browser */ - @media only screen and (max-width: 767px) {} - - /* Mobile Landscape/Browser */ - @media only screen and (min-width: 480px) and (max-width: 767px) {} - - /* Anything smaller than standard 960 */ - @media only screen and (max-width: 959px) {} - - - /* iPad Portrait Only */ - @media only screen and (min-width: 768px) and (max-width: 959px) and (max-device-width: 1000px) {} - - /* Mobile Only */ - @media only screen and (max-width: 767px) and (max-device-width: 1000px) {} - - /* Mobile Landscape Only */ - @media only screen and (min-width: 480px) and (max-width: 767px) and (max-device-width: 1000px) {} - - /* Anything smaller than standard 960 on a device */ - @media only screen and (max-width: 959px) and (max-device-width: 1000px) { - .resize { display: none; } - } - - diff --git a/flask/notejam/static/css/tables.css b/flask/notejam/static/css/tables.css deleted file mode 100644 index fb4441935..000000000 --- a/flask/notejam/static/css/tables.css +++ /dev/null @@ -1,45 +0,0 @@ -table { - width: 100%; - border-collapse: collapse; -} - -table th, table td { - padding: 10px 10px 9px; - font-size: 13px; - line-height: 18px; - text-align: left; -} - -table td { - vertical-align: top; - border-top: solid 1px #ddd; -} - -table th { - padding-top: 9px; - font-weight: bold; - vertical-align: middle; -} - -table.condensed th, table.condensed td { - padding: 5px 5px 4px; -} - -table.bordered { - border-collapse: separate; - border: solid 1px #ddd; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; -} - -table.bordered th + th, -table.bordered th + td, -table.bordered td + td { - border-left: solid 1px #ddd; -} - -.zebra-striped tbody tr:nth-child(odd) td, -.zebra-striped tbody tr:nth-child(odd) th { - background: #f5f5f5; -} diff --git a/flask/notejam/templates/_helpers.html b/flask/notejam/templates/_helpers.html deleted file mode 100644 index bea460a16..000000000 --- a/flask/notejam/templates/_helpers.html +++ /dev/null @@ -1,11 +0,0 @@ -{% macro render_field(field) %} - - {{ field }} - {% if field.errors %} -
    - {% for error in field.errors %} -
  • {{ error }}
  • - {% endfor %} -
- {% endif %} -{% endmacro %} diff --git a/flask/notejam/templates/base.html b/flask/notejam/templates/base.html deleted file mode 100644 index 5a061688b..000000000 --- a/flask/notejam/templates/base.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - {% block title %}Notejam{% endblock %} - - - - - - - - - - - - - - - - - {% block extrahead %}{% endblock %} - - -
-
- -
-
-

- notejam: - {% block page_title %} - All notes - {% endblock %} -

-
- {% block pads %} -
- - - - -
- {% endblock %} -
- {% with messages = get_flashed_messages(with_categories=true) %} - {% if messages %} -
    - {% for category, message in messages %} -
    {{ message }}
    - {% endfor %} -
- {% endif %} - {% endwith %} - {% block content %} - {% endblock %} -
- - -
- Fork me on GitHub - - - diff --git a/flask/notejam/templates/notes/create.html b/flask/notejam/templates/notes/create.html deleted file mode 100644 index 2a83b0914..000000000 --- a/flask/notejam/templates/notes/create.html +++ /dev/null @@ -1,10 +0,0 @@ -{% extends "base.html" %} - -{% block title %}New note{% endblock %} -{% block page_title %}New note{% endblock %} - -{% block content %} - {% include "notes/form.html" %} -{% endblock %} - - diff --git a/flask/notejam/templates/notes/delete.html b/flask/notejam/templates/notes/delete.html deleted file mode 100644 index c52cf550f..000000000 --- a/flask/notejam/templates/notes/delete.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ note.name }}{% endblock %} -{% block page_title %}{{ note.name }}{% endblock %} - -{% block content %} -

Are you sure you want to delete {{ note.name }}?

-
- {{ form.hidden_tag() }} -   - Cancel -
-{% endblock %} diff --git a/flask/notejam/templates/notes/edit.html b/flask/notejam/templates/notes/edit.html deleted file mode 100644 index 292ce8f97..000000000 --- a/flask/notejam/templates/notes/edit.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ form.name.data }}{% endblock %} -{% block page_title %}{{ form.name.data }}{% endblock %} - -{% block content %} - {% include "notes/form.html" %} -{% endblock %} - - - diff --git a/flask/notejam/templates/notes/form.html b/flask/notejam/templates/notes/form.html deleted file mode 100644 index b83c5f9e7..000000000 --- a/flask/notejam/templates/notes/form.html +++ /dev/null @@ -1,10 +0,0 @@ -{% from "_helpers.html" import render_field %} - -
- {{ form.hidden_tag() }} - {{ render_field(form.name) }} - {{ render_field(form.text) }} - {{ render_field(form.pad) }} - -
- diff --git a/flask/notejam/templates/notes/list.html b/flask/notejam/templates/notes/list.html deleted file mode 100644 index fffc9f61f..000000000 --- a/flask/notejam/templates/notes/list.html +++ /dev/null @@ -1,34 +0,0 @@ -{% extends "base.html" %} - -{% block title %}All notes ({{ notes|length }}){% endblock %} -{% block page_title %} All notes ({{ notes|length }}) {% endblock %} - -{% block content %} - {% if notes %} - - - - - - - {% for note in notes %} - - - - - - {% endfor %} -
Note PadLast modified
{{ note.name }} - {% if note.pad %} - {{ note.pad.name }} - {% else %} - No pad - {% endif %} - {{ note.updated_at|smart_date }}
- {% else %} -

Create your first note.

- {% endif %} - New note -{% endblock %} - - diff --git a/flask/notejam/templates/notes/view.html b/flask/notejam/templates/notes/view.html deleted file mode 100644 index f73a5fe81..000000000 --- a/flask/notejam/templates/notes/view.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ note.name }}{% endblock %} -{% block page_title %}{{ note.name }}{% endblock %} - -{% block content %} -

Last edited at {{ note.updated_at|smart_date }}

-
- {{ note.text }} -
- Edit - Delete it -{% endblock %} - diff --git a/flask/notejam/templates/pads/create.html b/flask/notejam/templates/pads/create.html deleted file mode 100644 index e43ed38b1..000000000 --- a/flask/notejam/templates/pads/create.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends "base.html" %} - -{% block title %}New pad{% endblock %} -{% block page_title %}New pad{% endblock %} - -{% block content %} - {% include "pads/form.html" %} -{% endblock %} - - - diff --git a/flask/notejam/templates/pads/delete.html b/flask/notejam/templates/pads/delete.html deleted file mode 100644 index d93d979b7..000000000 --- a/flask/notejam/templates/pads/delete.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ pad.name }}{% endblock %} -{% block page_title %}{{ pad.name }}{% endblock %} - -{% block content %} -

Are you sure you want to delete {{ pad.name }}?

-
- {{ form.hidden_tag() }} -   - Cancel -
-{% endblock %} - - - - diff --git a/flask/notejam/templates/pads/edit.html b/flask/notejam/templates/pads/edit.html deleted file mode 100644 index 56b30dddd..000000000 --- a/flask/notejam/templates/pads/edit.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ pad.name }}{% endblock %} -{% block page_title %}{{ pad.name }}{% endblock %} - -{% block content %} - {% include "pads/form.html" %} - Delete pad -{% endblock %} - - - - diff --git a/flask/notejam/templates/pads/form.html b/flask/notejam/templates/pads/form.html deleted file mode 100644 index d6895e3bc..000000000 --- a/flask/notejam/templates/pads/form.html +++ /dev/null @@ -1,9 +0,0 @@ -{% from "_helpers.html" import render_field %} - -
- {{ form.hidden_tag() }} - {{ render_field(form.name) }} - -
- - diff --git a/flask/notejam/templates/pads/note_list.html b/flask/notejam/templates/pads/note_list.html deleted file mode 100644 index 31bd5fb41..000000000 --- a/flask/notejam/templates/pads/note_list.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ pad.name }} ({{ pad.notes.count() }}){% endblock %} -{% block page_title %}{{ pad.name }} ({{ pad.notes.count() }}){% endblock %} - -{% block content %} - {% if notes %} - - - - - - {% for note in notes %} - - - - - {% endfor %} -
Note - Last modified
{{ note.name }}{{ note.updated_at|smart_date }}
- {% else %} -

Create first note in the pad.

- {% endif %} - New note  - Pad settings -{% endblock %} diff --git a/flask/notejam/templates/user.html b/flask/notejam/templates/user.html deleted file mode 100644 index 8e556e310..000000000 --- a/flask/notejam/templates/user.html +++ /dev/null @@ -1,4 +0,0 @@ -{% extends "base.html" %} - -{% block pads %}{% endblock %} -{% block content_class %}sixteen columns content-area{% endblock %} diff --git a/flask/notejam/templates/users/forgot_password.html b/flask/notejam/templates/users/forgot_password.html deleted file mode 100644 index 0635ad68a..000000000 --- a/flask/notejam/templates/users/forgot_password.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "user.html" %} -{% from "_helpers.html" import render_field %} - -{% block title %}Forgot Password?{% endblock %} -{% block page_title %}Forgot Password?{% endblock %} - -{% block content %} - -{% endblock %} - diff --git a/flask/notejam/templates/users/settings.html b/flask/notejam/templates/users/settings.html deleted file mode 100644 index 0de132d2f..000000000 --- a/flask/notejam/templates/users/settings.html +++ /dev/null @@ -1,16 +0,0 @@ -{% extends "user.html" %} -{% from "_helpers.html" import render_field %} - -{% block title %}Account Settings{% endblock %} -{% block page_title %}Account Settings{% endblock %} - -{% block content %} -
- {{ form.hidden_tag() }} - {{ render_field(form.old_password) }} - {{ render_field(form.new_password) }} - {{ render_field(form.repeat_new_password) }} - -
-{% endblock %} - diff --git a/flask/notejam/templates/users/signin.html b/flask/notejam/templates/users/signin.html deleted file mode 100644 index 58c5e494c..000000000 --- a/flask/notejam/templates/users/signin.html +++ /dev/null @@ -1,16 +0,0 @@ -{% extends "user.html" %} -{% from "_helpers.html" import render_field %} - -{% block title %}Sign In{% endblock %} -{% block page_title %}Sign In{% endblock %} - -{% block content %} - -{% endblock %} diff --git a/flask/notejam/templates/users/signup.html b/flask/notejam/templates/users/signup.html deleted file mode 100644 index 19ae825ac..000000000 --- a/flask/notejam/templates/users/signup.html +++ /dev/null @@ -1,16 +0,0 @@ -{% extends "user.html" %} -{% from "_helpers.html" import render_field %} - -{% block title %}Sign Up{% endblock %} -{% block page_title %}Sign Up{% endblock %} - -{% block content %} - -{% endblock %} - diff --git a/flask/notejam/views.py b/flask/notejam/views.py deleted file mode 100644 index 0064053b8..000000000 --- a/flask/notejam/views.py +++ /dev/null @@ -1,264 +0,0 @@ -from datetime import date -import hashlib - -from flask import render_template, flash, request, redirect, url_for, abort -from flask_login import (login_user, login_required, logout_user, -current_user) -from flask_mail import Message - -from notejam import app, db, login_manager, mail -from notejam.models import User, Note, Pad -from notejam.forms import (SigninForm, SignupForm, NoteForm, PadForm, -DeleteForm, ChangePasswordForm, ForgotPasswordForm) - - -@login_manager.user_loader -def load_user(user_id): - return User.query.get(user_id) - - -@app.route('/') -@login_required -def home(): - notes = (Note.query - .filter_by(user=current_user) - .order_by(_get_order_by(request.args.get('order'))) - .all()) - return render_template('notes/list.html', notes=notes) - - -@app.route('/notes/create/', methods=['GET', 'POST']) -@login_required -def create_note(): - note_form = NoteForm(user=current_user, pad=request.args.get('pad')) - if note_form.validate_on_submit(): - note = Note( - name=note_form.name.data, - text=note_form.text.data, - pad_id=note_form.pad.data, - user=current_user - ) - db.session.add(note) - db.session.commit() - flash('Note is successfully created', 'success') - return redirect(_get_note_success_url(note)) - return render_template('notes/create.html', form=note_form) - - -@app.route('/notes//edit/', methods=['GET', 'POST']) -@login_required -def edit_note(note_id): - note = _get_user_object_or_404(Note, note_id, current_user) - note_form = NoteForm(user=current_user, obj=note) - if note_form.validate_on_submit(): - note.name = note_form.name.data - note.text = note_form.text.data - note.pad_id = note_form.pad.data - - db.session.commit() - flash('Note is successfully updated', 'success') - return redirect(_get_note_success_url(note)) - if note.pad: - note_form.pad.data = note.pad.id # XXX ? - return render_template('notes/edit.html', form=note_form) - - -@app.route('/notes//') -@login_required -def view_note(note_id): - note = _get_user_object_or_404(Note, note_id, current_user) - return render_template('notes/view.html', note=note) - - -@app.route('/notes//delete/', methods=['GET', 'POST']) -@login_required -def delete_note(note_id): - note = _get_user_object_or_404(Note, note_id, current_user) - delete_form = DeleteForm() - if request.method == 'POST': - db.session.delete(note) - db.session.commit() - flash('Note is successfully deleted', 'success') - return redirect(url_for('home')) - return render_template('notes/delete.html', note=note, form=delete_form) - - -@app.route('/pads/create/', methods=['GET', 'POST']) -@login_required -def create_pad(): - pad_form = PadForm() - if pad_form.validate_on_submit(): - pad = Pad( - name=pad_form.name.data, - user=current_user - ) - db.session.add(pad) - db.session.commit() - flash('Pad is successfully created', 'success') - return redirect(url_for('home')) - return render_template('pads/create.html', form=pad_form) - - -@app.route('/pads//edit/', methods=['GET', 'POST']) -@login_required -def edit_pad(pad_id): - pad = _get_user_object_or_404(Pad, pad_id, current_user) - pad_form = PadForm(obj=pad) - if pad_form.validate_on_submit(): - pad.name = pad_form.name.data - db.session.commit() - flash('Pad is successfully updated', 'success') - return redirect(url_for('pad_notes', pad_id=pad.id)) - return render_template('pads/edit.html', form=pad_form, pad=pad) - - -@app.route('/pads//') -@login_required -def pad_notes(pad_id): - pad = _get_user_object_or_404(Pad, pad_id, current_user) - notes = (Note.query - .filter_by(user=current_user, pad=pad) - .order_by(_get_order_by(request.args.get('order'))) - .all()) - return render_template('pads/note_list.html', pad=pad, notes=notes) - - -@app.route('/pads//delete/', methods=['GET', 'POST']) -@login_required -def delete_pad(pad_id): - pad = _get_user_object_or_404(Pad, pad_id, current_user) - delete_form = DeleteForm() - if request.method == 'POST': - db.session.delete(pad) - db.session.commit() - flash('Note is successfully deleted', 'success') - return redirect(url_for('home')) - return render_template('pads/delete.html', pad=pad, form=delete_form) - - -# @TODO use macro for form fields in template -@app.route('/signin/', methods=['GET', 'POST']) -def signin(): - form = SigninForm() - if form.validate_on_submit(): - auth_user = User.authenticate(form.email.data, form.password.data) - if auth_user: - login_user(auth_user) - flash('You are signed in!', 'success') - return redirect(url_for('home')) - else: - flash('Wrong email or password', 'error') - return render_template('users/signin.html', form=form) - - -@app.route('/signout/') -def signout(): - logout_user() - return redirect(url_for('signin')) - - -@app.route('/signup/', methods=['GET', 'POST']) -def signup(): - form = SignupForm() - if form.validate_on_submit(): - user = User(email=form.email.data) - user.set_password(form.password.data) - db.session.add(user) - db.session.commit() - flash('Account is created. Now you can sign in.', 'success') - return redirect(url_for('signin')) - return render_template('users/signup.html', form=form) - - -@app.route('/settings/', methods=['GET', 'POST']) -@login_required -def account_settings(): - form = ChangePasswordForm(user=current_user) - if form.validate_on_submit(): - current_user.set_password(form.new_password.data) - db.session.commit() - flash("Your password is successfully changed.", 'success') - return redirect(url_for('home')) - return render_template('users/settings.html', form=form) - - -@app.route('/forgot-password/', methods=['GET', 'POST']) -def forgot_password(): - form = ForgotPasswordForm() - if form.validate_on_submit(): - user = User.query.filter_by(email=form.email.data).first() - new_password = _generate_password(user) - user.set_password(new_password) - - message = Message( - subject="Notejam password", - body="Your new password is {}".format(new_password), - sender="from@notejamapp.com", - recipients=[user.email] - ) - mail.send(message) - - db.session.commit() - flash("Find new password in your inbox", 'success') - return redirect(url_for('home')) - return render_template('users/forgot_password.html', form=form) - - -# context processors and filters -@app.context_processor -def inject_user_pads(): - ''' inject list of user pads in template context ''' - if not current_user.is_anonymous: - return dict(pads=current_user.pads.all()) - return dict(pads=[]) - - -@app.template_filter('smart_date') -def smart_date_filter(updated_at): - delta = date.today() - updated_at.date() - if delta.days == 0: - return 'Today at {}'.format(updated_at.strftime("%H:%M")) - elif delta.days == 1: - return 'Yesterday at {}'.format(updated_at.strftime("%H:%M")) - elif 1 > delta.days > 4: - return '{} days ago'.format(abs(delta.days)) - else: - return updated_at.date() - - -# helper functions, @TODO move to helpers.py? -def _get_note_success_url(note): - ''' get note success redirect url depends on note's pad ''' - if note.pad is None: - return url_for('home') - else: - return url_for('pad_notes', pad_id=note.pad.id) - - -def _get_user_object_or_404(model, object_id, user, code=404): - ''' get an object by id and owner user or raise an abort ''' - result = model.query.filter_by(id=object_id, user=user).first() - return result or abort(code) - - -def _get_order_by(param='-updated_at'): - ''' get model order param by string description ''' - return { - 'name': Note.name.asc(), - '-name': Note.name.desc(), - 'updated_at': Note.updated_at.asc(), - '-updated_at': Note.updated_at.desc(), - }.get(param, Note.updated_at.desc()) - - -def _generate_password(user): - ''' generate new user password ''' - m = hashlib.md5() - m.update( - "{email}{secret}{date}".format( - email=user.email, - secret=app.secret_key, - date=str(date.today()) - ) - ) - return m.hexdigest()[:8] diff --git a/flask/notejam/wsgi.py b/flask/notejam/wsgi.py deleted file mode 100644 index 83370f350..000000000 --- a/flask/notejam/wsgi.py +++ /dev/null @@ -1,7 +0,0 @@ -from notejam import app as application -from notejam.config import DevelopmentConfig - -application.config.from_object(DevelopmentConfig) - -if __name__ == '__main__': - application.run() diff --git a/flask/requirements.txt b/flask/requirements.txt deleted file mode 100644 index 55908cf95..000000000 --- a/flask/requirements.txt +++ /dev/null @@ -1,15 +0,0 @@ -Flask==1.1.1 -Flask-Login==0.4.1 -Flask-Mail==0.9.1 -Flask-SQLAlchemy==2.4.1 -Flask-Testing==0.6.1 -Flask-WTF==0.14.2 -Jinja2==2.10.3 -SQLAlchemy==1.3.10 -Tempita==0.5.2 -WTForms==2.2.1 -Werkzeug==0.16.0 -blinker==1.4 -decorator==4.4.1 -ipython==5.8.0 -sqlalchemy-migrate==0.13.0 diff --git a/flask/runserver.py b/flask/runserver.py deleted file mode 100755 index 6cb3c5663..000000000 --- a/flask/runserver.py +++ /dev/null @@ -1,7 +0,0 @@ -from notejam import app -from notejam.config import DevelopmentConfig - -app.config.from_object(DevelopmentConfig) - -if __name__ == '__main__': - app.run() diff --git a/flask/tests.py b/flask/tests.py deleted file mode 100644 index b5fcf6aef..000000000 --- a/flask/tests.py +++ /dev/null @@ -1,336 +0,0 @@ -import os -import tempfile -import unittest -import urllib.parse - -from contextlib import contextmanager - -from flask import url_for -from flask_testing import TestCase - -from notejam import app, db -from notejam.config import TestingConfig -from notejam.models import User, Pad, Note - -app.config.from_object(TestingConfig) - - -class NotejamBaseTestCase(TestCase): - def setUp(self): - db.create_all() - - def tearDown(self): - db.session.remove() - db.drop_all() - os.close(self.fd) - os.unlink(self.db) - - def create_app(self): - self.fd, self.db = tempfile.mkstemp() - test_app = app - test_app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///" + self.db - test_app.config['TESTING'] = True - test_app.config['CSRF_ENABLED'] = False - return test_app - - def create_user(self, **kwargs): - user = User(email=kwargs['email']) - user.set_password(kwargs['password']) - db.session.add(user) - db.session.commit() - return user - - def create_pad(self, **kwargs): - pad = Pad(**kwargs) - db.session.add(pad) - db.session.commit() - return pad - - def create_note(self, **kwargs): - note = Note(**kwargs) - db.session.add(note) - db.session.commit() - return note - - -class SignupTestCase(NotejamBaseTestCase): - def _get_user_data(self, **kwargs): - user_data = { - 'email': 'email@example.com', - 'password': 'secure_password', - 'repeat_password': 'secure_password' - } - user_data.update(**kwargs) - return user_data - - def test_signup_success(self): - response = self.client.post( - url_for("signup"), data=self._get_user_data()) - self.assertRedirects(response, url_for('signin')) - self.assertEqual(1, User.query.count()) - - def test_signup_fail_required_fields(self): - self.client.post(url_for("signup"), data={}) - self.assertEqual( - set(self._get_user_data().keys()), - set(self.get_context_variable('form').errors.keys()) - ) - - def test_signup_fail_email_exists(self): - data = self._get_user_data() - self.create_user(**data) - - self.client.post(url_for("signup"), data=self._get_user_data()) - self.assertEqual( - ['email'], list(self.get_context_variable('form').errors.keys())) - - def test_signup_fail_invalid_email(self): - data = self._get_user_data() - data['email'] = 'invalid email' - - self.client.post(url_for("signup"), data=data) - self.assertEqual( - ['email'], list(self.get_context_variable('form').errors.keys())) - - def test_signup_fail_passwords_dont_match(self): - invalid_data = self._get_user_data(password='another pass') - self.client.post(url_for('signup'), data=invalid_data) - self.assertEqual( - ['repeat_password'], - list(self.get_context_variable('form').errors.keys()) - ) - - -class SigninTestCase(NotejamBaseTestCase): - def _get_user_data(self, **kwargs): - user_data = { - 'email': 'email@example.com', - 'password': 'secure_password' - } - user_data.update(**kwargs) - return user_data - - def test_signin_success(self): - data = self._get_user_data() - self.create_user(**data) - - response = self.client.post(url_for('signin'), data=data) - self.assertRedirects(response, url_for('home')) - - def test_signin_fail(self): - response = self.client.post( - url_for('signin'), data=self._get_user_data()) - self.assertIn('Wrong email or password', str(response.data)) - - def test_signin_fail_required_fields(self): - self.client.post(url_for("signin"), data={}) - self.assertEqual( - set(self._get_user_data().keys()), - set(self.get_context_variable('form').errors.keys()) - ) - - def test_signup_fail_invalid_email(self): - data = self._get_user_data() - data['email'] = 'invalid email' - - self.client.post(url_for("signin"), data=data) - self.assertEqual( - ['email'], list(self.get_context_variable('form').errors.keys())) - - -class PadTestCase(NotejamBaseTestCase): - - def test_create_success(self): - user = self.create_user(email='email@example.com', password='password') - with signed_in_user(user) as c: - response = c.post(url_for('create_pad'), data={'name': 'pad'}) - self.assertRedirects(response, '/') - self.assertEqual(1, Pad.query.count()) - - def test_create_fail_required_name(self): - user = self.create_user(email='email@example.com', password='password') - with signed_in_user(user) as c: - c.post(url_for('create_pad'), data={}) - self.assertEqual( - ['name'], list(self.get_context_variable('form').errors.keys())) - - def test_create_fail_anonymous_user(self): - response = self.client.post( - url_for('create_pad'), data={'name': 'pad'}) - self.assertRedirects( - response, - "{signin}?next={redirect_to}".format( - signin=url_for('signin'), redirect_to=urllib.parse.quote( - url_for('create_pad'), '')) - ) - - def test_edit_success(self): - user = self.create_user(email='email@example.com', password='password') - pad = self.create_pad(name='pad', user=user) - with signed_in_user(user) as c: - new_name = 'new pad name' - response = c.post( - url_for('edit_pad', pad_id=pad.id), data={'name': new_name}) - self.assertRedirects(response, url_for('pad_notes', pad_id=pad.id)) - self.assertEqual(new_name, Pad.query.get(pad.id).name) - - def test_edit_fail_required_name(self): - user = self.create_user(email='email@example.com', password='password') - pad = self.create_pad(name='pad', user=user) - with signed_in_user(user) as c: - c.post(url_for('edit_pad', pad_id=pad.id), data={'name': ''}) - self.assertEqual( - ['name'], list(self.get_context_variable('form').errors.keys())) - - def test_edit_fail_anothers_user(self): - user = self.create_user(email='email@example.com', password='password') - pad = self.create_pad(name='pad', user=user) - another_user = self.create_user( - email='another@example.com', password='password') - with signed_in_user(another_user) as c: - new_name = 'new pad name' - response = c.post( - url_for('edit_pad', pad_id=pad.id), data={'name': new_name}) - self.assertEqual(404, response.status_code) - - def test_delete_success(self): - user = self.create_user(email='email@example.com', password='password') - pad = self.create_pad(name='pad', user=user) - with signed_in_user(user) as c: - response = c.post( - url_for('delete_pad', pad_id=pad.id)) - self.assertRedirects(response, url_for('home')) - self.assertEqual(0, Pad.query.count()) - - def test_delete_fail_anothers_user(self): - user = self.create_user(email='email@example.com', password='password') - pad = self.create_pad(name='pad', user=user) - another_user = self.create_user( - email='another@example.com', password='password') - with signed_in_user(another_user) as c: - response = c.post( - url_for('delete_pad', pad_id=pad.id)) - self.assertEqual(404, response.status_code) - - -class NoteTestCase(NotejamBaseTestCase): - def _get_note_data(self, **kwargs): - note_data = { - 'name': 'note', 'pad': 0, 'text': 'text' - } - note_data.update(**kwargs) - return note_data - - def test_create_success(self): - user = self.create_user(email='email@example.com', password='password') - with signed_in_user(user) as c: - response = c.post( - url_for('create_note'), data=self._get_note_data()) - self.assertRedirects(response, '/') - self.assertEqual(1, Note.query.count()) - - def test_create_fail_required_fields(self): - user = self.create_user(email='email@example.com', password='password') - with signed_in_user(user) as c: - c.post(url_for('create_note'), data={}) - self.assertEqual( - set(self._get_note_data().keys()), - set(self.get_context_variable('form').errors.keys()) - ) - - def test_create_fail_anothers_pad(self): - user = self.create_user(email='email@example.com', password='password') - another_user = self.create_user( - email='another@example.com', password='password') - pad = self.create_pad(name='pad', user=another_user) - with signed_in_user(user) as c: - c.post( - url_for('create_note'), data=self._get_note_data(pad=pad.id)) - self.assertEqual( - ['pad'], list(self.get_context_variable('form').errors.keys()) - ) - - def test_create_fail_anonymous_user(self): - response = self.client.post( - url_for('create_note'), data=self._get_note_data()) - self.assertRedirects( - response, - "{signin}?next={redirect_to}".format( - signin=url_for('signin'), redirect_to=urllib.parse.quote( - url_for('create_note'), '')) - ) - - def test_edit_success(self): - user = self.create_user(email='email@example.com', password='password') - note_data = {'name': 'note', 'text': 'text', 'user': user} - note = self.create_note(**note_data) - with signed_in_user(user) as c: - new_name = 'new pad name' - c.post( - url_for('edit_note', note_id=note.id), - data=self._get_note_data(name=new_name) - ) - self.assertEqual(new_name, Note.query.get(note.id).name) - - def test_edit_fail_required_fields(self): - user = self.create_user(email='email@example.com', password='password') - note_data = {'name': 'note', 'text': 'text', 'user': user} - note = self.create_note(**note_data) - with signed_in_user(user) as c: - c.post( - url_for('edit_note', note_id=note.id), - data={'pad': '', 'name': '', 'text': ''} - ) - self.assertEqual( - set(self._get_note_data().keys()), - set(self.get_context_variable('form').errors.keys()) - ) - - def test_edit_fail_anothers_user(self): - user = self.create_user(email='email@example.com', password='password') - note_data = {'name': 'note', 'text': 'text', 'user': user} - note = self.create_note(**note_data) - another_user = self.create_user( - email='another@example.com', password='password') - with signed_in_user(another_user) as c: - response = c.post( - url_for('edit_note', note_id=note.id), data={}) - self.assertEqual(404, response.status_code) - - def test_delete_success(self): - user = self.create_user(email='email@example.com', password='password') - note = self.create_note(name='note', text='text', user=user) - with signed_in_user(user) as c: - response = c.post( - url_for('delete_note', note_id=note.id)) - self.assertRedirects(response, url_for('home')) - self.assertEqual(0, Note.query.count()) - - def test_delete_fail_anothers_user(self): - user = self.create_user(email='email@example.com', password='password') - note = self.create_note(name='note', text='text', user=user) - another_user = self.create_user( - email='another@example.com', password='password') - with signed_in_user(another_user) as c: - response = c.post( - url_for('delete_note', note_id=note.id)) - self.assertEqual(404, response.status_code) - - -@contextmanager -def signed_in_user(user): - ''' - Signed in user context - Usage: - user = get_user() - with signed_in_user(user) as c: - response = c.get(...) - ''' - with app.test_client() as c: - with c.session_transaction() as sess: - sess['user_id'] = user.id - sess['_fresh'] = True - yield c - -if __name__ == '__main__': - unittest.main() diff --git a/html/account-settings.html b/html/account-settings.html deleted file mode 100644 index f4c90b375..000000000 --- a/html/account-settings.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - Notejam: Account Settings - - - - - - - - - - - - - - - -
-
- -
-
-

notejam: Account Settings

-
-
- -
- - -
- Fork me on GitHub - - diff --git a/html/alerts-and-errors.html b/html/alerts-and-errors.html deleted file mode 100644 index ffd621420..000000000 --- a/html/alerts-and-errors.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - Notejam: Alerts and errors - - - - - - - - - - - - - - - -
-
- -
-
-

notejam: Alerts and errors examples

-
-
-
-
Everything is OK
-
Something is wrong
-
- -
- - -
- Fork me on GitHub - - diff --git a/html/create-pad.html b/html/create-pad.html deleted file mode 100644 index 431ea2a9d..000000000 --- a/html/create-pad.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - Notejam: New pad - - - - - - - - - - - - - - - -
-
- -
-
-

notejam: New pad

-
-
- - -
-
-
- - - -
-
- - -
- Fork me on GitHub - - - - - diff --git a/html/create.html b/html/create.html deleted file mode 100644 index 71ed1af73..000000000 --- a/html/create.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - Notejam: New note - - - - - - - - - - - - - - - -
-
- -
-
-

notejam: New note

-
-
- - -
-
-
- - - - - - - -
-
- - -
- Fork me on GitHub - - - - diff --git a/html/css/style.css b/html/css/style.css deleted file mode 100644 index 76326fc39..000000000 --- a/html/css/style.css +++ /dev/null @@ -1,400 +0,0 @@ -/* -* Skeleton V1.0.3 -* Copyright 2011, Dave Gamache -* www.getskeleton.com -* Free to use under the MIT license. -* http://www.opensource.org/licenses/mit-license.php -* 7/17/2011 -*/ - - -/* Documentation Styles -================================================== */ - div.container { - padding-top: 40px; } - - /* Doc nav */ - nav { - width: 160px; } - #logo, .bold-header { - margin-bottom: 30px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - letter-spacing: -1px; - color: #555; - font-weight: bold; } - .bold-header span { - font-weight: normal; - font-size: 23px; - } - .bold-header a.header { - text-decoration: none; - color: inherit; - } - .bold-header span.jam { - font-size: 46px; - line-height: 50px; - } - nav ul { - float: left; } - nav ul li { - display: block; - margin-bottom: 10px; } - nav ul li a, - nav ul li a:visited, - nav ul li a:active { - font-size: 14px; - color: #555; - text-decoration: none; - font-weight: bold; } - nav ul li a:hover, - nav ul li a:focus { - color: #222; } - header h1 { - font-size: 52px; - line-height: 61px; - letter-spacing: -1px; - font-weight: normal; - font-family: "Georgia", "Times New Roman", Helvetica, Arial, sans-serif; } - hr.large { - border: none; - height: 8px; - background: #ebebeb; - margin: 50px 0; } - div.doc-section { - margin: 30px 0; } - - #whatAndWhy .row { - padding: 30px 0 0; } - - #typography blockquote { - margin-top: 20px; } - - .hidden-code a { - font-size: 12px; - color: #999; } - .hidden-code>div { - display: none; } - - - /* Grid */ - #grid .column, - #grid .columns { - background: #ddd; - height: 25px; - line-height: 25px; - margin-bottom: 10px; - text-align: center; - text-transform: uppercase; - color: #555; - font-size: 12px; - font-weight: bold; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; } - #grid .column:hover, - #grid .columns:hover { - background: #bbb; - color: #333; } - #grid .example-grid { overflow: hidden; } - - .post-button-note, - .post-button-note a { - font-size: 11px; - color: #999; } - - #examples .four.columns a { - text-decoration: none; - } - #examples .four.columns a:hover { - text-decoration: underline; - } - - - .resize { - position: fixed; - bottom: 0; - right: 0; - height: 80px; - width: 80px; - background: url(images/resize.png); } - - - img { - max-width: 100%; - height: auto; } - - .gist-meta { display: none !important;} - - ul ul ul li { margin-bottom: 3px; } - - .twitter-share-button { margin-bottom: -18px; } - - /* Table stylesheets */ - table { - width: 100%; - border-collapse: collapse; - } - - table th, table td { - padding: 10px 10px 9px; - font-size: 13px; - line-height: 18px; - text-align: left; - } - - table td { - vertical-align: top; - border-top: solid 1px #ddd; - } - - table th { - padding-top: 9px; - font-weight: bold; - vertical-align: middle; - } - - table.condensed th, table.condensed td { - padding: 5px 5px 4px; - } - - table.bordered { - border-collapse: separate; - border: solid 1px #ddd; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - } - - table.bordered th + th, - table.bordered th + td, - table.bordered td + td { - border-left: solid 1px #ddd; - } - - .zebra-striped tbody tr:nth-child(odd) td, - .zebra-striped tbody tr:nth-child(odd) th { - background: #f5f5f5; - } - -.carbonad, -.carbonad-image, -.carbonad-text, -.carbonad-tag { - background: none !important; - border: none !important; - margin-left: 0 !important; -} -.carbonad-tag { - margin-top: 6px !important; - padding-top: 0 !important; -} -.carbonad-text { - height: auto !important; -} -.carbonad-image { - margin-top: 0 !important; -} - -.hidden-text { - font-size: 12px; - color: #999; -} - -td.date, th.date { - text-align: right; -} - -td.date { - font-style: italic; -} - -form.note input[type="text"], form.note textarea { - width: 100%; -} - -form hr { - width: 218px; - margin: 10px 0px; -} - -form.note textarea { - height: 250px; -} - -div.content-area { - min-height: 600px; -} - -hr.footer { - margin-bottom: 10px; -} - -div.footer { - margin-bottom: 10px; - text-align: center; - font-size: 12px; -} - -form.sign-in { - margin: 50px 0 0 0; -} - -.sort_arrow { - text-decoration: none; -} - -.sort_arrow:hover { - text-decoration: none; - color: red; -} - -div.sign-in-out-block { - position: absolute; - right: 14px; - top: 8px; - font-size: 12px; -} - -div.sign-in-out-block a { - /*text-decoration: none;*/ -} - -a.small-red { - color: red; - font-size: 12px; -} - -table.notes { - margin: 0 0 20px 0; -} - -table.notes th.note { - width: 72%; -} - -table.notes td.pad { - color: grey; -} - -table.notes td.pad a { - color: grey; - text-decoration: underline; - font-style: normal; -} - - -table.notes td.pad a:hover { - color: black; -} - -p.empty { - color: grey; - font-style: italic; -} - -a.delete-note { - float: right; - font-size: 12px; - color: red; -} - -.red, input.red { - color: red !important; -} - -ul.errorlist, ul.errors { - margin: -18px 0 0 0; -} - -ul.errorlist li, ul.errors li { - color: red; -} - -.alert-area { - text-align: center; -} - -.alert { - padding: 5px 8px; - margin: 0 0 12px 0; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border: 1px solid #d6e9c6; -} - -.alert-error { - color: #b94a48; - background-color: #f2dede; - border: 1px solid #eed3d7; -} - -.pagination { - text-align: center; -} - - /* Mobile */ - @media only screen and (max-width: 767px) { - header h1 { font-size: 34px; line-height: 37px; } - nav { position: relative; } - nav ul, - .carbonad { - display: none; - } - #logo { text-align: left; } - #examples .four.columns { - padding-top: 30px; - } - } - - /* Mobile Landscape */ - @media only screen and (min-width: 480px) and (max-width: 767px) { - nav ul { - display: none; - } - } - - /* Non 960 */ - @media only screen and (max-width: 959px) { - #logo { - font-size: 21px; - margin-bottom: 15px; } - nav .button { - padding: 9px 20px 11px; } - } - - /* iPad Portrait/Browser */ - @media only screen and (min-width: 768px) and (max-width: 959px) { - nav { - width: 124px; } - } - - /* Mobile/Browser */ - @media only screen and (max-width: 767px) {} - - /* Mobile Landscape/Browser */ - @media only screen and (min-width: 480px) and (max-width: 767px) {} - - /* Anything smaller than standard 960 */ - @media only screen and (max-width: 959px) {} - - - /* iPad Portrait Only */ - @media only screen and (min-width: 768px) and (max-width: 959px) and (max-device-width: 1000px) {} - - /* Mobile Only */ - @media only screen and (max-width: 767px) and (max-device-width: 1000px) {} - - /* Mobile Landscape Only */ - @media only screen and (min-width: 480px) and (max-width: 767px) and (max-device-width: 1000px) {} - - /* Anything smaller than standard 960 on a device */ - @media only screen and (max-width: 959px) and (max-device-width: 1000px) { - .resize { display: none; } - } - diff --git a/html/delete.html b/html/delete.html deleted file mode 100644 index 44a00fbf8..000000000 --- a/html/delete.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - Notejam - - - - - - - - - - - - - - - -
-
- -
-
-

notejam: My sport

-
-
- - -
-
-

Are you sure you want to delete My sport note?

- Yes, delete I want to delete this note  - Cancel -
- - -
- Fork me on GitHub - - - - - diff --git a/html/edit.html b/html/edit.html deleted file mode 100644 index b24216c88..000000000 --- a/html/edit.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - Notejam: My sport - - - - - - - - - - - - - - - -
-
- -
-
-

notejam: My sport

-
-
- - -
-
-
- - - - - - - -
-
- - -
- Fork me on GitHub - - diff --git a/html/empty-list.html b/html/empty-list.html deleted file mode 100644 index d522c16e4..000000000 --- a/html/empty-list.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - Notejam - - - - - - - - - - - - - - - -
-
- -
-
-

notejam: 0 notes

-
-
- - -
-
-

Create your first note.

- New note -
- - -
- Fork me on GitHub - - - diff --git a/html/forgot-password.html b/html/forgot-password.html deleted file mode 100644 index 95da65c85..000000000 --- a/html/forgot-password.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - Notejam: Forgot password? - - - - - - - - - - - - - - - -
-
- -
-
-

notejam: Forgot password?

-
-
- -
- - -
- Fork me on GitHub - - diff --git a/html/index.html b/html/index.html deleted file mode 100644 index 821b25f47..000000000 --- a/html/index.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - - Notejam - - - - - - - - - - - - - - - -
-
- -
-
-

notejam: All notes (8)

-
-
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Note PadLast modified
My sport activitesNo padToday at 10:51
February reportsPadYesterday
Budget planPad2 days ago
Visit Agenda for all customersPad02 Feb. 2013
GiftsPad29 Jan. 2013
Calendar eventsPad29 Jan. 2013
TV seriesPad01 Dec. 2012
Daily postPad28 Nov. 2012
- New note - -
- - -
- Fork me on GitHub - - diff --git a/html/pad-notes.html b/html/pad-notes.html deleted file mode 100644 index 280cf518b..000000000 --- a/html/pad-notes.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - Notejam: Business (8 notes) - - - - - - - - - - - - - - - -
-
- -
-
-

notejam: Business (8 notes)

-
-
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Note PadLast modified
My sport activitesNo padToday at 10:51
February reportsPadYesterday
Budget planPad2 days ago
Visit Agenda for all customersPad02 Feb. 2013
GiftsPad29 Jan. 2013
Calendar eventsPad29 Jan. 2013
TV seriesPad01 Dec. 2012
Daily postPad28 Nov. 2012
- New note -
- - -
- Fork me on GitHub - - - - diff --git a/html/screenshots/1.png b/html/screenshots/1.png deleted file mode 100644 index b927f5e20a9451037974d3cfff5fec78e3f59026..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62464 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°7*m4xylb`p;eZS6irtArUp~^z+D?~X`g$5r^ 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 diff --git a/html/screenshots/1p.png b/html/screenshots/1p.png deleted file mode 100644 index b200eaf68e7f5df02731b81b7758a683850ee4fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21596 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 NX2xexrAU{Ee*#H^LmvPD diff --git a/html/screenshots/2.png b/html/screenshots/2.png deleted file mode 100644 index 2edb3d87da5c17a225546a95a05098d843172475..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96890 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 Cd!9uA diff --git a/html/screenshots/2p.png b/html/screenshots/2p.png deleted file mode 100644 index 6df1c840f59866144fe328a8ebd34d93ca46dfb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29797 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 diff --git a/html/screenshots/3.png b/html/screenshots/3.png deleted file mode 100644 index d22546010ebe4d763ca47a71a4e8607cd572acb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87165 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 F{{x}p=ZgRU diff --git a/html/screenshots/4.png b/html/screenshots/4.png deleted file mode 100644 index 59f37a6a32f112834e57bc9cea9eaa82b521cf27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100665 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 diff --git a/html/screenshots/5.png b/html/screenshots/5.png deleted file mode 100644 index 9dad30f9376715aebc5e12463666b2db3576258b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71944 zcmZ^~Wmp_x)8{+5hruPdyA#~q-Gc@v!QBRT3+}FiB{+i<2myiw2|BpD6Lb#mp0n5P z`<&emeRcPzuCBYf>i4g@J62O&0SlcJ9RL7eDJjZo0{}>Gmk3m-@NcK?jJ zIb|+MSwuQn96Cfq1WjFh0tBQQSjc4%jA#n>{3IGMIiA0?w3M^7M9u*?S%|T;ltMKI zgvrqS_>y?*TVVRp@B0)SA}|Dv2|!Q7OryH6ybS-ma2Eu>7qyZ-msAIvyr+C$(5``q z2KYt#(`*f=+=AE~0kEWuj**NA=%Ll%V&M6VvOkc`O{Ne0Ng%R#PUH+7FzdV6;7IPN z7f-N*EAGdO-3$f*GcAN&_(riaWfD;UGL&0t??R3IEbHX182u6Y&(N+Fkx`=0HpqzM z{a@0^`e5|4$Bn8qf6h5yTQi~ZmXb-R7&Jd$BqlCF?Hk3_5+1HU$SHB`?cVj}SauDk z#zc8@*+yQvfhcw2*Kfez6vbB7Z@k^hYhIEPEkw^KZMH7n_a&lxPDgSxCJ4aGO!)k> z6rnbh>Ao`_$fo!iR*o99V9tXxcKLdz-si{G9fXN#iK&1yC?q;}husH~ZGlqy2X^

3z!he9{{04aJ-?&dBs*LW}z(qxpa>d@Sc(_J- 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

KDy))wOpb^Cpu=v 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 - - - - - - - - - Notejam: Sign In - - - - - - - - - - - - - - - -

- -
-

notejam: Sign In

-
-
- - - - -
- - -
- Fork me on GitHub - - - - - diff --git a/html/signup.html b/html/signup.html deleted file mode 100644 index 14c3b9e67..000000000 --- a/html/signup.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - Notejam: Sign Up - - - - - - - - - - - - - - - -
-
- -
-
-

notejam: Sign Up

-
-
- -
- - -
- Fork me on GitHub - - diff --git a/html/view.html b/html/view.html deleted file mode 100644 index 4990d806b..000000000 --- a/html/view.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - Notejam: My sport - - - - - - - - - - - - - - - -
-
- -
-
-

notejam: My sport

-
-
- - -
-
-

Last edited at 10:32

-
-

- The typography of Skeleton is designed to create a strong hierarchy with basic styles. The primary font is the classic Helvetica Neue, but the font stack can be easily changed with just a couple adjustments. Regular paragraphs are set at a 14px base with 21px line height. -

-

- The typography of Skeleton is designed to create a strong hierarchy with basic styles. The primary font is the classic Helvetica Neue, but the font stack can be easily changed with just a couple adjustments. Regular paragraphs are set at a 14px base with 21px line height. -

-
- - Delete it -
- - -
- Fork me on GitHub - - - - - diff --git a/index.html b/index.html deleted file mode 100644 index e69de29bb..000000000 diff --git a/laravel/README.rst b/laravel/README.rst deleted file mode 100644 index f547c6009..000000000 --- a/laravel/README.rst +++ /dev/null @@ -1,90 +0,0 @@ -**************** -Notejam: Laravel -**************** - -Notejam application implemented using `Laravel `_ framework. - -Laravel version: 4.1 - - -========================== -Installation and launching -========================== - ------ -Clone ------ - -Clone the repo: - -.. code-block:: bash - - $ git clone git@github.com:komarserjio/notejam.git YOUR_PROJECT_DIR/ - -------- -Install -------- - -Install `composer `_ - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/laravel/notejam/ - $ curl -s https://getcomposer.org/installer | php - -Install dependencies - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/laravel/notejam/ - $ php composer.phar install - -Create database schema - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/laravel/notejam/ - $ touch app/database/notejam.db - $ php artisan migrate - - ------- -Launch ------- - -Start laravel web server: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/laravel/notejam/ - $ php artisan serve - -Go to http://localhost:8000/ in your browser. - ---------- -Run tests ---------- - -Run functional and unit tests: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/laravel/notejam/ - $ php vendor/bin/phpunit - - - -============ -Contribution -============ - -Do you have php/laravel experience? Help the app to follow php and laravel best practices. - -Please send your pull requests in the ``master`` branch. -Always prepend your commits with framework name: - -.. code-block:: bash - - Laravel: Implemented sign in functionality - -Read `contribution guide `_ for details. diff --git a/laravel/notejam/.gitattributes b/laravel/notejam/.gitattributes deleted file mode 100644 index 176a458f9..000000000 --- a/laravel/notejam/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto diff --git a/laravel/notejam/.gitignore b/laravel/notejam/.gitignore deleted file mode 100644 index b5363f020..000000000 --- a/laravel/notejam/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -/bootstrap/compiled.php -/vendor -composer.phar -composer.lock -.env.*.php -.env.php -.DS_Store -Thumbs.db diff --git a/laravel/notejam/app/commands/.gitkeep b/laravel/notejam/app/commands/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/laravel/notejam/app/config/app.php b/laravel/notejam/app/config/app.php deleted file mode 100644 index a63864d83..000000000 --- a/laravel/notejam/app/config/app.php +++ /dev/null @@ -1,193 +0,0 @@ - true, - - /* - |-------------------------------------------------------------------------- - | Application URL - |-------------------------------------------------------------------------- - | - | This URL is used by the console to properly generate URLs when using - | the Artisan command line tool. You should set this to the root of - | your application so that it is used when running Artisan tasks. - | - */ - - 'url' => 'http://localhost', - - /* - |-------------------------------------------------------------------------- - | Application Timezone - |-------------------------------------------------------------------------- - | - | Here you may specify the default timezone for your application, which - | will be used by the PHP date and date-time functions. We have gone - | ahead and set this to a sensible default for you out of the box. - | - */ - - 'timezone' => 'UTC', - - /* - |-------------------------------------------------------------------------- - | Application Locale Configuration - |-------------------------------------------------------------------------- - | - | The application locale determines the default locale that will be used - | by the translation service provider. You are free to set this value - | to any of the locales which will be supported by the application. - | - */ - - 'locale' => 'en', - - /* - |-------------------------------------------------------------------------- - | Application Fallback Locale - |-------------------------------------------------------------------------- - | - | The fallback locale determines the locale to use when the current one - | is not available. You may change the value to correspond to any of - | the language folders that are provided through your application. - | - */ - - 'fallback_locale' => 'en', - - /* - |-------------------------------------------------------------------------- - | Encryption Key - |-------------------------------------------------------------------------- - | - | This key is used by the Illuminate encrypter service and should be set - | to a random, 32 character string, otherwise these encrypted strings - | will not be safe. Please do this before deploying an application! - | - */ - - 'key' => 'J5263afFApteAj79OGkWSpGnBf0h76kF', - - 'crypt' => MCRYPT_RIJNDAEL_256, - - /* - |-------------------------------------------------------------------------- - | Autoloaded Service Providers - |-------------------------------------------------------------------------- - | - | The service providers listed here will be automatically loaded on the - | request to your application. Feel free to add your own services to - | this array to grant expanded functionality to your applications. - | - */ - - 'providers' => array( - - 'Illuminate\Foundation\Providers\ArtisanServiceProvider', - 'Illuminate\Auth\AuthServiceProvider', - 'Illuminate\Cache\CacheServiceProvider', - 'Illuminate\Session\CommandsServiceProvider', - 'Illuminate\Foundation\Providers\ConsoleSupportServiceProvider', - 'Illuminate\Routing\ControllerServiceProvider', - 'Illuminate\Cookie\CookieServiceProvider', - 'Illuminate\Database\DatabaseServiceProvider', - 'Illuminate\Encryption\EncryptionServiceProvider', - 'Illuminate\Filesystem\FilesystemServiceProvider', - 'Illuminate\Hashing\HashServiceProvider', - 'Illuminate\Html\HtmlServiceProvider', - 'Illuminate\Log\LogServiceProvider', - 'Illuminate\Mail\MailServiceProvider', - 'Illuminate\Database\MigrationServiceProvider', - 'Illuminate\Pagination\PaginationServiceProvider', - 'Illuminate\Queue\QueueServiceProvider', - 'Illuminate\Redis\RedisServiceProvider', - 'Illuminate\Remote\RemoteServiceProvider', - 'Illuminate\Auth\Reminders\ReminderServiceProvider', - 'Illuminate\Database\SeedServiceProvider', - 'Illuminate\Session\SessionServiceProvider', - 'Illuminate\Translation\TranslationServiceProvider', - 'Illuminate\Validation\ValidationServiceProvider', - 'Illuminate\View\ViewServiceProvider', - 'Illuminate\Workbench\WorkbenchServiceProvider', - - ), - - /* - |-------------------------------------------------------------------------- - | Service Provider Manifest - |-------------------------------------------------------------------------- - | - | The service provider manifest is used by Laravel to lazy load service - | providers which are not needed for each request, as well to keep a - | list of all of the services. Here, you may set its storage spot. - | - */ - - 'manifest' => storage_path().'/meta', - - /* - |-------------------------------------------------------------------------- - | Class Aliases - |-------------------------------------------------------------------------- - | - | This array of class aliases will be registered when this application - | is started. However, feel free to register as many as you wish as - | the aliases are "lazy" loaded so they don't hinder performance. - | - */ - - 'aliases' => array( - - 'App' => 'Illuminate\Support\Facades\App', - 'Artisan' => 'Illuminate\Support\Facades\Artisan', - 'Auth' => 'Illuminate\Support\Facades\Auth', - 'Blade' => 'Illuminate\Support\Facades\Blade', - 'Cache' => 'Illuminate\Support\Facades\Cache', - 'ClassLoader' => 'Illuminate\Support\ClassLoader', - 'Config' => 'Illuminate\Support\Facades\Config', - 'Controller' => 'Illuminate\Routing\Controller', - 'Cookie' => 'Illuminate\Support\Facades\Cookie', - 'Crypt' => 'Illuminate\Support\Facades\Crypt', - 'DB' => 'Illuminate\Support\Facades\DB', - 'Eloquent' => 'Illuminate\Database\Eloquent\Model', - 'Event' => 'Illuminate\Support\Facades\Event', - 'File' => 'Illuminate\Support\Facades\File', - 'Form' => 'Illuminate\Support\Facades\Form', - 'Hash' => 'Illuminate\Support\Facades\Hash', - 'HTML' => 'Illuminate\Support\Facades\HTML', - 'Input' => 'Illuminate\Support\Facades\Input', - 'Lang' => 'Illuminate\Support\Facades\Lang', - 'Log' => 'Illuminate\Support\Facades\Log', - 'Mail' => 'Illuminate\Support\Facades\Mail', - 'Paginator' => 'Illuminate\Support\Facades\Paginator', - 'Password' => 'Illuminate\Support\Facades\Password', - 'Queue' => 'Illuminate\Support\Facades\Queue', - 'Redirect' => 'Illuminate\Support\Facades\Redirect', - 'Redis' => 'Illuminate\Support\Facades\Redis', - 'Request' => 'Illuminate\Support\Facades\Request', - 'Response' => 'Illuminate\Support\Facades\Response', - 'Route' => 'Illuminate\Support\Facades\Route', - 'Schema' => 'Illuminate\Support\Facades\Schema', - 'Seeder' => 'Illuminate\Database\Seeder', - 'Session' => 'Illuminate\Support\Facades\Session', - 'SSH' => 'Illuminate\Support\Facades\SSH', - 'Str' => 'Illuminate\Support\Str', - 'URL' => 'Illuminate\Support\Facades\URL', - 'Validator' => 'Illuminate\Support\Facades\Validator', - 'View' => 'Illuminate\Support\Facades\View', - - ), - -); diff --git a/laravel/notejam/app/config/auth.php b/laravel/notejam/app/config/auth.php deleted file mode 100644 index eacbbfaed..000000000 --- a/laravel/notejam/app/config/auth.php +++ /dev/null @@ -1,71 +0,0 @@ - 'eloquent', - - /* - |-------------------------------------------------------------------------- - | Authentication Model - |-------------------------------------------------------------------------- - | - | When using the "Eloquent" authentication driver, we need to know which - | Eloquent model should be used to retrieve your users. Of course, it - | is often just the "User" model but you may use whatever you like. - | - */ - - 'model' => 'User', - - /* - |-------------------------------------------------------------------------- - | Authentication Table - |-------------------------------------------------------------------------- - | - | When using the "Database" authentication driver, we need to know which - | table should be used to retrieve your users. We have chosen a basic - | default value but you may easily change it to any table you like. - | - */ - - 'table' => 'users', - - /* - |-------------------------------------------------------------------------- - | Password Reminder Settings - |-------------------------------------------------------------------------- - | - | Here you may set the settings for password reminders, including a view - | that should be used as your password reminder e-mail. You will also - | be able to set the name of the table that holds the reset tokens. - | - | The "expire" time is the number of minutes that the reminder should be - | considered valid. This security feature keeps tokens short-lived so - | they have less time to be guessed. You may change this as needed. - | - */ - - 'reminder' => array( - - 'email' => 'emails.auth.reminder', - - 'table' => 'password_reminders', - - 'expire' => 60, - - ), - -); diff --git a/laravel/notejam/app/config/cache.php b/laravel/notejam/app/config/cache.php deleted file mode 100644 index ce8984239..000000000 --- a/laravel/notejam/app/config/cache.php +++ /dev/null @@ -1,89 +0,0 @@ - 'file', - - /* - |-------------------------------------------------------------------------- - | File Cache Location - |-------------------------------------------------------------------------- - | - | When using the "file" cache driver, we need a location where the cache - | files may be stored. A sensible default has been specified, but you - | are free to change it to any other place on disk that you desire. - | - */ - - 'path' => storage_path().'/cache', - - /* - |-------------------------------------------------------------------------- - | Database Cache Connection - |-------------------------------------------------------------------------- - | - | When using the "database" cache driver you may specify the connection - | that should be used to store the cached items. When this option is - | null the default database connection will be utilized for cache. - | - */ - - 'connection' => null, - - /* - |-------------------------------------------------------------------------- - | Database Cache Table - |-------------------------------------------------------------------------- - | - | When using the "database" cache driver we need to know the table that - | should be used to store the cached items. A default table name has - | been provided but you're free to change it however you deem fit. - | - */ - - 'table' => 'cache', - - /* - |-------------------------------------------------------------------------- - | Memcached Servers - |-------------------------------------------------------------------------- - | - | Now you may specify an array of your Memcached servers that should be - | used when utilizing the Memcached cache driver. All of the servers - | should contain a value for "host", "port", and "weight" options. - | - */ - - 'memcached' => array( - - array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100), - - ), - - /* - |-------------------------------------------------------------------------- - | Cache Key Prefix - |-------------------------------------------------------------------------- - | - | When utilizing a RAM based store such as APC or Memcached, there might - | be other applications utilizing the same cache. So, we'll specify a - | value to get prefixed to all our keys so we can avoid collisions. - | - */ - - 'prefix' => 'laravel', - -); diff --git a/laravel/notejam/app/config/compile.php b/laravel/notejam/app/config/compile.php deleted file mode 100644 index d5e55181b..000000000 --- a/laravel/notejam/app/config/compile.php +++ /dev/null @@ -1,18 +0,0 @@ - PDO::FETCH_CLASS, - - /* - |-------------------------------------------------------------------------- - | Default Database Connection Name - |-------------------------------------------------------------------------- - | - | Here you may specify which of the database connections below you wish - | to use as your default connection for all database work. Of course - | you may use many connections at once using the Database library. - | - */ - - 'default' => 'sqlite', - - /* - |-------------------------------------------------------------------------- - | Database Connections - |-------------------------------------------------------------------------- - | - | Here are each of the database connections setup for your application. - | Of course, examples of configuring each database platform that is - | supported by Laravel is shown below to make development simple. - | - | - | All database work in Laravel is done through the PHP PDO facilities - | so make sure you have the driver for your particular database of - | choice installed on your machine before you begin development. - | - */ - - 'connections' => array( - - 'sqlite' => array( - 'driver' => 'sqlite', - 'database' => __DIR__.'/../database/notejam.db', - 'prefix' => '', - ), - - 'mysql' => array( - 'driver' => 'mysql', - 'host' => 'localhost', - 'database' => 'database', - 'username' => 'root', - 'password' => '', - 'charset' => 'utf8', - 'collation' => 'utf8_unicode_ci', - 'prefix' => '', - ), - - 'pgsql' => array( - 'driver' => 'pgsql', - 'host' => 'localhost', - 'database' => 'database', - 'username' => 'root', - 'password' => '', - 'charset' => 'utf8', - 'prefix' => '', - 'schema' => 'public', - ), - - 'sqlsrv' => array( - 'driver' => 'sqlsrv', - 'host' => 'localhost', - 'database' => 'database', - 'username' => 'root', - 'password' => '', - 'prefix' => '', - ), - - ), - - /* - |-------------------------------------------------------------------------- - | Migration Repository Table - |-------------------------------------------------------------------------- - | - | This table keeps track of all the migrations that have already run for - | your application. Using this information, we can determine which of - | the migrations on disk haven't actually been run in the database. - | - */ - - 'migrations' => 'migrations', - - /* - |-------------------------------------------------------------------------- - | Redis Databases - |-------------------------------------------------------------------------- - | - | Redis is an open source, fast, and advanced key-value store that also - | provides a richer set of commands than a typical key-value systems - | such as APC or Memcached. Laravel makes it easy to dig right in. - | - */ - - 'redis' => array( - - 'cluster' => false, - - 'default' => array( - 'host' => '127.0.0.1', - 'port' => 6379, - 'database' => 0, - ), - - ), - - 'test' => array( - 'driver' => 'sqlite', - 'database' => 'memory:', - 'prefix' => '', - ), - -); diff --git a/laravel/notejam/app/config/local/app.php b/laravel/notejam/app/config/local/app.php deleted file mode 100644 index c56fcb9ce..000000000 --- a/laravel/notejam/app/config/local/app.php +++ /dev/null @@ -1,18 +0,0 @@ - true, - -); diff --git a/laravel/notejam/app/config/mail.php b/laravel/notejam/app/config/mail.php deleted file mode 100644 index 06be66551..000000000 --- a/laravel/notejam/app/config/mail.php +++ /dev/null @@ -1,124 +0,0 @@ - 'smtp', - - /* - |-------------------------------------------------------------------------- - | SMTP Host Address - |-------------------------------------------------------------------------- - | - | Here you may provide the host address of the SMTP server used by your - | applications. A default option is provided that is compatible with - | the Mailgun mail service which will provide reliable deliveries. - | - */ - - 'host' => 'smtp.mailgun.org', - - /* - |-------------------------------------------------------------------------- - | SMTP Host Port - |-------------------------------------------------------------------------- - | - | This is the SMTP port used by your application to delivery e-mails to - | users of your application. Like the host we have set this value to - | stay compatible with the Mailgun e-mail applications by default. - | - */ - - 'port' => 587, - - /* - |-------------------------------------------------------------------------- - | Global "From" Address - |-------------------------------------------------------------------------- - | - | You may wish for all e-mails sent by your application to be sent from - | the same address. Here, you may specify a name and address that is - | used globally for all e-mails that are sent by your application. - | - */ - - 'from' => array('address' => null, 'name' => null), - - /* - |-------------------------------------------------------------------------- - | E-Mail Encryption Protocol - |-------------------------------------------------------------------------- - | - | Here you may specify the encryption protocol that should be used when - | the application send e-mail messages. A sensible default using the - | transport layer security protocol should provide great security. - | - */ - - 'encryption' => 'tls', - - /* - |-------------------------------------------------------------------------- - | SMTP Server Username - |-------------------------------------------------------------------------- - | - | If your SMTP server requires a username for authentication, you should - | set it here. This will get used to authenticate with your server on - | connection. You may also set the "password" value below this one. - | - */ - - 'username' => null, - - /* - |-------------------------------------------------------------------------- - | SMTP Server Password - |-------------------------------------------------------------------------- - | - | Here you may set the password required by your SMTP server to send out - | messages from your application. This will be given to the server on - | connection so that the application will be able to send messages. - | - */ - - 'password' => null, - - /* - |-------------------------------------------------------------------------- - | Sendmail System Path - |-------------------------------------------------------------------------- - | - | When using the "sendmail" driver to send e-mails, we will need to know - | the path to where Sendmail lives on this server. A default path has - | been provided here, which will work well on most of your systems. - | - */ - - 'sendmail' => '/usr/sbin/sendmail -bs', - - /* - |-------------------------------------------------------------------------- - | Mail "Pretend" - |-------------------------------------------------------------------------- - | - | When this option is enabled, e-mail will not actually be sent over the - | web and will instead be written to your application's logs files so - | you may inspect the message. This is great for local development. - | - */ - - 'pretend' => true, - -); diff --git a/laravel/notejam/app/config/packages/.gitkeep b/laravel/notejam/app/config/packages/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/laravel/notejam/app/config/queue.php b/laravel/notejam/app/config/queue.php deleted file mode 100644 index 1fa4467e0..000000000 --- a/laravel/notejam/app/config/queue.php +++ /dev/null @@ -1,85 +0,0 @@ - 'sync', - - /* - |-------------------------------------------------------------------------- - | Queue Connections - |-------------------------------------------------------------------------- - | - | Here you may configure the connection information for each server that - | is used by your application. A default configuration has been added - | for each back-end shipped with Laravel. You are free to add more. - | - */ - - 'connections' => array( - - 'sync' => array( - 'driver' => 'sync', - ), - - 'beanstalkd' => array( - 'driver' => 'beanstalkd', - 'host' => 'localhost', - 'queue' => 'default', - 'ttr' => 60, - ), - - 'sqs' => array( - 'driver' => 'sqs', - 'key' => 'your-public-key', - 'secret' => 'your-secret-key', - 'queue' => 'your-queue-url', - 'region' => 'us-east-1', - ), - - 'iron' => array( - 'driver' => 'iron', - 'host' => 'mq-aws-us-east-1.iron.io', - 'token' => 'your-token', - 'project' => 'your-project-id', - 'queue' => 'your-queue-name', - 'encrypt' => false - ), - - 'redis' => array( - 'driver' => 'redis', - 'queue' => 'default', - ), - - ), - - /* - |-------------------------------------------------------------------------- - | Failed Queue Jobs - |-------------------------------------------------------------------------- - | - | These options configure the behavior of failed queue job logging so you - | can control which database and table are used to store the jobs that - | have failed. You may change them to any database / table you wish. - | - */ - - 'failed' => array( - - 'database' => 'mysql', 'table' => 'failed_jobs', - - ), - -); diff --git a/laravel/notejam/app/config/remote.php b/laravel/notejam/app/config/remote.php deleted file mode 100644 index 2169c434b..000000000 --- a/laravel/notejam/app/config/remote.php +++ /dev/null @@ -1,59 +0,0 @@ - 'production', - - /* - |-------------------------------------------------------------------------- - | Remote Server Connections - |-------------------------------------------------------------------------- - | - | These are the servers that will be accessible via the SSH task runner - | facilities of Laravel. This feature radically simplifies executing - | tasks on your servers, such as deploying out these applications. - | - */ - - 'connections' => array( - - 'production' => array( - 'host' => '', - 'username' => '', - 'password' => '', - 'key' => '', - 'keyphrase' => '', - 'root' => '/var/www', - ), - - ), - - /* - |-------------------------------------------------------------------------- - | Remote Server Groups - |-------------------------------------------------------------------------- - | - | Here you may list connections under a single group name, which allows - | you to easily access all of the servers at once using a short name - | that is extremely easy to remember, such as "web" or "database". - | - */ - - 'groups' => array( - - 'web' => array('production') - - ), - -); diff --git a/laravel/notejam/app/config/session.php b/laravel/notejam/app/config/session.php deleted file mode 100644 index ae343029e..000000000 --- a/laravel/notejam/app/config/session.php +++ /dev/null @@ -1,140 +0,0 @@ - 'file', - - /* - |-------------------------------------------------------------------------- - | Session Lifetime - |-------------------------------------------------------------------------- - | - | Here you may specify the number of minutes that you wish the session - | to be allowed to remain idle before it expires. If you want them - | to immediately expire on the browser closing, set that option. - | - */ - - 'lifetime' => 120, - - 'expire_on_close' => false, - - /* - |-------------------------------------------------------------------------- - | Session File Location - |-------------------------------------------------------------------------- - | - | When using the native session driver, we need a location where session - | files may be stored. A default has been set for you but a different - | location may be specified. This is only needed for file sessions. - | - */ - - 'files' => storage_path().'/sessions', - - /* - |-------------------------------------------------------------------------- - | Session Database Connection - |-------------------------------------------------------------------------- - | - | When using the "database" or "redis" session drivers, you may specify a - | connection that should be used to manage these sessions. This should - | correspond to a connection in your database configuration options. - | - */ - - 'connection' => null, - - /* - |-------------------------------------------------------------------------- - | Session Database Table - |-------------------------------------------------------------------------- - | - | When using the "database" session driver, you may specify the table we - | should use to manage the sessions. Of course, a sensible default is - | provided for you; however, you are free to change this as needed. - | - */ - - 'table' => 'sessions', - - /* - |-------------------------------------------------------------------------- - | Session Sweeping Lottery - |-------------------------------------------------------------------------- - | - | Some session drivers must manually sweep their storage location to get - | rid of old sessions from storage. Here are the chances that it will - | happen on a given request. By default, the odds are 2 out of 100. - | - */ - - 'lottery' => array(2, 100), - - /* - |-------------------------------------------------------------------------- - | Session Cookie Name - |-------------------------------------------------------------------------- - | - | Here you may change the name of the cookie used to identify a session - | instance by ID. The name specified here will get used every time a - | new session cookie is created by the framework for every driver. - | - */ - - 'cookie' => 'laravel_session', - - /* - |-------------------------------------------------------------------------- - | Session Cookie Path - |-------------------------------------------------------------------------- - | - | The session cookie path determines the path for which the cookie will - | be regarded as available. Typically, this will be the root path of - | your application but you are free to change this when necessary. - | - */ - - 'path' => '/', - - /* - |-------------------------------------------------------------------------- - | Session Cookie Domain - |-------------------------------------------------------------------------- - | - | Here you may change the domain of the cookie used to identify a session - | in your application. This will determine which domains the cookie is - | available to in your application. A sensible default has been set. - | - */ - - 'domain' => null, - - /* - |-------------------------------------------------------------------------- - | HTTPS Only Cookies - |-------------------------------------------------------------------------- - | - | By setting this option to true, session cookies will only be sent back - | to the server if the browser has a HTTPS connection. This will keep - | the cookie from being sent to you if it can not be done securely. - | - */ - - 'secure' => false, - -); diff --git a/laravel/notejam/app/config/testing/cache.php b/laravel/notejam/app/config/testing/cache.php deleted file mode 100644 index 66a8a39a8..000000000 --- a/laravel/notejam/app/config/testing/cache.php +++ /dev/null @@ -1,20 +0,0 @@ - 'array', - -); diff --git a/laravel/notejam/app/config/testing/database.php b/laravel/notejam/app/config/testing/database.php deleted file mode 100644 index d5e72f04a..000000000 --- a/laravel/notejam/app/config/testing/database.php +++ /dev/null @@ -1,14 +0,0 @@ - 'sqlite', - - 'connections' => array( - 'sqlite' => array( - 'driver' => 'sqlite', - 'database' => ':memory:', - 'prefix' => '' - ), - ) -); diff --git a/laravel/notejam/app/config/testing/session.php b/laravel/notejam/app/config/testing/session.php deleted file mode 100644 index 0364b63dc..000000000 --- a/laravel/notejam/app/config/testing/session.php +++ /dev/null @@ -1,21 +0,0 @@ - 'array', - -); diff --git a/laravel/notejam/app/config/view.php b/laravel/notejam/app/config/view.php deleted file mode 100644 index 34b8f3873..000000000 --- a/laravel/notejam/app/config/view.php +++ /dev/null @@ -1,31 +0,0 @@ - array(__DIR__.'/../views'), - - /* - |-------------------------------------------------------------------------- - | Pagination View - |-------------------------------------------------------------------------- - | - | This view will be used to render the pagination link output, and can - | be easily customized here to show any view you like. A clean view - | compatible with Twitter's Bootstrap is given to you by default. - | - */ - - 'pagination' => 'pagination::slider-3', - -); diff --git a/laravel/notejam/app/config/workbench.php b/laravel/notejam/app/config/workbench.php deleted file mode 100644 index 87c5e3879..000000000 --- a/laravel/notejam/app/config/workbench.php +++ /dev/null @@ -1,31 +0,0 @@ - '', - - /* - |-------------------------------------------------------------------------- - | Workbench Author E-Mail Address - |-------------------------------------------------------------------------- - | - | Like the option above, your e-mail address is used when generating new - | workbench packages. The e-mail is placed in your composer.json file - | automatically after the package is created by the workbench tool. - | - */ - - 'email' => '', - -); diff --git a/laravel/notejam/app/controllers/.gitkeep b/laravel/notejam/app/controllers/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/laravel/notejam/app/controllers/BaseController.php b/laravel/notejam/app/controllers/BaseController.php deleted file mode 100644 index cd6f5a89f..000000000 --- a/laravel/notejam/app/controllers/BaseController.php +++ /dev/null @@ -1,28 +0,0 @@ -layout)) - { - $this->layout = View::make($this->layout); - } - } - - protected function processOrderParam() - { - $order = array( - 'name' => array('name', 'ASC'), - '-name' => array('name', 'DESC'), - 'updated_at' => array('updated_at', 'ASC'), - '-updated_at' => array('updated_at', 'DESC'), - ); - return $order[Input::get('order', '-updated_at')]; - } -} diff --git a/laravel/notejam/app/controllers/NoteController.php b/laravel/notejam/app/controllers/NoteController.php deleted file mode 100644 index 7c853dcae..000000000 --- a/laravel/notejam/app/controllers/NoteController.php +++ /dev/null @@ -1,114 +0,0 @@ -processOrderParam(); - $notes = Auth::user()->notes()->orderBy( - $orderParams[0], $orderParams[1] - )->get(); - return View::make('note/index', array('notes' => $notes)); - } - - public function create() - { - return View::make('note/create'); - } - - public function store() - { - $validation = $this->validator(); - if ($validation->fails()) - { - return Redirect::route('notes.create')->withErrors($validation); - } - $note = new Note( - array( - 'name' => Input::get('name'), - 'text' => Input::get('text') - ) - ); - $padId = (int)Input::get('pad_id'); - if ($padId) { - $pad = Auth::user()->pads() - ->where('id', $padId)->firstOrFail(); - $note->pad_id = $pad->id; - } - Auth::user()->notes()->save($note); - return Redirect::route('notes.show', array('id' => $note->id)) - ->with('success', 'Note is successfully created.'); - } - - public function edit($id) - { - $note = $this->getNoteOrFail($id); - return View::make('note/edit', array('note' => $note)); - } - - public function update($id) - { - $note = $this->getNoteOrFail($id); - $validation = $this->validator(); - if ($validation->fails()) - { - return Redirect::route('notes.edit')->withErrors($validation); - } - $note->update( - array( - 'name' => Input::get('name'), - 'text' => Input::get('text') - ) - ); - $padId = (int)Input::get('pad_id'); - if ($padId) { - $pad = Auth::user()->pads() - ->where('id', $padId)->firstOrFail(); - $note->pad_id = $pad->id; - } else { - $note->pad_id = null; - } - Auth::user()->notes()->save($note); - - return Redirect::route('notes.show', array('id' => $note->id)) - ->with('success', 'Note is successfully updated.'); - } - - public function delete($id) - { - $note = $this->getNoteOrFail($id); - return View::make('note/delete', array('note' => $note)); - } - - public function destroy($id) - { - $note = $this->getNoteOrFail($id); - $note->delete(); - return Redirect::route('all_notes') - ->with('success', 'Note is deleted.'); - } - - public function show($id) - { - $note = $this->getNoteOrFail($id); - return View::make('note/view', array('note' => $note)); - } - - private function getNoteOrFail($id) - { - return Auth::user()->notes() - ->where('id', '=', $id)->firstOrFail(); - } - - private function validator() - { - return Validator::make( - Input::all(), - array( - 'name' => 'required', - 'text' => 'required', - ) - ); - } -} diff --git a/laravel/notejam/app/controllers/PadController.php b/laravel/notejam/app/controllers/PadController.php deleted file mode 100644 index 81017f24f..000000000 --- a/laravel/notejam/app/controllers/PadController.php +++ /dev/null @@ -1,87 +0,0 @@ -validator(); - if ($validation->fails()) - { - return Redirect::route('pads.create')->withErrors($validation); - } - $pad = new Pad(array('name' => Input::get('name'))); - Auth::user()->pads()->save($pad); - return Redirect::route('pads.show', array('id' => $pad->id)) - ->with('success', 'Pad is created.'); - } - - public function edit($id) - { - $pad = $this->getPadOrFail($id); - return View::make('pad/edit', array('pad' => $pad)); - } - - public function update($id) - { - $pad = $this->getPadOrFail($id); - $validation = $this->validator(); - if ($validation->fails()) - { - return Redirect::route('pads.edit', array('id' => $pad->id)) - ->withErrors($validation); - } - $pad->name = Input::get('name'); - $pad->save(); - return Redirect::route('pads.show', array('id' => $pad->id)) - ->with('success', 'Pad is updated.'); - } - - public function show($id) - { - $pad = $this->getPadOrFail($id); - $orderParams = $this->processOrderParam(); - $notes = $pad->notes()->orderBy( - $orderParams[0], $orderParams[1] - )->get(); - return View::make( - 'pad/view', - array('pad' => $pad, 'notes' => $notes) - ); - } - - public function delete($id) - { - $pad = $this->getPadOrFail($id); - return View::make('pad/delete', array('pad' => $pad)); - } - - public function destroy($id) - { - $pad = $this->getPadOrFail($id); - $pad->delete(); - return Redirect::route('all_notes') - ->with('success', 'Pad is deleted.'); - } - - private function getPadOrFail($id) - { - return Auth::user()->pads() - ->where('id', '=', $id)->firstOrFail(); - } - - private function validator() - { - return Validator::make( - Input::all(), - array( - 'name' => 'required', - ) - ); - } -} - diff --git a/laravel/notejam/app/controllers/UserController.php b/laravel/notejam/app/controllers/UserController.php deleted file mode 100644 index 0d5745c06..000000000 --- a/laravel/notejam/app/controllers/UserController.php +++ /dev/null @@ -1,150 +0,0 @@ - 'required|email|unique:users', - 'password' => 'required|min:6|confirmed', - 'password_confirmation' => 'required|min:6', - ) - ); - if ($validation->fails()) - { - return Redirect::route('signup')->withErrors($validation); - } - $user = User::create( - array( - 'email' => Input::get('email'), - 'password' => Hash::make(Input::get('password')) - ) - ); - return Redirect::route('signin') - ->with('success', 'Account is created. Now you can sign in.'); - } - - public function signin() - { - return View::make('user/signin'); - } - - public function processSignin() - { - $validation = Validator::make( - Input::all(), - array( - 'email' => 'required|email', - 'password' => 'required|min:6', - ) - ); - if ($validation->fails()) - { - return Redirect::route('signin')->withErrors($validation); - } - $authParams = array( - 'email' => Input::get('email'), - 'password' => Input::get('password') - ); - if (Auth::attempt($authParams)) - { - return Redirect::route('all_notes') - ->with('success', 'Signed in now!'); - } - return Redirect::route('signin') - ->with('error', 'Invalid email or password'); - } - - public function settings() - { - return View::make('user/settings'); - } - - public function updateSettings() - { - $user = Auth::user(); - $validation = Validator::make( - Input::all(), - array( - 'old_password' => 'required', - 'password' => 'required|min:6|confirmed', - 'password_confirmation' => 'required|min:6', - ) - ); - if ($validation->fails()) - { - return Redirect::route('settings')->withErrors($validation); - } - $authParams = array( - 'email' => $user->email, - 'password' => Input::get('old_password') - ); - if (Auth::validate($authParams)) - { - $user->password = Hash::make(Input::get('password')); - return Redirect::route('settings') - ->with('success', 'Password is successfully changed'); - } else { - return Redirect::route('settings') - ->with('error', 'Current password is incorrect'); - } - } - - public function forgotPassword() - { - if (Request::isMethod('post')) - { - $validation = Validator::make( - Input::all(), - array( - 'email' => 'required|email|exists:users', - ) - ); - if ($validation->fails()) - { - return Redirect::route('forgot_password') - ->withErrors($validation); - } - $user = User::where( - 'email', '=', Input::get('email') - )->firstOrFail(); - - $password = $this->generatePassword(); - $user->password = Hash::make($password); - $user->save(); - - $this->sendNewPassword($user, $password); - - return Redirect::route('signin') - ->with('success', 'New password sent to you mail.'); - } - return View::make('user/forgot-password'); - } - - private function generatePassword() - { - return substr(md5(time()), 0, 8); - } - - private function sendNewPassword($user, $password) - { - $data = array( - 'email' => $user->email, - 'password' => $password - ); - Mail::send(array('text' => 'emails.password') , $data, - function($message) use ($user) - { - $message->to($user->email)->subject('New password'); - } - ); - } -} - diff --git a/laravel/notejam/app/database/migrations/.gitkeep b/laravel/notejam/app/database/migrations/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/laravel/notejam/app/database/migrations/2014_05_14_215427_create_users_table.php b/laravel/notejam/app/database/migrations/2014_05_14_215427_create_users_table.php deleted file mode 100644 index 88be6b9f9..000000000 --- a/laravel/notejam/app/database/migrations/2014_05_14_215427_create_users_table.php +++ /dev/null @@ -1,34 +0,0 @@ -increments('id'); - $table->string('email'); - $table->string('password', 60); - $table->string('remember_token', 100)->nullable(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('users'); - } -} diff --git a/laravel/notejam/app/database/migrations/2014_05_16_225623_create_pads_table.php b/laravel/notejam/app/database/migrations/2014_05_16_225623_create_pads_table.php deleted file mode 100644 index b3ac08f33..000000000 --- a/laravel/notejam/app/database/migrations/2014_05_16_225623_create_pads_table.php +++ /dev/null @@ -1,34 +0,0 @@ -increments('id'); - $table->string('name', 255); - $table->integer('user_id'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - } - -} diff --git a/laravel/notejam/app/database/migrations/2014_05_18_180146_create_notes_table.php b/laravel/notejam/app/database/migrations/2014_05_18_180146_create_notes_table.php deleted file mode 100644 index 9ae69da2e..000000000 --- a/laravel/notejam/app/database/migrations/2014_05_18_180146_create_notes_table.php +++ /dev/null @@ -1,36 +0,0 @@ -increments('id'); - $table->string('name', 255); - $table->text('text'); - $table->integer('user_id'); - $table->integer('pad_id')->nullable(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - } - -} diff --git a/laravel/notejam/app/database/production.sqlite b/laravel/notejam/app/database/production.sqlite deleted file mode 100644 index e69de29bb..000000000 diff --git a/laravel/notejam/app/database/seeds/.gitkeep b/laravel/notejam/app/database/seeds/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/laravel/notejam/app/database/seeds/DatabaseSeeder.php b/laravel/notejam/app/database/seeds/DatabaseSeeder.php deleted file mode 100644 index 198925207..000000000 --- a/laravel/notejam/app/database/seeds/DatabaseSeeder.php +++ /dev/null @@ -1,17 +0,0 @@ -call('UserTableSeeder'); - } - -} diff --git a/laravel/notejam/app/filters.php b/laravel/notejam/app/filters.php deleted file mode 100644 index 5b81f3e36..000000000 --- a/laravel/notejam/app/filters.php +++ /dev/null @@ -1,80 +0,0 @@ - '« Previous', - - 'next' => 'Next »', - -); diff --git a/laravel/notejam/app/lang/en/reminders.php b/laravel/notejam/app/lang/en/reminders.php deleted file mode 100644 index e42148e9f..000000000 --- a/laravel/notejam/app/lang/en/reminders.php +++ /dev/null @@ -1,24 +0,0 @@ - "Passwords must be at least six characters and match the confirmation.", - - "user" => "We can't find a user with that e-mail address.", - - "token" => "This password reset token is invalid.", - - "sent" => "Password reminder sent!", - -); diff --git a/laravel/notejam/app/lang/en/validation.php b/laravel/notejam/app/lang/en/validation.php deleted file mode 100644 index b03b926c8..000000000 --- a/laravel/notejam/app/lang/en/validation.php +++ /dev/null @@ -1,104 +0,0 @@ - "The :attribute must be accepted.", - "active_url" => "The :attribute is not a valid URL.", - "after" => "The :attribute must be a date after :date.", - "alpha" => "The :attribute may only contain letters.", - "alpha_dash" => "The :attribute may only contain letters, numbers, and dashes.", - "alpha_num" => "The :attribute may only contain letters and numbers.", - "array" => "The :attribute must be an array.", - "before" => "The :attribute must be a date before :date.", - "between" => array( - "numeric" => "The :attribute must be between :min and :max.", - "file" => "The :attribute must be between :min and :max kilobytes.", - "string" => "The :attribute must be between :min and :max characters.", - "array" => "The :attribute must have between :min and :max items.", - ), - "confirmed" => "The :attribute confirmation does not match.", - "date" => "The :attribute is not a valid date.", - "date_format" => "The :attribute does not match the format :format.", - "different" => "The :attribute and :other must be different.", - "digits" => "The :attribute must be :digits digits.", - "digits_between" => "The :attribute must be between :min and :max digits.", - "email" => "The :attribute must be a valid email address.", - "exists" => "The selected :attribute is invalid.", - "image" => "The :attribute must be an image.", - "in" => "The selected :attribute is invalid.", - "integer" => "The :attribute must be an integer.", - "ip" => "The :attribute must be a valid IP address.", - "max" => array( - "numeric" => "The :attribute may not be greater than :max.", - "file" => "The :attribute may not be greater than :max kilobytes.", - "string" => "The :attribute may not be greater than :max characters.", - "array" => "The :attribute may not have more than :max items.", - ), - "mimes" => "The :attribute must be a file of type: :values.", - "min" => array( - "numeric" => "The :attribute must be at least :min.", - "file" => "The :attribute must be at least :min kilobytes.", - "string" => "The :attribute must be at least :min characters.", - "array" => "The :attribute must have at least :min items.", - ), - "not_in" => "The selected :attribute is invalid.", - "numeric" => "The :attribute must be a number.", - "regex" => "The :attribute format is invalid.", - "required" => "The :attribute field is required.", - "required_if" => "The :attribute field is required when :other is :value.", - "required_with" => "The :attribute field is required when :values is present.", - "required_with_all" => "The :attribute field is required when :values is present.", - "required_without" => "The :attribute field is required when :values is not present.", - "required_without_all" => "The :attribute field is required when none of :values are present.", - "same" => "The :attribute and :other must match.", - "size" => array( - "numeric" => "The :attribute must be :size.", - "file" => "The :attribute must be :size kilobytes.", - "string" => "The :attribute must be :size characters.", - "array" => "The :attribute must contain :size items.", - ), - "unique" => "The :attribute has already been taken.", - "url" => "The :attribute format is invalid.", - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute.rule" to name the lines. This makes it quick to - | specify a specific custom language line for a given attribute rule. - | - */ - - 'custom' => array( - 'attribute-name' => array( - 'rule-name' => 'custom-message', - ), - ), - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as E-Mail Address instead - | of "email". This simply helps us make messages a little cleaner. - | - */ - - 'attributes' => array(), - -); diff --git a/laravel/notejam/app/models/Note.php b/laravel/notejam/app/models/Note.php deleted file mode 100644 index 1867ff21c..000000000 --- a/laravel/notejam/app/models/Note.php +++ /dev/null @@ -1,41 +0,0 @@ -belongsTo('User'); - } - - public function pad() - { - return $this->belongsTo('Pad'); - } - - public function smartDate() - { - $day = 86400; - $date = strtotime($this->updated_at); - $diff = floor((time() - $date) / $day); - if ($diff < 1) { - return "Today at " . date("H:i", $date); - } elseif ($diff == 1) { - return "Yesterday at " . date("H:i", $date); - } elseif ($diff > 1 && $diff < 8) { - return "{$diff} days ago"; - } else { - return date("d.m.Y", $date); - } - } -} diff --git a/laravel/notejam/app/models/Pad.php b/laravel/notejam/app/models/Pad.php deleted file mode 100644 index 95c0759be..000000000 --- a/laravel/notejam/app/models/Pad.php +++ /dev/null @@ -1,26 +0,0 @@ -belongsTo('User'); - } - - public function notes() - { - return $this->hasMany('Note'); - } -} - diff --git a/laravel/notejam/app/models/User.php b/laravel/notejam/app/models/User.php deleted file mode 100644 index d780769c7..000000000 --- a/laravel/notejam/app/models/User.php +++ /dev/null @@ -1,85 +0,0 @@ -getKey(); - } - - /** - * Get the password for the user. - * - * @return string - */ - public function getAuthPassword() - { - return $this->password; - } - - /** - * Get the token value for the "remember me" session. - * - * @return string - */ - public function getRememberToken() - { - return $this->remember_token; - } - - /** - * Set the token value for the "remember me" session. - * - * @param string $value - * @return void - */ - public function setRememberToken($value) - { - $this->remember_token = $value; - } - - /** - * Get the column name for the "remember me" token. - * - * @return string - */ - public function getRememberTokenName() - { - return 'remember_token'; - } - - public function pads() - { - return $this->hasMany('Pad'); - } - - public function notes() - { - return $this->hasMany('Note'); - } - -} diff --git a/laravel/notejam/app/routes.php b/laravel/notejam/app/routes.php deleted file mode 100644 index b25c1e562..000000000 --- a/laravel/notejam/app/routes.php +++ /dev/null @@ -1,91 +0,0 @@ - 'auth'), function() -{ - Route::get('/', array( - 'as' => 'all_notes', 'uses' => 'NoteController@index' - ) - ); - - # user related routes (authed) - Route::get('settings', array( - 'as' => 'settings', 'uses' => 'UserController@settings' - ) - ); - Route::post('settings', array( - 'as' => 'settings.update', 'uses' => 'UserController@updateSettings' - ) - ); - Route::get('signout', array('as' => 'signout', function() { - Auth::logout(); - return Redirect::route('signin'); - })); - - # customized pad resource controller - Route::post('pads/{id}/update', array( - 'as' => 'pads.update', 'uses' => 'PadController@update' - ) - ); - Route::get('pads/{id}/delete', array( - 'as' => 'pads.delete', 'uses' => 'PadController@delete' - ) - ); - Route::post('pads/{id}/delete', array( - 'as' => 'pads.destroy', 'uses' => 'PadController@destroy' - ) - ); - Route::resource('pads', 'PadController', - array('except' => array('destroy', 'index', 'update'))); - - # customized note resource controller - Route::post('notes/{id}/update', array( - 'as' => 'notes.update', 'uses' => 'NoteController@update' - ) - ); - Route::get('notes/{id}/delete', array( - 'as' => 'notes.delete', 'uses' => 'NoteController@delete' - ) - ); - Route::post('notes/{id}/delete', array( - 'as' => 'notes.destroy', 'uses' => 'NoteController@destroy' - ) - ); - Route::resource('notes', 'NoteController', - array('except' => array('destroy', 'index', 'update'))); -}); - -# user related routes (anonymous) -Route::get( - 'signup', - array('as' => 'signup', 'uses' => 'UserController@signup') -); -Route::post( - 'signup', - array('as' => 'user.store', 'uses' => 'UserController@store') -); - -Route::get( - 'signin', - array('as' => 'signin', 'uses' => 'UserController@signin') -); -Route::post( - 'signin', - array('as' => 'signin.process', 'uses' => 'UserController@processSignin') -); -Route::match( - array('GET', 'POST'), - 'forgot-password', - array('as' => 'forgot_password', 'uses' => 'UserController@forgotPassword') -); - diff --git a/laravel/notejam/app/start/artisan.php b/laravel/notejam/app/start/artisan.php deleted file mode 100644 index 1df850bc9..000000000 --- a/laravel/notejam/app/start/artisan.php +++ /dev/null @@ -1,13 +0,0 @@ - 'Note', - 'text' => 'Text', - ), - $override - ); - } - - public function testCreateSuccess() - { - $data = $this->getNoteData(); - $user = $this->createUser('exists@example.com'); - $this->be($user); - $crawler = $this->client->request( - 'POST', URL::route('notes.store'), $data - ); - $this->assertRedirectedToRoute( - 'notes.show', - array('id' => $user->notes()->first()->id) - ); - $this->assertEquals(1, $user->notes()->count()); - } - - public function testCreateFailRequiredFields() - { - $this->be($this->createUser('exists@example.com')); - $crawler = $this->client->request( - 'POST', URL::route('notes.store'), array() - ); - $this->assertSessionHasErrors( - array('name', 'text') - ); - } - - public function testCreateFailAnonymousUser() - { - $data = $this->getNoteData(); - $crawler = $this->client->request( - 'POST', URL::route('notes.store'), $data - ); - $this->assertRedirectedToRoute('signin'); - } - - /** - * @expectedException Illuminate\Database\Eloquent\ModelNotFoundException - */ - public function testCreateFailAnothersUserPad() - { - $user2 = $this->createUser('exists@example.com'); - $pad = $user2->pads()->save(new Pad(array('name' => 'pad'))); - - $user = $this->createUser('exists2@example.com'); - $data = $this->getNoteData(array('pad_id' => $pad->id)); - $this->be($user); - $crawler = $this->client->request( - 'POST', URL::route('notes.store'), $data - ); - } - - public function testEditSuccess() - { - $user = $this->createUser('exists@example.com'); - $this->be($user); - $note = $user->notes()->save( - new Note($this->getNoteData()) - ); - $crawler = $this->client->request( - 'POST', - URL::route('notes.update', array('id' => $note->id)), - array('name' => 'new name', 'text' => 'new text') - ); - $this->assertRedirectedToRoute('notes.show', array('id' => $note->id)); - } - - public function testEditFailRequiredFields() - { - $user = $this->createUser('exists@example.com'); - $this->be($user); - $note = $user->notes()->save( - new Note($this->getNoteData()) - ); - $crawler = $this->client->request( - 'POST', - URL::route('notes.update', array('id' => $note->id)), - array() - ); - $this->assertSessionHasErrors( - array('name', 'text') - ); - } - - /** - * @expectedException Illuminate\Database\Eloquent\ModelNotFoundException - */ - public function testEditFailNotAnOwner() - { - $user = $this->createUser('exists@example.com'); - $note = $user->notes()->save( - new Note($this->getNoteData()) - ); - $this->be($this->createUser('exists2@example.com')); - - $crawler = $this->client->request( - 'POST', - URL::route('notes.update', array('id' => $note->id)), - array('name' => 'new name', 'text' => 'new text') - ); - } - - public function testViewSuccess() - { - $user = $this->createUser('exists@example.com'); - $note = $user->notes()->save( - new Note($this->getNoteData()) - ); - $this->be($user); - $crawler = $this->client->request( - 'GET', - URL::route('notes.show', array('id' => $note->id)) - ); - $this->assertTrue($this->client->getResponse()->isOk()); - } - - /** - * @expectedException Illuminate\Database\Eloquent\ModelNotFoundException - */ - public function testViewFailNotAnOwner() - { - $user = $this->createUser('exists@example.com'); - $note = $user->notes()->save( - new Note($this->getNoteData()) - ); - $this->be($this->createUser('exists2@example.com')); - $crawler = $this->client->request( - 'GET', - URL::route('notes.show', array('id' => $note->id)) - ); - } - - public function testDeleteSuccess() - { - $user = $this->createUser('exists@example.com'); - $note = $user->notes()->save( - new Note($this->getNoteData()) - ); - $this->be($user); - $crawler = $this->client->request( - 'POST', - URL::route('notes.destroy', array('id' => $note->id)) - ); - $this->assertRedirectedToRoute('all_notes'); - $this->assertEquals(0, $user->notes()->count()); - } - - /** - * @expectedException Illuminate\Database\Eloquent\ModelNotFoundException - */ - public function testDeleteFailNotAnOwner() - { - $user = $this->createUser('exists@example.com'); - $note = $user->notes()->save( - new Note($this->getNoteData()) - ); - $this->be($this->createUser('exists2@example.com')); - $crawler = $this->client->request( - 'POST', - URL::route('notes.destroy', array('id' => $note->id)) - ); - } -} - - - diff --git a/laravel/notejam/app/tests/PadTest.php b/laravel/notejam/app/tests/PadTest.php deleted file mode 100644 index ecae234bb..000000000 --- a/laravel/notejam/app/tests/PadTest.php +++ /dev/null @@ -1,138 +0,0 @@ - 'Pad', - ), - $override - ); - } - - public function testCreateSuccess() - { - $data = $this->getPadData(); - $user = $this->createUser('exists@example.com'); - $this->be($user); - $crawler = $this->client->request( - 'POST', URL::route('pads.store'), $data - ); - $this->assertRedirectedToRoute( - 'pads.show', - array('id' => $user->pads()->first()->id) - ); - $this->assertEquals(1, $user->pads()->count()); - } - - public function testCreateFailRequiredFields() - { - $this->be($this->createUser('exists@example.com')); - $crawler = $this->client->request( - 'POST', URL::route('pads.store'), array() - ); - $this->assertSessionHasErrors( - array('name') - ); - } - - public function testEditSuccess() - { - $user = $this->createUser('exists@example.com'); - $this->be($user); - $pad = $user->pads()->save(new Pad(array('name' => 'pad'))); - $crawler = $this->client->request( - 'POST', - URL::route('pads.update', array('id' => $pad->id)), - array('name' => 'new name') - ); - $this->assertRedirectedToRoute('pads.show', array('id' => $pad->id)); - } - - public function testEditFailRequiredFields() - { - $user = $this->createUser('exists@example.com'); - $this->be($user); - $pad = $user->pads()->save(new Pad(array('name' => 'pad'))); - $crawler = $this->client->request( - 'POST', - URL::route('pads.update', array('id' => $pad->id)), - array() - ); - $this->assertSessionHasErrors( - array('name') - ); - } - - /** - * @expectedException Illuminate\Database\Eloquent\ModelNotFoundException - */ - public function testEditFailNotAnOwner() - { - $user = $this->createUser('exists@example.com'); - $pad = $user->pads()->save(new Pad(array('name' => 'pad'))); - - $this->be($this->createUser('exists2@example.com')); - $crawler = $this->client->request( - 'POST', - URL::route('pads.update', array('id' => $pad->id)), - array('name' => 'new name') - ); - } - - public function testViewSuccess() - { - $user = $this->createUser('exists@example.com'); - $this->be($user); - $pad = $user->pads()->save(new Pad(array('name' => 'pad'))); - $crawler = $this->client->request( - 'GET', - URL::route('pads.show', array('id' => $pad->id)) - ); - $this->assertTrue($this->client->getResponse()->isOk()); - } - - /** - * @expectedException Illuminate\Database\Eloquent\ModelNotFoundException - */ - public function testViewFailNotAnOwner() - { - $user = $this->createUser('exists@example.com'); - $pad = $user->pads()->save(new Pad(array('name' => 'pad'))); - $this->be($this->createUser('exists2@example.com')); - $crawler = $this->client->request( - 'GET', - URL::route('pads.show', array('id' => $pad->id)) - ); - } - - public function testDeleteSuccess() - { - $user = $this->createUser('exists@example.com'); - $this->be($user); - $pad = $user->pads()->save(new Pad(array('name' => 'pad'))); - $crawler = $this->client->request( - 'POST', - URL::route('pads.destroy', array('id' => $pad->id)) - ); - $this->assertRedirectedToRoute('all_notes'); - $this->assertEquals(0, $user->pads()->count()); - } - - /** - * @expectedException Illuminate\Database\Eloquent\ModelNotFoundException - */ - public function testDeleteFailNotAnOwner() - { - $user = $this->createUser('exists@example.com'); - $pad = $user->pads()->save(new Pad(array('name' => 'pad'))); - $this->be($this->createUser('exists2@example.com')); - $crawler = $this->client->request( - 'POST', - URL::route('pads.destroy', array('id' => $pad->id)) - ); - } -} - - diff --git a/laravel/notejam/app/tests/TestCase.php b/laravel/notejam/app/tests/TestCase.php deleted file mode 100644 index 2c0e90102..000000000 --- a/laravel/notejam/app/tests/TestCase.php +++ /dev/null @@ -1,36 +0,0 @@ -app['router']->enableFilters(); - - Artisan::call('migrate'); - } - - protected function createUser($email, $password = 'password') { - $user = User::create( - array( - 'email' => $email, - 'password' => Hash::make($password) - ) - ); - return $user; - } - -} diff --git a/laravel/notejam/app/tests/UserTest.php b/laravel/notejam/app/tests/UserTest.php deleted file mode 100644 index f95f14d83..000000000 --- a/laravel/notejam/app/tests/UserTest.php +++ /dev/null @@ -1,97 +0,0 @@ - 'user@example.com', - 'password' => 'secure_password' - ), - $override - ); - } - - public function testSignupSuccess() - { - $data = $this->getUserData(); - $data['password_confirmation'] = $data['password']; - $crawler = $this->client->request( - 'POST', URL::route('signup'), $data - ); - $this->assertRedirectedToRoute('signin'); - $this->assertEquals(1, User::all()->count()); - } - - public function testSignupFailRequiredFields() - { - $crawler = $this->client->request( - 'POST', URL::route('signup'), array() - ); - $this->assertSessionHasErrors( - array('email', 'password', 'password_confirmation') - ); - } - - public function testSignupFailInvalidEmail() - { - $data = $this->getUserData(array('email' => 'invalid')); - $crawler = $this->client->request( - 'POST', URL::route('signup'), $data - ); - $this->assertSessionHasErrors('email'); - } - - public function testSignupFailEmailExists() - { - $email = 'exists@example.com'; - $user = $this->createUser($email); - - $data = $this->getUserData(array('email' => $email)); - $crawler = $this->client->request( - 'POST', URL::route('signup'), $data - ); - $this->assertSessionHasErrors('email'); - } - - public function testSignupFailPasswordsNotMatch() - { - $data = $this->getUserData(); - $data['password_confirmation'] = 'another_password'; - $crawler = $this->client->request( - 'POST', URL::route('signup'), $data - ); - $this->assertSessionHasErrors('password'); - } - - public function testSigninSuccess() - { - $data = $this->getUserData(); - $data['password'] = Hash::make($data['password']); - $user = User::create($data); - $crawler = $this->client->request( - 'POST', URL::route('signin'), $this->getUserData() - ); - $this->assertRedirectedToRoute('all_notes'); - } - - public function testSigninFailRequiredFields() - { - $crawler = $this->client->request( - 'POST', URL::route('signin'), array() - ); - $this->assertSessionHasErrors( - array('email', 'password') - ); - } - - public function testSigninFailInvalidCredentials() - { - $crawler = $this->client->request( - 'POST', URL::route('signin'), $this->getUserData() - ); - $this->assertRedirectedToRoute('signin'); - $this->assertSessionHas('error'); - } -} - diff --git a/laravel/notejam/app/views/emails/auth/reminder.blade.php b/laravel/notejam/app/views/emails/auth/reminder.blade.php deleted file mode 100644 index d92f2b3f5..000000000 --- a/laravel/notejam/app/views/emails/auth/reminder.blade.php +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - -

Password Reset

- -
- To reset your password, complete this form: {{ URL::to('password/reset', array($token)) }}. -
- - diff --git a/laravel/notejam/app/views/emails/password.blade.php b/laravel/notejam/app/views/emails/password.blade.php deleted file mode 100644 index d2f8e7ceb..000000000 --- a/laravel/notejam/app/views/emails/password.blade.php +++ /dev/null @@ -1,4 +0,0 @@ -Hi, {{ $email }} -========================================= -  -Your new password is {{ $password }} diff --git a/laravel/notejam/app/views/layout.blade.php b/laravel/notejam/app/views/layout.blade.php deleted file mode 100644 index aeb5c7aa9..000000000 --- a/laravel/notejam/app/views/layout.blade.php +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - @yield('page_title') - - - - - - - - {{ HTML::style('http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/base.min.css') }} - {{ HTML::style('http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/skeleton.min.css') }} - {{ HTML::style('http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/layout.css') }} - {{ HTML::style('css/style.css') }} - - - - -
-
- -
-
-

- notejam: - @yield('page_title') -

-
- @yield('pads') -
- @if(Session::has('success') || Session::has('error')) -
- @if(Session::has('success')) -
{{ Session::get('success') }}
- {{ Session::forget('success') }} - @endif - @if(Session::has('error')) -
{{ Session::get('error') }}
- {{ Session::forget('error') }} - @endif -
- @endif - @yield('content') -
- - -
- Fork me on GitHub - - diff --git a/laravel/notejam/app/views/note/create.blade.php b/laravel/notejam/app/views/note/create.blade.php deleted file mode 100644 index 6b801ba8f..000000000 --- a/laravel/notejam/app/views/note/create.blade.php +++ /dev/null @@ -1,24 +0,0 @@ -@extends('user') - -@section('page_title') -New note -@stop - -@section('content') - {{ Form::open(array("route" => "notes.store", "class" => "note")) }} - - {{ Form::label('name', 'Name') . Form::text('name', Input::old('name'), array('class' => 'thirteen')) }} - @include('partials.error', array('error' => $errors->first('name'))) - - {{ Form::label('text', 'Text') . Form::textarea('text', Input::old('text'), array('class' => 'thirteen')) }} - @include('partials.error', array('error' => $errors->first('text'))) - - {{ Form::label('pad_id', 'Pad') . Form::select('pad_id', array(0 => '-----------') + Auth::user()->pads()->lists('name', 'id'), Input::old('pad_id')) }} - - {{ Form::submit('Create') }} - - {{ Form::close() }} - -@stop - - diff --git a/laravel/notejam/app/views/note/delete.blade.php b/laravel/notejam/app/views/note/delete.blade.php deleted file mode 100644 index 9b226b376..000000000 --- a/laravel/notejam/app/views/note/delete.blade.php +++ /dev/null @@ -1,16 +0,0 @@ -@extends('user') - -@section('page_title') -{{ $note->name }} -@stop - -@section('content') - {{ Form::open() }} -

Are you sure you want to delete {{ $note->name }}?

- {{ Form::submit('Yes, I want to delete this note', array('class' => 'button red')) }} - Cancel - - {{ Form::close() }} -@stop - - diff --git a/laravel/notejam/app/views/note/edit.blade.php b/laravel/notejam/app/views/note/edit.blade.php deleted file mode 100644 index d95e76c86..000000000 --- a/laravel/notejam/app/views/note/edit.blade.php +++ /dev/null @@ -1,26 +0,0 @@ -@extends('user') - -@section('page_title') -{{ $note->name }} -@stop - -@section('content') - {{ Form::open(array("route" => array("notes.update", $note->id), "class" => "note")) }} - - {{ Form::label('name', 'Name') . Form::text('name', $note->name, array('class' => 'thirteen')) }} - @include('partials.error', array('error' => $errors->first('name'))) - - {{ Form::label('text', 'Text') . Form::textarea('text', $note->text, array('class' => 'thirteen')) }} - @include('partials.error', array('error' => $errors->first('text'))) - - {{ Form::label('pad_id', 'Pad') . Form::select('pad_id', array(0 => '-----------') + Auth::user()->pads()->lists('name', 'id'), $note->pad_id) }} - - {{ Form::submit('Save') }} - - {{ Form::close() }} - -@stop - - - - diff --git a/laravel/notejam/app/views/note/index.blade.php b/laravel/notejam/app/views/note/index.blade.php deleted file mode 100644 index 367a52a6b..000000000 --- a/laravel/notejam/app/views/note/index.blade.php +++ /dev/null @@ -1,33 +0,0 @@ -@extends('user') - -@section('page_title') -All notes ({{ $notes->count() }}) -@stop - -@section('content') - @if ($notes->count()) - - - - - - - @foreach ($notes as $note) - - - - - - @endforeach -
Note PadLast modified
{{ $note->name }} - @if ($note->pad) - {{ $note->pad->name }} - @else - No pad - @endif - {{ $note->smartDate(); }}
- @else -

Create your first note.

- @endif - New note -@stop diff --git a/laravel/notejam/app/views/note/view.blade.php b/laravel/notejam/app/views/note/view.blade.php deleted file mode 100644 index 19a552c3d..000000000 --- a/laravel/notejam/app/views/note/view.blade.php +++ /dev/null @@ -1,21 +0,0 @@ -@extends('user') - -@section('page_title') -{{ $note->name }} -@stop - -@section('content') -

Last edited at {{ $note->smartDate() }}

-
-

- {{ $note->text }} -

-
- Edit - Delete it -@stop - - - - - diff --git a/laravel/notejam/app/views/pad/create.blade.php b/laravel/notejam/app/views/pad/create.blade.php deleted file mode 100644 index 8b4b4a84d..000000000 --- a/laravel/notejam/app/views/pad/create.blade.php +++ /dev/null @@ -1,18 +0,0 @@ -@extends('user') - -@section('page_title') -New pad -@stop - -@section('content') - {{ Form::open(array('route' => 'pads.store')) }} - - {{ Form::label('name', 'Name') . Form::text('name', Input::old('name')) }} - @include('partials.error', array('error' => $errors->first('name'))) - - {{ Form::submit('Save') }} - - {{ Form::close() }} - -@stop - diff --git a/laravel/notejam/app/views/pad/delete.blade.php b/laravel/notejam/app/views/pad/delete.blade.php deleted file mode 100644 index 21b38099f..000000000 --- a/laravel/notejam/app/views/pad/delete.blade.php +++ /dev/null @@ -1,15 +0,0 @@ -@extends('user') - -@section('page_title') -Delete pad {{ $pad->name }} -@stop - -@section('content') - {{ Form::open(array('route' => array('pads.destroy', $pad->id))) }} -

Are you sure you want to delete {{ $pad->name }}?

- {{ Form::submit('Yes, I want to delete this pad', array('class' => 'button red')) }} - Cancel - - {{ Form::close() }} -@stop - diff --git a/laravel/notejam/app/views/pad/edit.blade.php b/laravel/notejam/app/views/pad/edit.blade.php deleted file mode 100644 index ac46abe20..000000000 --- a/laravel/notejam/app/views/pad/edit.blade.php +++ /dev/null @@ -1,17 +0,0 @@ -@extends('user') - -@section('page_title') -{{ $pad->name }} -@stop - -@section('content') - {{ Form::open(array('route' => array('pads.update', $pad->id))) }} - - {{ Form::label('name', 'Name') . Form::text('name', $pad->name) }} - @include('partials.error', array('error' => $errors->first('name'))) - - {{ Form::submit('Save') }} - {{ Form::close() }} - Delete pad - -@stop diff --git a/laravel/notejam/app/views/pad/view.blade.php b/laravel/notejam/app/views/pad/view.blade.php deleted file mode 100644 index 6fd1935e7..000000000 --- a/laravel/notejam/app/views/pad/view.blade.php +++ /dev/null @@ -1,26 +0,0 @@ -@extends('user') - -@section('page_title') -{{ $pad->name; }} ({{ $notes->count() }}) -@stop - -@section('content') - @if ($notes->count()) - - - - - - @foreach ($notes as $note) - - - - - @endforeach -
Note Last modified
{{ $note->name }}{{ $note->smartDate(); }}
- @else -

You don't have notes in this pad yet.

- @endif - New note  - Pad settings -@stop diff --git a/laravel/notejam/app/views/partials/error.blade.php b/laravel/notejam/app/views/partials/error.blade.php deleted file mode 100644 index cf7c470da..000000000 --- a/laravel/notejam/app/views/partials/error.blade.php +++ /dev/null @@ -1,5 +0,0 @@ -@if($error) -
    -
  • {{ $error }}
  • -
-@endif diff --git a/laravel/notejam/app/views/user.blade.php b/laravel/notejam/app/views/user.blade.php deleted file mode 100644 index 6cb1edf74..000000000 --- a/laravel/notejam/app/views/user.blade.php +++ /dev/null @@ -1,24 +0,0 @@ -@extends('layout') - -@section('content_class') -thirteen -@stop - -@section('pads') -
- - -
-@stop diff --git a/laravel/notejam/app/views/user/forgot-password.blade.php b/laravel/notejam/app/views/user/forgot-password.blade.php deleted file mode 100644 index 7ddd40535..000000000 --- a/laravel/notejam/app/views/user/forgot-password.blade.php +++ /dev/null @@ -1,18 +0,0 @@ -@extends('layout') - -@section('page_title') -Forgot Password? -@stop - -@section('content') - {{ Form::open(array('class' => 'offset-by-six')) }} - - {{ Form::label('email', 'E-mail') . Form::text('email', Input::old('email')) }} - @include('partials.error', array('error' => $errors->first('email'))) - - {{ Form::submit('Send') }} - - {{ Form::close() }} -@stop - - diff --git a/laravel/notejam/app/views/user/settings.blade.php b/laravel/notejam/app/views/user/settings.blade.php deleted file mode 100644 index 64ece1836..000000000 --- a/laravel/notejam/app/views/user/settings.blade.php +++ /dev/null @@ -1,22 +0,0 @@ -@extends('layout') - -@section('page_title') -Account Settings -@stop - -@section('content') - {{ Form::open(array('class' => 'offset-by-six')) }} - - {{ Form::label('old_password', 'Current password') . Form::password('old_password') }} - @include('partials.error', array('error' => $errors->first('old_password'))) - {{ Form::label('password', 'Password') . Form::password('password') }} - @include('partials.error', array('error' => $errors->first('password'))) - {{ Form::label('password_confirmation', 'Confirm password') . Form::password('password_confirmation') }} - @include('partials.error', array('error' => $errors->first('password_confirmation'))) - - {{ Form::submit('Save') }} - - {{ Form::close() }} - -@stop - diff --git a/laravel/notejam/app/views/user/signin.blade.php b/laravel/notejam/app/views/user/signin.blade.php deleted file mode 100644 index c118efe83..000000000 --- a/laravel/notejam/app/views/user/signin.blade.php +++ /dev/null @@ -1,21 +0,0 @@ -@extends('layout') - -@section('page_title') -Sign In -@stop - -@section('content') - {{ Form::open(array('class' => 'offset-by-six')) }} - - {{ Form::label('email', 'E-mail') . Form::text('email', Input::old('email')) }} - @include('partials.error', array('error' => $errors->first('email'))) - {{ Form::label('password', 'Password') . Form::password('password') }} - @include('partials.error', array('error' => $errors->first('password'))) - - {{ Form::submit('Sign in') }} or Sign up -
-

Forgot Password?

- - {{ Form::close() }} -@stop - diff --git a/laravel/notejam/app/views/user/signup.blade.php b/laravel/notejam/app/views/user/signup.blade.php deleted file mode 100644 index 136c29755..000000000 --- a/laravel/notejam/app/views/user/signup.blade.php +++ /dev/null @@ -1,21 +0,0 @@ -@extends('layout') - -@section('page_title') -Sign Up -@stop - -@section('content') - {{ Form::open(array('class' => 'offset-by-six')) }} - - {{ Form::label('email', 'E-mail') . Form::text('email', Input::old('email')) }} - @include('partials.error', array('error' => $errors->first('email'))) - {{ Form::label('password', 'Password') . Form::password('password') }} - @include('partials.error', array('error' => $errors->first('password'))) - {{ Form::label('password_confirmation', 'Confirm password') . Form::password('password_confirmation') }} - @include('partials.error', array('error' => $errors->first('password_confirmation'))) - - {{ Form::submit('Sign Up') }} or Sign in - - {{ Form::close() }} - -@stop diff --git a/laravel/notejam/artisan b/laravel/notejam/artisan deleted file mode 100755 index 5c408ad80..000000000 --- a/laravel/notejam/artisan +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env php -setRequestForConsoleEnvironment(); - -$artisan = Illuminate\Console\Application::start($app); - -/* -|-------------------------------------------------------------------------- -| Run The Artisan Application -|-------------------------------------------------------------------------- -| -| When we run the console application, the current CLI command will be -| executed in this console and the response sent back to a terminal -| or another output device for the developers. Here goes nothing! -| -*/ - -$status = $artisan->run(); - -/* -|-------------------------------------------------------------------------- -| Shutdown The Application -|-------------------------------------------------------------------------- -| -| Once Artisan has finished running. We will fire off the shutdown events -| so that any final work may be done by the application before we shut -| down the process. This is the last thing to happen to the request. -| -*/ - -$app->shutdown(); - -exit($status); diff --git a/laravel/notejam/bootstrap/autoload.php b/laravel/notejam/bootstrap/autoload.php deleted file mode 100644 index 6b329312a..000000000 --- a/laravel/notejam/bootstrap/autoload.php +++ /dev/null @@ -1,75 +0,0 @@ - __DIR__.'/../app', - - /* - |-------------------------------------------------------------------------- - | Public Path - |-------------------------------------------------------------------------- - | - | The public path contains the assets for your web application, such as - | your JavaScript and CSS files, and also contains the primary entry - | point for web requests into these applications from the outside. - | - */ - - 'public' => __DIR__.'/../public', - - /* - |-------------------------------------------------------------------------- - | Base Path - |-------------------------------------------------------------------------- - | - | The base path is the root of the Laravel installation. Most likely you - | will not need to change this value. But, if for some wild reason it - | is necessary you will do so here, just proceed with some caution. - | - */ - - 'base' => __DIR__.'/..', - - /* - |-------------------------------------------------------------------------- - | Storage Path - |-------------------------------------------------------------------------- - | - | The storage path is used by Laravel to store cached Blade views, logs - | and other pieces of information. You may modify the path here when - | you want to change the location of this directory for your apps. - | - */ - - 'storage' => __DIR__.'/../app/storage', - -); diff --git a/laravel/notejam/bootstrap/start.php b/laravel/notejam/bootstrap/start.php deleted file mode 100644 index a55def12d..000000000 --- a/laravel/notejam/bootstrap/start.php +++ /dev/null @@ -1,73 +0,0 @@ -detectEnvironment(array( - - 'local' => array('your-machine-name'), - -)); - -/* -|-------------------------------------------------------------------------- -| Bind Paths -|-------------------------------------------------------------------------- -| -| Here we are binding the paths configured in paths.php to the app. You -| should not be changing these here. If you need to change these you -| may do so within the paths.php file and they will be bound here. -| -*/ - -$app->bindInstallPaths(require __DIR__.'/paths.php'); - -/* -|-------------------------------------------------------------------------- -| Load The Application -|-------------------------------------------------------------------------- -| -| Here we will load this Illuminate application. We will keep this in a -| separate location so we can isolate the creation of an application -| from the actual running of the application with a given request. -| -*/ - -$framework = $app['path.base']. - '/vendor/laravel/framework/src'; - -require $framework.'/Illuminate/Foundation/start.php'; - -/* -|-------------------------------------------------------------------------- -| Return The Application -|-------------------------------------------------------------------------- -| -| This script returns the application instance. The instance is given to -| the calling script so we can separate the building of the instances -| from the actual running of the application and sending responses. -| -*/ - -return $app; diff --git a/laravel/notejam/composer.json b/laravel/notejam/composer.json deleted file mode 100644 index 6ccce0385..000000000 --- a/laravel/notejam/composer.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "laravel/laravel", - "description": "The Laravel Framework.", - "keywords": ["framework", "laravel"], - "license": "MIT", - "require": { - "laravel/framework": "4.2.*" - }, - "require-dev": { - "phpunit/phpunit": "3.7.*" - }, - "autoload": { - "classmap": [ - "app/commands", - "app/controllers", - "app/models", - "app/database/migrations", - "app/database/seeds", - "app/tests/TestCase.php" - ] - }, - "scripts": { - "post-install-cmd": [ - "php artisan clear-compiled", - "php artisan optimize" - ], - "post-update-cmd": [ - "php artisan clear-compiled", - "php artisan optimize" - ], - "post-create-project-cmd": [ - "php artisan key:generate" - ] - }, - "config": { - "preferred-install": "dist" - }, - "minimum-stability": "stable" -} diff --git a/laravel/notejam/phpunit.xml b/laravel/notejam/phpunit.xml deleted file mode 100644 index c33042056..000000000 --- a/laravel/notejam/phpunit.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - ./app/tests/ - - - diff --git a/laravel/notejam/public/.htaccess b/laravel/notejam/public/.htaccess deleted file mode 100644 index 77827ae70..000000000 --- a/laravel/notejam/public/.htaccess +++ /dev/null @@ -1,15 +0,0 @@ - - - Options -MultiViews - - - RewriteEngine On - - # Redirect Trailing Slashes... - RewriteRule ^(.*)/$ /$1 [L,R=301] - - # Handle Front Controller... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^ index.php [L] - diff --git a/laravel/notejam/public/css/style.css b/laravel/notejam/public/css/style.css deleted file mode 100644 index 86cd131ff..000000000 --- a/laravel/notejam/public/css/style.css +++ /dev/null @@ -1,395 +0,0 @@ -/* -* Skeleton V1.0.3 -* Copyright 2011, Dave Gamache -* www.getskeleton.com -* Free to use under the MIT license. -* http://www.opensource.org/licenses/mit-license.php -* 7/17/2011 -*/ - - -/* Documentation Styles -================================================== */ - div.container { - padding-top: 40px; } - - /* Doc nav */ - nav { - width: 160px; } - #logo, .bold-header { - margin-bottom: 30px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - letter-spacing: -1px; - color: #555; - font-weight: bold; } - .bold-header span { - font-weight: normal; - font-size: 23px; - } - .bold-header a.header { - text-decoration: none; - color: inherit; - } - .bold-header span.jam { - font-size: 46px; - line-height: 50px; - } - nav ul { - float: left; } - nav ul li { - display: block; - margin-bottom: 10px; } - nav ul li a, - nav ul li a:visited, - nav ul li a:active { - font-size: 14px; - color: #555; - text-decoration: none; - font-weight: bold; } - nav ul li a:hover, - nav ul li a:focus { - color: #222; } - header h1 { - font-size: 52px; - line-height: 61px; - letter-spacing: -1px; - font-weight: normal; - font-family: "Georgia", "Times New Roman", Helvetica, Arial, sans-serif; } - hr.large { - border: none; - height: 8px; - background: #ebebeb; - margin: 50px 0; } - div.doc-section { - margin: 30px 0; } - - #whatAndWhy .row { - padding: 30px 0 0; } - - #typography blockquote { - margin-top: 20px; } - - .hidden-code a { - font-size: 12px; - color: #999; } - .hidden-code>div { - display: none; } - - - /* Grid */ - #grid .column, - #grid .columns { - background: #ddd; - height: 25px; - line-height: 25px; - margin-bottom: 10px; - text-align: center; - text-transform: uppercase; - color: #555; - font-size: 12px; - font-weight: bold; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; } - #grid .column:hover, - #grid .columns:hover { - background: #bbb; - color: #333; } - #grid .example-grid { overflow: hidden; } - - .post-button-note, - .post-button-note a { - font-size: 11px; - color: #999; } - - #examples .four.columns a { - text-decoration: none; - } - #examples .four.columns a:hover { - text-decoration: underline; - } - - - .resize { - position: fixed; - bottom: 0; - right: 0; - height: 80px; - width: 80px; - background: url(images/resize.png); } - - - img { - max-width: 100%; - height: auto; } - - .gist-meta { display: none !important;} - - ul ul ul li { margin-bottom: 3px; } - - .twitter-share-button { margin-bottom: -18px; } - - /* Table stylesheets */ - table { - width: 100%; - border-collapse: collapse; - } - - table th, table td { - padding: 10px 10px 9px; - font-size: 13px; - line-height: 18px; - text-align: left; - } - - table td { - vertical-align: top; - border-top: solid 1px #ddd; - } - - table th { - padding-top: 9px; - font-weight: bold; - vertical-align: middle; - } - - table.condensed th, table.condensed td { - padding: 5px 5px 4px; - } - - table.bordered { - border-collapse: separate; - border: solid 1px #ddd; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - } - - table.bordered th + th, - table.bordered th + td, - table.bordered td + td { - border-left: solid 1px #ddd; - } - - .zebra-striped tbody tr:nth-child(odd) td, - .zebra-striped tbody tr:nth-child(odd) th { - background: #f5f5f5; - } - -.carbonad, -.carbonad-image, -.carbonad-text, -.carbonad-tag { - background: none !important; - border: none !important; - margin-left: 0 !important; -} -.carbonad-tag { - margin-top: 6px !important; - padding-top: 0 !important; -} -.carbonad-text { - height: auto !important; -} -.carbonad-image { - margin-top: 0 !important; -} - -.hidden-text { - font-size: 12px; - color: #999; -} - -td.date, th.date { - text-align: right; -} - -td.date { - font-style: italic; -} - -form.note input[type="text"], form.note textarea { - width: 100%; -} - -form hr { - width: 218px; - margin: 10px 0px; -} - -form.note textarea { - height: 250px; -} - -div.content-area { - min-height: 600px; -} - -hr.footer { - margin-bottom: 10px; -} - -div.footer { - margin-bottom: 10px; - text-align: center; - font-size: 12px; -} - -form.sign-in { - margin: 50px 0 0 0; -} - -.sort_arrow { - text-decoration: none; -} - -.sort_arrow:hover { - text-decoration: none; - color: red; -} - -div.sign-in-out-block { - position: absolute; - right: 14px; - top: 8px; - font-size: 12px; -} - -div.sign-in-out-block a { - /*text-decoration: none;*/ -} - -a.small-red { - color: red; - font-size: 12px; -} - -table.notes { - margin: 0 0 20px 0; -} - -table.notes th.note { - width: 72%; -} - -table.notes td.pad { - color: grey; -} - -table.notes td.pad a { - color: grey; - text-decoration: underline; - font-style: normal; -} - - -table.notes td.pad a:hover { - color: black; -} - -p.empty { - color: grey; - font-style: italic; -} - -a.delete-note { - float: right; - font-size: 12px; - color: red; -} - -.red, input.red { - color: red !important; -} - -ul.errorlist, ul.errors { - margin: -18px 0 0 0; -} - -ul.errorlist li, ul.errors li { - color: red; -} - -.alert-area { - text-align: center; -} - -.alert { - padding: 5px 8px; - margin: 0 0 12px 0; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border: 1px solid #d6e9c6; -} - -.alert-error { - color: #b94a48; - background-color: #f2dede; - border: 1px solid #eed3d7; -} - - /* Mobile */ - @media only screen and (max-width: 767px) { - header h1 { font-size: 34px; line-height: 37px; } - nav { position: relative; } - nav ul, - .carbonad { - display: none; - } - #logo { text-align: left; } - #examples .four.columns { - padding-top: 30px; - } - } - - /* Mobile Landscape */ - @media only screen and (min-width: 480px) and (max-width: 767px) { - nav ul { - display: none; - } - } - - /* Non 960 */ - @media only screen and (max-width: 959px) { - #logo { - font-size: 21px; - margin-bottom: 15px; } - nav .button { - padding: 9px 20px 11px; } - } - - /* iPad Portrait/Browser */ - @media only screen and (min-width: 768px) and (max-width: 959px) { - nav { - width: 124px; } - } - - /* Mobile/Browser */ - @media only screen and (max-width: 767px) {} - - /* Mobile Landscape/Browser */ - @media only screen and (min-width: 480px) and (max-width: 767px) {} - - /* Anything smaller than standard 960 */ - @media only screen and (max-width: 959px) {} - - - /* iPad Portrait Only */ - @media only screen and (min-width: 768px) and (max-width: 959px) and (max-device-width: 1000px) {} - - /* Mobile Only */ - @media only screen and (max-width: 767px) and (max-device-width: 1000px) {} - - /* Mobile Landscape Only */ - @media only screen and (min-width: 480px) and (max-width: 767px) and (max-device-width: 1000px) {} - - /* Anything smaller than standard 960 on a device */ - @media only screen and (max-width: 959px) and (max-device-width: 1000px) { - .resize { display: none; } - } diff --git a/laravel/notejam/public/favicon.ico b/laravel/notejam/public/favicon.ico deleted file mode 100644 index e69de29bb..000000000 diff --git a/laravel/notejam/public/index.php b/laravel/notejam/public/index.php deleted file mode 100644 index f08822d95..000000000 --- a/laravel/notejam/public/index.php +++ /dev/null @@ -1,49 +0,0 @@ - - */ - -/* -|-------------------------------------------------------------------------- -| Register The Auto Loader -|-------------------------------------------------------------------------- -| -| Composer provides a convenient, automatically generated class loader -| for our application. We just need to utilize it! We'll require it -| into the script here so that we do not have to worry about the -| loading of any our classes "manually". Feels great to relax. -| -*/ - -require __DIR__.'/../bootstrap/autoload.php'; - -/* -|-------------------------------------------------------------------------- -| Turn On The Lights -|-------------------------------------------------------------------------- -| -| We need to illuminate PHP development, so let's turn on the lights. -| This bootstraps the framework and gets it ready for use, then it -| will load up this application so that we can run it and send -| the responses back to the browser and delight these users. -| -*/ - -$app = require_once __DIR__.'/../bootstrap/start.php'; - -/* -|-------------------------------------------------------------------------- -| Run The Application -|-------------------------------------------------------------------------- -| -| Once we have the application, we can simply call the run method, -| which will execute the request and send the response back to -| the client's browser allowing them to enjoy the creative -| and wonderful application we have whipped up for them. -| -*/ - -$app->run(); diff --git a/laravel/notejam/public/packages/.gitkeep b/laravel/notejam/public/packages/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/laravel/notejam/public/robots.txt b/laravel/notejam/public/robots.txt deleted file mode 100644 index eb0536286..000000000 --- a/laravel/notejam/public/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: diff --git a/laravel/notejam/server.php b/laravel/notejam/server.php deleted file mode 100644 index 5f187f344..000000000 --- a/laravel/notejam/server.php +++ /dev/null @@ -1,19 +0,0 @@ -`_. - -Nette version: 2.3 - -The application is maintained by `@fprochazka `_. - -========================== -Installation and launching -========================== - ------ -Clone ------ - -Clone the repo: - -.. code-block:: bash - - $ git clone git@github.com:komarserjio/notejam.git YOUR_PROJECT_DIR/ - -------- -Install -------- - -Install `composer `_ - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/nette/doctrine/notejam - $ curl -s https://getcomposer.org/installer | php - -Install dependencies - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/nette/doctrine/notejam - $ php composer.phar install - -Create empty ``config.local.neon`` - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/nette/doctrine/notejam - $ cp app/config/config.local.example.neon app/config/config.local.neon - -Create database schema - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/nette/doctrine/notejam - $ php www/index.php orm:schema:up --force - - ------- -Launch ------- - -Start built-in php web server: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/nette/doctrine/notejam/ - $ php -t `pwd`/www -S 127.0.0.1:8000 `pwd`/www/index.php - -Go to http://localhost:8000/ in your browser. - ---------- -Run tests ---------- - -Run tests: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/nette/doctrine/notejam/ - $ php -t `pwd`/www -S 127.0.0.1:8000 `pwd`/www/index.php - $ ./vendor/bin/codecept run - - -============ -Contribution -============ - - -Do you have php/nette experience? Help the app to follow php and Nette Framework best practices. - -Please send your pull requests in the ``master`` branch. -Always prepend your commits with framework name: - -.. code-block:: bash - - Nette: Implemented sign in functionality - -Read `contribution guide `_ for details. diff --git a/nette/doctrine/notejam/.gitignore b/nette/doctrine/notejam/.gitignore deleted file mode 100644 index 6ddedf44f..000000000 --- a/nette/doctrine/notejam/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -app/config/config.local.neon -vendor diff --git a/nette/doctrine/notejam/app/Components/ConfirmationControl.php b/nette/doctrine/notejam/app/Components/ConfirmationControl.php deleted file mode 100644 index f9fbf8fe8..000000000 --- a/nette/doctrine/notejam/app/Components/ConfirmationControl.php +++ /dev/null @@ -1,71 +0,0 @@ -formFactory = $formFactory; - } - - - - /** - * @return Form - */ - protected function createComponentForm() - { - $form = $this->formFactory->create(); - - $form->addProtection(); - $form->addSubmit('confirm', 'Confirm'); - $form->onSuccess[] = function (Form $form) { - $this->onConfirm($this); - }; - - return $form; - } - - -} - - - -/** - * @see \Notejam\Components\PadsList\IPadsListControlFactory - */ -interface IConfirmationControlFactory -{ - - /** - * @return ConfirmationControl - */ - public function create(); -} diff --git a/nette/doctrine/notejam/app/Components/ForgottenPasswordControl.php b/nette/doctrine/notejam/app/Components/ForgottenPasswordControl.php deleted file mode 100644 index 847b79516..000000000 --- a/nette/doctrine/notejam/app/Components/ForgottenPasswordControl.php +++ /dev/null @@ -1,136 +0,0 @@ -formFactory = $formFactory; - $this->em = $em; - $this->userRepository = $userRepository; - $this->mailer = $mailer; - } - - - - /** - * Factory method for subcomponent form instance. - * This factory is called internally by Nette in the component model. - * - * @return Form - */ - protected function createComponentForm() - { - $form = $this->formFactory->create(); - - $form->addText('email', 'Email') - ->setRequired('%label is required') - ->addRule($form::EMAIL, 'Invalid email'); - - $form->addSubmit('save', 'Get new password'); - $form->onSuccess[] = [$this, 'formSucceeded']; - - return $form; - } - - - - /** - * Callback method, that is called once form is successfully submitted, without validation errors. - * - * @param Form $form - * @param Nette\Utils\ArrayHash $values - */ - public function formSucceeded(Form $form, $values) - { - if (!$user = $this->userRepository->findOneBy(['email' => $values->email])) { - $form['email']->addError("User with given email doesn't exist"); - return; - } - - // this is not a very secure way of getting new password - // but it's the same way the symfony app is doing it... - $newPassword = $user->generateRandomPassword(); - $this->em->flush(); - - try { - $message = new Nette\Mail\Message(); - $message->setSubject('Notejam password'); - $message->setFrom('noreply@notejamapp.com'); - $message->addTo($user->getEmail()); - - // !!! Never send passwords through email !!! - // This is only for demonstration purposes of Notejam. - // Ideally, you can create a unique link where user can change his password - // himself for limited amount of time, and then send the link. - $message->setBody("Your new password is {$newPassword}"); - - $this->mailer->send($message); - - } catch (Nette\Mail\SendException $e) { - Debugger::log($e, 'email'); - $form->addError('Could not send email with new password'); - } - - $this->onSuccess($this); - } - -} - - - -/** - * @see \Notejam\Components\PadsList\IPadsListControlFactory - */ -interface IForgottenPasswordControlFactory -{ - - /** - * @return ForgottenPasswordControl - */ - public function create(); -} diff --git a/nette/doctrine/notejam/app/Components/NoteControl.php b/nette/doctrine/notejam/app/Components/NoteControl.php deleted file mode 100644 index f0cec1c5e..000000000 --- a/nette/doctrine/notejam/app/Components/NoteControl.php +++ /dev/null @@ -1,172 +0,0 @@ -padRepository = $padRepository; - $this->em = $em; - $this->user = $user; - $this->formFactory = $formFactory; - } - - - - /** - * This setter allows to edit notes instead of only creating them. - * - * @param Note $note - */ - public function setNote(Note $note) - { - $this->note = $note; - $this['form']->setDefaults([ - 'name' => $note->getName(), - 'text' => $note->getText(), - 'pad' => $note->getPad() ? $note->getPad()->getId() : NULL, - ]); - } - - - - /** - * Setter for the default pad, to be pre-selected in the pad select form element. - * - * @param Pad|null $pad - */ - public function setPad(Pad $pad = NULL) - { - if ($pad === NULL) { - return; // ignore - } - - $this['form']->setDefaults([ - 'pad' => $pad->getId(), - ]); - } - - - - /** - * Factory method for subcomponent form instance. - * This factory is called internally by Nette in the component model. - * - * @return Form - */ - protected function createComponentForm() - { - $form = $this->formFactory->create(); - - $form->addText('name', 'Name') - ->setRequired('%label is required'); - $form->addTextArea('text', 'Text') - ->setRequired('%label is required'); - $form->addSelect('pad', 'Pad') - ->setPrompt('----------') - ->setItems($this->padRepository->findPairs('name')); - - $form->addSubmit('save', 'Save'); - $form->onSuccess[] = [$this, 'formSucceeded']; - - return $form; - } - - - - /** - * Callback method, that is called once form is successfully submitted, without validation errors. - * - * @param Form $form - * @param Nette\Utils\ArrayHash $values - */ - public function formSucceeded(Form $form, $values) - { - if ($this->note === NULL) { - $note = new Note($this->user->getIdentity()); - $this->em->persist($note); - - } else { - $note = $this->note; - } - - $note->setName($values->name); - $note->setText($values->text); - - if ($values->pad === NULL) { - $note->setPad(NULL); - - } else { - $note->setPad($this->padRepository->find($values->pad)); - } - - $this->em->flush(); - - $this->onSuccess($this); - } - -} - - - -/** - * @see \Notejam\Components\PadsList\IPadsListControlFactory - */ -interface INoteControlFactory -{ - - /** - * @return NoteControl - */ - function create(); -} diff --git a/nette/doctrine/notejam/app/Components/PadsControl.php b/nette/doctrine/notejam/app/Components/PadsControl.php deleted file mode 100644 index e9c367498..000000000 --- a/nette/doctrine/notejam/app/Components/PadsControl.php +++ /dev/null @@ -1,129 +0,0 @@ -em = $em; - $this->user = $user; - $this->formFactory = $formFactory; - } - - - - /** - * This setter allows to edit pads instead of only creating them. - * - * @param Pad $pad - */ - public function setPad(Pad $pad) - { - $this->pad = $pad; - $this['form']->setDefaults([ - 'name' => $pad->getName(), - ]); - } - - - - /** - * Factory method for subcomponent form instance. - * This factory is called internally by Nette in the component model. - * - * @return Form - */ - protected function createComponentForm() - { - $form = $this->formFactory->create(); - - $form->addText('name', 'Name') - ->setRequired('%label is required'); - - $form->addSubmit('save', 'Save'); - $form->onSuccess[] = [$this, 'formSucceeded']; - - return $form; - } - - - - /** - * Callback method, that is called once form is successfully submitted, without validation errors. - * - * @param Form $form - * @param Nette\Utils\ArrayHash $values - */ - public function formSucceeded(Form $form, $values) - { - if ($this->pad === NULL) { - $this->em->persist($pad = new Pad($this->user->getIdentity())); - - } else { - $pad = $this->pad; - } - - $pad->setName($values->name); - $this->em->flush($pad); - - $this->onSuccess($this, $pad); - } - -} - - - -/** - * @see \Notejam\Components\PadsList\IPadsListControlFactory - */ -interface IPadsControlFactory -{ - - /** - * @return PadsControl - */ - function create(); -} diff --git a/nette/doctrine/notejam/app/Components/PadsList/PadsListControl.php b/nette/doctrine/notejam/app/Components/PadsList/PadsListControl.php deleted file mode 100644 index 7406c7cb9..000000000 --- a/nette/doctrine/notejam/app/Components/PadsList/PadsListControl.php +++ /dev/null @@ -1,60 +0,0 @@ -padRepository = $padRepository; - $this->user = $user; - } - - - - public function render() - { - $this->template->pads = $this->padRepository->findBy(['user' => $this->user->getId()]); - $this->template->render(__DIR__ . '/default.latte'); - } - -} - - - -/** - * Interface for automatically generated factory (handled by Nette/DI), - * that is used for creating new instance of the PadsListControl. - * - * This probably should be in a separated file, but this is more convenient. - */ -interface IPadsListControlFactory -{ - - /** - * @return PadsListControl - */ - public function create(); -} diff --git a/nette/doctrine/notejam/app/Components/PadsList/default.latte b/nette/doctrine/notejam/app/Components/PadsList/default.latte deleted file mode 100644 index 66ea4a20d..000000000 --- a/nette/doctrine/notejam/app/Components/PadsList/default.latte +++ /dev/null @@ -1,14 +0,0 @@ -
- - -
diff --git a/nette/doctrine/notejam/app/Components/SettingsControl.php b/nette/doctrine/notejam/app/Components/SettingsControl.php deleted file mode 100644 index 62425dd15..000000000 --- a/nette/doctrine/notejam/app/Components/SettingsControl.php +++ /dev/null @@ -1,116 +0,0 @@ -user = $user; - $this->em = $em; - $this->formFactory = $formFactory; - } - - - - /** - * Factory method for subcomponent form instance. - * This factory is called internally by Nette in the component model. - * - * @return Form - */ - protected function createComponentForm() - { - $form = $this->formFactory->create(); - - $form->addPassword('current', 'Current password') - ->setRequired('%label is required'); - $form->addPassword('password', 'New password') - ->setRequired('%label is required'); - $form->addPassword('confirm', 'Confirm') - ->setRequired('%label is required') - ->addRule(Form::EQUAL, 'New passwords must match', $form['password']); - - $form->addSubmit('save', 'Change password'); - $form->onSuccess[] = [$this, 'formSucceeded']; - - return $form; - } - - - - /** - * Callback method, that is called once form is successfully submitted, without validation errors. - * - * @param Form $form - * @param Nette\Utils\ArrayHash $values - */ - public function formSucceeded(Form $form, $values) - { - /** @var User $user */ - $user = $this->user->getIdentity(); - - try { - $user->changePassword($values->current, $values->password); - $this->em->flush(); - $this->onSuccess($this); - - } catch (InvalidPasswordException $e) { - $form['current']->addError('Invalid current password'); - } - } - -} - - - -/** - * @see \Notejam\Components\PadsList\IPadsListControlFactory - */ -interface ISettingsControlFactory -{ - - /** - * @return SettingsControl - */ - public function create(); -} diff --git a/nette/doctrine/notejam/app/Components/SignInControl.php b/nette/doctrine/notejam/app/Components/SignInControl.php deleted file mode 100644 index 11c9bbe1a..000000000 --- a/nette/doctrine/notejam/app/Components/SignInControl.php +++ /dev/null @@ -1,100 +0,0 @@ -user = $user; - $this->formFactory = $formFactory; - } - - - - /** - * Factory method for subcomponent form instance. - * This factory is called internally by Nette in the component model. - * - * @return Form - */ - protected function createComponentForm() - { - $form = $this->formFactory->create(); - - $form->addText('email', 'Email') - ->setRequired('%label is required') - ->addRule($form::EMAIL); - $form->addPassword('password', 'Password') - ->setRequired('%label is required'); - - $form->addSubmit('send'); - $form->onSuccess[] = [$this, 'formSucceeded']; - - return $form; - } - - - - /** - * Callback method, that is called once form is successfully submitted, without validation errors. - * - * @param Form $form - * @param Nette\Utils\ArrayHash $values - */ - public function formSucceeded(Form $form, $values) - { - try { - $this->user->login($values->email, $values->password); - $this->onSuccess($this); - - } catch (Nette\Security\AuthenticationException $e) { - $form->addError($e->getMessage()); - } - } - -} - - - -/** - * @see \Notejam\Components\PadsList\IPadsListControlFactory - */ -interface ISignInControlFactory -{ - - /** - * @return SignInControl - */ - public function create(); -} diff --git a/nette/doctrine/notejam/app/Components/SignUpControl.php b/nette/doctrine/notejam/app/Components/SignUpControl.php deleted file mode 100644 index 81cd73ede..000000000 --- a/nette/doctrine/notejam/app/Components/SignUpControl.php +++ /dev/null @@ -1,125 +0,0 @@ -user = $user; - $this->em = $em; - $this->userRepository = $userRepository; - $this->formFactory = $formFactory; - } - - - - /** - * Factory method for subcomponent form instance. - * This factory is called internally by Nette in the component model. - * - * @return Form - */ - protected function createComponentForm() - { - $form = $this->formFactory->create(); - - $form->addText('email', 'Email') - ->setRequired('%label is required') - ->addRule($form::EMAIL); - $form->addPassword('password', 'Password') - ->setRequired('%label is required'); - $form->addPassword('confirm', 'Confirm') - ->setRequired('%label is required') - ->addRule(Form::EQUAL, 'New passwords must match', $form['password']); - - $form->addSubmit('send'); - $form->onSuccess[] = [$this, 'formSucceeded']; - - $form->onValidate[] = function (Form $form, $values) { - if ($this->userRepository->countBy(['email' => $values->email]) > 0) { - $form->addError('Account with this email already exists'); - } - }; - - return $form; - } - - - - /** - * Callback method, that is called once form is successfully submitted, without validation errors. - * - * @param Form $form - * @param Nette\Utils\ArrayHash $values - */ - public function formSucceeded(Form $form, $values) - { - $user = new User($values->email, $values->password); - $this->em->persist($user); - $this->em->flush(); - - // directly login user on signup - // $this->user->login($user); - - $this->onSuccess($this); - } - -} - - - -/** - * @see \Notejam\Components\PadsList\IPadsListControlFactory - */ -interface ISignUpControlFactory -{ - - /** - * @return SignUpControl - */ - public function create(); -} diff --git a/nette/doctrine/notejam/app/Presenters/BasePresenter.php b/nette/doctrine/notejam/app/Presenters/BasePresenter.php deleted file mode 100644 index a4ccaa27d..000000000 --- a/nette/doctrine/notejam/app/Presenters/BasePresenter.php +++ /dev/null @@ -1,68 +0,0 @@ -padsListControlFactory->create(); - } - - - - /** - * This allows me to implement a basic access control for presenters. - * - * This method is called for every presenter run, - * once it's created before the presenter startup, - * and for every other lifecycle methods, like render, action and signals. - */ - public function checkRequirements($element) - { - $user = PresenterComponentReflection::parseAnnotation($element, 'User'); - if ($user === FALSE) { - return; // not protected - } - - if (!$this->getUser()->isLoggedIn()) { - $this->forbiddenAccess(); - } - } - - - - /** - * The default behaviour for parts of app, where the user is not allowed for some reason. - * This can be overwritten in subclasses to achieve different behaviour. - */ - protected function forbiddenAccess() - { - $this->redirect('User:signIn'); - } - -} diff --git a/nette/doctrine/notejam/app/Presenters/Error4xxPresenter.php b/nette/doctrine/notejam/app/Presenters/Error4xxPresenter.php deleted file mode 100644 index 666e5e05a..000000000 --- a/nette/doctrine/notejam/app/Presenters/Error4xxPresenter.php +++ /dev/null @@ -1,27 +0,0 @@ -getCode()}.latte"; - $this->template->setFile(is_file($file) ? $file : __DIR__ . '/templates/Error/4xx.latte'); - } - -} diff --git a/nette/doctrine/notejam/app/Presenters/ErrorPresenter.php b/nette/doctrine/notejam/app/Presenters/ErrorPresenter.php deleted file mode 100644 index 2d05af731..000000000 --- a/nette/doctrine/notejam/app/Presenters/ErrorPresenter.php +++ /dev/null @@ -1,58 +0,0 @@ -logger = $logger; - } - - - - /** - * This method is usually implemented by the more complex UI\Presenter - * But since an unhandled exception might have occurred, - * it should be processed as simply as possible to avoid any further problems or even another exception. - * - * @param Nette\Application\Request $request - * @return Responses\CallbackResponse|Responses\ForwardResponse - */ - public function run(Nette\Application\Request $request) - { - $exception = $request->getParameter('exception'); - - // if it's a simple BadRequestException, use the more powerful presenter - if ($exception instanceof Nette\Application\BadRequestException) { - return new Responses\ForwardResponse($request->setPresenterName('Error4xx')); - } - - $this->logger->log($exception, ILogger::EXCEPTION); - - // the 500 means unhandled exception, which should translate to the simplest page possible - return new Responses\CallbackResponse( - function () { - require __DIR__ . '/templates/Error/500.phtml'; - } - ); - } - -} diff --git a/nette/doctrine/notejam/app/Presenters/NotePresenter.php b/nette/doctrine/notejam/app/Presenters/NotePresenter.php deleted file mode 100644 index 39b42d8bb..000000000 --- a/nette/doctrine/notejam/app/Presenters/NotePresenter.php +++ /dev/null @@ -1,252 +0,0 @@ -getParameter('id')) { - $this->note = $this->noteRepository->findOneBy([ - 'id' => $id, - 'user' => $this->user->getId() - ]); - - if (!$this->note) { - $this->error(); - } - } - - if ($padId = $this->getParameter('pad')) { - $this->pad = $this->padRepository->findOneBy([ - 'id' => $padId, - 'user' => $this->user->getId() - ]); - - if (!$this->pad) { - $this->error(); - } - } - } - - - - /** - * This method is called before the render method. - * It is a good place to add code that would be duplicated in all render methods. - */ - protected function beforeRender() - { - parent::beforeRender(); - - // so we don't have to repeat the code in every render method - $this->template->note = $this->note; - } - - - - /** - * Prepares template variables for the default action. - * - * @param string $order - */ - public function renderDefault($order = 'name') - { - $this->template->notes = $this->noteRepository->findBy( - [ - 'user' => $this->getUser()->getId() - ], - $this->noteRepository->buildOrderBy($order) - ); - } - - - - /** - * Since the note is required for the detail, - * if it haven't been found, the presenter should end with 404 error. - */ - public function actionDetail($id) - { - if (!$this->note) { - $this->error(); - } - } - - - - /** - * Since the note is required for the edit, - * if it haven't been found, the presenter should end with 404 error. - */ - public function actionEdit($id) - { - if (!$this->note) { - $this->error(); - } - } - - - - /** - * Since the note is required for the delete, - * if it haven't been found, the presenter should end with 404 error. - */ - public function actionDelete($id) - { - if (!$this->note) { - $this->error(); - } - } - - - - /** - * Factory method for subcomponent form instance. - * This factory is called internally by Nette in the component model. - * - * This factory creates a ConfirmationControl, - * that calls the onConfirm event if user clicks on the button. - * - * @return \Notejam\Components\ConfirmationControl - */ - protected function createComponentDeleteNote() - { - if ($this->action !== 'delete') { - $this->error(); - } - - $control = $this->confirmationControlFactory->create(); - $control->onConfirm[] = function () { - $this->em->remove($this->note); - $this->em->flush(); - $this->flashMessage('The note has been deleted', 'success'); - $this->redirect('Note:'); - }; - - return $control; - } - - - - /** - * Factory method for subcomponent form instance. - * This factory is called internally by Nette in the component model. - * - * This factory creates a NoteControl that handles creation of new notes. - * - * @return \Notejam\Components\NoteControl - * @throws Nette\Application\BadRequestException - */ - protected function createComponentCreateNote() - { - if ($this->action !== 'create') { - $this->error(); - } - - $control = $this->noteControlFactory->create(); - $control->setPad($this->pad); - $control->onSuccess[] = function () { - $this->flashMessage('Note was successfully created', 'success'); - $this->redirect('Note:'); - }; - - return $control; - } - - - - /** - * Factory method for subcomponent form instance. - * This factory is called internally by Nette in the component model. - * - * This factory creates a NoteControl that handles edit of existing notes. - * - * @return \Notejam\Components\NoteControl - * @throws Nette\Application\BadRequestException - */ - protected function createComponentEditNote() - { - if ($this->action !== 'edit' || !$this->note) { - $this->error(); - } - - $control = $this->noteControlFactory->create(); - $control->setNote($this->note); - $control->onSuccess[] = function () { - $this->flashMessage('Note was successfully edited', 'success'); - $this->redirect('Note:'); - }; - - return $control; - } - -} diff --git a/nette/doctrine/notejam/app/Presenters/PadPresenter.php b/nette/doctrine/notejam/app/Presenters/PadPresenter.php deleted file mode 100644 index c65e942a4..000000000 --- a/nette/doctrine/notejam/app/Presenters/PadPresenter.php +++ /dev/null @@ -1,223 +0,0 @@ -getParameter('id')) { - $this->pad = $this->padRepository->findOneBy([ - 'id' => $id, - 'user' => $this->user->getId() - ]); - } - } - - - - /** - * This method is called before the render method. - * It is a good place to add code that would be duplicated in all render methods. - */ - protected function beforeRender() - { - parent::beforeRender(); - - // so we don't have to repeat the code in every render method - $this->template->pad = $this->pad; - } - - - - /** - * Since the pad is required for the edit, - * if it haven't been found, the presenter should end with 404 error. - * - * Prepares template variables for the detail action. - */ - public function actionDetail($id, $order = 'name') - { - if (!$this->pad) { - $this->error(); - } - - $this->template->notes = $this->noteRepository->findBy( - [ - 'user' => $this->getUser()->getId(), - 'pad' => $this->pad->getId() - ], - $this->noteRepository->buildOrderBy($order) - ); - } - - - - /** - * Since the pad is required for the edit, - * if it haven't been found, the presenter should end with 404 error. - */ - public function actionEdit($id) - { - if (!$this->pad) { - $this->error(); - } - } - - - - /** - * Since the pad is required for the delete, - * if it haven't been found, the presenter should end with 404 error. - */ - public function actionDelete($id) - { - if (!$this->pad) { - $this->error(); - } - } - - - - /** - * Factory method for subcomponent form instance. - * This factory is called internally by Nette in the component model. - * - * This factory creates a ConfirmationControl, - * that calls the onConfirm event if user clicks on the button. - * - * @return \Notejam\Components\ConfirmationControl - */ - protected function createComponentDeletePad() - { - if ($this->action !== 'delete') { - $this->error(); - } - - $control = $this->confirmationControlFactory->create(); - $control->onConfirm[] = function () { - $this->em->remove($this->pad); - $this->em->flush(); - $this->flashMessage('The pad has been deleted', 'success'); - $this->redirect('Note:'); - }; - - return $control; - } - - - - /** - * Factory method for subcomponent form instance. - * This factory is called internally by Nette in the component model. - * - * This factory creates a PadsControl that handles creation of new pads. - * - * @return \Notejam\Components\PadsControl - * @throws Nette\Application\BadRequestException - */ - protected function createComponentCreatePad() - { - if ($this->action !== 'create') { - $this->error(); - } - - $control = $this->padsControlFactory->create(); - $control->onSuccess[] = function ($control, Pad $createdPad) { - $this->flashMessage('New pad has been created', 'success'); - $this->redirect('Pad:detail', ['id' => $createdPad->getId()]); - }; - - return $control; - } - - - - /** - * Factory method for subcomponent form instance. - * This factory is called internally by Nette in the component model. - * - * This factory creates a PadsControl that handles edit of existing pads. - * - * @return \Notejam\Components\PadsControl - * @throws Nette\Application\BadRequestException - */ - protected function createComponentEditPad() - { - if ($this->action !== 'edit' || !$this->pad) { - $this->error(); - } - - $control = $this->padsControlFactory->create(); - $control->setPad($this->pad); - $control->onSuccess[] = function () { - $this->flashMessage('Pad has been edited', 'success'); - $this->redirect('Pad:detail', ['id' => $this->pad->getId()]); - }; - - return $control; - } - -} diff --git a/nette/doctrine/notejam/app/Presenters/UserPresenter.php b/nette/doctrine/notejam/app/Presenters/UserPresenter.php deleted file mode 100644 index 03cfe6e34..000000000 --- a/nette/doctrine/notejam/app/Presenters/UserPresenter.php +++ /dev/null @@ -1,145 +0,0 @@ -user->logout(TRUE); - $this->flashMessage("You've been logged out.", 'success'); - $this->redirect('User:signIn'); - } - - - - /** - * This method is here only for the user annotation, that creates a protected section of app. - * Meaning that if you try to access this action when you're not logged in, you'll be redirected to login form page. - * - * @User() - */ - public function actionSettings() - { - - } - - - - /** - * Factory method for subcomponent form instance. - * This factory is called internally by Nette in the component model. - * - * @return \Notejam\Components\SignInControl - */ - protected function createComponentSignIn() - { - $control = $this->signInFormFactory->create(); - $control->onSuccess[] = function () { - $this->redirect('Note:'); - }; - - return $control; - } - - - - /** - * Factory method for subcomponent form instance. - * This factory is called internally by Nette in the component model. - * - * @return \Notejam\Components\SignUpControl - */ - protected function createComponentSignUp() - { - $control = $this->signUpFormFactory->create(); - $control->onSuccess[] = function () { - $this->flashMessage('Thank you for registration. Now you can sign in', 'success'); - $this->redirect('User:signIn'); - }; - - return $control; - } - - - - /** - * Factory method for subcomponent form instance. - * This factory is called internally by Nette in the component model. - * - * @return \Notejam\Components\SettingsControl - * @throws Nette\Application\BadRequestException - */ - protected function createComponentSettings() - { - if ($this->action !== 'settings') { - $this->error(); - } - - $control = $this->settingsControlFactory->create(); - $control->onSuccess[] = function () { - $this->flashMessage('The password has been changed', 'success'); - $this->redirect('Note:'); - }; - - return $control; - } - - - - /** - * Factory method for subcomponent form instance. - * This factory is called internally by Nette in the component model. - * - * @return \Notejam\Components\ForgottenPasswordControl - */ - protected function createComponentForgottenPassword() - { - $control = $this->forgottenPasswordControlFactory->create(); - $control->onSuccess[] = function () { - $this->flashMessage('New password sent to your inbox', 'success'); - $this->redirect('User:signIn'); - }; - - return $control; - } - -} diff --git a/nette/doctrine/notejam/app/Presenters/templates/@layout.latte b/nette/doctrine/notejam/app/Presenters/templates/@layout.latte deleted file mode 100644 index 8dd37f71f..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/@layout.latte +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - {ifset title}{include title|striptags}{else}Notejam{/ifset} - - - - - - - {block stylesheets} - - - - - - - - {/block} - - -
-
- -
-
-

- notejam: - {block page_title} - All notes - {/block} -

-
- {block pads} - {control padsList} - {/block} -
-
-
{$flash->message}
-
- {block body}{/block} -
- - -
- Fork me on GitHub - {block javascripts} - - {/block} - - diff --git a/nette/doctrine/notejam/app/Presenters/templates/@user.latte b/nette/doctrine/notejam/app/Presenters/templates/@user.latte deleted file mode 100644 index 2b72e3db8..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/@user.latte +++ /dev/null @@ -1,5 +0,0 @@ -{extends '@layout.latte'} - -{block content_class}sixteen columns content-area{/block} - -{block pads}{/block} diff --git a/nette/doctrine/notejam/app/Presenters/templates/Error/403.latte b/nette/doctrine/notejam/app/Presenters/templates/Error/403.latte deleted file mode 100644 index 25c24ab3c..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/Error/403.latte +++ /dev/null @@ -1,7 +0,0 @@ -{block body} -

Access Denied

- -

You do not have permission to view this page. Please try contact the web -site administrator if you believe you should be able to view this page.

- -

error 403

diff --git a/nette/doctrine/notejam/app/Presenters/templates/Error/404.latte b/nette/doctrine/notejam/app/Presenters/templates/Error/404.latte deleted file mode 100644 index d0a09f2a3..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/Error/404.latte +++ /dev/null @@ -1,8 +0,0 @@ -{block body} -

Page Not Found

- -

The page you requested could not be found. It is possible that the address is -incorrect, or that the page no longer exists. Please use a search engine to find -what you are looking for.

- -

error 404

diff --git a/nette/doctrine/notejam/app/Presenters/templates/Error/405.latte b/nette/doctrine/notejam/app/Presenters/templates/Error/405.latte deleted file mode 100644 index 28192d2ff..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/Error/405.latte +++ /dev/null @@ -1,6 +0,0 @@ -{block body} -

Method Not Allowed

- -

The requested method is not allowed for the URL.

- -

error 405

diff --git a/nette/doctrine/notejam/app/Presenters/templates/Error/410.latte b/nette/doctrine/notejam/app/Presenters/templates/Error/410.latte deleted file mode 100644 index b81f19b68..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/Error/410.latte +++ /dev/null @@ -1,6 +0,0 @@ -{block body} -

Page Not Found

- -

The page you requested has been taken off the site. We apologize for the inconvenience.

- -

error 410

diff --git a/nette/doctrine/notejam/app/Presenters/templates/Error/4xx.latte b/nette/doctrine/notejam/app/Presenters/templates/Error/4xx.latte deleted file mode 100644 index d084ed723..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/Error/4xx.latte +++ /dev/null @@ -1,4 +0,0 @@ -{block body} -

Oops...

- -

Your browser sent a request that this server could not understand or process.

diff --git a/nette/doctrine/notejam/app/Presenters/templates/Error/500.phtml b/nette/doctrine/notejam/app/Presenters/templates/Error/500.phtml deleted file mode 100644 index 619611eac..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/Error/500.phtml +++ /dev/null @@ -1,20 +0,0 @@ - - - -Server Error - - - -
-

Server Error

- -

We're sorry! The server encountered an internal error and - was unable to complete your request. Please try again later.

- -

error 500

-
diff --git a/nette/doctrine/notejam/app/Presenters/templates/Note/create.latte b/nette/doctrine/notejam/app/Presenters/templates/Note/create.latte deleted file mode 100644 index c43128571..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/Note/create.latte +++ /dev/null @@ -1,8 +0,0 @@ -{block title}New note{/block} -{block page_title}New note{/block} - -{block body} -
- {control $form ownerrors} - {control $form body} -
diff --git a/nette/doctrine/notejam/app/Presenters/templates/Note/default.latte b/nette/doctrine/notejam/app/Presenters/templates/Note/default.latte deleted file mode 100644 index 5863a25e0..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/Note/default.latte +++ /dev/null @@ -1,36 +0,0 @@ -{block title}All notes ({$notes|length}){/block} -{block page_title}All notes ({$notes|length}){/block} - -{block body} - - - - - - - - - - - -
- Note - - - Pad - Last modified - - -
{$note->name} - {if $note->pad} - {$note->pad} - {else} - No pad - {/if} - {$note->updatedAt|date:'d M. Y'}
- -{if !$iterations} -

Create your first note.

-{/if} - -New note diff --git a/nette/doctrine/notejam/app/Presenters/templates/Note/delete.latte b/nette/doctrine/notejam/app/Presenters/templates/Note/delete.latte deleted file mode 100644 index 8b552f369..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/Note/delete.latte +++ /dev/null @@ -1,9 +0,0 @@ -{block title}Delete note {$note->name}{/block} -{block page_title}Delete note {$note->name}{/block} - -{block body} -
-

Are you sure you want to delete {$note->name}?

- - Cancel -
diff --git a/nette/doctrine/notejam/app/Presenters/templates/Note/detail.latte b/nette/doctrine/notejam/app/Presenters/templates/Note/detail.latte deleted file mode 100644 index 8c2409094..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/Note/detail.latte +++ /dev/null @@ -1,10 +0,0 @@ -{block title}{$note->name}{/block} -{block page_title}{$note->name}{/block} - -{block body} -

Last edited at {$note->updatedAt->format('H:i')}

-
- {$note->text|escape|nl2br|noescape} -
- Edit - Delete it diff --git a/nette/doctrine/notejam/app/Presenters/templates/Note/edit.latte b/nette/doctrine/notejam/app/Presenters/templates/Note/edit.latte deleted file mode 100644 index 906bb35df..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/Note/edit.latte +++ /dev/null @@ -1,8 +0,0 @@ -{block title}{$note->name}{/block} -{block page_title}{$note->name}{/block} - -{block body} -
- {control $form ownerrors} - {control $form body} -
diff --git a/nette/doctrine/notejam/app/Presenters/templates/Pad/create.latte b/nette/doctrine/notejam/app/Presenters/templates/Pad/create.latte deleted file mode 100644 index 1d446a09e..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/Pad/create.latte +++ /dev/null @@ -1,5 +0,0 @@ -{block title}New pad{/block} -{block page_title}New pad{/block} - -{block body} - {control createPad-form} diff --git a/nette/doctrine/notejam/app/Presenters/templates/Pad/delete.latte b/nette/doctrine/notejam/app/Presenters/templates/Pad/delete.latte deleted file mode 100644 index 9b842beb1..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/Pad/delete.latte +++ /dev/null @@ -1,9 +0,0 @@ -{block title}Delete pad {$pad->name}{/block} -{block page_title}Delete pad {$pad->name}{/block} - -{block body} -
-

Are you sure you want to delete {$pad->name}?

- - Cancel -
diff --git a/nette/doctrine/notejam/app/Presenters/templates/Pad/detail.latte b/nette/doctrine/notejam/app/Presenters/templates/Pad/detail.latte deleted file mode 100644 index b8f233d17..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/Pad/detail.latte +++ /dev/null @@ -1,37 +0,0 @@ -{block title}{$pad->name} ({$notes|length} notes){/block} -{block page_title}{$pad->name} ({$notes|length}){/block} - -{block body} - - - - - - - - - - - -
- Note - - - Pad - Last modified - - -
{$note->name} - {if $note->pad} - {$note->pad} - {else} - No pad - {/if} - {$note->updatedAt|date:'d M. Y'}
- -{if !$iterations} -

Create first note in the pad

-{/if} - -New note  -Pad settings diff --git a/nette/doctrine/notejam/app/Presenters/templates/Pad/edit.latte b/nette/doctrine/notejam/app/Presenters/templates/Pad/edit.latte deleted file mode 100644 index 6448a3c4e..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/Pad/edit.latte +++ /dev/null @@ -1,6 +0,0 @@ -{block title}{$pad->name}{/block} -{block page_title}{$pad->name}{/block} - -{block body} - {control editPad-form} - Delete pad diff --git a/nette/doctrine/notejam/app/Presenters/templates/User/forgottenPassword.latte b/nette/doctrine/notejam/app/Presenters/templates/User/forgottenPassword.latte deleted file mode 100644 index e9ab4b29b..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/User/forgottenPassword.latte +++ /dev/null @@ -1,10 +0,0 @@ -{extends '../@user.latte'} - -{block title}Forgot Password?{/block} -{block page_title}Forgot Password?{/block} - -{block body} - diff --git a/nette/doctrine/notejam/app/Presenters/templates/User/settings.latte b/nette/doctrine/notejam/app/Presenters/templates/User/settings.latte deleted file mode 100644 index a33ed1173..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/User/settings.latte +++ /dev/null @@ -1,10 +0,0 @@ -{extends '../@user.latte'} - -{block title}Account Settings{/block} -{block page_title}Account Settings{/block} - -{block body} - diff --git a/nette/doctrine/notejam/app/Presenters/templates/User/signIn.latte b/nette/doctrine/notejam/app/Presenters/templates/User/signIn.latte deleted file mode 100644 index a8f4e16e7..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/User/signIn.latte +++ /dev/null @@ -1,21 +0,0 @@ -{extends '../@user.latte'} - -{block title}Sign In{/block} -{block page_title}Sign In{/block} - -{block body} - diff --git a/nette/doctrine/notejam/app/Presenters/templates/User/signUp.latte b/nette/doctrine/notejam/app/Presenters/templates/User/signUp.latte deleted file mode 100644 index 5b91bc2b9..000000000 --- a/nette/doctrine/notejam/app/Presenters/templates/User/signUp.latte +++ /dev/null @@ -1,20 +0,0 @@ -{extends '../@user.latte'} - -{block title}Sign Up{/block} -{block page_title}Sign Up{/block} - -{block body} - diff --git a/nette/doctrine/notejam/app/bootstrap.php b/nette/doctrine/notejam/app/bootstrap.php deleted file mode 100644 index 8fd851263..000000000 --- a/nette/doctrine/notejam/app/bootstrap.php +++ /dev/null @@ -1,21 +0,0 @@ -setDebugMode('23.75.345.200'); // enable for your remote IP -$configurator->enableDebugger(__DIR__ . '/../log'); - -$configurator->setTempDirectory(__DIR__ . '/../temp'); - -$configurator->createRobotLoader() - ->addDirectory(__DIR__) - ->register(); - -$configurator->addConfig(__DIR__ . '/config/config.neon'); -$configurator->addConfig(__DIR__ . '/config/config.local.neon'); - -$container = $configurator->createContainer(); - -return $container; diff --git a/nette/doctrine/notejam/app/config/config.local.example.neon b/nette/doctrine/notejam/app/config/config.local.example.neon deleted file mode 100644 index 8ef3ce85f..000000000 --- a/nette/doctrine/notejam/app/config/config.local.example.neon +++ /dev/null @@ -1,2 +0,0 @@ -# copy me to config.local.neon -parameters: diff --git a/nette/doctrine/notejam/app/config/config.neon b/nette/doctrine/notejam/app/config/config.neon deleted file mode 100644 index 63a9977a2..000000000 --- a/nette/doctrine/notejam/app/config/config.neon +++ /dev/null @@ -1,42 +0,0 @@ -# WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser! -# https://nette.org/security-warning - -parameters: - srcDir: %appDir%/../src - - -php: - date.timezone: Europe/Prague - - -extensions: - console: Kdyby\Console\DI\ConsoleExtension - events: Kdyby\Events\DI\EventsExtension - annotations: Kdyby\Annotations\DI\AnnotationsExtension - doctrine: Kdyby\Doctrine\DI\OrmExtension - doctrine2identity: Majkl578\NetteAddons\Doctrine2Identity\DI\IdentityExtension - - -application: - errorPresenter: Error - mapping: - *: Notejam\*Module\Presenters\*Presenter - - -session: - expiration: 14 days - - -doctrine: - driver: pdo_sqlite - path: %appDir%/../notejam.db - metadata: - Notejam: %srcDir%/Notejam - - -events: - debugger: off - - -includes: - - services.neon diff --git a/nette/doctrine/notejam/app/config/services.neon b/nette/doctrine/notejam/app/config/services.neon deleted file mode 100644 index 4a04010a4..000000000 --- a/nette/doctrine/notejam/app/config/services.neon +++ /dev/null @@ -1,21 +0,0 @@ -services: - router: Notejam\Http\RouterFactory::createRouter - security.authenticator: Notejam\Users\Authenticator - - latte.latteFactory: - setup: - - addFilter(length, 'Notejam\Templating\RuntimeFilters::length') - - - Notejam\UI\FormFactory - - Notejam\Components\ISignInControlFactory - - Notejam\Components\ISignUpControlFactory - - Notejam\Components\INoteControlFactory - - Notejam\Components\IPadsControlFactory - - Notejam\Components\ISettingsControlFactory - - Notejam\Components\PadsList\IPadsListControlFactory - - Notejam\Components\IForgottenPasswordControlFactory - - Notejam\Components\IConfirmationControlFactory - - - Notejam\Notes\NoteRepository - - Notejam\Pads\PadRepository - - Notejam\Users\UserRepository diff --git a/nette/doctrine/notejam/codeception.yml b/nette/doctrine/notejam/codeception.yml deleted file mode 100644 index 15019d00a..000000000 --- a/nette/doctrine/notejam/codeception.yml +++ /dev/null @@ -1,23 +0,0 @@ -actor: Tester -paths: - tests: tests - log: tests/_output - data: tests/_data - support: tests/_support - envs: tests/_envs -settings: - bootstrap: _bootstrap.php - colors: true - memory_limit: 1024M -extensions: - enabled: - - Codeception\Extension\RunFailed -modules: - config: - Db: - dsn: 'sqlite:notejam.db' - user: - password: - dump: tests/_data/dump.sql - populate: true - cleanup: true diff --git a/nette/doctrine/notejam/composer.json b/nette/doctrine/notejam/composer.json deleted file mode 100644 index 6edba100b..000000000 --- a/nette/doctrine/notejam/composer.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "nette/web-project", - "description": "Nette: Standard Web Project", - "type": "project", - "license": ["MIT", "BSD-3-Clause", "GPL-2.0", "GPL-3.0"], - "require": { - "php": ">= 5.4.0", - "nette/application": "~2.3.6", - "nette/bootstrap": "~2.3.0", - "nette/caching": "~2.3.0", - "nette/di": "~2.3.0", - "nette/finder": "~2.3.0", - "nette/forms": "~2.3.0", - "nette/http": "~2.3.0", - "nette/mail": "~2.3.0", - "nette/robot-loader": "~2.3.0", - "nette/safe-stream": "~2.3.0", - "nette/security": "~2.3.0", - "nette/utils": "~2.3.0", - "latte/latte": "~2.3.0", - "tracy/tracy": "~2.3.0", - "nextras/static-router": "^1.0", - "kdyby/doctrine": "^3.0", - "majkl578/nette-identity-doctrine": "~2.3@rc" - }, - "autoload": { - "classmap": [ - "app/", - "src/Notejam/exceptions.php" - ], - "psr-4": { - "Notejam\\": "src/Notejam" - } - }, - "require-dev": { - "nette/tester": "~1.4", - "codeception/codeception": "^2.0" - } -} diff --git a/nette/doctrine/notejam/composer.lock b/nette/doctrine/notejam/composer.lock deleted file mode 100644 index 42880c42d..000000000 --- a/nette/doctrine/notejam/composer.lock +++ /dev/null @@ -1,3754 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", - "This file is @generated automatically" - ], - "hash": "99a26131a249a67fdc54e59ec1add7b2", - "content-hash": "bb5d12a2b59bf82f1fd5ad6e2252efce", - "packages": [ - { - "name": "doctrine/annotations", - "version": "v1.2.7", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/f25c8aab83e0c3e976fd7d19875f198ccf2f7535", - "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535", - "shasum": "" - }, - "require": { - "doctrine/lexer": "1.*", - "php": ">=5.3.2" - }, - "require-dev": { - "doctrine/cache": "1.*", - "phpunit/phpunit": "4.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\Annotations\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "time": "2015-08-31 12:32:49" - }, - { - "name": "doctrine/cache", - "version": "v1.5.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "2b9cec5a5e722010cbebc91713d4c11eaa064d5e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/2b9cec5a5e722010cbebc91713d4c11eaa064d5e", - "reference": "2b9cec5a5e722010cbebc91713d4c11eaa064d5e", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "phpunit/phpunit": ">=3.7", - "predis/predis": "~1.0", - "satooshi/php-coveralls": "~0.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.5.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Caching library offering an object-oriented API for many cache backends", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "cache", - "caching" - ], - "time": "2015-11-02 18:35:48" - }, - { - "name": "doctrine/collections", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/collections.git", - "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/6c1e4eef75f310ea1b3e30945e9f06e652128b8a", - "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\Collections\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Collections Abstraction library", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "array", - "collections", - "iterator" - ], - "time": "2015-04-14 22:21:58" - }, - { - "name": "doctrine/common", - "version": "v2.5.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/common.git", - "reference": "0009b8f0d4a917aabc971fb089eba80e872f83f9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/0009b8f0d4a917aabc971fb089eba80e872f83f9", - "reference": "0009b8f0d4a917aabc971fb089eba80e872f83f9", - "shasum": "" - }, - "require": { - "doctrine/annotations": "1.*", - "doctrine/cache": "1.*", - "doctrine/collections": "1.*", - "doctrine/inflector": "1.*", - "doctrine/lexer": "1.*", - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~3.7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Common Library for Doctrine projects", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "annotations", - "collections", - "eventmanager", - "persistence", - "spl" - ], - "time": "2015-08-31 13:00:22" - }, - { - "name": "doctrine/dbal", - "version": "v2.5.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "01dbcbc5cd0a913d751418e635434a18a2f2a75c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/01dbcbc5cd0a913d751418e635434a18a2f2a75c", - "reference": "01dbcbc5cd0a913d751418e635434a18a2f2a75c", - "shasum": "" - }, - "require": { - "doctrine/common": ">=2.4,<2.6-dev", - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "4.*", - "symfony/console": "2.*" - }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." - }, - "bin": [ - "bin/doctrine-dbal" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.5.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\DBAL\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Database Abstraction Layer", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "database", - "dbal", - "persistence", - "queryobject" - ], - "time": "2015-09-16 16:29:33" - }, - { - "name": "doctrine/inflector", - "version": "v1.1.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "90b2128806bfde671b6952ab8bea493942c1fdae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae", - "reference": "90b2128806bfde671b6952ab8bea493942c1fdae", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "4.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\Inflector\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Common String Manipulations with regard to casing and singular/plural rules.", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "inflection", - "pluralize", - "singularize", - "string" - ], - "time": "2015-11-06 14:35:42" - }, - { - "name": "doctrine/instantiator", - "version": "1.0.5", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", - "shasum": "" - }, - "require": { - "php": ">=5.3,<8.0-DEV" - }, - "require-dev": { - "athletic/athletic": "~0.1.8", - "ext-pdo": "*", - "ext-phar": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", - "keywords": [ - "constructor", - "instantiate" - ], - "time": "2015-06-14 21:17:01" - }, - { - "name": "doctrine/lexer", - "version": "v1.0.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", - "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\Lexer\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "lexer", - "parser" - ], - "time": "2014-09-09 13:34:57" - }, - { - "name": "doctrine/orm", - "version": "v2.5.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/doctrine2.git", - "reference": "464b5fdbfbbeb4a65465ac173c4c5d90960f41ff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/464b5fdbfbbeb4a65465ac173c4c5d90960f41ff", - "reference": "464b5fdbfbbeb4a65465ac173c4c5d90960f41ff", - "shasum": "" - }, - "require": { - "doctrine/cache": "~1.4", - "doctrine/collections": "~1.2", - "doctrine/common": ">=2.5-dev,<2.6-dev", - "doctrine/dbal": ">=2.5-dev,<2.6-dev", - "doctrine/instantiator": "~1.0.1", - "ext-pdo": "*", - "php": ">=5.4", - "symfony/console": "~2.5|~3.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", - "symfony/yaml": "~2.3|~3.0" - }, - "suggest": { - "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" - }, - "bin": [ - "bin/doctrine", - "bin/doctrine.php" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\ORM\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Object-Relational-Mapper for PHP", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "database", - "orm" - ], - "time": "2015-11-23 12:44:25" - }, - { - "name": "kdyby/annotations", - "version": "v2.3.0", - "source": { - "type": "git", - "url": "https://github.com/Kdyby/Annotations.git", - "reference": "36cb90e8a28c1f9a23a5c351af2449139c21229d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Kdyby/Annotations/zipball/36cb90e8a28c1f9a23a5c351af2449139c21229d", - "reference": "36cb90e8a28c1f9a23a5c351af2449139c21229d", - "shasum": "" - }, - "require": { - "doctrine/annotations": "~1.2", - "kdyby/doctrine-cache": "~2.4@dev", - "nette/di": "~2.3@dev", - "nette/utils": "~2.3@dev" - }, - "conflict": { - "kdyby/doctrine": "0.9.*" - }, - "require-dev": { - "latte/latte": "~2.3@dev", - "nette/application": "~2.3@dev", - "nette/bootstrap": "~2.3@dev", - "nette/caching": "~2.3@dev", - "nette/component-model": "~2.2@dev", - "nette/database": "~2.3@dev", - "nette/deprecated": "~2.3@dev", - "nette/di": "~2.3@dev", - "nette/finder": "~2.3@dev", - "nette/forms": "~2.3@dev", - "nette/http": "~2.3@dev", - "nette/mail": "~2.3@dev", - "nette/neon": "~2.3@dev", - "nette/php-generator": "~2.3@dev", - "nette/reflection": "~2.3@dev", - "nette/robot-loader": "~2.3@dev", - "nette/safe-stream": "~2.3@dev", - "nette/security": "~2.3@dev", - "nette/tester": "~1.3@rc", - "nette/tokenizer": "~2.2@dev", - "nette/utils": "~2.3@dev", - "tracy/tracy": "~2.3@dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - } - }, - "autoload": { - "psr-0": { - "Kdyby\\Annotations\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "Filip Procházka", - "email": "filip@prochazka.su", - "homepage": "http://filip-prochazka.com" - }, - { - "name": "Jáchym TouÅ¡ek", - "email": "enumag@gmail.com", - "homepage": "http://enumag.cz" - } - ], - "description": "Doctrine Annotations integration into Nette Framework", - "homepage": "http://kdyby.org", - "keywords": [ - "annotations", - "doctrine", - "kdyby", - "nette" - ], - "time": "2015-10-30 21:04:27" - }, - { - "name": "kdyby/console", - "version": "v2.5.0", - "source": { - "type": "git", - "url": "https://github.com/Kdyby/Console.git", - "reference": "50e9f6ce4db18628d01724d5085d8056056eb9cb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Kdyby/Console/zipball/50e9f6ce4db18628d01724d5085d8056056eb9cb", - "reference": "50e9f6ce4db18628d01724d5085d8056056eb9cb", - "shasum": "" - }, - "require": { - "nette/application": "~2.3@dev", - "nette/di": "~2.3@dev", - "nette/http": "~2.3@dev", - "symfony/console": "~2.3" - }, - "require-dev": { - "kdyby/events": "~2.4@dev", - "latte/latte": "~2.3@dev", - "nette/application": "~2.3@dev", - "nette/bootstrap": "~2.3@dev", - "nette/caching": "~2.3@dev", - "nette/component-model": "~2.2@dev", - "nette/database": "~2.3@dev", - "nette/deprecated": "~2.3@dev", - "nette/di": "~2.3@dev", - "nette/finder": "~2.3@dev", - "nette/forms": "~2.3@dev", - "nette/http": "~2.3@dev", - "nette/mail": "~2.3@dev", - "nette/neon": "~2.3@dev", - "nette/php-generator": "~2.3@dev", - "nette/reflection": "~2.3@dev", - "nette/robot-loader": "~2.3@dev", - "nette/safe-stream": "~2.3@dev", - "nette/security": "~2.3@dev", - "nette/tester": "~1.6@rc", - "nette/tokenizer": "~2.2@dev", - "nette/utils": "~2.3@dev", - "symfony/event-dispatcher": "~2.3", - "tracy/tracy": "~2.3@dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Kdyby\\Console\\": "src/" - }, - "classmap": [ - "src/Kdyby/Console/CliPresenter.php", - "src/Kdyby/Console/exceptions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "Filip Procházka", - "email": "filip@prochazka.su", - "homepage": "http://filip-prochazka.com" - } - ], - "description": "Symfony Console integration for Kdyby components", - "homepage": "http://kdyby.org", - "keywords": [ - "console", - "kdyby", - "nette" - ], - "time": "2015-10-30 21:57:23" - }, - { - "name": "kdyby/doctrine", - "version": "v3.0.1", - "source": { - "type": "git", - "url": "https://github.com/Kdyby/Doctrine.git", - "reference": "69c63fe943d1fade98d8879a9e3aa8fc9e7b5c4b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Kdyby/Doctrine/zipball/69c63fe943d1fade98d8879a9e3aa8fc9e7b5c4b", - "reference": "69c63fe943d1fade98d8879a9e3aa8fc9e7b5c4b", - "shasum": "" - }, - "require": { - "doctrine/dbal": "~2.5", - "doctrine/orm": "~2.5", - "kdyby/annotations": "~2.3@dev", - "kdyby/console": "~2.5@dev", - "kdyby/doctrine-cache": "~2.5@dev", - "kdyby/events": "~3.0@dev", - "nette/di": "~2.3@dev", - "nette/neon": "~2.3@dev", - "nette/robot-loader": "~2.3@dev", - "nette/utils": "~2.3@dev" - }, - "require-dev": { - "dg/dibi": "~2.0", - "latte/latte": "~2.3@dev", - "nette/application": "~2.3@dev", - "nette/bootstrap": "~2.3@dev", - "nette/caching": "~2.3@dev", - "nette/component-model": "~2.2@dev", - "nette/database": "~2.3@dev", - "nette/deprecated": "~2.2@dev", - "nette/di": "~2.3@dev", - "nette/finder": "~2.3@dev", - "nette/forms": "~2.3@dev", - "nette/http": "~2.3@dev", - "nette/mail": "~2.3@dev", - "nette/neon": "~2.3@dev", - "nette/php-generator": "~2.3@dev", - "nette/reflection": "~2.3@dev", - "nette/robot-loader": "~2.3@dev", - "nette/safe-stream": "~2.3@dev", - "nette/security": "~2.3@dev", - "nette/tester": "~1.3@rc", - "nette/tokenizer": "~2.2@dev", - "nette/utils": "~2.3@dev", - "tracy/tracy": "~2.3@dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-0": { - "Kdyby\\Doctrine\\": "src/", - "Kdyby\\Persistence\\": "src/", - "Kdyby\\DibiBridge\\": "src/" - }, - "classmap": [ - "src/Kdyby/Doctrine/exceptions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "Filip Procházka", - "email": "filip@prochazka.su", - "homepage": "http://filip-prochazka.com" - } - ], - "description": "Doctrine integration into Nette Framework", - "homepage": "http://kdyby.org", - "keywords": [ - "dbal", - "doctrine", - "kdyby", - "nette", - "orm" - ], - "time": "2015-11-14 14:11:04" - }, - { - "name": "kdyby/doctrine-cache", - "version": "v2.5.0", - "source": { - "type": "git", - "url": "https://github.com/Kdyby/DoctrineCache.git", - "reference": "01a55db5ab0e0892c77a7f6fa9ea0022dabb9440" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Kdyby/DoctrineCache/zipball/01a55db5ab0e0892c77a7f6fa9ea0022dabb9440", - "reference": "01a55db5ab0e0892c77a7f6fa9ea0022dabb9440", - "shasum": "" - }, - "require": { - "doctrine/cache": "~1.5", - "nette/caching": "~2.3@dev", - "nette/di": "~2.3@dev", - "php": ">=5.4" - }, - "require-dev": { - "latte/latte": "~2.3@dev", - "nette/application": "~2.3@dev", - "nette/bootstrap": "~2.3@dev", - "nette/caching": "~2.3@dev", - "nette/component-model": "~2.2@dev", - "nette/database": "~2.3@dev", - "nette/deprecated": "~2.3@dev", - "nette/di": "~2.3@dev", - "nette/finder": "~2.3@dev", - "nette/forms": "~2.3@dev", - "nette/http": "~2.3@dev", - "nette/mail": "~2.3@dev", - "nette/neon": "~2.3@dev", - "nette/php-generator": "~2.3@dev", - "nette/reflection": "~2.3@dev", - "nette/robot-loader": "~2.3@dev", - "nette/safe-stream": "~2.3@dev", - "nette/security": "~2.3@dev", - "nette/tester": "~1.3@rc", - "nette/tokenizer": "~2.2@dev", - "nette/utils": "~2.3@dev", - "tracy/tracy": "~2.3@dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Kdyby\\DoctrineCache\\": "src/" - }, - "classmap": [ - "src/Kdyby/DoctrineCache/exceptions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "Filip Procházka", - "email": "filip@prochazka.su", - "homepage": "http://filip-prochazka.com" - } - ], - "description": "Doctrine Cache bridge for Nette Framework", - "homepage": "http://kdyby.org", - "keywords": [ - "cache", - "doctrine", - "kdyby", - "nette" - ], - "time": "2015-10-30 20:54:56" - }, - { - "name": "kdyby/events", - "version": "v3.0.0", - "source": { - "type": "git", - "url": "https://github.com/Kdyby/Events.git", - "reference": "fc82cd11e3415bb3c30d661948ab6279c40caa04" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Kdyby/Events/zipball/fc82cd11e3415bb3c30d661948ab6279c40caa04", - "reference": "fc82cd11e3415bb3c30d661948ab6279c40caa04", - "shasum": "" - }, - "require": { - "nette/di": "~2.3@dev", - "nette/utils": "~2.3@dev" - }, - "require-dev": { - "latte/latte": "~2.3@dev", - "nette/application": "~2.3@dev", - "nette/bootstrap": "~2.3@dev", - "nette/caching": "~2.3@dev", - "nette/component-model": "~2.2@dev", - "nette/database": "~2.3@dev", - "nette/deprecated": "~2.3@dev", - "nette/di": "~2.3@dev", - "nette/finder": "~2.3@dev", - "nette/forms": "~2.3@dev", - "nette/http": "~2.3@dev", - "nette/mail": "~2.3@dev", - "nette/neon": "~2.3@dev", - "nette/php-generator": "~2.3@dev", - "nette/reflection": "~2.3@dev", - "nette/robot-loader": "~2.3@dev", - "nette/safe-stream": "~2.3@dev", - "nette/security": "~2.3@dev", - "nette/tester": "~1.4", - "nette/tokenizer": "~2.2@dev", - "nette/utils": "~2.3@dev", - "symfony/event-dispatcher": "~2.3", - "tracy/tracy": "~2.3@dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "psr-0": { - "Kdyby\\Events\\": "src/" - }, - "classmap": [ - "src/Kdyby/Events/exceptions.php" - ], - "files": [ - "src/Doctrine/compatibility.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "Filip Procházka", - "email": "filip@prochazka.su", - "homepage": "http://filip-prochazka.com" - } - ], - "description": "Events for Nette Framework", - "homepage": "http://kdyby.org", - "keywords": [ - "kdyby", - "nette" - ], - "time": "2015-10-30 18:00:28" - }, - { - "name": "latte/latte", - "version": "v2.3.7", - "source": { - "type": "git", - "url": "https://github.com/nette/latte.git", - "reference": "b6e090e461c9cd88d60ae79a7713990b17b1531c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/latte/zipball/b6e090e461c9cd88d60ae79a7713990b17b1531c", - "reference": "b6e090e461c9cd88d60ae79a7713990b17b1531c", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=5.3.1" - }, - "require-dev": { - "nette/tester": "~1.3" - }, - "suggest": { - "ext-fileinfo": "to use filter |datastream", - "ext-mbstring": "to use filters like lower, upper, capitalize, ..." - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "Latte: the amazing template engine for PHP", - "homepage": "https://latte.nette.org", - "keywords": [ - "templating", - "twig" - ], - "time": "2015-11-07 22:54:05" - }, - { - "name": "majkl578/nette-identity-doctrine", - "version": "v2.3-rc1", - "source": { - "type": "git", - "url": "https://github.com/Majkl578/nette-identity-doctrine.git", - "reference": "6d78821908dcf06e276b34eae7a3123d9fe1fb3a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Majkl578/nette-identity-doctrine/zipball/6d78821908dcf06e276b34eae7a3123d9fe1fb3a", - "reference": "6d78821908dcf06e276b34eae7a3123d9fe1fb3a", - "shasum": "" - }, - "require": { - "doctrine/orm": "~2.3", - "nette/di": "~2.2", - "nette/http": "~2.2", - "nette/security": "~2.2", - "php": ">=5.3.2" - }, - "require-dev": { - "kdyby/doctrine": "~2.0", - "nette/bootstrap": "~2.2", - "phpunit/phpunit": "~4.8", - "tracy/tracy": "~2.2" - }, - "type": "nette-addon", - "autoload": { - "psr-4": { - "Majkl578\\NetteAddons\\Doctrine2Identity\\": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Moravec" - } - ], - "description": "Integration of entities implementing IIdentity in Nette 2", - "keywords": [ - "Authentication", - "doctrine", - "identity", - "nette", - "orm", - "security" - ], - "time": "2015-11-27 13:47:40" - }, - { - "name": "nette/application", - "version": "v2.3.7", - "source": { - "type": "git", - "url": "https://github.com/nette/application.git", - "reference": "8e87ae81c2098abd7895bfd96d9fac1cd332abc3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/application/zipball/8e87ae81c2098abd7895bfd96d9fac1cd332abc3", - "reference": "8e87ae81c2098abd7895bfd96d9fac1cd332abc3", - "shasum": "" - }, - "require": { - "nette/component-model": "~2.2", - "nette/http": "~2.2", - "nette/reflection": "~2.2", - "nette/security": "~2.2", - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "latte/latte": "~2.3.0", - "nette/di": "~2.3", - "nette/forms": "~2.2", - "nette/robot-loader": "~2.2", - "nette/tester": "~1.3" - }, - "suggest": { - "latte/latte": "Allows using Latte in templates", - "nette/forms": "Allows to use Nette\\Application\\UI\\Form" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "Nette Application MVC Component", - "homepage": "https://nette.org", - "time": "2015-10-13 14:33:28" - }, - { - "name": "nette/bootstrap", - "version": "v2.3.3", - "source": { - "type": "git", - "url": "https://github.com/nette/bootstrap.git", - "reference": "8e2db45c39a1fa24f88e94c7b2a62ad09e9a306e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/bootstrap/zipball/8e2db45c39a1fa24f88e94c7b2a62ad09e9a306e", - "reference": "8e2db45c39a1fa24f88e94c7b2a62ad09e9a306e", - "shasum": "" - }, - "require": { - "nette/di": "~2.3", - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "latte/latte": "~2.2", - "nette/application": "~2.3", - "nette/caching": "~2.3", - "nette/database": "~2.3", - "nette/forms": "~2.3", - "nette/http": "~2.3", - "nette/mail": "~2.3", - "nette/robot-loader": "~2.2", - "nette/safe-stream": "~2.2", - "nette/security": "~2.3", - "nette/tester": "~1.3", - "tracy/tracy": "~2.3" - }, - "suggest": { - "nette/robot-loader": "to use Configurator::createRobotLoader()", - "tracy/tracy": "to use Configurator::enableDebugger()" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette Bootstrap", - "homepage": "http://nette.org", - "time": "2015-07-11 21:07:11" - }, - { - "name": "nette/caching", - "version": "v2.3.3", - "source": { - "type": "git", - "url": "https://github.com/nette/caching.git", - "reference": "d4be13806d70c02d53b72cc63e93de6cf813f50f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/caching/zipball/d4be13806d70c02d53b72cc63e93de6cf813f50f", - "reference": "d4be13806d70c02d53b72cc63e93de6cf813f50f", - "shasum": "" - }, - "require": { - "nette/finder": "~2.2", - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "latte/latte": "~2.3.0", - "nette/di": "~2.3", - "nette/tester": "~1.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette Caching Component", - "homepage": "http://nette.org", - "time": "2015-07-11 21:09:42" - }, - { - "name": "nette/component-model", - "version": "v2.2.4", - "source": { - "type": "git", - "url": "https://github.com/nette/component-model.git", - "reference": "07bce436051fd92d084642ce7a47f00045e0d1e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/component-model/zipball/07bce436051fd92d084642ce7a47f00045e0d1e5", - "reference": "07bce436051fd92d084642ce7a47f00045e0d1e5", - "shasum": "" - }, - "require": { - "nette/utils": "^2.3.5", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/tester": "~1.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "Nette Component Model", - "homepage": "https://nette.org", - "time": "2015-10-06 17:54:05" - }, - { - "name": "nette/di", - "version": "v2.3.6", - "source": { - "type": "git", - "url": "https://github.com/nette/di.git", - "reference": "efa1d13f016b58b4a9200802c9c5b14d10d72e85" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/di/zipball/efa1d13f016b58b4a9200802c9c5b14d10d72e85", - "reference": "efa1d13f016b58b4a9200802c9c5b14d10d72e85", - "shasum": "" - }, - "require": { - "nette/neon": "^2.3.3", - "nette/php-generator": "^2.3.3", - "nette/utils": "~2.3", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/tester": "~1.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette Dependency Injection Component", - "homepage": "http://nette.org", - "time": "2015-09-14 18:18:24" - }, - { - "name": "nette/finder", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/nette/finder.git", - "reference": "38f803a03f4cddf352e28af70294c71f7026e516" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/finder/zipball/38f803a03f4cddf352e28af70294c71f7026e516", - "reference": "38f803a03f4cddf352e28af70294c71f7026e516", - "shasum": "" - }, - "require": { - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/tester": "~1.4" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette Finder: Files Searching", - "homepage": "http://nette.org", - "time": "2015-07-11 21:13:50" - }, - { - "name": "nette/forms", - "version": "v2.3.6", - "source": { - "type": "git", - "url": "https://github.com/nette/forms.git", - "reference": "5e07a7b7180e5e88db9d44e12f1677e36b4f164b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/forms/zipball/5e07a7b7180e5e88db9d44e12f1677e36b4f164b", - "reference": "5e07a7b7180e5e88db9d44e12f1677e36b4f164b", - "shasum": "" - }, - "require": { - "nette/component-model": "~2.2", - "nette/http": "~2.2", - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "latte/latte": "~2.3.2", - "nette/di": "~2.3", - "nette/tester": "~1.3", - "tracy/tracy": "~2.2" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "Nette Forms: greatly facilitates web forms", - "homepage": "https://nette.org", - "time": "2015-10-19 01:41:55" - }, - { - "name": "nette/http", - "version": "v2.3.3", - "source": { - "type": "git", - "url": "https://github.com/nette/http.git", - "reference": "ff2e4608391bca2444df9af6eaf8666ac853eb02" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/http/zipball/ff2e4608391bca2444df9af6eaf8666ac853eb02", - "reference": "ff2e4608391bca2444df9af6eaf8666ac853eb02", - "shasum": "" - }, - "require": { - "nette/utils": "~2.2, >=2.2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/di": "~2.3", - "nette/tester": "~1.4" - }, - "suggest": { - "ext-fileinfo": "to detect type of uploaded files" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette HTTP Component", - "homepage": "http://nette.org", - "time": "2015-07-19 16:17:50" - }, - { - "name": "nette/mail", - "version": "v2.3.3", - "source": { - "type": "git", - "url": "https://github.com/nette/mail.git", - "reference": "4ea303d96c6a80ffe357baf59d387f4fe2cfd412" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/mail/zipball/4ea303d96c6a80ffe357baf59d387f4fe2cfd412", - "reference": "4ea303d96c6a80ffe357baf59d387f4fe2cfd412", - "shasum": "" - }, - "require": { - "ext-iconv": "*", - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/di": "~2.3", - "nette/tester": "~1.3" - }, - "suggest": { - "ext-fileinfo": "to detect type of attached files" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "Nette Mail: Sending E-mails", - "homepage": "https://nette.org", - "time": "2015-10-05 12:58:01" - }, - { - "name": "nette/neon", - "version": "v2.3.3", - "source": { - "type": "git", - "url": "https://github.com/nette/neon.git", - "reference": "12bbb0e85ba8521dd291f4df0fe20a1b79aae32c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/neon/zipball/12bbb0e85ba8521dd291f4df0fe20a1b79aae32c", - "reference": "12bbb0e85ba8521dd291f4df0fe20a1b79aae32c", - "shasum": "" - }, - "require": { - "ext-iconv": "*", - "php": ">=5.3.1" - }, - "require-dev": { - "nette/tester": "~1.4" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette NEON: parser & generator for Nette Object Notation", - "homepage": "http://ne-on.org", - "time": "2015-08-22 15:23:30" - }, - { - "name": "nette/php-generator", - "version": "v2.3.4", - "source": { - "type": "git", - "url": "https://github.com/nette/php-generator.git", - "reference": "846028e9d885d2d8ec60823d995e1291bbe3eb69" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/php-generator/zipball/846028e9d885d2d8ec60823d995e1291bbe3eb69", - "reference": "846028e9d885d2d8ec60823d995e1291bbe3eb69", - "shasum": "" - }, - "require": { - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/tester": "~1.4" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "Nette PHP Generator", - "homepage": "https://nette.org", - "time": "2015-10-09 14:34:13" - }, - { - "name": "nette/reflection", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/nette/reflection.git", - "reference": "9c2ed2a29f1f58125a0f19ffc987812d6b17d3e6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/reflection/zipball/9c2ed2a29f1f58125a0f19ffc987812d6b17d3e6", - "reference": "9c2ed2a29f1f58125a0f19ffc987812d6b17d3e6", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "nette/caching": "~2.2", - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/di": "~2.3", - "nette/tester": "~1.4" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette PHP Reflection Component", - "homepage": "http://nette.org", - "time": "2015-07-11 21:34:53" - }, - { - "name": "nette/robot-loader", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/nette/robot-loader.git", - "reference": "69331d359bbc9e5f911c12b82187cac914d983fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/robot-loader/zipball/69331d359bbc9e5f911c12b82187cac914d983fb", - "reference": "69331d359bbc9e5f911c12b82187cac914d983fb", - "shasum": "" - }, - "require": { - "nette/caching": "~2.2", - "nette/finder": "~2.3", - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/tester": "~1.4" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette RobotLoader: comfortable autoloading", - "homepage": "http://nette.org", - "time": "2015-07-11 21:20:57" - }, - { - "name": "nette/safe-stream", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/nette/safe-stream.git", - "reference": "bf30db367b51a0932c44dcb9a378927644d48b2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/safe-stream/zipball/bf30db367b51a0932c44dcb9a378927644d48b2e", - "reference": "bf30db367b51a0932c44dcb9a378927644d48b2e", - "shasum": "" - }, - "require": { - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/tester": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "files": [ - "src/loader.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette SafeStream: Atomic Operations", - "homepage": "http://nette.org", - "time": "2015-07-11 20:59:15" - }, - { - "name": "nette/security", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/nette/security.git", - "reference": "744264a42b506d63009d7e3853ed72b04c99e964" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/security/zipball/744264a42b506d63009d7e3853ed72b04c99e964", - "reference": "744264a42b506d63009d7e3853ed72b04c99e964", - "shasum": "" - }, - "require": { - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/di": "~2.3", - "nette/http": "~2.3", - "nette/tester": "~1.4" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette Security: Access Control Component", - "homepage": "http://nette.org", - "time": "2015-07-11 21:22:53" - }, - { - "name": "nette/utils", - "version": "v2.3.6", - "source": { - "type": "git", - "url": "https://github.com/nette/utils.git", - "reference": "c9dfaec788eb65d5ef10cefed0ae63bc76febaa8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/c9dfaec788eb65d5ef10cefed0ae63bc76febaa8", - "reference": "c9dfaec788eb65d5ef10cefed0ae63bc76febaa8", - "shasum": "" - }, - "require": { - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/tester": "~1.0" - }, - "suggest": { - "ext-gd": "to use Image", - "ext-iconv": "to use Strings::webalize() and toAscii()", - "ext-intl": "for script transliteration in Strings::webalize() and toAscii()", - "ext-mbstring": "to use Strings::lower() etc..." - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "Nette Utility Classes", - "homepage": "https://nette.org", - "time": "2015-10-05 12:18:24" - }, - { - "name": "nextras/static-router", - "version": "v1.0.1", - "source": { - "type": "git", - "url": "https://github.com/nextras/static-router.git", - "reference": "cf4155820b9f2d2cb98705ce5538feb22226e8cc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nextras/static-router/zipball/cf4155820b9f2d2cb98705ce5538feb22226e8cc", - "reference": "cf4155820b9f2d2cb98705ce5538feb22226e8cc", - "shasum": "" - }, - "require": { - "nette/application": "~2.2", - "php": ">=5.3" - }, - "require-dev": { - "nette/tester": "~1.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Nextras\\Routing\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nextras Community", - "homepage": "https://github.com/nextras/static-router/graphs/contributors" - } - ], - "description": "Simple static router for Nette Framework", - "homepage": "https://github.com/nextras/static-router", - "keywords": [ - "nette", - "nextras", - "router" - ], - "time": "2015-06-13 09:05:20" - }, - { - "name": "symfony/console", - "version": "v2.7.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "16bb1cb86df43c90931df65f529e7ebd79636750" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/16bb1cb86df43c90931df65f529e7ebd79636750", - "reference": "16bb1cb86df43c90931df65f529e7ebd79636750", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/event-dispatcher": "~2.1", - "symfony/process": "~2.1" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "https://symfony.com", - "time": "2015-11-18 09:54:26" - }, - { - "name": "tracy/tracy", - "version": "v2.3.6", - "source": { - "type": "git", - "url": "https://github.com/nette/tracy.git", - "reference": "79831c75b6f48fcb897d25ccae5deec358cb2142" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/tracy/zipball/79831c75b6f48fcb897d25ccae5deec358cb2142", - "reference": "79831c75b6f48fcb897d25ccae5deec358cb2142", - "shasum": "" - }, - "require": { - "php": ">=5.3.1" - }, - "require-dev": { - "nette/di": "~2.3", - "nette/tester": "~1.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src" - ], - "files": [ - "src/shortcuts.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "Tracy: useful PHP debugger", - "homepage": "https://tracy.nette.org", - "keywords": [ - "debug", - "debugger", - "nette" - ], - "time": "2015-10-28 23:49:21" - } - ], - "packages-dev": [ - { - "name": "codeception/codeception", - "version": "2.1.4", - "source": { - "type": "git", - "url": "https://github.com/Codeception/Codeception.git", - "reference": "6a812e8a0d1b1db939a29b4dc14cb398b21b6112" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/6a812e8a0d1b1db939a29b4dc14cb398b21b6112", - "reference": "6a812e8a0d1b1db939a29b4dc14cb398b21b6112", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-mbstring": "*", - "facebook/webdriver": ">=1.0.1", - "guzzlehttp/guzzle": ">=4.1.4 <7.0", - "guzzlehttp/psr7": "~1.0", - "php": ">=5.4.0", - "phpunit/phpunit": "~4.8.0", - "symfony/browser-kit": "~2.4", - "symfony/console": "~2.4", - "symfony/css-selector": "~2.4", - "symfony/dom-crawler": "~2.4,!=2.4.5", - "symfony/event-dispatcher": "~2.4", - "symfony/finder": "~2.4", - "symfony/yaml": "~2.4" - }, - "require-dev": { - "codeception/specify": "~0.3", - "facebook/php-sdk-v4": "~4.0", - "flow/jsonpath": "~0.2", - "monolog/monolog": "~1.8", - "pda/pheanstalk": "~2.0", - "videlalvaro/php-amqplib": "~2.4" - }, - "suggest": { - "codeception/phpbuiltinserver": "Extension to start and stop PHP built-in web server for your tests", - "codeception/specify": "BDD-style code blocks", - "codeception/verify": "BDD-style assertions", - "monolog/monolog": "Log test steps", - "phpseclib/phpseclib": "Extension required to use the SFTP option in the FTP Module." - }, - "bin": [ - "codecept" - ], - "type": "library", - "extra": { - "branch-alias": [] - }, - "autoload": { - "psr-4": { - "Codeception\\": "src\\Codeception", - "Codeception\\Extension\\": "ext" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Bodnarchuk", - "email": "davert@mail.ua", - "homepage": "http://codegyre.com" - } - ], - "description": "BDD-style testing framework", - "homepage": "http://codeception.com/", - "keywords": [ - "BDD", - "TDD", - "acceptance testing", - "functional testing", - "unit testing" - ], - "time": "2015-11-12 03:57:06" - }, - { - "name": "facebook/webdriver", - "version": "1.0.4", - "source": { - "type": "git", - "url": "https://github.com/facebook/php-webdriver.git", - "reference": "a6e209a309bf7cd71acf15476f40b11a25d5a79d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/a6e209a309bf7cd71acf15476f40b11a25d5a79d", - "reference": "a6e209a309bf7cd71acf15476f40b11a25d5a79d", - "shasum": "" - }, - "require": { - "php": ">=5.3.19" - }, - "require-dev": { - "phpunit/phpunit": "4.6.*" - }, - "suggest": { - "phpdocumentor/phpdocumentor": "2.*" - }, - "type": "library", - "autoload": { - "psr-4": { - "Facebook\\WebDriver\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "A PHP client for WebDriver", - "homepage": "https://github.com/facebook/php-webdriver", - "keywords": [ - "facebook", - "php", - "selenium", - "webdriver" - ], - "time": "2015-11-03 22:17:22" - }, - { - "name": "guzzlehttp/guzzle", - "version": "6.1.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "c6851d6e48f63b69357cbfa55bca116448140e0c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/c6851d6e48f63b69357cbfa55bca116448140e0c", - "reference": "c6851d6e48f63b69357cbfa55bca116448140e0c", - "shasum": "" - }, - "require": { - "guzzlehttp/promises": "~1.0", - "guzzlehttp/psr7": "~1.1", - "php": ">=5.5.0" - }, - "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "~4.0", - "psr/log": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.1-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" - ], - "time": "2015-11-23 00:47:50" - }, - { - "name": "guzzlehttp/promises", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "b1e1c0d55f8083c71eda2c28c12a228d708294ea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/b1e1c0d55f8083c71eda2c28c12a228d708294ea", - "reference": "b1e1c0d55f8083c71eda2c28c12a228d708294ea", - "shasum": "" - }, - "require": { - "php": ">=5.5.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "time": "2015-10-15 22:28:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "4d0bdbe1206df7440219ce14c972aa57cc5e4982" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/4d0bdbe1206df7440219ce14c972aa57cc5e4982", - "reference": "4d0bdbe1206df7440219ce14c972aa57cc5e4982", - "shasum": "" - }, - "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "PSR-7 message implementation", - "keywords": [ - "http", - "message", - "stream", - "uri" - ], - "time": "2015-11-03 01:34:55" - }, - { - "name": "nette/tester", - "version": "v1.6.1", - "source": { - "type": "git", - "url": "https://github.com/nette/tester.git", - "reference": "b0f312e7ab9a70bbd5c92568e2a20dd46be9a529" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/tester/zipball/b0f312e7ab9a70bbd5c92568e2a20dd46be9a529", - "reference": "b0f312e7ab9a70bbd5c92568e2a20dd46be9a529", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "bin": [ - "src/tester" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "An easy-to-use PHP unit testing framework.", - "homepage": "https://tester.nette.org", - "keywords": [ - "nette", - "testing", - "unit" - ], - "time": "2015-10-26 05:38:30" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ], - "time": "2015-02-03 12:10:50" - }, - { - "name": "phpspec/prophecy", - "version": "v1.5.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4745ded9307786b730d7a60df5cb5a6c43cf95f7", - "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "phpdocumentor/reflection-docblock": "~2.0", - "sebastian/comparator": "~1.1" - }, - "require-dev": { - "phpspec/phpspec": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "psr-0": { - "Prophecy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "time": "2015-08-13 10:07:40" - }, - { - "name": "phpunit/php-code-coverage", - "version": "2.2.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "phpunit/php-file-iterator": "~1.3", - "phpunit/php-text-template": "~1.2", - "phpunit/php-token-stream": "~1.3", - "sebastian/environment": "^1.3.2", - "sebastian/version": "~1.0" - }, - "require-dev": { - "ext-xdebug": ">=2.1.4", - "phpunit/phpunit": "~4" - }, - "suggest": { - "ext-dom": "*", - "ext-xdebug": ">=2.2.1", - "ext-xmlwriter": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "time": "2015-10-06 15:47:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "1.4.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "time": "2015-06-21 13:08:43" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "time": "2015-06-21 13:50:34" - }, - { - "name": "phpunit/php-timer", - "version": "1.0.7", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b", - "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "time": "2015-06-21 08:01:12" - }, - { - "name": "phpunit/php-token-stream", - "version": "1.4.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", - "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "time": "2015-09-15 10:49:45" - }, - { - "name": "phpunit/phpunit", - "version": "4.8.18", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "fa33d4ad96481b91df343d83e8c8aabed6b1dfd3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fa33d4ad96481b91df343d83e8c8aabed6b1dfd3", - "reference": "fa33d4ad96481b91df343d83e8c8aabed6b1dfd3", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=5.3.3", - "phpspec/prophecy": "^1.3.1", - "phpunit/php-code-coverage": "~2.1", - "phpunit/php-file-iterator": "~1.4", - "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": ">=1.0.6", - "phpunit/phpunit-mock-objects": "~2.3", - "sebastian/comparator": "~1.1", - "sebastian/diff": "~1.2", - "sebastian/environment": "~1.3", - "sebastian/exporter": "~1.2", - "sebastian/global-state": "~1.0", - "sebastian/version": "~1.0", - "symfony/yaml": "~2.1|~3.0" - }, - "suggest": { - "phpunit/php-invoker": "~1.1" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.8.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "time": "2015-11-11 11:32:49" - }, - { - "name": "phpunit/phpunit-mock-objects", - "version": "2.3.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": ">=5.3.3", - "phpunit/php-text-template": "~1.2", - "sebastian/exporter": "~1.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "suggest": { - "ext-soap": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", - "keywords": [ - "mock", - "xunit" - ], - "time": "2015-10-02 06:51:40" - }, - { - "name": "psr/http-message", - "version": "1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", - "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "time": "2015-05-04 20:22:00" - }, - { - "name": "sebastian/comparator", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/diff": "~1.2", - "sebastian/exporter": "~1.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "http://www.github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "time": "2015-07-26 15:48:44" - }, - { - "name": "sebastian/diff", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3", - "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "http://www.github.com/sebastianbergmann/diff", - "keywords": [ - "diff" - ], - "time": "2015-02-22 15:13:53" - }, - { - "name": "sebastian/environment", - "version": "1.3.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6324c907ce7a52478eeeaede764f48733ef5ae44", - "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "time": "2015-08-03 06:14:51" - }, - { - "name": "sebastian/exporter", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "7ae5513327cb536431847bcc0c10edba2701064e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e", - "reference": "7ae5513327cb536431847bcc0c10edba2701064e", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/recursion-context": "~1.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "time": "2015-06-21 07:55:53" - }, - { - "name": "sebastian/global-state", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "time": "2015-10-12 03:26:01" - }, - { - "name": "sebastian/recursion-context", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "994d4a811bafe801fb06dccbee797863ba2792ba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/994d4a811bafe801fb06dccbee797863ba2792ba", - "reference": "994d4a811bafe801fb06dccbee797863ba2792ba", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2015-06-21 08:04:50" - }, - { - "name": "sebastian/version", - "version": "1.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "shasum": "" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "time": "2015-06-21 13:59:46" - }, - { - "name": "symfony/browser-kit", - "version": "v2.7.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/browser-kit.git", - "reference": "bd28847ea2193916074c7b11d4fdd78570049694" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/bd28847ea2193916074c7b11d4fdd78570049694", - "reference": "bd28847ea2193916074c7b11d4fdd78570049694", - "shasum": "" - }, - "require": { - "php": ">=5.3.9", - "symfony/dom-crawler": "~2.0,>=2.0.5" - }, - "require-dev": { - "symfony/css-selector": "~2.0,>=2.0.5", - "symfony/process": "~2.3.34|~2.7,>=2.7.6" - }, - "suggest": { - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\BrowserKit\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony BrowserKit Component", - "homepage": "https://symfony.com", - "time": "2015-11-02 20:20:53" - }, - { - "name": "symfony/css-selector", - "version": "v2.7.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "abb47717fb88aebd9437da2fc8bb01a50a36679f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/abb47717fb88aebd9437da2fc8bb01a50a36679f", - "reference": "abb47717fb88aebd9437da2fc8bb01a50a36679f", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\CssSelector\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony CssSelector Component", - "homepage": "https://symfony.com", - "time": "2015-10-30 20:10:21" - }, - { - "name": "symfony/dom-crawler", - "version": "v2.7.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/dom-crawler.git", - "reference": "b33593cbfe1d81b50d48353f338aca76a08658d8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b33593cbfe1d81b50d48353f338aca76a08658d8", - "reference": "b33593cbfe1d81b50d48353f338aca76a08658d8", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "require-dev": { - "symfony/css-selector": "~2.3" - }, - "suggest": { - "symfony/css-selector": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\DomCrawler\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony DomCrawler Component", - "homepage": "https://symfony.com", - "time": "2015-11-02 20:20:53" - }, - { - "name": "symfony/event-dispatcher", - "version": "v2.7.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "7e2f9c31645680026c2372edf66f863fc7757af5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7e2f9c31645680026c2372edf66f863fc7757af5", - "reference": "7e2f9c31645680026c2372edf66f863fc7757af5", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~2.0,>=2.0.5", - "symfony/dependency-injection": "~2.6", - "symfony/expression-language": "~2.6", - "symfony/stopwatch": "~2.3" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony EventDispatcher Component", - "homepage": "https://symfony.com", - "time": "2015-10-30 20:10:21" - }, - { - "name": "symfony/finder", - "version": "v2.7.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "a06a0c0ff7db3736a50d530c908cca547bf13da9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a06a0c0ff7db3736a50d530c908cca547bf13da9", - "reference": "a06a0c0ff7db3736a50d530c908cca547bf13da9", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Finder Component", - "homepage": "https://symfony.com", - "time": "2015-10-30 20:10:21" - }, - { - "name": "symfony/yaml", - "version": "v2.7.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "4cfcd7a9fceba662b3c036b7d9a91f6197af046c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4cfcd7a9fceba662b3c036b7d9a91f6197af046c", - "reference": "4cfcd7a9fceba662b3c036b7d9a91f6197af046c", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com", - "time": "2015-11-18 13:41:01" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": { - "majkl578/nette-identity-doctrine": 5 - }, - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">= 5.4.0" - }, - "platform-dev": [] -} diff --git a/nette/doctrine/notejam/log/.gitignore b/nette/doctrine/notejam/log/.gitignore deleted file mode 100644 index d6b7ef32c..000000000 --- a/nette/doctrine/notejam/log/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/nette/doctrine/notejam/src/Notejam/Http/RouterFactory.php b/nette/doctrine/notejam/src/Notejam/Http/RouterFactory.php deleted file mode 100644 index d3a6d7584..000000000 --- a/nette/doctrine/notejam/src/Notejam/Http/RouterFactory.php +++ /dev/null @@ -1,40 +0,0 @@ - 'signup', - 'User:signIn' => 'signin', - 'User:signOut' => 'signout', - 'User:forgottenPassword' => 'forgot-password', - 'User:settings' => 'settings', - ]); - - $router[] = new Route('pads/[/]', 'Pad:detail'); - $router[] = new Route('pads[/]', 'Pad:default'); - - $router[] = new Route('notes/[/]', 'Note:detail'); - $router[] = new Route('notes[/]', 'Note:'); - $router[] = new Route('[/]', 'Note:default'); - - return $router; - } - -} diff --git a/nette/doctrine/notejam/src/Notejam/Notes/Note.php b/nette/doctrine/notejam/src/Notejam/Notes/Note.php deleted file mode 100644 index 15f73eb96..000000000 --- a/nette/doctrine/notejam/src/Notejam/Notes/Note.php +++ /dev/null @@ -1,168 +0,0 @@ -user = $user; - } - - - - /** - * @param string $name - * @return Note - */ - public function setName($name) - { - $this->name = $name; - return $this; - } - - - - /** - * @return string - */ - public function getName() - { - return $this->name; - } - - - - /** - * @param string $text - * @return Note - */ - public function setText($text) - { - $this->text = $text; - return $this; - } - - - - /** - * @return string - */ - public function getText() - { - return $this->text; - } - - - - /** - * @return User - */ - public function getUser() - { - return $this->user; - } - - - - /** - * @return Pad - */ - public function getPad() - { - return $this->pad; - } - - - - /** - * @param Pad pad - * @return Note - */ - public function setPad(Pad $pad = null) - { - $this->pad = $pad; - return $this; - } - - - - /** - * @ORM\PrePersist - * @ORM\PreUpdate - */ - public function setUpdatedAt() - { - $this->updatedAt = new \DateTime('now'); - } - - - - /** - * @return \Datetime - */ - public function getUpdatedAt() - { - return clone $this->updatedAt; - } - - - - /** - * @return string - */ - public function __toString() - { - return $this->getName(); - } -} diff --git a/nette/doctrine/notejam/src/Notejam/Notes/NoteRepository.php b/nette/doctrine/notejam/src/Notejam/Notes/NoteRepository.php deleted file mode 100644 index 913e66baf..000000000 --- a/nette/doctrine/notejam/src/Notejam/Notes/NoteRepository.php +++ /dev/null @@ -1,34 +0,0 @@ - array('name' => 'ASC'), - '-name' => array('name' => 'DESC'), - 'updated_at' => array('updatedAt' => 'ASC'), - '-updated_at' => array('updatedAt' => 'DESC') - ]; - - return isset($ordering[$orderBy]) ? $ordering[$orderBy] : $ordering['name']; - } - -} diff --git a/nette/doctrine/notejam/src/Notejam/Pads/Pad.php b/nette/doctrine/notejam/src/Notejam/Pads/Pad.php deleted file mode 100644 index cdeec9b1a..000000000 --- a/nette/doctrine/notejam/src/Notejam/Pads/Pad.php +++ /dev/null @@ -1,105 +0,0 @@ -user = $user; - $this->notes = new ArrayCollection(); - } - - - - /** - * @param string $name - * @return Pad - */ - public function setName($name) - { - $this->name = $name; - return $this; - } - - - - /** - * @return string - */ - public function getName() - { - return $this->name; - } - - - - /** - * @return User - */ - public function getUser() - { - return $this->user; - } - - - - /** - * @param User user - * @return Pad - */ - public function setUser($user) - { - $this->user = $user; - return $this; - } - - - - /** - * @return string - */ - public function __toString() - { - return $this->getName(); - } - -} diff --git a/nette/doctrine/notejam/src/Notejam/Pads/PadRepository.php b/nette/doctrine/notejam/src/Notejam/Pads/PadRepository.php deleted file mode 100644 index 12b36c3cf..000000000 --- a/nette/doctrine/notejam/src/Notejam/Pads/PadRepository.php +++ /dev/null @@ -1,16 +0,0 @@ -setRenderer(new FormRenderer()); - - return $form; - } - -} diff --git a/nette/doctrine/notejam/src/Notejam/UI/FormRenderer.php b/nette/doctrine/notejam/src/Notejam/UI/FormRenderer.php deleted file mode 100644 index 8984181a6..000000000 --- a/nette/doctrine/notejam/src/Notejam/UI/FormRenderer.php +++ /dev/null @@ -1,29 +0,0 @@ -wrappers['error']['container'] = 'ul class=errorlist'; - $this->wrappers['control']['errorcontainer'] = 'ul class=errorlist'; - $this->wrappers['control']['erroritem'] = 'li'; - - // remove rendering in table - $this->wrappers['controls']['container'] = NULL; - $this->wrappers['pair']['container'] = NULL; - $this->wrappers['control']['container'] = NULL; - $this->wrappers['label']['container'] = NULL; - } - -} diff --git a/nette/doctrine/notejam/src/Notejam/Users/Authenticator.php b/nette/doctrine/notejam/src/Notejam/Users/Authenticator.php deleted file mode 100644 index 6634fdd2a..000000000 --- a/nette/doctrine/notejam/src/Notejam/Users/Authenticator.php +++ /dev/null @@ -1,49 +0,0 @@ -userRepository = $userRepository; - } - - - - /** - * Using the given email finds the user and verifies it's password. - * If the user is not fund or if the password is wrong, it throws. - * - * @param array $credentials - * @throws AuthenticationException - * @return User|NULL - */ - public function authenticate(array $credentials) - { - list($username, $password) = $credentials; - - if (!$user = $this->userRepository->findOneBy(['email' => $username])) { - throw new AuthenticationException("User '$username' not found.", self::IDENTITY_NOT_FOUND); - - } elseif (!$user->verifyPassword($password)) { - throw new AuthenticationException('Invalid password.', self::INVALID_CREDENTIAL); - } - - return $user; - } - -} diff --git a/nette/doctrine/notejam/src/Notejam/Users/User.php b/nette/doctrine/notejam/src/Notejam/Users/User.php deleted file mode 100644 index d1348a90c..000000000 --- a/nette/doctrine/notejam/src/Notejam/Users/User.php +++ /dev/null @@ -1,162 +0,0 @@ -email = $email; - $this->password = Passwords::hash($password); - $this->active = true; - - $this->pads = new ArrayCollection(); - $this->notes = new ArrayCollection(); - } - - - - /** - * List of string roles of the user. - * - * @return array - */ - public function getRoles() - { - return array('user'); - } - - - - /** - * @return string - */ - public function getEmail() - { - return $this->email; - } - - - - /** - * @return boolean - */ - public function isActive() - { - return $this->active; - } - - - - /** - * Changes the password, only if the right original password is provided. - * - * @param string $original - * @param string $password - * @throws InvalidPasswordException - */ - public function changePassword($original, $password) - { - if (!$this->verifyPassword($original)) { - throw new InvalidPasswordException('Wrong password'); - } - - $this->password = Passwords::hash($password); - } - - - - /** - * Generates a random password that can be used when the user forgots the orignal. - * In real app, this shouldn't overwrite the current password, - * it should be in another field, or even better a whole new table. - * - * @return string - */ - public function generateRandomPassword() - { - $password = Random::generate(10); - $this->password = Passwords::hash($password); - return $password; - } - - - - /** - * Verifies if given password is the same as the original hashed password. - * - * @param string $password - * @return bool - */ - public function verifyPassword($password) - { - return Passwords::verify($password, $this->password); - } - - - - /** - * If the password was hashed with too small cost, this method can tell you that, - * so you can regenerate the hash with higher cost. - * - * @return bool - */ - public function passwordNeedsRehash() - { - return Passwords::needsRehash($this->password); - } - -} diff --git a/nette/doctrine/notejam/src/Notejam/Users/UserRepository.php b/nette/doctrine/notejam/src/Notejam/Users/UserRepository.php deleted file mode 100644 index 50ce70d6e..000000000 --- a/nette/doctrine/notejam/src/Notejam/Users/UserRepository.php +++ /dev/null @@ -1,16 +0,0 @@ -amOnPage('/signin'); - $this->see('Sign in'); - $this->fillField("Email", $email); - $this->fillField("Password", $password); - $this->click('Sign in', ['css' => 'form.sign-in']); - } - -} diff --git a/nette/doctrine/notejam/tests/_support/FunctionalTester.php b/nette/doctrine/notejam/tests/_support/FunctionalTester.php deleted file mode 100644 index 7e888f8b2..000000000 --- a/nette/doctrine/notejam/tests/_support/FunctionalTester.php +++ /dev/null @@ -1,26 +0,0 @@ -wantTo('see note can be successfully created'); -$I->testLogin(); -$I->amOnPage('/notes/create'); -$I->fillField('Name', 'Example note'); -$I->fillField('Text', 'Lorem ipsum'); -$I->selectOption('Pad', 1); -$I->click('Save'); -$I->see('Example note'); diff --git a/nette/doctrine/notejam/tests/acceptance/CreateNoteFailCept.php b/nette/doctrine/notejam/tests/acceptance/CreateNoteFailCept.php deleted file mode 100644 index 4f768ee29..000000000 --- a/nette/doctrine/notejam/tests/acceptance/CreateNoteFailCept.php +++ /dev/null @@ -1,9 +0,0 @@ -wantTo('see note can not be created without required fields'); -$I->testLogin(); -$I->amOnPage('/notes/create'); -$I->click('Save'); -$I->seeInCurrentUrl('/notes/create'); -$I->see('Name is required'); -$I->see('Text is required'); diff --git a/nette/doctrine/notejam/tests/acceptance/CreatePadCept.php b/nette/doctrine/notejam/tests/acceptance/CreatePadCept.php deleted file mode 100644 index 4926950ba..000000000 --- a/nette/doctrine/notejam/tests/acceptance/CreatePadCept.php +++ /dev/null @@ -1,8 +0,0 @@ -wantTo('see pad can be successfully created'); -$I->testLogin(); -$I->amOnPage('/pads/create'); -$I->fillField('Name', 'Example pad'); -$I->click('Save'); -$I->see('Example pad'); diff --git a/nette/doctrine/notejam/tests/acceptance/CreatePadFailCept.php b/nette/doctrine/notejam/tests/acceptance/CreatePadFailCept.php deleted file mode 100644 index b8f61bbfa..000000000 --- a/nette/doctrine/notejam/tests/acceptance/CreatePadFailCept.php +++ /dev/null @@ -1,9 +0,0 @@ -wantTo('see pad can not be created without required fields'); -$I->testLogin(); -$I->amOnPage('/pads/create'); -$I->click('Save'); -$I->dontSee('Example pad'); -$I->seeInCurrentUrl('/pads/create'); -$I->see('Name is required'); diff --git a/nette/doctrine/notejam/tests/acceptance/DeleteNoteCept.php b/nette/doctrine/notejam/tests/acceptance/DeleteNoteCept.php deleted file mode 100644 index fb718c70c..000000000 --- a/nette/doctrine/notejam/tests/acceptance/DeleteNoteCept.php +++ /dev/null @@ -1,7 +0,0 @@ -wantTo('see note can be successfully deleted'); -$I->testLogin(); -$I->amOnPage('/notes/1/delete'); -$I->click('Yes, I want to delete this note'); -$I->dontSee('Note 1'); diff --git a/nette/doctrine/notejam/tests/acceptance/DeleteOtherOwnersNoteCept.php b/nette/doctrine/notejam/tests/acceptance/DeleteOtherOwnersNoteCept.php deleted file mode 100644 index f9f262da0..000000000 --- a/nette/doctrine/notejam/tests/acceptance/DeleteOtherOwnersNoteCept.php +++ /dev/null @@ -1,6 +0,0 @@ -wantTo('see note can not be deleted by not an owner'); -$I->testLogin(); -$I->amOnPage('/notes/5/delete'); -$I->dontSee('Yes, I want to delete this note'); diff --git a/nette/doctrine/notejam/tests/acceptance/DeleteOtherOwnersPadCept.php b/nette/doctrine/notejam/tests/acceptance/DeleteOtherOwnersPadCept.php deleted file mode 100644 index 531887afe..000000000 --- a/nette/doctrine/notejam/tests/acceptance/DeleteOtherOwnersPadCept.php +++ /dev/null @@ -1,6 +0,0 @@ -wantTo('see pad can not be deleted by not an owner'); -$I->testLogin(); -$I->amOnPage('/pads/4/delete'); -$I->dontSee('Yes, I want to delete this pad'); diff --git a/nette/doctrine/notejam/tests/acceptance/DeletePadCept.php b/nette/doctrine/notejam/tests/acceptance/DeletePadCept.php deleted file mode 100644 index f86354c75..000000000 --- a/nette/doctrine/notejam/tests/acceptance/DeletePadCept.php +++ /dev/null @@ -1,7 +0,0 @@ -wantTo('see pad can be successfully deleted'); -$I->testLogin(); -$I->amOnPage('/pads/1/delete'); -$I->click('Yes, I want to delete this pad'); -$I->dontSee('Pad 1'); diff --git a/nette/doctrine/notejam/tests/acceptance/EditNoteCept.php b/nette/doctrine/notejam/tests/acceptance/EditNoteCept.php deleted file mode 100644 index 9012a2e35..000000000 --- a/nette/doctrine/notejam/tests/acceptance/EditNoteCept.php +++ /dev/null @@ -1,12 +0,0 @@ -wantTo('see note can be successfully edited'); -$I->testLogin(); -$I->amOnPage('/notes/1/edit'); -$I->fillField('Name', 'Note 1 - edited'); -$I->fillField('Text', 'Lorem ipsum - edited'); -$I->selectOption('Pad', 1); -$I->click('Save'); -$I->see('Note 1 - edited'); -$I->amOnPage('/pads/1'); -$I->see('Note 1 - edited'); diff --git a/nette/doctrine/notejam/tests/acceptance/EditNoteFailCept.php b/nette/doctrine/notejam/tests/acceptance/EditNoteFailCept.php deleted file mode 100644 index f921f1475..000000000 --- a/nette/doctrine/notejam/tests/acceptance/EditNoteFailCept.php +++ /dev/null @@ -1,11 +0,0 @@ -wantTo('see note can not be edited without required fields'); -$I->testLogin(); -$I->amOnPage('/notes/1/edit'); -$I->fillField('Name', ''); -$I->fillField('Text', ''); -$I->click('Save'); -$I->seeInCurrentUrl('/notes/1/edit'); -$I->see('Name is required'); -$I->see('Text is required'); diff --git a/nette/doctrine/notejam/tests/acceptance/EditOtherOwnersNoteCept.php b/nette/doctrine/notejam/tests/acceptance/EditOtherOwnersNoteCept.php deleted file mode 100644 index 23d00f608..000000000 --- a/nette/doctrine/notejam/tests/acceptance/EditOtherOwnersNoteCept.php +++ /dev/null @@ -1,6 +0,0 @@ -wantTo('see note can not be edited by not an owner'); -$I->testLogin(); -$I->amOnPage('/notes/5/edit'); -$I->dontSee('Save', 'input'); diff --git a/nette/doctrine/notejam/tests/acceptance/EditOtherOwnersPadCept.php b/nette/doctrine/notejam/tests/acceptance/EditOtherOwnersPadCept.php deleted file mode 100644 index 227f97916..000000000 --- a/nette/doctrine/notejam/tests/acceptance/EditOtherOwnersPadCept.php +++ /dev/null @@ -1,6 +0,0 @@ -wantTo('see pad can not be edited by not an owner'); -$I->testLogin(); -$I->amOnPage('/pads/4/edit'); -$I->dontSee('Save', 'input'); diff --git a/nette/doctrine/notejam/tests/acceptance/EditPadCept.php b/nette/doctrine/notejam/tests/acceptance/EditPadCept.php deleted file mode 100644 index 923c9cc95..000000000 --- a/nette/doctrine/notejam/tests/acceptance/EditPadCept.php +++ /dev/null @@ -1,8 +0,0 @@ -wantTo('see pad can be successfully edited'); -$I->testLogin(); -$I->amOnPage('/pads/1/edit'); -$I->fillField('Name', 'Pad 1 - edited'); -$I->click('Save'); -$I->see('Pad 1 - edited'); diff --git a/nette/doctrine/notejam/tests/acceptance/EditPadFailCept.php b/nette/doctrine/notejam/tests/acceptance/EditPadFailCept.php deleted file mode 100644 index a6614b736..000000000 --- a/nette/doctrine/notejam/tests/acceptance/EditPadFailCept.php +++ /dev/null @@ -1,9 +0,0 @@ -wantTo('see pad cannot be edited without required fields'); -$I->testLogin(); -$I->amOnPage('/pads/1/edit'); -$I->fillField('Name', ''); -$I->click('Save'); -$I->seeInCurrentUrl('/pads/1/edit'); -$I->see('Name is required'); diff --git a/nette/doctrine/notejam/tests/acceptance/ForgottenPasswordCept.php b/nette/doctrine/notejam/tests/acceptance/ForgottenPasswordCept.php deleted file mode 100644 index aaeccdc3c..000000000 --- a/nette/doctrine/notejam/tests/acceptance/ForgottenPasswordCept.php +++ /dev/null @@ -1,7 +0,0 @@ -wantTo('see user can successfully get new password'); -$I->amOnPage('/forgot-password'); -$I->fillField('Email', 'john.doe@example.com'); -$I->click('Get new password'); -$I->see('Sign in'); diff --git a/nette/doctrine/notejam/tests/acceptance/ForgottenPasswordInvalidEmailCept.php b/nette/doctrine/notejam/tests/acceptance/ForgottenPasswordInvalidEmailCept.php deleted file mode 100644 index 2be0e84ab..000000000 --- a/nette/doctrine/notejam/tests/acceptance/ForgottenPasswordInvalidEmailCept.php +++ /dev/null @@ -1,7 +0,0 @@ -wantTo('see user can not successfully get new password with invalid email'); -$I->amOnPage('/forgot-password'); -$I->fillField('Email', 'invalid'); -$I->click('Get new password'); -$I->see('Invalid email'); diff --git a/nette/doctrine/notejam/tests/acceptance/ForgottenPasswordUnregisteredEmailCept.php b/nette/doctrine/notejam/tests/acceptance/ForgottenPasswordUnregisteredEmailCept.php deleted file mode 100644 index 1ef96e58d..000000000 --- a/nette/doctrine/notejam/tests/acceptance/ForgottenPasswordUnregisteredEmailCept.php +++ /dev/null @@ -1,7 +0,0 @@ -wantTo('see user can not successfully get new password with unregistered email'); -$I->amOnPage('/forgot-password'); -$I->fillField('Email', 'invalid@example.com'); -$I->click('Get new password'); -$I->see("User with given email doesn't exist"); diff --git a/nette/doctrine/notejam/tests/acceptance/HomepageCept.php b/nette/doctrine/notejam/tests/acceptance/HomepageCept.php deleted file mode 100644 index c7c7afd42..000000000 --- a/nette/doctrine/notejam/tests/acceptance/HomepageCept.php +++ /dev/null @@ -1,8 +0,0 @@ -wantTo('see notes can be viewed successfully'); -$I->amOnPage('/'); -$I->seeInCurrentUrl('/signin'); -$I->testLogin(); -$I->seeCurrentUrlEquals('/'); -$I->see('My pads'); diff --git a/nette/doctrine/notejam/tests/acceptance/NoteDetailCept.php b/nette/doctrine/notejam/tests/acceptance/NoteDetailCept.php deleted file mode 100644 index 55c890c63..000000000 --- a/nette/doctrine/notejam/tests/acceptance/NoteDetailCept.php +++ /dev/null @@ -1,7 +0,0 @@ -wantTo('see note can be viewed successfully'); -$I->testLogin(); -$I->amOnPage('/notes/1'); -$I->see('Note 1'); -$I->see('Lorem ipsum'); diff --git a/nette/doctrine/notejam/tests/acceptance/OtherOwnersNoteDetailCept.php b/nette/doctrine/notejam/tests/acceptance/OtherOwnersNoteDetailCept.php deleted file mode 100644 index 2e65f0224..000000000 --- a/nette/doctrine/notejam/tests/acceptance/OtherOwnersNoteDetailCept.php +++ /dev/null @@ -1,7 +0,0 @@ -wantTo('see note can not be viewed by not an owner'); -$I->testLogin(); -$I->amOnPage('/notes/5'); -$I->dontSee('Other Note'); -$I->dontSee('Lorem ipsum'); diff --git a/nette/doctrine/notejam/tests/acceptance/OtherOwnersPadDetailCept.php b/nette/doctrine/notejam/tests/acceptance/OtherOwnersPadDetailCept.php deleted file mode 100644 index e169ae94f..000000000 --- a/nette/doctrine/notejam/tests/acceptance/OtherOwnersPadDetailCept.php +++ /dev/null @@ -1,6 +0,0 @@ -wantTo('see pad can not be viewed by not an owner'); -$I->testLogin(); -$I->amOnPage('/pads/4'); -$I->dontSee('Other Pad'); diff --git a/nette/doctrine/notejam/tests/acceptance/PadDetailCept.php b/nette/doctrine/notejam/tests/acceptance/PadDetailCept.php deleted file mode 100644 index cc00bcf9a..000000000 --- a/nette/doctrine/notejam/tests/acceptance/PadDetailCept.php +++ /dev/null @@ -1,7 +0,0 @@ -wantTo('see pad can be viewed'); -$I->testLogin(); -$I->amOnPage('/pads/1'); -$I->see('Pad 1'); -$I->see('Note 2'); // Note 2 belongs to Pad 1 diff --git a/nette/doctrine/notejam/tests/acceptance/SetNewPasswordCept.php b/nette/doctrine/notejam/tests/acceptance/SetNewPasswordCept.php deleted file mode 100644 index 70c1ed8ef..000000000 --- a/nette/doctrine/notejam/tests/acceptance/SetNewPasswordCept.php +++ /dev/null @@ -1,10 +0,0 @@ -wantTo('see user can successfully set new password'); -$I->testLogin(); -$I->amOnPage('/settings'); -$I->fillField('Current password', 'pass'); -$I->fillField('New password', 'qwerty'); -$I->fillField('Confirm', 'qwerty'); -$I->click('Change password'); -$I->see('Account settings'); diff --git a/nette/doctrine/notejam/tests/acceptance/SetNewPasswordFailCept.php b/nette/doctrine/notejam/tests/acceptance/SetNewPasswordFailCept.php deleted file mode 100644 index 26ee270fd..000000000 --- a/nette/doctrine/notejam/tests/acceptance/SetNewPasswordFailCept.php +++ /dev/null @@ -1,11 +0,0 @@ -wantTo('see user can not set new password without required fields'); -$I->testLogin(); -$I->amOnPage('/settings'); -$I->fillField('Current password', ''); -$I->fillField('New password', ''); -$I->fillField('Confirm', ''); -$I->click('Change password'); -$I->see('Current password is required'); -$I->see('New password is required'); diff --git a/nette/doctrine/notejam/tests/acceptance/SetNewPasswordInvalidCurrentPasswordCept.php b/nette/doctrine/notejam/tests/acceptance/SetNewPasswordInvalidCurrentPasswordCept.php deleted file mode 100644 index a7aabf0af..000000000 --- a/nette/doctrine/notejam/tests/acceptance/SetNewPasswordInvalidCurrentPasswordCept.php +++ /dev/null @@ -1,10 +0,0 @@ -wantTo('see user can not set new password with invalid current password'); -$I->testLogin(); -$I->amOnPage('/settings'); -$I->fillField('Current password', 'pls'); -$I->fillField('New password', 'pass'); -$I->fillField('Confirm', 'pass'); -$I->click('Change password'); -$I->see('Invalid current password'); diff --git a/nette/doctrine/notejam/tests/acceptance/SetNewPasswordMismatchCept.php b/nette/doctrine/notejam/tests/acceptance/SetNewPasswordMismatchCept.php deleted file mode 100644 index 1ded09583..000000000 --- a/nette/doctrine/notejam/tests/acceptance/SetNewPasswordMismatchCept.php +++ /dev/null @@ -1,10 +0,0 @@ -wantTo('see user can not set new password without confirming new password'); -$I->testLogin(); -$I->amOnPage('/settings'); -$I->fillField('Current password', 'pass'); -$I->fillField('New password', 'pls'); -$I->fillField('Confirm', 'pass'); -$I->click('Change password'); -$I->see('New passwords must match'); diff --git a/nette/doctrine/notejam/tests/acceptance/SignInCept.php b/nette/doctrine/notejam/tests/acceptance/SignInCept.php deleted file mode 100644 index bae44a2a5..000000000 --- a/nette/doctrine/notejam/tests/acceptance/SignInCept.php +++ /dev/null @@ -1,5 +0,0 @@ -wantTo('see user can successfully sign in'); -$I->testLogin(); -$I->see("My pads"); diff --git a/nette/doctrine/notejam/tests/acceptance/SignInFailCept.php b/nette/doctrine/notejam/tests/acceptance/SignInFailCept.php deleted file mode 100644 index e123b018e..000000000 --- a/nette/doctrine/notejam/tests/acceptance/SignInFailCept.php +++ /dev/null @@ -1,10 +0,0 @@ -wantTo('see user can not sign in without required fields'); -$I->amOnPage('/signin'); -$I->see('Sign in'); -$I->fillField("Email", ''); -$I->fillField("Password", ''); -$I->click('Sign in', ['css' => 'form.sign-in']); -$I->see('Email is required'); -$I->see('Password is required'); diff --git a/nette/doctrine/notejam/tests/acceptance/SignInInvalidEmailCept.php b/nette/doctrine/notejam/tests/acceptance/SignInInvalidEmailCept.php deleted file mode 100644 index 0298b64a8..000000000 --- a/nette/doctrine/notejam/tests/acceptance/SignInInvalidEmailCept.php +++ /dev/null @@ -1,5 +0,0 @@ -wantTo('see user can not sign in with invalid email'); -$I->testLogin('invalid@example.com', 'pass'); -$I->see("User 'invalid@example.com' not found."); diff --git a/nette/doctrine/notejam/tests/acceptance/SignInInvalidPasswordCept.php b/nette/doctrine/notejam/tests/acceptance/SignInInvalidPasswordCept.php deleted file mode 100644 index 2e8b58871..000000000 --- a/nette/doctrine/notejam/tests/acceptance/SignInInvalidPasswordCept.php +++ /dev/null @@ -1,5 +0,0 @@ -wantTo('see user can not sign in with invalid password'); -$I->testLogin('john.doe@example.com', 'pls'); -$I->see('Invalid password'); diff --git a/nette/doctrine/notejam/tests/acceptance/SignUpAlreadyExistsCept.php b/nette/doctrine/notejam/tests/acceptance/SignUpAlreadyExistsCept.php deleted file mode 100644 index 5e92ec0a7..000000000 --- a/nette/doctrine/notejam/tests/acceptance/SignUpAlreadyExistsCept.php +++ /dev/null @@ -1,10 +0,0 @@ -wantTo('see user can not sign up with already registered email'); -$I->amOnPage('/signup'); -$I->fillField('Email', 'john.doe@example.com'); -$I->fillField('Password', 'pass'); -$I->fillField('confirm', 'pass'); -$I->click('Sign up', ['css' => 'form']); -$I->seeInCurrentUrl('/signup'); -$I->see('Account with this email already exists'); diff --git a/nette/doctrine/notejam/tests/acceptance/SignUpCept.php b/nette/doctrine/notejam/tests/acceptance/SignUpCept.php deleted file mode 100644 index df11ed43e..000000000 --- a/nette/doctrine/notejam/tests/acceptance/SignUpCept.php +++ /dev/null @@ -1,13 +0,0 @@ -wantTo('see user can successfully sign up'); -$I->amOnPage('/signup'); -$I->fillField('Email', 'test@example.com'); -$I->fillField('Password', 'qwerty'); -$I->fillField('confirm', 'qwerty'); -$I->click('Sign up', ['css' => 'form']); -$I->seeInCurrentUrl('/signin'); -$I->see('Thank you for registration. Now you can sign in'); -$I->testLogin('test@example.com', 'qwerty'); -$I->seeCurrentUrlEquals('/'); -$I->see('My pads'); diff --git a/nette/doctrine/notejam/tests/acceptance/SignUpFailCept.php b/nette/doctrine/notejam/tests/acceptance/SignUpFailCept.php deleted file mode 100644 index 250b1cd83..000000000 --- a/nette/doctrine/notejam/tests/acceptance/SignUpFailCept.php +++ /dev/null @@ -1,11 +0,0 @@ -wantTo('see user can not sign up without required fields'); -$I->amOnPage('/signup'); -$I->fillField('Email', ''); -$I->fillField('Password', ''); -$I->fillField('confirm', ''); -$I->click('Sign up', ['css' => 'form']); -$I->seeInCurrentUrl('/signup'); -$I->see('Email is required'); -$I->see('Password is required'); diff --git a/nette/doctrine/notejam/tests/acceptance/SignUpInvalidEmailCept.php b/nette/doctrine/notejam/tests/acceptance/SignUpInvalidEmailCept.php deleted file mode 100644 index 1cc57ad1e..000000000 --- a/nette/doctrine/notejam/tests/acceptance/SignUpInvalidEmailCept.php +++ /dev/null @@ -1,10 +0,0 @@ -wantTo('see user can not sign up with invalid email'); -$I->amOnPage('/signup'); -$I->fillField('Email', 'abcd'); -$I->fillField('Password', 'pass'); -$I->fillField('confirm', 'pass'); -$I->click('Sign up', ['css' => 'form']); -$I->seeInCurrentUrl('/signup'); -$I->see('Please enter a valid email address.'); diff --git a/nette/doctrine/notejam/tests/acceptance/SignUpPasswordMismatchCept.php b/nette/doctrine/notejam/tests/acceptance/SignUpPasswordMismatchCept.php deleted file mode 100644 index e1e083f19..000000000 --- a/nette/doctrine/notejam/tests/acceptance/SignUpPasswordMismatchCept.php +++ /dev/null @@ -1,10 +0,0 @@ -wantTo('see user can not sign up without confirming password'); -$I->amOnPage('/signup'); -$I->fillField('Email', 'test@example.com'); -$I->fillField('Password', 'pass'); -$I->fillField('confirm', 'pls'); -$I->click('Sign up', ['css' => 'form']); -$I->seeInCurrentUrl('/signup'); -$I->see('Passwords must match'); diff --git a/nette/doctrine/notejam/tests/acceptance/_bootstrap.php b/nette/doctrine/notejam/tests/acceptance/_bootstrap.php deleted file mode 100644 index 8a8855580..000000000 --- a/nette/doctrine/notejam/tests/acceptance/_bootstrap.php +++ /dev/null @@ -1,2 +0,0 @@ - - Options -Indexes - - -# enable cool URL - - RewriteEngine On - # RewriteBase / - - # prevents files starting with dot to be viewed by browser - RewriteRule /\.|^\. - [F] - - # front controller - RewriteCond %{REQUEST_FILENAME} !-f - RewriteCond %{REQUEST_FILENAME} !-d - RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz|map)$ index.php [L] - - -# enable gzip compression - - - AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json application/xml image/svg+xml - - diff --git a/nette/doctrine/notejam/www/.maintenance.php b/nette/doctrine/notejam/www/.maintenance.php deleted file mode 100644 index 2ff638cb3..000000000 --- a/nette/doctrine/notejam/www/.maintenance.php +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - -Site is temporarily down for maintenance - -

We're Sorry

- -

The site is temporarily down for maintenance. Please try again in a few minutes.

- -div { - display: none; } - - - /* Grid */ - #grid .column, - #grid .columns { - background: #ddd; - height: 25px; - line-height: 25px; - margin-bottom: 10px; - text-align: center; - text-transform: uppercase; - color: #555; - font-size: 12px; - font-weight: bold; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; } - #grid .column:hover, - #grid .columns:hover { - background: #bbb; - color: #333; } - #grid .example-grid { overflow: hidden; } - - .post-button-note, - .post-button-note a { - font-size: 11px; - color: #999; } - - #examples .four.columns a { - text-decoration: none; - } - #examples .four.columns a:hover { - text-decoration: underline; - } - - - .resize { - position: fixed; - bottom: 0; - right: 0; - height: 80px; - width: 80px; - background: url(images/resize.png); } - - - img { - max-width: 100%; - height: auto; } - - .gist-meta { display: none !important;} - - ul ul ul li { margin-bottom: 3px; } - - .twitter-share-button { margin-bottom: -18px; } - - /* Table stylesheets */ - table { - width: 100%; - border-collapse: collapse; - } - - table th, table td { - padding: 10px 10px 9px; - font-size: 13px; - line-height: 18px; - text-align: left; - } - - table td { - vertical-align: top; - border-top: solid 1px #ddd; - } - - table th { - padding-top: 9px; - font-weight: bold; - vertical-align: middle; - } - - table.condensed th, table.condensed td { - padding: 5px 5px 4px; - } - - table.bordered { - border-collapse: separate; - border: solid 1px #ddd; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - } - - table.bordered th + th, - table.bordered th + td, - table.bordered td + td { - border-left: solid 1px #ddd; - } - - .zebra-striped tbody tr:nth-child(odd) td, - .zebra-striped tbody tr:nth-child(odd) th { - background: #f5f5f5; - } - -.carbonad, -.carbonad-image, -.carbonad-text, -.carbonad-tag { - background: none !important; - border: none !important; - margin-left: 0 !important; -} -.carbonad-tag { - margin-top: 6px !important; - padding-top: 0 !important; -} -.carbonad-text { - height: auto !important; -} -.carbonad-image { - margin-top: 0 !important; -} - -.hidden-text { - font-size: 12px; - color: #999; -} - -td.date, th.date { - text-align: right; -} - -td.date { - font-style: italic; -} - -form.note input[type="text"], form.note textarea { - width: 100%; -} - -form hr { - width: 218px; - margin: 10px 0px; -} - -form.note textarea { - height: 250px; -} - -div.content-area { - min-height: 600px; -} - -hr.footer { - margin-bottom: 10px; -} - -div.footer { - margin-bottom: 10px; - text-align: center; - font-size: 12px; -} - -form.sign-in { - margin: 50px 0 0 0; -} - -.sort_arrow { - text-decoration: none; -} - -.sort_arrow:hover { - text-decoration: none; - color: red; -} - -div.sign-in-out-block { - position: absolute; - right: 14px; - top: 8px; - font-size: 12px; -} - -div.sign-in-out-block a { - /*text-decoration: none;*/ -} - -a.small-red { - color: red; - font-size: 12px; -} - -table.notes { - margin: 0 0 20px 0; -} - -table.notes th.note { - width: 72%; -} - -table.notes td.pad { - color: grey; -} - -table.notes td.pad a { - color: grey; - text-decoration: underline; - font-style: normal; -} - - -table.notes td.pad a:hover { - color: black; -} - -p.empty { - color: grey; - font-style: italic; -} - -a.delete-note { - float: right; - font-size: 12px; - color: red; -} - -.red, input.red { - color: red !important; -} - -ul.errorlist, ul.errors { - margin: -18px 0 0 0; -} - -ul.errorlist li, ul.errors li { - color: red; -} - -.alert-area { - text-align: center; -} - -.alert { - padding: 5px 8px; - margin: 0 0 12px 0; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border: 1px solid #d6e9c6; -} - -.alert-error { - color: #b94a48; - background-color: #f2dede; - border: 1px solid #eed3d7; -} - - /* Mobile */ - @media only screen and (max-width: 767px) { - header h1 { font-size: 34px; line-height: 37px; } - nav { position: relative; } - nav ul, - .carbonad { - display: none; - } - #logo { text-align: left; } - #examples .four.columns { - padding-top: 30px; - } - } - - /* Mobile Landscape */ - @media only screen and (min-width: 480px) and (max-width: 767px) { - nav ul { - display: none; - } - } - - /* Non 960 */ - @media only screen and (max-width: 959px) { - #logo { - font-size: 21px; - margin-bottom: 15px; } - nav .button { - padding: 9px 20px 11px; } - } - - /* iPad Portrait/Browser */ - @media only screen and (min-width: 768px) and (max-width: 959px) { - nav { - width: 124px; } - } - - /* Mobile/Browser */ - @media only screen and (max-width: 767px) {} - - /* Mobile Landscape/Browser */ - @media only screen and (min-width: 480px) and (max-width: 767px) {} - - /* Anything smaller than standard 960 */ - @media only screen and (max-width: 959px) {} - - - /* iPad Portrait Only */ - @media only screen and (min-width: 768px) and (max-width: 959px) and (max-device-width: 1000px) {} - - /* Mobile Only */ - @media only screen and (max-width: 767px) and (max-device-width: 1000px) {} - - /* Mobile Landscape Only */ - @media only screen and (min-width: 480px) and (max-width: 767px) and (max-device-width: 1000px) {} - - /* Anything smaller than standard 960 on a device */ - @media only screen and (max-width: 959px) and (max-device-width: 1000px) { - .resize { display: none; } - } - diff --git a/nette/doctrine/notejam/www/favicon.ico b/nette/doctrine/notejam/www/favicon.ico deleted file mode 100644 index b20cfd0f056c1c9d43100f612f4319c66e2adb94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2550 zcmcgsdpy=>6#qV`h?U#SZJVg3NgD48bB$?q*(P0BnsTYks)Y)n7Gs6xwl1`?sD@_U z*mR*3ue;!TGX-%KzT!aoOgA9#8p?H)WL?RL7J%`}#?vCTxIT)jQ5SY=6*49?+ zh&_ole$lYAvxC8Q5iS=MLnsttXlMv`?%ctjEsbHE`WM;pN*(R2gPpQVcsz^BU^|{g zdOB}*utia3=3%>|9bp}tc@~XfN=iy^4Uf>sN#&@~UN&lzy{)*3spzf3^BSR||YZz~*6I;1wF3`8Euwo$so^QQ+fPxAeUii#5Rap}?} zI637bDXAWlCQX8umlyQ(DzI){DFgxmGBPq~J0F>ud>9)Wx9 zfgL;esHkY7xZ6lhPR71{g~-j##nPo0;O%`5H*eOUySp2Q4mF^^zn|iS2n`K|hDI$; zovJ}&<4uS}_n@M34_mgBKvq^3>gwt+H#bLFSs9iuUk*P%KTMxqN_*>}udk1soE*f( z#nC;_e;ul; zt8w}?A7jS!QZIBOE2|m`3JTEH))x21tXZ>QWo3op;$o_0Df094;o;#yaal-9OC!E& zp{go?j7&KuP88z$^;>9YXrMdSVdKV9NJ~poO)8i?c`_KQLVJ5Vi*e)nQB_rs;o(29XHPk%O)EoSARo=m&6HP2wf#l4 zH4*=<7(aeI#SKGEO$`GB1JKmeL|tgHl| z&&T4$i{a|(iW4VJVAZNs@bU41udgpcLP8K89*&rp7&_}APxI`(?@mKQ1HHYy(9+Vvg9i`L z)zw8kr-!?D??PU_7j12A;_p^j`9AIG#>|;BVPaweGcz;P)YQPz(vteE0@l{nm@{V% zN=iy#Z*Nb1a0PSc&P8EiA)K9^k(ZYT7Z(>SS+WFfZf?lV&c@1>E8*$siS+bz>eGGj z_xGpXNy6^kyRmiaR>a1}A}lNn(b3U}jEsboln`Ub3Nc{<$N329V+>PWBGDrZP)!2^ zgH$uuXI=CzePr8-qdwAy^oBz6>qtwft{!^Z9;%1y^ZT^+>g7P{OXUFj7df)}wRucq zmlm@v@hbOa8Ko5wENykg4mNL*D*qf~3xUi}fK4-w!qLe|`Yf=;$Q%fcQ2~x_S{3dI z1exGnPg=`oSp@5O5E7$6zbZYJ`mKgNaD~lBlrvWRaz2EePA_9@`j2`n7s~VV^4Wnj z`nAb@jO`Kl`fYGqwwdB8k@2B3#Tt)Nf%6LZidBEm%>U zIp^f3xWHJNw^!P)mp({kCuGbESuBup*#~gvu}K%ttO=2*{sN2{JA-W!z>@{nZxqL{ zh=QL_y(oY&ani$2@YEN_aY*gFm*aH@{||iK?3yQO>z|YV>W4Sqo9I6p5G09PXfCPx z;&Zb&aX?Vev-kV*{k_d?**5~-RN@c`{2gue-TH}%`ch3}=ROC&rnaYAkVqm}+BD5V za{pA9-^FlZ;_>*&Z%E=g`&+o(oUB|tP7=3%{UlJbB85M$22KZ{7Oda^FYEk~m9tOZv=@F{=&ov#vg;K8};8MS`EFL7E3`erDkr Rce72getByType('Nette\Application\Application')->run(); diff --git a/nette/doctrine/notejam/www/robots.txt b/nette/doctrine/notejam/www/robots.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/nette/native_db/notejam/.gitignore b/nette/native_db/notejam/.gitignore deleted file mode 100644 index 32b40f1f6..000000000 --- a/nette/native_db/notejam/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -log/* -temp/* -vendor/* -!.gitignore -app/config/config.local.neon - -tests/_output/* diff --git a/nette/native_db/notejam/app/bootstrap.php b/nette/native_db/notejam/app/bootstrap.php deleted file mode 100644 index 8fd851263..000000000 --- a/nette/native_db/notejam/app/bootstrap.php +++ /dev/null @@ -1,21 +0,0 @@ -setDebugMode('23.75.345.200'); // enable for your remote IP -$configurator->enableDebugger(__DIR__ . '/../log'); - -$configurator->setTempDirectory(__DIR__ . '/../temp'); - -$configurator->createRobotLoader() - ->addDirectory(__DIR__) - ->register(); - -$configurator->addConfig(__DIR__ . '/config/config.neon'); -$configurator->addConfig(__DIR__ . '/config/config.local.neon'); - -$container = $configurator->createContainer(); - -return $container; diff --git a/nette/native_db/notejam/app/components/Notes/INotesFactory.php b/nette/native_db/notejam/app/components/Notes/INotesFactory.php deleted file mode 100644 index 375c2e520..000000000 --- a/nette/native_db/notejam/app/components/Notes/INotesFactory.php +++ /dev/null @@ -1,18 +0,0 @@ - - - - Note - - - Pad - - Last modified - - - - - {$note->name} - - {if $note->pad_id} - {$note->pad->name} - {else} - No pad - {/if} - - {$note->updated_at|date:'d. M. Y'} - - diff --git a/nette/native_db/notejam/app/components/Notes/Notes.php b/nette/native_db/notejam/app/components/Notes/Notes.php deleted file mode 100644 index 5ebb20fc3..000000000 --- a/nette/native_db/notejam/app/components/Notes/Notes.php +++ /dev/null @@ -1,42 +0,0 @@ -notes = $notes; - $this->pad = $pad; - } - - - /** - * Renders the component. - */ - public function render() - { - $template = $this->createTemplate(); - $template->setFile(__DIR__ . '/Notes.latte'); - $template->notes = $this->notes; - $template->pad = $this->pad; - $template->render(); - } - -} diff --git a/nette/native_db/notejam/app/components/Pads/IPadsFactory.php b/nette/native_db/notejam/app/components/Pads/IPadsFactory.php deleted file mode 100644 index 351e360bd..000000000 --- a/nette/native_db/notejam/app/components/Pads/IPadsFactory.php +++ /dev/null @@ -1,15 +0,0 @@ - - - - diff --git a/nette/native_db/notejam/app/components/Pads/Pads.php b/nette/native_db/notejam/app/components/Pads/Pads.php deleted file mode 100644 index bd7f96bba..000000000 --- a/nette/native_db/notejam/app/components/Pads/Pads.php +++ /dev/null @@ -1,35 +0,0 @@ -pads = $pads; - } - - - /** - * Renders the component. - */ - public function render() - { - $template = $this->createTemplate(); - $template->setFile(__DIR__ . '/Pads.latte'); - $template->pads = $this->pads; - $template->render(); - } - -} diff --git a/nette/native_db/notejam/app/components/UserBar/IUserBarFactory.php b/nette/native_db/notejam/app/components/UserBar/IUserBarFactory.php deleted file mode 100644 index efa689371..000000000 --- a/nette/native_db/notejam/app/components/UserBar/IUserBarFactory.php +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/nette/native_db/notejam/app/components/UserBar/UserBar.php b/nette/native_db/notejam/app/components/UserBar/UserBar.php deleted file mode 100644 index adf2d82e2..000000000 --- a/nette/native_db/notejam/app/components/UserBar/UserBar.php +++ /dev/null @@ -1,35 +0,0 @@ -user = $user; - } - - /** - * Renders the component. - */ - public function render() - { - $template = $this->createTemplate(); - $template->setFile(__DIR__ . '/UserBar.latte'); - $template->render(); - } - -} diff --git a/nette/native_db/notejam/app/config/config.example.neon b/nette/native_db/notejam/app/config/config.example.neon deleted file mode 100644 index 24dfdf1f0..000000000 --- a/nette/native_db/notejam/app/config/config.example.neon +++ /dev/null @@ -1,3 +0,0 @@ -parameters: - database: - dsn: 'sqlite:%appDir%/../notejam.db' diff --git a/nette/native_db/notejam/app/config/config.neon b/nette/native_db/notejam/app/config/config.neon deleted file mode 100644 index d1a5d2533..000000000 --- a/nette/native_db/notejam/app/config/config.neon +++ /dev/null @@ -1,45 +0,0 @@ -# -# WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser! -# https://nette.org/security-warning -# -parameters: - - -php: - date.timezone: Europe/Prague - - -application: - errorPresenter: Error - mapping: - *: App\*Module\Presenters\*Presenter - - -session: - expiration: 14 days - - -database: - dsn: %database.dsn% - options: - lazy: yes - - -services: - - App\Model\UserManager - - App\Model\NoteManager - - App\Model\PadManager - - App\Components\Notes\INotesFactory - - App\Components\Pads\IPadsFactory - - App\Components\UserBar\IUserBarFactory - - App\Forms\Account\AccountSettingsFormFactory - - App\Forms\Note\DeleteNoteFormFactory - - App\Forms\Note\EditNoteFormFactory - - App\Forms\Note\NewNoteFormFactory - - App\Forms\Pad\DeletePadFormFactory - - App\Forms\Pad\EditPadFormFactory - - App\Forms\Pad\NewPadFormFactory - - App\Forms\Sign\ForgottenPasswordFormFactory - - App\Forms\Sign\SignInFormFactory - - App\Forms\Sign\SignUpFormFactory - router: App\RouterFactory::createRouter diff --git a/nette/native_db/notejam/app/forms/Account/AccountSettingsFormFactory.php b/nette/native_db/notejam/app/forms/Account/AccountSettingsFormFactory.php deleted file mode 100644 index 14a3e12f5..000000000 --- a/nette/native_db/notejam/app/forms/Account/AccountSettingsFormFactory.php +++ /dev/null @@ -1,69 +0,0 @@ -userManager = $userManager; - $this->user = $user; - } - - /** - * Creates Account Settings Form. - * @return Form - */ - public function create() - { - $form = new Form; - $form->addPassword('current', 'Current password') - ->setRequired('%label is required'); - - $form->addPassword('new', 'New Password') - ->setRequired('%label is required'); - - $form->addPassword('confirm', 'Confirm New Password') - ->setRequired('New password is required') - ->addRule(Form::EQUAL, 'New passwords must match', $form['new']); - - $form->addSubmit('submit', 'Change Password'); - - $form->onSuccess[] = [$this, 'formSucceeded']; - - return $form; - } - - /** - * Callback for Account Settings Form onSuccess event. - * @param Form $form - * @param ArrayHash $values - */ - public function formSucceeded(Form $form, $values) - { - if (!$this->userManager->checkPassword($this->user->getId(), $values->current)) { - $form->addError("Invalid current password"); - } - $this->userManager->setNewPassword($this->user->getId(), $values->new); - } - -} diff --git a/nette/native_db/notejam/app/forms/Note/DeleteNoteFormFactory.php b/nette/native_db/notejam/app/forms/Note/DeleteNoteFormFactory.php deleted file mode 100644 index 1adb01b4e..000000000 --- a/nette/native_db/notejam/app/forms/Note/DeleteNoteFormFactory.php +++ /dev/null @@ -1,45 +0,0 @@ -noteManager = $noteManager; - } - - /** - * Creates a DeleteNoteForm. - * @param int $id Id of the note to be deleted. - * @return Form - */ - public function create($id) - { - $form = new Form; - $form->addProtection(); // Adds CSRF protection - - $form->addSubmit('submit', 'Yes, I want to delete this note'); - - $form->onSuccess[] = function (Form $form) use ($id) { - if (!$this->noteManager->delete($id)) { - $form->addError("Failed to delete note"); - } - }; - - return $form; - } - -} diff --git a/nette/native_db/notejam/app/forms/Note/EditNoteFormFactory.php b/nette/native_db/notejam/app/forms/Note/EditNoteFormFactory.php deleted file mode 100644 index 894a43b81..000000000 --- a/nette/native_db/notejam/app/forms/Note/EditNoteFormFactory.php +++ /dev/null @@ -1,65 +0,0 @@ -padManager = $padManager; - $this->noteManager = $noteManager; - } - - /** - * Creates an EditNoteForm. - * @param int $id - * @param string $name - * @param string $text - * @param int $pad - * @return Form - */ - public function create($id, $name, $text, $pad) - { - $form = new Form; - $form->addText('name', 'Name') - ->setDefaultValue($name) - ->setRequired('%label is required'); - - $form->addTextArea('text', 'Text') - ->setDefaultValue($text) - ->setRequired('%label is required'); - - $form->addSelect('pad', 'Pad', $this->padManager->findAll()->fetchPairs('id', 'name')) - ->setPrompt('Select pad') - ->setDefaultValue($pad); - - $form->addSubmit('submit', 'Save'); - - $form->onSuccess[] = function (Form $form, $values) use ($id) { - if (!$this->noteManager->update($id, $values->name, $values->text, $values->pad)) { - $form->addError("Failed to edit pad"); - } - }; - - return $form; - } - -} diff --git a/nette/native_db/notejam/app/forms/Note/NewNoteFormFactory.php b/nette/native_db/notejam/app/forms/Note/NewNoteFormFactory.php deleted file mode 100644 index b99d46fb0..000000000 --- a/nette/native_db/notejam/app/forms/Note/NewNoteFormFactory.php +++ /dev/null @@ -1,68 +0,0 @@ -padManager = $padManager; - $this->noteManager = $noteManager; - } - - /** - * Creates a NewNoteForm. - * @param int|NULL $pad Id of the default pad. Can be NULL. - * @return Form - */ - public function create($pad) - { - $form = new Form; - $form->addText('name', 'Name') - ->setRequired('%label is required'); - - $form->addTextArea('text', 'Text') - ->setRequired('%label is required'); - - $form->addSelect('pad', 'Pad', $this->padManager->findAll()->fetchPairs('id', 'name')) - ->setPrompt('Select pad') - ->setDefaultValue($pad); - - $form->addSubmit('submit', 'Save'); - - $form->onSuccess[] = [$this, 'formSucceeded']; - return $form; - } - - /** - * Callback for NewNoteForm onSuccess event. - * @param Form $form - * @param ArrayHash $values - */ - public function formSucceeded(Form $form, $values) - { - if (!$this->noteManager->add($values->name, $values->text, $values->pad)) { - $form->addError("Failed to create pad"); - } - } - -} diff --git a/nette/native_db/notejam/app/forms/Pad/DeletePadFormFactory.php b/nette/native_db/notejam/app/forms/Pad/DeletePadFormFactory.php deleted file mode 100644 index ebacdf538..000000000 --- a/nette/native_db/notejam/app/forms/Pad/DeletePadFormFactory.php +++ /dev/null @@ -1,46 +0,0 @@ -padManager = $padManager; - } - - /** - * Creates a DeletePadForm. - * @param int $id Id of the pad to be deleted. - * @return Form - */ - public function create($id) - { - $form = new Form; - $form->addProtection(); // Adds CSRF protection - - $form->addSubmit('submit', 'Yes, I want to delete this pad'); - - $form->onSuccess[] = function (Form $form) use ($id) { - if (!$this->padManager->delete($id)) { - $form->addError("Failed to delete pad"); - } - }; - - return $form; - } - -} diff --git a/nette/native_db/notejam/app/forms/Pad/EditPadFormFactory.php b/nette/native_db/notejam/app/forms/Pad/EditPadFormFactory.php deleted file mode 100644 index 62a9510ad..000000000 --- a/nette/native_db/notejam/app/forms/Pad/EditPadFormFactory.php +++ /dev/null @@ -1,49 +0,0 @@ -padManager = $padManager; - } - - /** - * Creates an EditPadForm. - * @param int $id Id of the pad to be edited. - * @param string $name Current name of the pad. - * @return Form - */ - public function create($id, $name) - { - $form = new Form; - $form->addText('name', 'Name') - ->setDefaultValue($name) - ->setRequired('%label is required'); - - $form->addSubmit('submit', 'Save'); - - $form->onSuccess[] = function (Form $form, $values) use ($id) { - if (!$this->padManager->update($id, $values->name)) { - $form->addError("Failed to edit pad"); - } - }; - - return $form; - } - -} diff --git a/nette/native_db/notejam/app/forms/Pad/NewPadFormFactory.php b/nette/native_db/notejam/app/forms/Pad/NewPadFormFactory.php deleted file mode 100644 index b4ca697ea..000000000 --- a/nette/native_db/notejam/app/forms/Pad/NewPadFormFactory.php +++ /dev/null @@ -1,54 +0,0 @@ -padManager = $padManager; - } - - /** - * Creates a NewPadForm. - * @return Form - */ - public function create() - { - $form = new Form; - $form->addText('name', 'Name') - ->setRequired('%label is required'); - - $form->addSubmit('submit', 'Save'); - - $form->onSuccess[] = [$this, 'formSucceeded']; - return $form; - } - - /** - * Callback for NewPadForm onSuccess event. - * @param Form $form - * @param ArrayHash $values - */ - public function formSucceeded(Form $form, $values) - { - if (!$this->padManager->add($values->name)) { - $form->addError("Failed to create new pad"); - } - } - -} diff --git a/nette/native_db/notejam/app/forms/Sign/ForgottenPasswordFormFactory.php b/nette/native_db/notejam/app/forms/Sign/ForgottenPasswordFormFactory.php deleted file mode 100644 index 3fb12cabd..000000000 --- a/nette/native_db/notejam/app/forms/Sign/ForgottenPasswordFormFactory.php +++ /dev/null @@ -1,84 +0,0 @@ -userManager = $userManager; - $this->mailer = $mailer; - } - - /** - * Creates a ForgottenPasswordForm. - * @return Form - */ - public function create() - { - $form = new Form; - $form->addText('email', 'Email') - ->setRequired('%label is required') - ->addRule(Form::EMAIL, 'Invalid %label'); - - $form->addSubmit('submit', 'Get new password'); - - $form->onSuccess[] = [$this, 'formSucceeded']; - return $form; - } - - /** - * Callback for ForgottenPasswordForm onSuccess event. - * @param Form $form - * @param ArrayHash $values - */ - public function formSucceeded(Form $form, $values) - { - $user = $this->userManager->findByEmail($values->email); - if (!$user) { - $form->addError('No user with given email found'); - return; - } - $password = Nette\Utils\Random::generate(10); - $this->userManager->setNewPassword($user->id, $password); - - try { - // !!! Never send passwords through email !!! - // This is only for demonstration purposes of Notejam. - // Ideally, you can create a unique link where user can change his password - // himself for limited amount of time, and then send the link. - $mail = new Nette\Mail\Message(); - $mail->setFrom('noreply@notejamapp.com', 'Notejamapp'); - $mail->addTo($user->email); - $mail->setSubject('New notejam password'); - $mail->setBody(sprintf('Your new password: %s', $password)); - $this->mailer->send($mail); - - } catch (Nette\Mail\SendException $e) { - Debugger::log($e, Debugger::EXCEPTION); - $form->addError('Could not send email with new password'); - } - } - -} diff --git a/nette/native_db/notejam/app/forms/Sign/SignInFormFactory.php b/nette/native_db/notejam/app/forms/Sign/SignInFormFactory.php deleted file mode 100644 index 7737e36db..000000000 --- a/nette/native_db/notejam/app/forms/Sign/SignInFormFactory.php +++ /dev/null @@ -1,60 +0,0 @@ -user = $user; - } - - /** - * Creates a SignInForm. - * @return Form - */ - public function create() - { - $form = new Form; - - $form->addText('email', 'Email') - ->setRequired('%label is required'); - - $form->addPassword('password', 'Password') - ->setRequired('%label is required'); - - $form->addSubmit('submit', 'Sign In'); - - $form->onSuccess[] = [$this, 'formSucceeded']; - return $form; - } - - /** - * Callback for SignInForm onSuccess event. - * @param Form $form - * @param ArrayHash $values - */ - public function formSucceeded(Form $form, $values) - { - try { - $this->user->login($values->email, $values->password); - } catch (Nette\Security\AuthenticationException $e) { - $form->addError($e->getMessage()); - } - } - -} diff --git a/nette/native_db/notejam/app/forms/Sign/SignUpFormFactory.php b/nette/native_db/notejam/app/forms/Sign/SignUpFormFactory.php deleted file mode 100644 index 06b1d2519..000000000 --- a/nette/native_db/notejam/app/forms/Sign/SignUpFormFactory.php +++ /dev/null @@ -1,65 +0,0 @@ -userManager = $userManager; - } - - /** - * Creates a SignUpForm. - * @return Form - */ - public function create() - { - $form = new Form; - $form->addText('email', 'Email') - ->setRequired('%label is required') - ->addRule(Form::EMAIL, 'Invalid email'); - - $form->addPassword('password', 'Password') - ->setRequired('%label is required'); - - $form->addPassword('confirm', 'Confirm Password') - ->setRequired('%label is required') - ->addRule(Form::EQUAL, 'Passwords must match', $form['password']); - - $form->addSubmit('submit', 'Sign Up'); - - $form->onSuccess[] = [$this, 'formSucceeded']; - return $form; - } - - /** - * Callback for SignUpForm onSuccess event. - * @param Form $form - * @param ArrayHash $values - */ - public function formSucceeded(Form $form, $values) - { - try { - $this->userManager->add($values->email, $values->password); - } catch (DuplicateNameException $e) { - $form->addError($e->getMessage()); - } - } - -} diff --git a/nette/native_db/notejam/app/helpers/OrderHelper.php b/nette/native_db/notejam/app/helpers/OrderHelper.php deleted file mode 100644 index 72d2296ca..000000000 --- a/nette/native_db/notejam/app/helpers/OrderHelper.php +++ /dev/null @@ -1,25 +0,0 @@ - 'name ASC', - '-name' => 'name DESC', - 'updated_at' => 'updated_at ASC', - '-updated_at' => 'updated_at DESC' - ]; - return isset($ordering[$orderBy]) ? $ordering[$orderBy] : $ordering['name']; - } - -} diff --git a/nette/native_db/notejam/app/model/NoteManager.php b/nette/native_db/notejam/app/model/NoteManager.php deleted file mode 100644 index be5c9151b..000000000 --- a/nette/native_db/notejam/app/model/NoteManager.php +++ /dev/null @@ -1,121 +0,0 @@ -database = $database; - $this->user = $user; - } - - /** - * Finds note with given id. - * @param int $id - * @return bool|mixed|Nette\Database\Table\IRow - */ - public function find($id) - { - return $this->findAll()->where('id', $id)->fetch(); - } - - /** - * Finds all notes. - * @return Nette\Database\Table\Selection - */ - public function findAll() - { - return $this->getTable()->where('user_id', $this->user->getId()); - } - - /** - * Finds notes in given pad. - * @param int $padId - * @return Nette\Database\Table\Selection - */ - public function findByPad($padId) - { - return $this->findAll()->where('pad_id', $padId); - } - - /** - * Adds new note. - * @param string $name - * @param string $text - * @param int $padId - * @return bool|int|Nette\Database\Table\IRow - */ - public function add($name, $text, $padId) - { - return $this->getTable()->insert([ - 'name' => $name, - 'text' => $text, - 'pad_id' => $padId, - 'user_id' => $this->user->getId(), - 'created_at' => date('Y-m-d H:i:s'), - 'updated_at' => date('Y-m-d H:i:s'), - ]); - } - - /** - * Updates note with given id. - * @param int $id - * @param string $name - * @param string $text - * @param int $padId - * @return int - */ - public function update($id, $name, $text, $padId) - { - return $this->getTable()->where([ - 'id' => $id, - 'user_id' => $this->user->getId(), - ])->update([ - 'name' => $name, - 'text' => $text, - 'pad_id' => $padId, - 'updated_at' => date('Y-m-d H:i:s'), - ]); - } - - /** - * Deletes note with given id. - * @param int $id - * @return int - */ - public function delete($id) - { - return $this->getTable()->where([ - 'id' => $id, - 'user_id' => $this->user->getId(), - ])->delete(); - } - - /** - * @return Nette\Database\Table\Selection - */ - protected function getTable() - { - return $this->database->table('notes'); - } - -} diff --git a/nette/native_db/notejam/app/model/PadManager.php b/nette/native_db/notejam/app/model/PadManager.php deleted file mode 100644 index 306d8f95f..000000000 --- a/nette/native_db/notejam/app/model/PadManager.php +++ /dev/null @@ -1,100 +0,0 @@ -database = $database; - $this->user = $user; - } - - /** - * Finds pad with given id. - * @param int $id - * @return Nette\Database\Table\IRow|bool The pad or FALSE if not found. - */ - public function find($id) - { - return $this->findAll()->where('id', $id)->fetch(); - } - - /** - * Finds all pads. - * @return Nette\Database\Table\Selection - */ - public function findAll() - { - return $this->getTable()->where('user_id', $this->user->getId()); - } - - /** - * Adds new pad. - * @param string $name - * @return bool|int|Nette\Database\Table\IRow - */ - public function add($name) - { - return $this->getTable()->insert([ - 'name' => $name, - 'user_id' => $this->user->getId(), - ]); - } - - /** - * Updates pad with given id. - * @param int $id - * @param string $name - * @return int - */ - public function update($id, $name) - { - return $this->getTable()->where([ - 'id' => $id, - 'user_id' => $this->user->getId(), - ])->update([ - 'name' => $name, - ]); - } - - /** - * Deletes pad with given id. - * @param int $id - * @return int - */ - public function delete($id) - { - return $this->getTable()->where([ - 'id' => $id, - 'user_id' => $this->user->getId(), - ])->delete(); - } - - /** - * @return Nette\Database\Table\Selection - */ - protected function getTable() - { - return $this->database->table('pads'); - } - -} diff --git a/nette/native_db/notejam/app/model/UserManager.php b/nette/native_db/notejam/app/model/UserManager.php deleted file mode 100644 index 1365a33cb..000000000 --- a/nette/native_db/notejam/app/model/UserManager.php +++ /dev/null @@ -1,123 +0,0 @@ -database = $database; - } - - /** - * Performs an authentication. - * @param array $credentials - * @return Nette\Security\Identity - * @throws Nette\Security\AuthenticationException - */ - public function authenticate(array $credentials) - { - list($email, $password) = $credentials; - - $row = $this->findByEmail($email); - - if (!$row) { - throw new Nette\Security\AuthenticationException(sprintf('Unknown user', $email), self::IDENTITY_NOT_FOUND); - - } elseif (!Passwords::verify($password, $row['password'])) { - throw new Nette\Security\AuthenticationException('Invalid password', self::INVALID_CREDENTIAL); - - } elseif (Passwords::needsRehash($row['password'])) { - $row->update([ - 'password' => Passwords::hash($password), - ]); - } - - $arr = $row->toArray(); - unset($arr['password']); - return new Nette\Security\Identity($row['id'], null, $arr); - } - - - /** - * Adds new user. - * @param string $email - * @param string $password - * @throws DuplicateNameException - */ - public function add($email, $password) - { - if ($this->getTable()->where('email', $email)->count() > 0) { - throw new DuplicateNameException("User with given email already registered"); - } - - $this->getTable()->insert([ - 'email' => $email, - 'password' => Passwords::hash($password), - ]); - } - - /** - * @param $id - * @param $password - * @return bool - */ - public function checkPassword($id, $password) - { - $user = $this->getTable()->get($id); - return $user && Passwords::verify($password, $user->password); - } - - /** - * Changes password of the user with given id. - * @param int $id - * @param string $new - * @return int - */ - public function setNewPassword($id, $new) - { - return $this->getTable()->where('id', $id)->update([ - 'password' => Passwords::hash($new) - ]); - } - - /** - * Finds user by given email. - * @param string $email - * @return bool|mixed|Nette\Database\Table\IRow - */ - public function findByEmail($email) - { - return $this->getTable()->where('email', $email)->fetch(); - } - - /** - * @return Nette\Database\Table\Selection - */ - protected function getTable() - { - return $this->database->table('users'); - } - -} - - -class DuplicateNameException extends \Exception -{ - -} diff --git a/nette/native_db/notejam/app/presenters/AccountPresenter.php b/nette/native_db/notejam/app/presenters/AccountPresenter.php deleted file mode 100644 index 0903c195e..000000000 --- a/nette/native_db/notejam/app/presenters/AccountPresenter.php +++ /dev/null @@ -1,35 +0,0 @@ -formFactory->create(); - $form->onError[] = function ($form) { - foreach ($form->getErrors() as $error) { - $this->flashMessage($error, 'error'); - } - }; - $form->onSuccess[] = function () { - $this->flashMessage('Password is successfully changed', 'success'); - $this->redirect('Homepage:'); - }; - return $form; - } - -} diff --git a/nette/native_db/notejam/app/presenters/BasePresenter.php b/nette/native_db/notejam/app/presenters/BasePresenter.php deleted file mode 100644 index 96d1dacf8..000000000 --- a/nette/native_db/notejam/app/presenters/BasePresenter.php +++ /dev/null @@ -1,47 +0,0 @@ -userBarFactory->create(); - } - - /** - * @return \App\Components\Pads\Pads - */ - protected function createComponentPads() - { - $this->pads = $this->padManager->findAll(); - return $this->padsFactory->create($this->pads); - } - -} diff --git a/nette/native_db/notejam/app/presenters/Error4xxPresenter.php b/nette/native_db/notejam/app/presenters/Error4xxPresenter.php deleted file mode 100644 index c25c651a2..000000000 --- a/nette/native_db/notejam/app/presenters/Error4xxPresenter.php +++ /dev/null @@ -1,21 +0,0 @@ -getCode()}.latte"; - $this->template->setFile(is_file($file) ? $file : __DIR__ . '/templates/Error/4xx.latte'); - } - -} diff --git a/nette/native_db/notejam/app/presenters/ErrorPresenter.php b/nette/native_db/notejam/app/presenters/ErrorPresenter.php deleted file mode 100644 index 6067dee05..000000000 --- a/nette/native_db/notejam/app/presenters/ErrorPresenter.php +++ /dev/null @@ -1,42 +0,0 @@ -logger = $logger; - } - - /** - * @return Nette\Application\IResponse - */ - public function run(Nette\Application\Request $request) - { - $e = $request->getParameter('exception'); - - if ($e instanceof Nette\Application\BadRequestException) { - // $this->logger->log("HTTP code {$e->getCode()}: {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", 'access'); - return new Nette\Application\Responses\ForwardResponse($request->setPresenterName('Error4xx')); - } - - $this->logger->log($e, ILogger::EXCEPTION); - return new Nette\Application\Responses\CallbackResponse(function () { - require __DIR__ . '/templates/Error/500.phtml'; - }); - } - -} diff --git a/nette/native_db/notejam/app/presenters/HomepagePresenter.php b/nette/native_db/notejam/app/presenters/HomepagePresenter.php deleted file mode 100644 index eaeacb42a..000000000 --- a/nette/native_db/notejam/app/presenters/HomepagePresenter.php +++ /dev/null @@ -1,51 +0,0 @@ -notesFactory->create($this->notes); - } - - /** - * Homepage:default. - * @param string $order - */ - public function actionDefault($order) - { - $this->notes = $this->noteManager->findAll(); - if ($order) { - $this->notes->order(OrderHelper::translateParameterToColumns($order)); - } - } - - /** - * Homepage:default render. - */ - public function renderDefault() - { - $this->template->notes = $this->notes; - } - -} diff --git a/nette/native_db/notejam/app/presenters/NotePresenter.php b/nette/native_db/notejam/app/presenters/NotePresenter.php deleted file mode 100644 index ab344412b..000000000 --- a/nette/native_db/notejam/app/presenters/NotePresenter.php +++ /dev/null @@ -1,183 +0,0 @@ -editPadFormFactory->create($this->note->id, $this->note->name, $this->note->text, $this->note->pad_id); - $form->onError[] = function ($form) { - foreach ($form->getErrors() as $error) { - $this->flashMessage($error, 'error'); - } - }; - $form->onSuccess[] = function () { - $this->flashMessage('Note successfully updated', 'success'); - $this->redirect('default', ['id' => $this->id]); - }; - return $form; - } - - /** - * Creates DeleteNoteForm component. - * Called automagically by the framework. - * @return \Nette\Application\UI\Form - */ - protected function createComponentDeleteNoteForm() - { - $form = $this->deletePadFormFactory->create($this->id); - $form->onError[] = function ($form) { - foreach ($form->getErrors() as $error) { - $this->flashMessage($error, 'error'); - } - }; - $form->onSuccess[] = function () { - $this->flashMessage('Note successfully deleted', 'success'); - $this->redirect('Homepage:'); - }; - return $form; - } - - /** - * Creates NewNoteForm component. - * Called automagically by the framework. - * @return \Nette\Application\UI\Form - */ - protected function createComponentNewNoteForm() - { - $form = $this->newPadFormFactory->create($this->padId); - $form->onError[] = function ($form) { - foreach ($form->getErrors() as $error) { - $this->flashMessage($error, 'error'); - } - }; - $form->onSuccess[] = function () { - $this->flashMessage('Note successfully created', 'success'); - $this->redirect('Homepage:'); - }; - return $form; - } - - /** - * Note:default. - * @param int $id - * @throws BadRequestException - */ - public function actionDefault($id) - { - $this->loadNote($id); - $this->notes = $this->noteManager->findByPad($id); - } - - /** - * Note:default render. - */ - public function renderDefault() - { - $this->template->note = $this->note; - } - - /** - * Note:edit. - * @param int $id - * @throws BadRequestException - */ - public function actionEdit($id) - { - $this->loadNote($id); - } - - /** - * Note:edit render. - */ - public function renderEdit() - { - $this->template->note = $this->note; - } - - /** - * Note:delete. - * @param int $id - * @throws BadRequestException - */ - public function actionDelete($id) - { - $this->loadNote($id); - } - - /** - * Note:delete render. - */ - public function renderDelete() - { - $this->template->note = $this->note; - } - - /** - * Note:new. - * @param int $pad - */ - public function actionNew($pad) - { - $this->padId = $pad; - } - - /** - * Loads note with given id and if not found, throws BadRequestException. - * @param int $id - * @throws BadRequestException - */ - private function loadNote($id) - { - $this->id = $id; - $this->note = $this->noteManager->find($this->id); - if (!$this->note) { - throw new BadRequestException("Pad with given id not found"); - } - } - -} diff --git a/nette/native_db/notejam/app/presenters/PadPresenter.php b/nette/native_db/notejam/app/presenters/PadPresenter.php deleted file mode 100644 index c15961cc0..000000000 --- a/nette/native_db/notejam/app/presenters/PadPresenter.php +++ /dev/null @@ -1,189 +0,0 @@ -editPadFormFactory->create($this->id, $this->pad->name); - $form->onError[] = function ($form) { - foreach ($form->getErrors() as $error) { - $this->flashMessage($error, 'error'); - } - }; - $form->onSuccess[] = function () { - $this->flashMessage('Pad successfully updated', 'success'); - $this->redirect('Homepage:'); - }; - return $form; - } - - /** - * Creates DeletePadForm component. - * Called automagically by the framework. - * @return \Nette\Application\UI\Form - */ - protected function createComponentDeletePadForm() - { - $form = $this->deletePadFormFactory->create($this->id); - $form->onError[] = function ($form) { - foreach ($form->getErrors() as $error) { - $this->flashMessage($error, 'error'); - } - }; - $form->onSuccess[] = function () { - $this->flashMessage('Pad successfully deleted', 'success'); - $this->redirect('Homepage:'); - }; - return $form; - } - - /** - * Creates NewPadForm component. - * Called automagically by the framework. - * @return \Nette\Application\UI\Form - */ - protected function createComponentNewPadForm() - { - $form = $this->newPadFormFactory->create(); - $form->onError[] = function ($form) { - foreach ($form->getErrors() as $error) { - $this->flashMessage($error, 'error'); - } - }; - $form->onSuccess[] = function () { - $this->flashMessage('Pad successfully created', 'success'); - $this->redirect('Homepage:'); - }; - return $form; - } - - /** - * Creates Notes component. - * Called automagically by the framework. - * @return \App\Components\Notes\Notes - */ - protected function createComponentNotes() - { - return $this->notesFactory->create($this->notes, $this->pad); - } - - /** - * Pad:default. - * @param int $id - * @param string|null $order - * @throws BadRequestException - */ - public function actionDefault($id, $order) - { - $this->loadPad($id); - $this->notes = $this->noteManager->findByPad($id); - if ($order) { - $this->notes->order(OrderHelper::translateParameterToColumns($order)); - } - } - - /** - * Pad:default render. - */ - public function renderDefault() - { - $this->template->pad = $this->pad; - } - - /** - * Pad:edit. - * @param int $id - * @throws BadRequestException - */ - public function actionEdit($id) - { - $this->loadPad($id); - } - - /** - * Pad:edit render. - */ - public function renderEdit() - { - $this->template->pad = $this->pad; - } - - /** - * Pad:delete. - * @param int $id - * @throws BadRequestException - */ - public function actionDelete($id) - { - $this->loadPad($id); - } - - /** - * Pad:delete render. - */ - public function renderDelete() - { - $this->template->pad = $this->pad; - } - - /** - * Loads pad with given id and if not found, throws BadRequestException. - * @param int $id - * @throws BadRequestException - */ - private function loadPad($id) - { - $this->id = $id; - $this->pad = $this->padManager->find($this->id); - if (!$this->pad) { - throw new BadRequestException("Pad with given id not found"); - } - } - -} diff --git a/nette/native_db/notejam/app/presenters/SecuredBasePresenter.php b/nette/native_db/notejam/app/presenters/SecuredBasePresenter.php deleted file mode 100644 index d9838e6b1..000000000 --- a/nette/native_db/notejam/app/presenters/SecuredBasePresenter.php +++ /dev/null @@ -1,20 +0,0 @@ -user->isLoggedIn()) { - $this->redirect('Sign:in', ['backlink' => $this->storeRequest()]); - } - } - -} diff --git a/nette/native_db/notejam/app/presenters/SignPresenter.php b/nette/native_db/notejam/app/presenters/SignPresenter.php deleted file mode 100644 index 8a51cb89d..000000000 --- a/nette/native_db/notejam/app/presenters/SignPresenter.php +++ /dev/null @@ -1,116 +0,0 @@ -forgottenPasswordFormFactory->create(); - $form->onError[] = function ($form) { - foreach ($form->getErrors() as $error) { - $this->flashMessage($error, 'error'); - } - }; - $form->onSuccess[] = function () { - $this->flashMessage('New password sent to your inbox', 'success'); - $this->redirect('Sign:in'); - }; - return $form; - } - - /** - * Creates SignInForm component. - * Called automagically by the framework. - * @return Nette\Application\UI\Form - */ - protected function createComponentSignInForm() - { - $form = $this->signInFormFactory->create(); - $form->onError[] = function ($form) { - foreach ($form->getErrors() as $error) { - $this->flashMessage($error, 'error'); - } - }; - $form->onSuccess[] = function () { - $this->restoreRequest($this->backlink); - $this->redirect('Homepage:'); - }; - return $form; - } - - - /** - * Creates SignUpForm component. - * Called automagically by the framework. - * @return Nette\Application\UI\Form - */ - protected function createComponentSignUpForm() - { - $form = $this->signUpFormFactory->create(); - $form->onError[] = function ($form) { - foreach ($form->getErrors() as $error) { - $this->flashMessage($error, 'error'); - } - }; - $form->onSuccess[] = function () { - $this->flashMessage('User is successfully created. Now you can sign in.', 'success'); - $this->redirect('Sign:in'); - }; - return $form; - } - - /** - * Sign:in. - */ - public function actionIn() - { - if ($this->user->isLoggedIn()) { - $this->redirect('Homepage:'); - } - } - - /** - * Sign:up. - */ - public function actionUp() - { - if ($this->user->isLoggedIn()) { - $this->redirect('Homepage:'); - } - } - - /** - * Sign:out. - */ - public function actionOut() - { - $this->getUser()->logout(true); - $this->flashMessage('You have been signed out.', 'info'); - $this->redirect('in'); - } - -} diff --git a/nette/native_db/notejam/app/presenters/templates/@layout.latte b/nette/native_db/notejam/app/presenters/templates/@layout.latte deleted file mode 100644 index 57cb82c51..000000000 --- a/nette/native_db/notejam/app/presenters/templates/@layout.latte +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - Notejam{ifset title}: {include title|striptags}{/ifset} - - - - - - - - - - - - - - - -
- {if $user->isLoggedIn()} - {control userBar} - {else} -
- -
- {/if} - -
-

notejam: - {include header} -

-
- - {if $user->isLoggedIn() && !$presenter->isLinkCurrent('Account:settings')} - {control pads} - {/if} - -
-
-
{$flash->message}
-
- {include content} -
- - - -
- - Fork me on GitHub - - - diff --git a/nette/native_db/notejam/app/presenters/templates/Account/settings.latte b/nette/native_db/notejam/app/presenters/templates/Account/settings.latte deleted file mode 100644 index d5e1a7424..000000000 --- a/nette/native_db/notejam/app/presenters/templates/Account/settings.latte +++ /dev/null @@ -1,13 +0,0 @@ -{block title}Account settings{/block} -{block header}Account settings{/block} -{block content} - -{/block} diff --git a/nette/native_db/notejam/app/presenters/templates/Error/403.latte b/nette/native_db/notejam/app/presenters/templates/Error/403.latte deleted file mode 100644 index de00328e7..000000000 --- a/nette/native_db/notejam/app/presenters/templates/Error/403.latte +++ /dev/null @@ -1,7 +0,0 @@ -{block content} -

Access Denied

- -

You do not have permission to view this page. Please try contact the web -site administrator if you believe you should be able to view this page.

- -

error 403

diff --git a/nette/native_db/notejam/app/presenters/templates/Error/404.latte b/nette/native_db/notejam/app/presenters/templates/Error/404.latte deleted file mode 100644 index 022001c2a..000000000 --- a/nette/native_db/notejam/app/presenters/templates/Error/404.latte +++ /dev/null @@ -1,8 +0,0 @@ -{block content} -

Page Not Found

- -

The page you requested could not be found. It is possible that the address is -incorrect, or that the page no longer exists. Please use a search engine to find -what you are looking for.

- -

error 404

diff --git a/nette/native_db/notejam/app/presenters/templates/Error/405.latte b/nette/native_db/notejam/app/presenters/templates/Error/405.latte deleted file mode 100644 index d42489233..000000000 --- a/nette/native_db/notejam/app/presenters/templates/Error/405.latte +++ /dev/null @@ -1,6 +0,0 @@ -{block content} -

Method Not Allowed

- -

The requested method is not allowed for the URL.

- -

error 405

diff --git a/nette/native_db/notejam/app/presenters/templates/Error/410.latte b/nette/native_db/notejam/app/presenters/templates/Error/410.latte deleted file mode 100644 index 99bde92c1..000000000 --- a/nette/native_db/notejam/app/presenters/templates/Error/410.latte +++ /dev/null @@ -1,6 +0,0 @@ -{block content} -

Page Not Found

- -

The page you requested has been taken off the site. We apologize for the inconvenience.

- -

error 410

diff --git a/nette/native_db/notejam/app/presenters/templates/Error/4xx.latte b/nette/native_db/notejam/app/presenters/templates/Error/4xx.latte deleted file mode 100644 index d5ce82f19..000000000 --- a/nette/native_db/notejam/app/presenters/templates/Error/4xx.latte +++ /dev/null @@ -1,4 +0,0 @@ -{block content} -

Oops...

- -

Your browser sent a request that this server could not understand or process.

diff --git a/nette/native_db/notejam/app/presenters/templates/Error/500.phtml b/nette/native_db/notejam/app/presenters/templates/Error/500.phtml deleted file mode 100644 index 619611eac..000000000 --- a/nette/native_db/notejam/app/presenters/templates/Error/500.phtml +++ /dev/null @@ -1,20 +0,0 @@ - - - -Server Error - - - -
-

Server Error

- -

We're sorry! The server encountered an internal error and - was unable to complete your request. Please try again later.

- -

error 500

-
diff --git a/nette/native_db/notejam/app/presenters/templates/Homepage/default.latte b/nette/native_db/notejam/app/presenters/templates/Homepage/default.latte deleted file mode 100644 index 616841a40..000000000 --- a/nette/native_db/notejam/app/presenters/templates/Homepage/default.latte +++ /dev/null @@ -1,6 +0,0 @@ -{block title}All notes ({count($notes)}){/block} -{block header}All notes ({count($notes)}){/block} -{block content} - {control notes} - New note -{/block} diff --git a/nette/native_db/notejam/app/presenters/templates/Note/default.latte b/nette/native_db/notejam/app/presenters/templates/Note/default.latte deleted file mode 100644 index 3f72e1232..000000000 --- a/nette/native_db/notejam/app/presenters/templates/Note/default.latte +++ /dev/null @@ -1,9 +0,0 @@ -{block title}{$note->name}{/block} -{block header}{$note->name}{/block} -{block content} -

Last edited {$note->updated_at|date:'d. M. Y'}

-

{$note->text}

-
- Edit - Delete it -{/block} diff --git a/nette/native_db/notejam/app/presenters/templates/Note/delete.latte b/nette/native_db/notejam/app/presenters/templates/Note/delete.latte deleted file mode 100644 index 1ab2ab7f5..000000000 --- a/nette/native_db/notejam/app/presenters/templates/Note/delete.latte +++ /dev/null @@ -1,9 +0,0 @@ -{block title}{$note->name}{/block} -{block header}{$note->name}{/block} -{block content} -

Are you sure you want to delete the note?

-
-   - Cancel -
-{/block} diff --git a/nette/native_db/notejam/app/presenters/templates/Note/edit.latte b/nette/native_db/notejam/app/presenters/templates/Note/edit.latte deleted file mode 100644 index 5066cc048..000000000 --- a/nette/native_db/notejam/app/presenters/templates/Note/edit.latte +++ /dev/null @@ -1,13 +0,0 @@ -{block title}{$note->name}{/block} -{block header}{$note->name}{/block} -{block content} -
- - - - - - - -
-{/block} diff --git a/nette/native_db/notejam/app/presenters/templates/Note/new.latte b/nette/native_db/notejam/app/presenters/templates/Note/new.latte deleted file mode 100644 index 4b3f7daba..000000000 --- a/nette/native_db/notejam/app/presenters/templates/Note/new.latte +++ /dev/null @@ -1,13 +0,0 @@ -{block title}New note{/block} -{block header}New note{/block} -{block content} -
- - - - - - - -
-{/block} diff --git a/nette/native_db/notejam/app/presenters/templates/Pad/default.latte b/nette/native_db/notejam/app/presenters/templates/Pad/default.latte deleted file mode 100644 index 86e3c6904..000000000 --- a/nette/native_db/notejam/app/presenters/templates/Pad/default.latte +++ /dev/null @@ -1,8 +0,0 @@ -{block title}New pad{/block} -{block header}New pad{/block} -{block content} - {control notes} - New note -   - Pad settings -{/block} diff --git a/nette/native_db/notejam/app/presenters/templates/Pad/delete.latte b/nette/native_db/notejam/app/presenters/templates/Pad/delete.latte deleted file mode 100644 index dbc159065..000000000 --- a/nette/native_db/notejam/app/presenters/templates/Pad/delete.latte +++ /dev/null @@ -1,9 +0,0 @@ -{block title}{$pad->name}{/block} -{block header}{$pad->name}{/block} -{block content} -

Are you sure you want to delete the pad?

-
-   - Cancel -
-{/block} diff --git a/nette/native_db/notejam/app/presenters/templates/Pad/edit.latte b/nette/native_db/notejam/app/presenters/templates/Pad/edit.latte deleted file mode 100644 index 95decdce9..000000000 --- a/nette/native_db/notejam/app/presenters/templates/Pad/edit.latte +++ /dev/null @@ -1,11 +0,0 @@ -{block title}{$pad->name}{/block} -{block header}{$pad->name}{/block} -{block content} -
- - - - - -
-{/block} diff --git a/nette/native_db/notejam/app/presenters/templates/Pad/new.latte b/nette/native_db/notejam/app/presenters/templates/Pad/new.latte deleted file mode 100644 index 70acc715b..000000000 --- a/nette/native_db/notejam/app/presenters/templates/Pad/new.latte +++ /dev/null @@ -1,9 +0,0 @@ -{block title}New pad{/block} -{block header}New pad{/block} -{block content} -
- - - -
-{/block} diff --git a/nette/native_db/notejam/app/presenters/templates/Sign/forgotten.latte b/nette/native_db/notejam/app/presenters/templates/Sign/forgotten.latte deleted file mode 100644 index 7f2702b6d..000000000 --- a/nette/native_db/notejam/app/presenters/templates/Sign/forgotten.latte +++ /dev/null @@ -1,9 +0,0 @@ -{block title}Frogot password?{/block} -{block header}Forgot password?{/block} -{block content} - -{/block} diff --git a/nette/native_db/notejam/app/presenters/templates/Sign/in.latte b/nette/native_db/notejam/app/presenters/templates/Sign/in.latte deleted file mode 100644 index 0644d8aa9..000000000 --- a/nette/native_db/notejam/app/presenters/templates/Sign/in.latte +++ /dev/null @@ -1,13 +0,0 @@ -{block title}Sign In{/block} -{block header}Sign In{/block} -{block content} - -{/block} diff --git a/nette/native_db/notejam/app/presenters/templates/Sign/up.latte b/nette/native_db/notejam/app/presenters/templates/Sign/up.latte deleted file mode 100644 index b742ab8ee..000000000 --- a/nette/native_db/notejam/app/presenters/templates/Sign/up.latte +++ /dev/null @@ -1,15 +0,0 @@ -{block title}Sign Up{/block} -{block header}Sign Up{/block} -{block content} - -{/block} diff --git a/nette/native_db/notejam/app/router/RouterFactory.php b/nette/native_db/notejam/app/router/RouterFactory.php deleted file mode 100644 index c601dec2a..000000000 --- a/nette/native_db/notejam/app/router/RouterFactory.php +++ /dev/null @@ -1,40 +0,0 @@ -', 'Note:default'); - $router[] = new Route('/notes//edit', 'Note:edit'); - $router[] = new Route('/notes//delete', 'Note:delete'); - - $router[] = new Route('/pads/create', 'Pad:new'); - $router[] = new Route('/pads/', 'Pad:default'); - $router[] = new Route('/pads//edit', 'Pad:edit'); - $router[] = new Route('/pads//delete', 'Pad:delete'); - - $router[] = new Route('[/]', 'Homepage:default'); - return $router; - } - -} diff --git a/nette/native_db/notejam/bin/create-db.php b/nette/native_db/notejam/bin/create-db.php deleted file mode 100644 index 5df629192..000000000 --- a/nette/native_db/notejam/bin/create-db.php +++ /dev/null @@ -1,29 +0,0 @@ -getByType('Nette\Database\Context'); -$db->getConnection()->query(" -CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, - email VARCHAR(75) NOT NULL, - password VARCHAR(128) NOT NULL -);"); - -$db->getConnection()->query(" -CREATE TABLE IF NOT EXISTS pads ( - id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, - name VARCHAR(100) NOT NULL, - user_id INTEGER NOT NULL REFERENCES users(id) -);"); - -$db->getConnection()->query(" -CREATE TABLE notes ( - id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, - pad_id INTEGER REFERENCES pads(id), - user_id INTEGER NOT NULL REFERENCES users(id), - name VARCHAR(100) NOT NULL, - text text NOT NULL, - created_at DATETIME NOT NULL, - updated_at DATETIME NOT NULL -);"); diff --git a/nette/native_db/notejam/codeception.yml b/nette/native_db/notejam/codeception.yml deleted file mode 100644 index 15019d00a..000000000 --- a/nette/native_db/notejam/codeception.yml +++ /dev/null @@ -1,23 +0,0 @@ -actor: Tester -paths: - tests: tests - log: tests/_output - data: tests/_data - support: tests/_support - envs: tests/_envs -settings: - bootstrap: _bootstrap.php - colors: true - memory_limit: 1024M -extensions: - enabled: - - Codeception\Extension\RunFailed -modules: - config: - Db: - dsn: 'sqlite:notejam.db' - user: - password: - dump: tests/_data/dump.sql - populate: true - cleanup: true diff --git a/nette/native_db/notejam/composer.json b/nette/native_db/notejam/composer.json deleted file mode 100644 index e261b7a05..000000000 --- a/nette/native_db/notejam/composer.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "nette/sandbox", - "description": "The sandbox is a pre-packaged Nette Framework project, basic configured structure for your application.", - "homepage": "https://nette.org", - "type": "project", - "license": ["BSD-3-Clause", "GPL-2.0", "GPL-3.0"], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "require": { - "php": ">= 5.3.7", - "nette/application": "~2.3.6", - "nette/bootstrap": "~2.3.0", - "nette/caching": "~2.3.0", - "nette/database": "~2.3.0", - "nette/di": "~2.3.0", - "nette/finder": "~2.3.0", - "nette/forms": "~2.3.0", - "nette/http": "~2.3.0", - "nette/mail": "~2.3.0", - "nette/robot-loader": "~2.3.0", - "nette/safe-stream": "~2.3.0", - "nette/security": "~2.3.0", - "nette/utils": "~2.3.0", - "latte/latte": "~2.3.0", - "tracy/tracy": "~2.3.0", - "dg/adminer-custom": "~1.6" - }, - "require-dev": { - "codeception/codeception": "*" - } -} diff --git a/nette/native_db/notejam/composer.lock b/nette/native_db/notejam/composer.lock deleted file mode 100644 index ca68de2e1..000000000 --- a/nette/native_db/notejam/composer.lock +++ /dev/null @@ -1,2697 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", - "This file is @generated automatically" - ], - "hash": "42813a0174e5fbe7e251f6af01ccfeba", - "content-hash": "9f640b3bb59ce0b58222c5594953b85f", - "packages": [ - { - "name": "dg/adminer-custom", - "version": "v1.6.4", - "source": { - "type": "git", - "url": "https://github.com/dg/adminer-custom.git", - "reference": "5215a1fa29ae9fc4304a867ce972f252b12921b0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dg/adminer-custom/zipball/5215a1fa29ae9fc4304a867ce972f252b12921b0", - "reference": "5215a1fa29ae9fc4304a867ce972f252b12921b0", - "shasum": "" - }, - "type": "project", - "notification-url": "https://packagist.org/downloads/", - "description": "Customization for the best database management tool written in PHP, Adminer", - "time": "2015-09-07 07:29:02" - }, - { - "name": "latte/latte", - "version": "v2.3.7", - "source": { - "type": "git", - "url": "https://github.com/nette/latte.git", - "reference": "b6e090e461c9cd88d60ae79a7713990b17b1531c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/latte/zipball/b6e090e461c9cd88d60ae79a7713990b17b1531c", - "reference": "b6e090e461c9cd88d60ae79a7713990b17b1531c", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=5.3.1" - }, - "require-dev": { - "nette/tester": "~1.3" - }, - "suggest": { - "ext-fileinfo": "to use filter |datastream", - "ext-mbstring": "to use filters like lower, upper, capitalize, ..." - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "Latte: the amazing template engine for PHP", - "homepage": "https://latte.nette.org", - "keywords": [ - "templating", - "twig" - ], - "time": "2015-11-07 22:54:05" - }, - { - "name": "nette/application", - "version": "v2.3.7", - "source": { - "type": "git", - "url": "https://github.com/nette/application.git", - "reference": "8e87ae81c2098abd7895bfd96d9fac1cd332abc3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/application/zipball/8e87ae81c2098abd7895bfd96d9fac1cd332abc3", - "reference": "8e87ae81c2098abd7895bfd96d9fac1cd332abc3", - "shasum": "" - }, - "require": { - "nette/component-model": "~2.2", - "nette/http": "~2.2", - "nette/reflection": "~2.2", - "nette/security": "~2.2", - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "latte/latte": "~2.3.0", - "nette/di": "~2.3", - "nette/forms": "~2.2", - "nette/robot-loader": "~2.2", - "nette/tester": "~1.3" - }, - "suggest": { - "latte/latte": "Allows using Latte in templates", - "nette/forms": "Allows to use Nette\\Application\\UI\\Form" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "Nette Application MVC Component", - "homepage": "https://nette.org", - "time": "2015-10-13 14:33:28" - }, - { - "name": "nette/bootstrap", - "version": "v2.3.3", - "source": { - "type": "git", - "url": "https://github.com/nette/bootstrap.git", - "reference": "8e2db45c39a1fa24f88e94c7b2a62ad09e9a306e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/bootstrap/zipball/8e2db45c39a1fa24f88e94c7b2a62ad09e9a306e", - "reference": "8e2db45c39a1fa24f88e94c7b2a62ad09e9a306e", - "shasum": "" - }, - "require": { - "nette/di": "~2.3", - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "latte/latte": "~2.2", - "nette/application": "~2.3", - "nette/caching": "~2.3", - "nette/database": "~2.3", - "nette/forms": "~2.3", - "nette/http": "~2.3", - "nette/mail": "~2.3", - "nette/robot-loader": "~2.2", - "nette/safe-stream": "~2.2", - "nette/security": "~2.3", - "nette/tester": "~1.3", - "tracy/tracy": "~2.3" - }, - "suggest": { - "nette/robot-loader": "to use Configurator::createRobotLoader()", - "tracy/tracy": "to use Configurator::enableDebugger()" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette Bootstrap", - "homepage": "http://nette.org", - "time": "2015-07-11 21:07:11" - }, - { - "name": "nette/caching", - "version": "v2.3.3", - "source": { - "type": "git", - "url": "https://github.com/nette/caching.git", - "reference": "d4be13806d70c02d53b72cc63e93de6cf813f50f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/caching/zipball/d4be13806d70c02d53b72cc63e93de6cf813f50f", - "reference": "d4be13806d70c02d53b72cc63e93de6cf813f50f", - "shasum": "" - }, - "require": { - "nette/finder": "~2.2", - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "latte/latte": "~2.3.0", - "nette/di": "~2.3", - "nette/tester": "~1.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette Caching Component", - "homepage": "http://nette.org", - "time": "2015-07-11 21:09:42" - }, - { - "name": "nette/component-model", - "version": "v2.2.4", - "source": { - "type": "git", - "url": "https://github.com/nette/component-model.git", - "reference": "07bce436051fd92d084642ce7a47f00045e0d1e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/component-model/zipball/07bce436051fd92d084642ce7a47f00045e0d1e5", - "reference": "07bce436051fd92d084642ce7a47f00045e0d1e5", - "shasum": "" - }, - "require": { - "nette/utils": "^2.3.5", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/tester": "~1.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "Nette Component Model", - "homepage": "https://nette.org", - "time": "2015-10-06 17:54:05" - }, - { - "name": "nette/database", - "version": "v2.3.7", - "source": { - "type": "git", - "url": "https://github.com/nette/database.git", - "reference": "32ab8af7abb405c6415ef335d3395dea9d575859" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/database/zipball/32ab8af7abb405c6415ef335d3395dea9d575859", - "reference": "32ab8af7abb405c6415ef335d3395dea9d575859", - "shasum": "" - }, - "require": { - "ext-pdo": "*", - "nette/caching": "~2.2", - "nette/utils": "^2.3.5", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "mockery/mockery": "~0.9.1", - "nette/di": "~2.3", - "nette/tester": "~1.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "Nette Database Component", - "homepage": "https://nette.org", - "time": "2015-10-05 13:16:36" - }, - { - "name": "nette/di", - "version": "v2.3.6", - "source": { - "type": "git", - "url": "https://github.com/nette/di.git", - "reference": "efa1d13f016b58b4a9200802c9c5b14d10d72e85" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/di/zipball/efa1d13f016b58b4a9200802c9c5b14d10d72e85", - "reference": "efa1d13f016b58b4a9200802c9c5b14d10d72e85", - "shasum": "" - }, - "require": { - "nette/neon": "^2.3.3", - "nette/php-generator": "^2.3.3", - "nette/utils": "~2.3", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/tester": "~1.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette Dependency Injection Component", - "homepage": "http://nette.org", - "time": "2015-09-14 18:18:24" - }, - { - "name": "nette/finder", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/nette/finder.git", - "reference": "38f803a03f4cddf352e28af70294c71f7026e516" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/finder/zipball/38f803a03f4cddf352e28af70294c71f7026e516", - "reference": "38f803a03f4cddf352e28af70294c71f7026e516", - "shasum": "" - }, - "require": { - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/tester": "~1.4" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette Finder: Files Searching", - "homepage": "http://nette.org", - "time": "2015-07-11 21:13:50" - }, - { - "name": "nette/forms", - "version": "v2.3.6", - "source": { - "type": "git", - "url": "https://github.com/nette/forms.git", - "reference": "5e07a7b7180e5e88db9d44e12f1677e36b4f164b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/forms/zipball/5e07a7b7180e5e88db9d44e12f1677e36b4f164b", - "reference": "5e07a7b7180e5e88db9d44e12f1677e36b4f164b", - "shasum": "" - }, - "require": { - "nette/component-model": "~2.2", - "nette/http": "~2.2", - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "latte/latte": "~2.3.2", - "nette/di": "~2.3", - "nette/tester": "~1.3", - "tracy/tracy": "~2.2" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "Nette Forms: greatly facilitates web forms", - "homepage": "https://nette.org", - "time": "2015-10-19 01:41:55" - }, - { - "name": "nette/http", - "version": "v2.3.3", - "source": { - "type": "git", - "url": "https://github.com/nette/http.git", - "reference": "ff2e4608391bca2444df9af6eaf8666ac853eb02" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/http/zipball/ff2e4608391bca2444df9af6eaf8666ac853eb02", - "reference": "ff2e4608391bca2444df9af6eaf8666ac853eb02", - "shasum": "" - }, - "require": { - "nette/utils": "~2.2, >=2.2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/di": "~2.3", - "nette/tester": "~1.4" - }, - "suggest": { - "ext-fileinfo": "to detect type of uploaded files" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette HTTP Component", - "homepage": "http://nette.org", - "time": "2015-07-19 16:17:50" - }, - { - "name": "nette/mail", - "version": "v2.3.3", - "source": { - "type": "git", - "url": "https://github.com/nette/mail.git", - "reference": "4ea303d96c6a80ffe357baf59d387f4fe2cfd412" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/mail/zipball/4ea303d96c6a80ffe357baf59d387f4fe2cfd412", - "reference": "4ea303d96c6a80ffe357baf59d387f4fe2cfd412", - "shasum": "" - }, - "require": { - "ext-iconv": "*", - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/di": "~2.3", - "nette/tester": "~1.3" - }, - "suggest": { - "ext-fileinfo": "to detect type of attached files" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "Nette Mail: Sending E-mails", - "homepage": "https://nette.org", - "time": "2015-10-05 12:58:01" - }, - { - "name": "nette/neon", - "version": "v2.3.3", - "source": { - "type": "git", - "url": "https://github.com/nette/neon.git", - "reference": "12bbb0e85ba8521dd291f4df0fe20a1b79aae32c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/neon/zipball/12bbb0e85ba8521dd291f4df0fe20a1b79aae32c", - "reference": "12bbb0e85ba8521dd291f4df0fe20a1b79aae32c", - "shasum": "" - }, - "require": { - "ext-iconv": "*", - "php": ">=5.3.1" - }, - "require-dev": { - "nette/tester": "~1.4" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette NEON: parser & generator for Nette Object Notation", - "homepage": "http://ne-on.org", - "time": "2015-08-22 15:23:30" - }, - { - "name": "nette/php-generator", - "version": "v2.3.4", - "source": { - "type": "git", - "url": "https://github.com/nette/php-generator.git", - "reference": "846028e9d885d2d8ec60823d995e1291bbe3eb69" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/php-generator/zipball/846028e9d885d2d8ec60823d995e1291bbe3eb69", - "reference": "846028e9d885d2d8ec60823d995e1291bbe3eb69", - "shasum": "" - }, - "require": { - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/tester": "~1.4" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "Nette PHP Generator", - "homepage": "https://nette.org", - "time": "2015-10-09 14:34:13" - }, - { - "name": "nette/reflection", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/nette/reflection.git", - "reference": "9c2ed2a29f1f58125a0f19ffc987812d6b17d3e6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/reflection/zipball/9c2ed2a29f1f58125a0f19ffc987812d6b17d3e6", - "reference": "9c2ed2a29f1f58125a0f19ffc987812d6b17d3e6", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "nette/caching": "~2.2", - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/di": "~2.3", - "nette/tester": "~1.4" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette PHP Reflection Component", - "homepage": "http://nette.org", - "time": "2015-07-11 21:34:53" - }, - { - "name": "nette/robot-loader", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/nette/robot-loader.git", - "reference": "69331d359bbc9e5f911c12b82187cac914d983fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/robot-loader/zipball/69331d359bbc9e5f911c12b82187cac914d983fb", - "reference": "69331d359bbc9e5f911c12b82187cac914d983fb", - "shasum": "" - }, - "require": { - "nette/caching": "~2.2", - "nette/finder": "~2.3", - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/tester": "~1.4" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette RobotLoader: comfortable autoloading", - "homepage": "http://nette.org", - "time": "2015-07-11 21:20:57" - }, - { - "name": "nette/safe-stream", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/nette/safe-stream.git", - "reference": "bf30db367b51a0932c44dcb9a378927644d48b2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/safe-stream/zipball/bf30db367b51a0932c44dcb9a378927644d48b2e", - "reference": "bf30db367b51a0932c44dcb9a378927644d48b2e", - "shasum": "" - }, - "require": { - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/tester": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "files": [ - "src/loader.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette SafeStream: Atomic Operations", - "homepage": "http://nette.org", - "time": "2015-07-11 20:59:15" - }, - { - "name": "nette/security", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/nette/security.git", - "reference": "744264a42b506d63009d7e3853ed72b04c99e964" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/security/zipball/744264a42b506d63009d7e3853ed72b04c99e964", - "reference": "744264a42b506d63009d7e3853ed72b04c99e964", - "shasum": "" - }, - "require": { - "nette/utils": "~2.2", - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/di": "~2.3", - "nette/http": "~2.3", - "nette/tester": "~1.4" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Nette Security: Access Control Component", - "homepage": "http://nette.org", - "time": "2015-07-11 21:22:53" - }, - { - "name": "nette/utils", - "version": "v2.3.6", - "source": { - "type": "git", - "url": "https://github.com/nette/utils.git", - "reference": "c9dfaec788eb65d5ef10cefed0ae63bc76febaa8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/c9dfaec788eb65d5ef10cefed0ae63bc76febaa8", - "reference": "c9dfaec788eb65d5ef10cefed0ae63bc76febaa8", - "shasum": "" - }, - "require": { - "php": ">=5.3.1" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/tester": "~1.0" - }, - "suggest": { - "ext-gd": "to use Image", - "ext-iconv": "to use Strings::webalize() and toAscii()", - "ext-intl": "for script transliteration in Strings::webalize() and toAscii()", - "ext-mbstring": "to use Strings::lower() etc..." - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "Nette Utility Classes", - "homepage": "https://nette.org", - "time": "2015-10-05 12:18:24" - }, - { - "name": "tracy/tracy", - "version": "v2.3.6", - "source": { - "type": "git", - "url": "https://github.com/nette/tracy.git", - "reference": "79831c75b6f48fcb897d25ccae5deec358cb2142" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/tracy/zipball/79831c75b6f48fcb897d25ccae5deec358cb2142", - "reference": "79831c75b6f48fcb897d25ccae5deec358cb2142", - "shasum": "" - }, - "require": { - "php": ">=5.3.1" - }, - "require-dev": { - "nette/di": "~2.3", - "nette/tester": "~1.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src" - ], - "files": [ - "src/shortcuts.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "Tracy: useful PHP debugger", - "homepage": "https://tracy.nette.org", - "keywords": [ - "debug", - "debugger", - "nette" - ], - "time": "2015-10-28 23:49:21" - } - ], - "packages-dev": [ - { - "name": "codeception/codeception", - "version": "2.1.4", - "source": { - "type": "git", - "url": "https://github.com/Codeception/Codeception.git", - "reference": "6a812e8a0d1b1db939a29b4dc14cb398b21b6112" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/6a812e8a0d1b1db939a29b4dc14cb398b21b6112", - "reference": "6a812e8a0d1b1db939a29b4dc14cb398b21b6112", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-mbstring": "*", - "facebook/webdriver": ">=1.0.1", - "guzzlehttp/guzzle": ">=4.1.4 <7.0", - "guzzlehttp/psr7": "~1.0", - "php": ">=5.4.0", - "phpunit/phpunit": "~4.8.0", - "symfony/browser-kit": "~2.4", - "symfony/console": "~2.4", - "symfony/css-selector": "~2.4", - "symfony/dom-crawler": "~2.4,!=2.4.5", - "symfony/event-dispatcher": "~2.4", - "symfony/finder": "~2.4", - "symfony/yaml": "~2.4" - }, - "require-dev": { - "codeception/specify": "~0.3", - "facebook/php-sdk-v4": "~4.0", - "flow/jsonpath": "~0.2", - "monolog/monolog": "~1.8", - "pda/pheanstalk": "~2.0", - "videlalvaro/php-amqplib": "~2.4" - }, - "suggest": { - "codeception/phpbuiltinserver": "Extension to start and stop PHP built-in web server for your tests", - "codeception/specify": "BDD-style code blocks", - "codeception/verify": "BDD-style assertions", - "monolog/monolog": "Log test steps", - "phpseclib/phpseclib": "Extension required to use the SFTP option in the FTP Module." - }, - "bin": [ - "codecept" - ], - "type": "library", - "extra": { - "branch-alias": [] - }, - "autoload": { - "psr-4": { - "Codeception\\": "src\\Codeception", - "Codeception\\Extension\\": "ext" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Bodnarchuk", - "email": "davert@mail.ua", - "homepage": "http://codegyre.com" - } - ], - "description": "BDD-style testing framework", - "homepage": "http://codeception.com/", - "keywords": [ - "BDD", - "TDD", - "acceptance testing", - "functional testing", - "unit testing" - ], - "time": "2015-11-12 03:57:06" - }, - { - "name": "doctrine/instantiator", - "version": "1.0.5", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", - "shasum": "" - }, - "require": { - "php": ">=5.3,<8.0-DEV" - }, - "require-dev": { - "athletic/athletic": "~0.1.8", - "ext-pdo": "*", - "ext-phar": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", - "keywords": [ - "constructor", - "instantiate" - ], - "time": "2015-06-14 21:17:01" - }, - { - "name": "facebook/webdriver", - "version": "1.0.4", - "source": { - "type": "git", - "url": "https://github.com/facebook/php-webdriver.git", - "reference": "a6e209a309bf7cd71acf15476f40b11a25d5a79d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/a6e209a309bf7cd71acf15476f40b11a25d5a79d", - "reference": "a6e209a309bf7cd71acf15476f40b11a25d5a79d", - "shasum": "" - }, - "require": { - "php": ">=5.3.19" - }, - "require-dev": { - "phpunit/phpunit": "4.6.*" - }, - "suggest": { - "phpdocumentor/phpdocumentor": "2.*" - }, - "type": "library", - "autoload": { - "psr-4": { - "Facebook\\WebDriver\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "A PHP client for WebDriver", - "homepage": "https://github.com/facebook/php-webdriver", - "keywords": [ - "facebook", - "php", - "selenium", - "webdriver" - ], - "time": "2015-11-03 22:17:22" - }, - { - "name": "guzzlehttp/guzzle", - "version": "6.1.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "c6851d6e48f63b69357cbfa55bca116448140e0c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/c6851d6e48f63b69357cbfa55bca116448140e0c", - "reference": "c6851d6e48f63b69357cbfa55bca116448140e0c", - "shasum": "" - }, - "require": { - "guzzlehttp/promises": "~1.0", - "guzzlehttp/psr7": "~1.1", - "php": ">=5.5.0" - }, - "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "~4.0", - "psr/log": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.1-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" - ], - "time": "2015-11-23 00:47:50" - }, - { - "name": "guzzlehttp/promises", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "b1e1c0d55f8083c71eda2c28c12a228d708294ea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/b1e1c0d55f8083c71eda2c28c12a228d708294ea", - "reference": "b1e1c0d55f8083c71eda2c28c12a228d708294ea", - "shasum": "" - }, - "require": { - "php": ">=5.5.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "time": "2015-10-15 22:28:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "4d0bdbe1206df7440219ce14c972aa57cc5e4982" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/4d0bdbe1206df7440219ce14c972aa57cc5e4982", - "reference": "4d0bdbe1206df7440219ce14c972aa57cc5e4982", - "shasum": "" - }, - "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "PSR-7 message implementation", - "keywords": [ - "http", - "message", - "stream", - "uri" - ], - "time": "2015-11-03 01:34:55" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ], - "time": "2015-02-03 12:10:50" - }, - { - "name": "phpspec/prophecy", - "version": "v1.5.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4745ded9307786b730d7a60df5cb5a6c43cf95f7", - "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "phpdocumentor/reflection-docblock": "~2.0", - "sebastian/comparator": "~1.1" - }, - "require-dev": { - "phpspec/phpspec": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "psr-0": { - "Prophecy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "time": "2015-08-13 10:07:40" - }, - { - "name": "phpunit/php-code-coverage", - "version": "2.2.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "phpunit/php-file-iterator": "~1.3", - "phpunit/php-text-template": "~1.2", - "phpunit/php-token-stream": "~1.3", - "sebastian/environment": "^1.3.2", - "sebastian/version": "~1.0" - }, - "require-dev": { - "ext-xdebug": ">=2.1.4", - "phpunit/phpunit": "~4" - }, - "suggest": { - "ext-dom": "*", - "ext-xdebug": ">=2.2.1", - "ext-xmlwriter": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "time": "2015-10-06 15:47:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "1.4.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "time": "2015-06-21 13:08:43" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "time": "2015-06-21 13:50:34" - }, - { - "name": "phpunit/php-timer", - "version": "1.0.7", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b", - "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "time": "2015-06-21 08:01:12" - }, - { - "name": "phpunit/php-token-stream", - "version": "1.4.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", - "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "time": "2015-09-15 10:49:45" - }, - { - "name": "phpunit/phpunit", - "version": "4.8.18", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "fa33d4ad96481b91df343d83e8c8aabed6b1dfd3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fa33d4ad96481b91df343d83e8c8aabed6b1dfd3", - "reference": "fa33d4ad96481b91df343d83e8c8aabed6b1dfd3", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=5.3.3", - "phpspec/prophecy": "^1.3.1", - "phpunit/php-code-coverage": "~2.1", - "phpunit/php-file-iterator": "~1.4", - "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": ">=1.0.6", - "phpunit/phpunit-mock-objects": "~2.3", - "sebastian/comparator": "~1.1", - "sebastian/diff": "~1.2", - "sebastian/environment": "~1.3", - "sebastian/exporter": "~1.2", - "sebastian/global-state": "~1.0", - "sebastian/version": "~1.0", - "symfony/yaml": "~2.1|~3.0" - }, - "suggest": { - "phpunit/php-invoker": "~1.1" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.8.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "time": "2015-11-11 11:32:49" - }, - { - "name": "phpunit/phpunit-mock-objects", - "version": "2.3.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": ">=5.3.3", - "phpunit/php-text-template": "~1.2", - "sebastian/exporter": "~1.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "suggest": { - "ext-soap": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", - "keywords": [ - "mock", - "xunit" - ], - "time": "2015-10-02 06:51:40" - }, - { - "name": "psr/http-message", - "version": "1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", - "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "time": "2015-05-04 20:22:00" - }, - { - "name": "sebastian/comparator", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/diff": "~1.2", - "sebastian/exporter": "~1.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "http://www.github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "time": "2015-07-26 15:48:44" - }, - { - "name": "sebastian/diff", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3", - "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "http://www.github.com/sebastianbergmann/diff", - "keywords": [ - "diff" - ], - "time": "2015-02-22 15:13:53" - }, - { - "name": "sebastian/environment", - "version": "1.3.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6324c907ce7a52478eeeaede764f48733ef5ae44", - "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "time": "2015-08-03 06:14:51" - }, - { - "name": "sebastian/exporter", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "7ae5513327cb536431847bcc0c10edba2701064e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e", - "reference": "7ae5513327cb536431847bcc0c10edba2701064e", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/recursion-context": "~1.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "time": "2015-06-21 07:55:53" - }, - { - "name": "sebastian/global-state", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "time": "2015-10-12 03:26:01" - }, - { - "name": "sebastian/recursion-context", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "994d4a811bafe801fb06dccbee797863ba2792ba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/994d4a811bafe801fb06dccbee797863ba2792ba", - "reference": "994d4a811bafe801fb06dccbee797863ba2792ba", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2015-06-21 08:04:50" - }, - { - "name": "sebastian/version", - "version": "1.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "shasum": "" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "time": "2015-06-21 13:59:46" - }, - { - "name": "symfony/browser-kit", - "version": "v2.7.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/browser-kit.git", - "reference": "bd28847ea2193916074c7b11d4fdd78570049694" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/bd28847ea2193916074c7b11d4fdd78570049694", - "reference": "bd28847ea2193916074c7b11d4fdd78570049694", - "shasum": "" - }, - "require": { - "php": ">=5.3.9", - "symfony/dom-crawler": "~2.0,>=2.0.5" - }, - "require-dev": { - "symfony/css-selector": "~2.0,>=2.0.5", - "symfony/process": "~2.3.34|~2.7,>=2.7.6" - }, - "suggest": { - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\BrowserKit\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony BrowserKit Component", - "homepage": "https://symfony.com", - "time": "2015-11-02 20:20:53" - }, - { - "name": "symfony/console", - "version": "v2.7.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "16bb1cb86df43c90931df65f529e7ebd79636750" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/16bb1cb86df43c90931df65f529e7ebd79636750", - "reference": "16bb1cb86df43c90931df65f529e7ebd79636750", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/event-dispatcher": "~2.1", - "symfony/process": "~2.1" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "https://symfony.com", - "time": "2015-11-18 09:54:26" - }, - { - "name": "symfony/css-selector", - "version": "v2.7.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "abb47717fb88aebd9437da2fc8bb01a50a36679f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/abb47717fb88aebd9437da2fc8bb01a50a36679f", - "reference": "abb47717fb88aebd9437da2fc8bb01a50a36679f", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\CssSelector\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony CssSelector Component", - "homepage": "https://symfony.com", - "time": "2015-10-30 20:10:21" - }, - { - "name": "symfony/dom-crawler", - "version": "v2.7.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/dom-crawler.git", - "reference": "b33593cbfe1d81b50d48353f338aca76a08658d8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b33593cbfe1d81b50d48353f338aca76a08658d8", - "reference": "b33593cbfe1d81b50d48353f338aca76a08658d8", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "require-dev": { - "symfony/css-selector": "~2.3" - }, - "suggest": { - "symfony/css-selector": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\DomCrawler\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony DomCrawler Component", - "homepage": "https://symfony.com", - "time": "2015-11-02 20:20:53" - }, - { - "name": "symfony/event-dispatcher", - "version": "v2.7.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "7e2f9c31645680026c2372edf66f863fc7757af5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7e2f9c31645680026c2372edf66f863fc7757af5", - "reference": "7e2f9c31645680026c2372edf66f863fc7757af5", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~2.0,>=2.0.5", - "symfony/dependency-injection": "~2.6", - "symfony/expression-language": "~2.6", - "symfony/stopwatch": "~2.3" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony EventDispatcher Component", - "homepage": "https://symfony.com", - "time": "2015-10-30 20:10:21" - }, - { - "name": "symfony/finder", - "version": "v2.7.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "a06a0c0ff7db3736a50d530c908cca547bf13da9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a06a0c0ff7db3736a50d530c908cca547bf13da9", - "reference": "a06a0c0ff7db3736a50d530c908cca547bf13da9", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Finder Component", - "homepage": "https://symfony.com", - "time": "2015-10-30 20:10:21" - }, - { - "name": "symfony/yaml", - "version": "v2.7.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "4cfcd7a9fceba662b3c036b7d9a91f6197af046c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4cfcd7a9fceba662b3c036b7d9a91f6197af046c", - "reference": "4cfcd7a9fceba662b3c036b7d9a91f6197af046c", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com", - "time": "2015-11-18 13:41:01" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">= 5.3.7" - }, - "platform-dev": [] -} diff --git a/nette/native_db/notejam/tests/_bootstrap.php b/nette/native_db/notejam/tests/_bootstrap.php deleted file mode 100644 index 243f9c85b..000000000 --- a/nette/native_db/notejam/tests/_bootstrap.php +++ /dev/null @@ -1,2 +0,0 @@ -amOnPage('/signin'); - $this->see('Sign in'); - $this->fillField("Email", $email); - $this->fillField("Password", $password); - $this->click('Sign In'); - } - -} diff --git a/nette/native_db/notejam/tests/_support/FunctionalTester.php b/nette/native_db/notejam/tests/_support/FunctionalTester.php deleted file mode 100644 index 7e888f8b2..000000000 --- a/nette/native_db/notejam/tests/_support/FunctionalTester.php +++ /dev/null @@ -1,26 +0,0 @@ -wantTo('see note can be successfully created'); -$I->testLogin(); -$I->amOnPage('/notes/create'); -$I->fillField('Name', 'Example note'); -$I->fillField('Text', 'Lorem ipsum'); -$I->selectOption('Pad', 1); -$I->click('Save'); -$I->see('Example note'); diff --git a/nette/native_db/notejam/tests/acceptance/CreateNoteFailCept.php b/nette/native_db/notejam/tests/acceptance/CreateNoteFailCept.php deleted file mode 100644 index 4f768ee29..000000000 --- a/nette/native_db/notejam/tests/acceptance/CreateNoteFailCept.php +++ /dev/null @@ -1,9 +0,0 @@ -wantTo('see note can not be created without required fields'); -$I->testLogin(); -$I->amOnPage('/notes/create'); -$I->click('Save'); -$I->seeInCurrentUrl('/notes/create'); -$I->see('Name is required'); -$I->see('Text is required'); diff --git a/nette/native_db/notejam/tests/acceptance/CreatePadCept.php b/nette/native_db/notejam/tests/acceptance/CreatePadCept.php deleted file mode 100644 index 4926950ba..000000000 --- a/nette/native_db/notejam/tests/acceptance/CreatePadCept.php +++ /dev/null @@ -1,8 +0,0 @@ -wantTo('see pad can be successfully created'); -$I->testLogin(); -$I->amOnPage('/pads/create'); -$I->fillField('Name', 'Example pad'); -$I->click('Save'); -$I->see('Example pad'); diff --git a/nette/native_db/notejam/tests/acceptance/CreatePadFailCept.php b/nette/native_db/notejam/tests/acceptance/CreatePadFailCept.php deleted file mode 100644 index b8f61bbfa..000000000 --- a/nette/native_db/notejam/tests/acceptance/CreatePadFailCept.php +++ /dev/null @@ -1,9 +0,0 @@ -wantTo('see pad can not be created without required fields'); -$I->testLogin(); -$I->amOnPage('/pads/create'); -$I->click('Save'); -$I->dontSee('Example pad'); -$I->seeInCurrentUrl('/pads/create'); -$I->see('Name is required'); diff --git a/nette/native_db/notejam/tests/acceptance/DeleteNoteCept.php b/nette/native_db/notejam/tests/acceptance/DeleteNoteCept.php deleted file mode 100644 index fb718c70c..000000000 --- a/nette/native_db/notejam/tests/acceptance/DeleteNoteCept.php +++ /dev/null @@ -1,7 +0,0 @@ -wantTo('see note can be successfully deleted'); -$I->testLogin(); -$I->amOnPage('/notes/1/delete'); -$I->click('Yes, I want to delete this note'); -$I->dontSee('Note 1'); diff --git a/nette/native_db/notejam/tests/acceptance/DeleteOtherOwnersNoteCept.php b/nette/native_db/notejam/tests/acceptance/DeleteOtherOwnersNoteCept.php deleted file mode 100644 index f9f262da0..000000000 --- a/nette/native_db/notejam/tests/acceptance/DeleteOtherOwnersNoteCept.php +++ /dev/null @@ -1,6 +0,0 @@ -wantTo('see note can not be deleted by not an owner'); -$I->testLogin(); -$I->amOnPage('/notes/5/delete'); -$I->dontSee('Yes, I want to delete this note'); diff --git a/nette/native_db/notejam/tests/acceptance/DeleteOtherOwnersPadCept.php b/nette/native_db/notejam/tests/acceptance/DeleteOtherOwnersPadCept.php deleted file mode 100644 index 531887afe..000000000 --- a/nette/native_db/notejam/tests/acceptance/DeleteOtherOwnersPadCept.php +++ /dev/null @@ -1,6 +0,0 @@ -wantTo('see pad can not be deleted by not an owner'); -$I->testLogin(); -$I->amOnPage('/pads/4/delete'); -$I->dontSee('Yes, I want to delete this pad'); diff --git a/nette/native_db/notejam/tests/acceptance/DeletePadCept.php b/nette/native_db/notejam/tests/acceptance/DeletePadCept.php deleted file mode 100644 index f86354c75..000000000 --- a/nette/native_db/notejam/tests/acceptance/DeletePadCept.php +++ /dev/null @@ -1,7 +0,0 @@ -wantTo('see pad can be successfully deleted'); -$I->testLogin(); -$I->amOnPage('/pads/1/delete'); -$I->click('Yes, I want to delete this pad'); -$I->dontSee('Pad 1'); diff --git a/nette/native_db/notejam/tests/acceptance/EditNoteCept.php b/nette/native_db/notejam/tests/acceptance/EditNoteCept.php deleted file mode 100644 index 9012a2e35..000000000 --- a/nette/native_db/notejam/tests/acceptance/EditNoteCept.php +++ /dev/null @@ -1,12 +0,0 @@ -wantTo('see note can be successfully edited'); -$I->testLogin(); -$I->amOnPage('/notes/1/edit'); -$I->fillField('Name', 'Note 1 - edited'); -$I->fillField('Text', 'Lorem ipsum - edited'); -$I->selectOption('Pad', 1); -$I->click('Save'); -$I->see('Note 1 - edited'); -$I->amOnPage('/pads/1'); -$I->see('Note 1 - edited'); diff --git a/nette/native_db/notejam/tests/acceptance/EditNoteFailCept.php b/nette/native_db/notejam/tests/acceptance/EditNoteFailCept.php deleted file mode 100644 index f921f1475..000000000 --- a/nette/native_db/notejam/tests/acceptance/EditNoteFailCept.php +++ /dev/null @@ -1,11 +0,0 @@ -wantTo('see note can not be edited without required fields'); -$I->testLogin(); -$I->amOnPage('/notes/1/edit'); -$I->fillField('Name', ''); -$I->fillField('Text', ''); -$I->click('Save'); -$I->seeInCurrentUrl('/notes/1/edit'); -$I->see('Name is required'); -$I->see('Text is required'); diff --git a/nette/native_db/notejam/tests/acceptance/EditOtherOwnersNoteCept.php b/nette/native_db/notejam/tests/acceptance/EditOtherOwnersNoteCept.php deleted file mode 100644 index 23d00f608..000000000 --- a/nette/native_db/notejam/tests/acceptance/EditOtherOwnersNoteCept.php +++ /dev/null @@ -1,6 +0,0 @@ -wantTo('see note can not be edited by not an owner'); -$I->testLogin(); -$I->amOnPage('/notes/5/edit'); -$I->dontSee('Save', 'input'); diff --git a/nette/native_db/notejam/tests/acceptance/EditOtherOwnersPadCept.php b/nette/native_db/notejam/tests/acceptance/EditOtherOwnersPadCept.php deleted file mode 100644 index 227f97916..000000000 --- a/nette/native_db/notejam/tests/acceptance/EditOtherOwnersPadCept.php +++ /dev/null @@ -1,6 +0,0 @@ -wantTo('see pad can not be edited by not an owner'); -$I->testLogin(); -$I->amOnPage('/pads/4/edit'); -$I->dontSee('Save', 'input'); diff --git a/nette/native_db/notejam/tests/acceptance/EditPadCept.php b/nette/native_db/notejam/tests/acceptance/EditPadCept.php deleted file mode 100644 index 923c9cc95..000000000 --- a/nette/native_db/notejam/tests/acceptance/EditPadCept.php +++ /dev/null @@ -1,8 +0,0 @@ -wantTo('see pad can be successfully edited'); -$I->testLogin(); -$I->amOnPage('/pads/1/edit'); -$I->fillField('Name', 'Pad 1 - edited'); -$I->click('Save'); -$I->see('Pad 1 - edited'); diff --git a/nette/native_db/notejam/tests/acceptance/EditPadFailCept.php b/nette/native_db/notejam/tests/acceptance/EditPadFailCept.php deleted file mode 100644 index a6614b736..000000000 --- a/nette/native_db/notejam/tests/acceptance/EditPadFailCept.php +++ /dev/null @@ -1,9 +0,0 @@ -wantTo('see pad cannot be edited without required fields'); -$I->testLogin(); -$I->amOnPage('/pads/1/edit'); -$I->fillField('Name', ''); -$I->click('Save'); -$I->seeInCurrentUrl('/pads/1/edit'); -$I->see('Name is required'); diff --git a/nette/native_db/notejam/tests/acceptance/ForgottenPasswordCept.php b/nette/native_db/notejam/tests/acceptance/ForgottenPasswordCept.php deleted file mode 100644 index aaeccdc3c..000000000 --- a/nette/native_db/notejam/tests/acceptance/ForgottenPasswordCept.php +++ /dev/null @@ -1,7 +0,0 @@ -wantTo('see user can successfully get new password'); -$I->amOnPage('/forgot-password'); -$I->fillField('Email', 'john.doe@example.com'); -$I->click('Get new password'); -$I->see('Sign in'); diff --git a/nette/native_db/notejam/tests/acceptance/ForgottenPasswordInvalidEmailCept.php b/nette/native_db/notejam/tests/acceptance/ForgottenPasswordInvalidEmailCept.php deleted file mode 100644 index 2be0e84ab..000000000 --- a/nette/native_db/notejam/tests/acceptance/ForgottenPasswordInvalidEmailCept.php +++ /dev/null @@ -1,7 +0,0 @@ -wantTo('see user can not successfully get new password with invalid email'); -$I->amOnPage('/forgot-password'); -$I->fillField('Email', 'invalid'); -$I->click('Get new password'); -$I->see('Invalid email'); diff --git a/nette/native_db/notejam/tests/acceptance/ForgottenPasswordUnregisteredEmailCept.php b/nette/native_db/notejam/tests/acceptance/ForgottenPasswordUnregisteredEmailCept.php deleted file mode 100644 index 83702e1d2..000000000 --- a/nette/native_db/notejam/tests/acceptance/ForgottenPasswordUnregisteredEmailCept.php +++ /dev/null @@ -1,7 +0,0 @@ -wantTo('see user can not successfully get new password with unregistered email'); -$I->amOnPage('/forgot-password'); -$I->fillField('Email', 'invalid@example.com'); -$I->click('Get new password'); -$I->see('No user with given email found'); diff --git a/nette/native_db/notejam/tests/acceptance/HomepageCept.php b/nette/native_db/notejam/tests/acceptance/HomepageCept.php deleted file mode 100644 index c7c7afd42..000000000 --- a/nette/native_db/notejam/tests/acceptance/HomepageCept.php +++ /dev/null @@ -1,8 +0,0 @@ -wantTo('see notes can be viewed successfully'); -$I->amOnPage('/'); -$I->seeInCurrentUrl('/signin'); -$I->testLogin(); -$I->seeCurrentUrlEquals('/'); -$I->see('My pads'); diff --git a/nette/native_db/notejam/tests/acceptance/NoteDetailCept.php b/nette/native_db/notejam/tests/acceptance/NoteDetailCept.php deleted file mode 100644 index 55c890c63..000000000 --- a/nette/native_db/notejam/tests/acceptance/NoteDetailCept.php +++ /dev/null @@ -1,7 +0,0 @@ -wantTo('see note can be viewed successfully'); -$I->testLogin(); -$I->amOnPage('/notes/1'); -$I->see('Note 1'); -$I->see('Lorem ipsum'); diff --git a/nette/native_db/notejam/tests/acceptance/OtherOwnersNoteDetailCept.php b/nette/native_db/notejam/tests/acceptance/OtherOwnersNoteDetailCept.php deleted file mode 100644 index 2e65f0224..000000000 --- a/nette/native_db/notejam/tests/acceptance/OtherOwnersNoteDetailCept.php +++ /dev/null @@ -1,7 +0,0 @@ -wantTo('see note can not be viewed by not an owner'); -$I->testLogin(); -$I->amOnPage('/notes/5'); -$I->dontSee('Other Note'); -$I->dontSee('Lorem ipsum'); diff --git a/nette/native_db/notejam/tests/acceptance/OtherOwnersPadDetailCept.php b/nette/native_db/notejam/tests/acceptance/OtherOwnersPadDetailCept.php deleted file mode 100644 index e169ae94f..000000000 --- a/nette/native_db/notejam/tests/acceptance/OtherOwnersPadDetailCept.php +++ /dev/null @@ -1,6 +0,0 @@ -wantTo('see pad can not be viewed by not an owner'); -$I->testLogin(); -$I->amOnPage('/pads/4'); -$I->dontSee('Other Pad'); diff --git a/nette/native_db/notejam/tests/acceptance/PadDetailCept.php b/nette/native_db/notejam/tests/acceptance/PadDetailCept.php deleted file mode 100644 index cc00bcf9a..000000000 --- a/nette/native_db/notejam/tests/acceptance/PadDetailCept.php +++ /dev/null @@ -1,7 +0,0 @@ -wantTo('see pad can be viewed'); -$I->testLogin(); -$I->amOnPage('/pads/1'); -$I->see('Pad 1'); -$I->see('Note 2'); // Note 2 belongs to Pad 1 diff --git a/nette/native_db/notejam/tests/acceptance/SetNewPasswordCept.php b/nette/native_db/notejam/tests/acceptance/SetNewPasswordCept.php deleted file mode 100644 index 5b4a95f91..000000000 --- a/nette/native_db/notejam/tests/acceptance/SetNewPasswordCept.php +++ /dev/null @@ -1,10 +0,0 @@ -wantTo('see user can successfully set new password'); -$I->testLogin(); -$I->amOnPage('/settings'); -$I->fillField('Current password', 'pass'); -$I->fillField('New Password', 'qwerty'); -$I->fillField('Confirm New Password', 'qwerty'); -$I->click('Change Password'); -$I->see('Account settings'); diff --git a/nette/native_db/notejam/tests/acceptance/SetNewPasswordFailCept.php b/nette/native_db/notejam/tests/acceptance/SetNewPasswordFailCept.php deleted file mode 100644 index 76160c170..000000000 --- a/nette/native_db/notejam/tests/acceptance/SetNewPasswordFailCept.php +++ /dev/null @@ -1,11 +0,0 @@ -wantTo('see user can not set new password without required fields'); -$I->testLogin(); -$I->amOnPage('/settings'); -$I->fillField('Current password', ''); -$I->fillField('New Password', ''); -$I->fillField('Confirm New Password', ''); -$I->click('Change Password'); -$I->see('Current password is required'); -$I->see('New password is required'); diff --git a/nette/native_db/notejam/tests/acceptance/SetNewPasswordInvalidCurrentPasswordCept.php b/nette/native_db/notejam/tests/acceptance/SetNewPasswordInvalidCurrentPasswordCept.php deleted file mode 100644 index 44decd705..000000000 --- a/nette/native_db/notejam/tests/acceptance/SetNewPasswordInvalidCurrentPasswordCept.php +++ /dev/null @@ -1,10 +0,0 @@ -wantTo('see user can not set new password with invalid current password'); -$I->testLogin(); -$I->amOnPage('/settings'); -$I->fillField('Current password', 'pls'); -$I->fillField('New Password', 'pass'); -$I->fillField('Confirm New Password', 'pass'); -$I->click('Change Password'); -$I->see('Invalid current password'); diff --git a/nette/native_db/notejam/tests/acceptance/SetNewPasswordMismatchCept.php b/nette/native_db/notejam/tests/acceptance/SetNewPasswordMismatchCept.php deleted file mode 100644 index a229a0ecd..000000000 --- a/nette/native_db/notejam/tests/acceptance/SetNewPasswordMismatchCept.php +++ /dev/null @@ -1,10 +0,0 @@ -wantTo('see user can not set new password without confirming new password'); -$I->testLogin(); -$I->amOnPage('/settings'); -$I->fillField('Current password', 'pass'); -$I->fillField('New Password', 'pls'); -$I->fillField('Confirm New Password', 'pass'); -$I->click('Change Password'); -$I->see('New passwords must match'); diff --git a/nette/native_db/notejam/tests/acceptance/SignInCept.php b/nette/native_db/notejam/tests/acceptance/SignInCept.php deleted file mode 100644 index bae44a2a5..000000000 --- a/nette/native_db/notejam/tests/acceptance/SignInCept.php +++ /dev/null @@ -1,5 +0,0 @@ -wantTo('see user can successfully sign in'); -$I->testLogin(); -$I->see("My pads"); diff --git a/nette/native_db/notejam/tests/acceptance/SignInFailCept.php b/nette/native_db/notejam/tests/acceptance/SignInFailCept.php deleted file mode 100644 index 99645b64f..000000000 --- a/nette/native_db/notejam/tests/acceptance/SignInFailCept.php +++ /dev/null @@ -1,10 +0,0 @@ -wantTo('see user can not sign in without required fields'); -$I->amOnPage('/signin'); -$I->see('Sign in'); -$I->fillField("Email", ''); -$I->fillField("Password", ''); -$I->click('Sign In'); -$I->see('Email is required'); -$I->see('Password is required'); diff --git a/nette/native_db/notejam/tests/acceptance/SignInInvalidEmailCept.php b/nette/native_db/notejam/tests/acceptance/SignInInvalidEmailCept.php deleted file mode 100644 index 606afc3c2..000000000 --- a/nette/native_db/notejam/tests/acceptance/SignInInvalidEmailCept.php +++ /dev/null @@ -1,5 +0,0 @@ -wantTo('see user can not sign in with invalid email'); -$I->testLogin('invalid@example.com', 'pass'); -$I->see("Unknown user"); diff --git a/nette/native_db/notejam/tests/acceptance/SignInInvalidPasswordCept.php b/nette/native_db/notejam/tests/acceptance/SignInInvalidPasswordCept.php deleted file mode 100644 index 2e8b58871..000000000 --- a/nette/native_db/notejam/tests/acceptance/SignInInvalidPasswordCept.php +++ /dev/null @@ -1,5 +0,0 @@ -wantTo('see user can not sign in with invalid password'); -$I->testLogin('john.doe@example.com', 'pls'); -$I->see('Invalid password'); diff --git a/nette/native_db/notejam/tests/acceptance/SignUpAlreadyExistsCept.php b/nette/native_db/notejam/tests/acceptance/SignUpAlreadyExistsCept.php deleted file mode 100644 index f8e100b0f..000000000 --- a/nette/native_db/notejam/tests/acceptance/SignUpAlreadyExistsCept.php +++ /dev/null @@ -1,10 +0,0 @@ -wantTo('see user can not sign up with already registered email'); -$I->amOnPage('/signup'); -$I->fillField('Email', 'john.doe@example.com'); -$I->fillField('Password', 'pass'); -$I->fillField('confirm', 'pass'); -$I->click('Sign Up'); -$I->seeInCurrentUrl('/signup'); -$I->see('User with given email already registered'); diff --git a/nette/native_db/notejam/tests/acceptance/SignUpCept.php b/nette/native_db/notejam/tests/acceptance/SignUpCept.php deleted file mode 100644 index 4c6f190ac..000000000 --- a/nette/native_db/notejam/tests/acceptance/SignUpCept.php +++ /dev/null @@ -1,13 +0,0 @@ -wantTo('see user can successfully sign up'); -$I->amOnPage('/signup'); -$I->fillField('Email', 'test@example.com'); -$I->fillField('Password', 'qwerty'); -$I->fillField('confirm', 'qwerty'); -$I->click('Sign Up'); -$I->seeInCurrentUrl('/signin'); -$I->see('User is successfully created. Now you can sign in.'); -$I->testLogin('test@example.com', 'qwerty'); -$I->seeCurrentUrlEquals('/'); -$I->see('My pads'); diff --git a/nette/native_db/notejam/tests/acceptance/SignUpFailCept.php b/nette/native_db/notejam/tests/acceptance/SignUpFailCept.php deleted file mode 100644 index 2581fb91e..000000000 --- a/nette/native_db/notejam/tests/acceptance/SignUpFailCept.php +++ /dev/null @@ -1,11 +0,0 @@ -wantTo('see user can not sign up without required fields'); -$I->amOnPage('/signup'); -$I->fillField('Email', ''); -$I->fillField('Password', ''); -$I->fillField('confirm', ''); -$I->click('Sign Up'); -$I->seeInCurrentUrl('/signup'); -$I->see('Email is required'); -$I->see('Password is required'); diff --git a/nette/native_db/notejam/tests/acceptance/SignUpInvalidEmailCept.php b/nette/native_db/notejam/tests/acceptance/SignUpInvalidEmailCept.php deleted file mode 100644 index 97b4bfef8..000000000 --- a/nette/native_db/notejam/tests/acceptance/SignUpInvalidEmailCept.php +++ /dev/null @@ -1,10 +0,0 @@ -wantTo('see user can not sign up with invalid email'); -$I->amOnPage('/signup'); -$I->fillField('Email', 'abcd'); -$I->fillField('Password', 'pass'); -$I->fillField('confirm', 'pass'); -$I->click('Sign Up'); -$I->seeInCurrentUrl('/signup'); -$I->see('Invalid email'); diff --git a/nette/native_db/notejam/tests/acceptance/SignUpPasswordMismatchCept.php b/nette/native_db/notejam/tests/acceptance/SignUpPasswordMismatchCept.php deleted file mode 100644 index 1e6a470fb..000000000 --- a/nette/native_db/notejam/tests/acceptance/SignUpPasswordMismatchCept.php +++ /dev/null @@ -1,10 +0,0 @@ -wantTo('see user can not sign up without confirming password'); -$I->amOnPage('/signup'); -$I->fillField('Email', 'test@example.com'); -$I->fillField('Password', 'pass'); -$I->fillField('confirm', 'pls'); -$I->click('Sign Up'); -$I->seeInCurrentUrl('/signup'); -$I->see('Passwords must match'); diff --git a/nette/native_db/notejam/tests/acceptance/_bootstrap.php b/nette/native_db/notejam/tests/acceptance/_bootstrap.php deleted file mode 100644 index 8a8855580..000000000 --- a/nette/native_db/notejam/tests/acceptance/_bootstrap.php +++ /dev/null @@ -1,2 +0,0 @@ - - - - - - - - -Site is temporarily down for maintenance - -

We're Sorry

- -

The site is temporarily down for maintenance. Please try again in a few minutes.

- -div { - display: none; } - - -/* Grid */ -#grid .column, -#grid .columns { - background: #ddd; - height: 25px; - line-height: 25px; - margin-bottom: 10px; - text-align: center; - text-transform: uppercase; - color: #555; - font-size: 12px; - font-weight: bold; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; } -#grid .column:hover, -#grid .columns:hover { - background: #bbb; - color: #333; } -#grid .example-grid { overflow: hidden; } - -.post-button-note, -.post-button-note a { - font-size: 11px; - color: #999; } - -#examples .four.columns a { - text-decoration: none; -} -#examples .four.columns a:hover { - text-decoration: underline; -} - - -.resize { - position: fixed; - bottom: 0; - right: 0; - height: 80px; - width: 80px; - background: url(images/resize.png); } - - -img { - max-width: 100%; - height: auto; } - -.gist-meta { display: none !important;} - -ul ul ul li { margin-bottom: 3px; } - -.twitter-share-button { margin-bottom: -18px; } - -/* Table stylesheets */ -table { - width: 100%; - border-collapse: collapse; -} - -table th, table td { - padding: 10px 10px 9px; - font-size: 13px; - line-height: 18px; - text-align: left; -} - -table td { - vertical-align: top; - border-top: solid 1px #ddd; -} - -table th { - padding-top: 9px; - font-weight: bold; - vertical-align: middle; -} - -table.condensed th, table.condensed td { - padding: 5px 5px 4px; -} - -table.bordered { - border-collapse: separate; - border: solid 1px #ddd; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; -} - -table.bordered th + th, -table.bordered th + td, -table.bordered td + td { - border-left: solid 1px #ddd; -} - -.zebra-striped tbody tr:nth-child(odd) td, -.zebra-striped tbody tr:nth-child(odd) th { - background: #f5f5f5; -} - -.carbonad, -.carbonad-image, -.carbonad-text, -.carbonad-tag { - background: none !important; - border: none !important; - margin-left: 0 !important; -} -.carbonad-tag { - margin-top: 6px !important; - padding-top: 0 !important; -} -.carbonad-text { - height: auto !important; -} -.carbonad-image { - margin-top: 0 !important; -} - -.hidden-text { - font-size: 12px; - color: #999; -} - -td.date, th.date { - text-align: right; -} - -td.date { - font-style: italic; -} - -form.note input[type="text"], form.note textarea { - width: 100%; -} - -form hr { - width: 218px; - margin: 10px 0px; -} - -form.note textarea { - height: 250px; -} - -div.content-area { - min-height: 600px; -} - -hr.footer { - margin-bottom: 10px; -} - -div.footer { - margin-bottom: 10px; - text-align: center; - font-size: 12px; -} - -form.sign-in { - margin: 50px 0 0 0; -} - -.sort_arrow { - text-decoration: none; -} - -.sort_arrow:hover { - text-decoration: none; - color: red; -} - -div.sign-in-out-block { - position: absolute; - right: 14px; - top: 8px; - font-size: 12px; -} - -div.sign-in-out-block a { - /*text-decoration: none;*/ -} - -a.small-red { - color: red; - font-size: 12px; -} - -table.notes { - margin: 0 0 20px 0; -} - -table.notes th.note { - width: 72%; -} - -table.notes td.pad { - color: grey; -} - -table.notes td.pad a { - color: grey; - text-decoration: underline; - font-style: normal; -} - - -table.notes td.pad a:hover { - color: black; -} - -p.empty { - color: grey; - font-style: italic; -} - -a.delete-note { - float: right; - font-size: 12px; - color: red; -} - -.red, input.red { - color: red !important; -} - -ul.errorlist, ul.errors { - margin: -18px 0 0 0; -} - -ul.errorlist li, ul.errors li { - color: red; -} - -.alert-area { - text-align: center; -} - -.alert { - padding: 5px 8px; - margin: 0 0 12px 0; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border: 1px solid #d6e9c6; -} - -.alert-error { - color: #b94a48; - background-color: #f2dede; - border: 1px solid #eed3d7; -} - -/* Mobile */ -@media only screen and (max-width: 767px) { - header h1 { font-size: 34px; line-height: 37px; } - nav { position: relative; } - nav ul, - .carbonad { - display: none; - } - #logo { text-align: left; } - #examples .four.columns { - padding-top: 30px; - } -} - -/* Mobile Landscape */ -@media only screen and (min-width: 480px) and (max-width: 767px) { - nav ul { - display: none; - } -} - -/* Non 960 */ -@media only screen and (max-width: 959px) { - #logo { - font-size: 21px; - margin-bottom: 15px; } - nav .button { - padding: 9px 20px 11px; } -} - -/* iPad Portrait/Browser */ -@media only screen and (min-width: 768px) and (max-width: 959px) { - nav { - width: 124px; } -} - -/* Mobile/Browser */ -@media only screen and (max-width: 767px) {} - -/* Mobile Landscape/Browser */ -@media only screen and (min-width: 480px) and (max-width: 767px) {} - -/* Anything smaller than standard 960 */ -@media only screen and (max-width: 959px) {} - - -/* iPad Portrait Only */ -@media only screen and (min-width: 768px) and (max-width: 959px) and (max-device-width: 1000px) {} - -/* Mobile Only */ -@media only screen and (max-width: 767px) and (max-device-width: 1000px) {} - -/* Mobile Landscape Only */ -@media only screen and (min-width: 480px) and (max-width: 767px) and (max-device-width: 1000px) {} - -/* Anything smaller than standard 960 on a device */ -@media only screen and (max-width: 959px) and (max-device-width: 1000px) { - .resize { display: none; } -} diff --git a/nette/native_db/notejam/www/favicon.ico b/nette/native_db/notejam/www/favicon.ico deleted file mode 100644 index b20cfd0f056c1c9d43100f612f4319c66e2adb94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2550 zcmcgsdpy=>6#qV`h?U#SZJVg3NgD48bB$?q*(P0BnsTYks)Y)n7Gs6xwl1`?sD@_U z*mR*3ue;!TGX-%KzT!aoOgA9#8p?H)WL?RL7J%`}#?vCTxIT)jQ5SY=6*49?+ zh&_ole$lYAvxC8Q5iS=MLnsttXlMv`?%ctjEsbHE`WM;pN*(R2gPpQVcsz^BU^|{g zdOB}*utia3=3%>|9bp}tc@~XfN=iy^4Uf>sN#&@~UN&lzy{)*3spzf3^BSR||YZz~*6I;1wF3`8Euwo$so^QQ+fPxAeUii#5Rap}?} zI637bDXAWlCQX8umlyQ(DzI){DFgxmGBPq~J0F>ud>9)Wx9 zfgL;esHkY7xZ6lhPR71{g~-j##nPo0;O%`5H*eOUySp2Q4mF^^zn|iS2n`K|hDI$; zovJ}&<4uS}_n@M34_mgBKvq^3>gwt+H#bLFSs9iuUk*P%KTMxqN_*>}udk1soE*f( z#nC;_e;ul; zt8w}?A7jS!QZIBOE2|m`3JTEH))x21tXZ>QWo3op;$o_0Df094;o;#yaal-9OC!E& zp{go?j7&KuP88z$^;>9YXrMdSVdKV9NJ~poO)8i?c`_KQLVJ5Vi*e)nQB_rs;o(29XHPk%O)EoSARo=m&6HP2wf#l4 zH4*=<7(aeI#SKGEO$`GB1JKmeL|tgHl| z&&T4$i{a|(iW4VJVAZNs@bU41udgpcLP8K89*&rp7&_}APxI`(?@mKQ1HHYy(9+Vvg9i`L z)zw8kr-!?D??PU_7j12A;_p^j`9AIG#>|;BVPaweGcz;P)YQPz(vteE0@l{nm@{V% zN=iy#Z*Nb1a0PSc&P8EiA)K9^k(ZYT7Z(>SS+WFfZf?lV&c@1>E8*$siS+bz>eGGj z_xGpXNy6^kyRmiaR>a1}A}lNn(b3U}jEsboln`Ub3Nc{<$N329V+>PWBGDrZP)!2^ zgH$uuXI=CzePr8-qdwAy^oBz6>qtwft{!^Z9;%1y^ZT^+>g7P{OXUFj7df)}wRucq zmlm@v@hbOa8Ko5wENykg4mNL*D*qf~3xUi}fK4-w!qLe|`Yf=;$Q%fcQ2~x_S{3dI z1exGnPg=`oSp@5O5E7$6zbZYJ`mKgNaD~lBlrvWRaz2EePA_9@`j2`n7s~VV^4Wnj z`nAb@jO`Kl`fYGqwwdB8k@2B3#Tt)Nf%6LZidBEm%>U zIp^f3xWHJNw^!P)mp({kCuGbESuBup*#~gvu}K%ttO=2*{sN2{JA-W!z>@{nZxqL{ zh=QL_y(oY&ani$2@YEN_aY*gFm*aH@{||iK?3yQO>z|YV>W4Sqo9I6p5G09PXfCPx z;&Zb&aX?Vev-kV*{k_d?**5~-RN@c`{2gue-TH}%`ch3}=ROC&rnaYAkVqm}+BD5V za{pA9-^FlZ;_>*&Z%E=g`&+o(oUB|tP7=3%{UlJbB85M$22KZ{7Oda^FYEk~m9tOZv=@F{=&ov#vg;K8};8MS`EFL7E3`erDkr Rce72<)P%rko!0<@1$nAsLG*SvM{)7lvk zaRoYpCW7o00k;d}PB?fjEU=VGa9-rlU?A7(d@|@!i{G*<>O9q*xJw&z%YwlkWE zj3xr|KLT$T)SYnPY%CDuNN`SCNUVvHhxQ}~XrG^m>PE>eg4{cRZqx&s$WWjulHjb= zNUVvK=k_QDXt$!dk@t&$cm>dnaVH!)4;Cm208L~d)9a6Cw?iIJ!FI0a~PqM0cBMUdG7=xaV;%qSEXN+dWxN+8xm&l7u=252*) z`I>W!fbgetByType('Nette\Application\Application')->run(); diff --git a/nette/native_db/notejam/www/js/main.js b/nette/native_db/notejam/www/js/main.js deleted file mode 100644 index f5aaa4205..000000000 --- a/nette/native_db/notejam/www/js/main.js +++ /dev/null @@ -1,2 +0,0 @@ -$(function () { -}); diff --git a/nette/native_db/notejam/www/robots.txt b/nette/native_db/notejam/www/robots.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/nette/native_db/readme.rst b/nette/native_db/readme.rst deleted file mode 100644 index b68fe3fe8..000000000 --- a/nette/native_db/readme.rst +++ /dev/null @@ -1,99 +0,0 @@ -************** -Notejam: Nette -************** - -Notejam application implemented using `Nette framework `_. - -Nette version: 2.3 - -The application is maintained by `@klimesf `_. - -========================== -Installation and launching -========================== - ------ -Clone ------ - -Clone the repo: - -.. code-block:: bash - - $ git clone git@github.com:komarserjio/notejam.git YOUR_PROJECT_DIR/ - -------- -Install -------- - -Install `composer `_ - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/nette/native_db/notejam - $ curl -s https://getcomposer.org/installer | php - -Install dependencies - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/nette/native_db/notejam - $ php composer.phar install - -Create your copy of ``config.local.neon`` - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/nette/native_db/notejam - $ cp app/config/config.example.neon app/config/config.local.neon - -Create database schema - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/nette/native_db/notejam - $ php ./bin/create-db.php - - ------- -Launch ------- - -Start built-in php web server: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/nette/native_db/notejam/www/ - $ php -t `pwd` -S 127.0.0.1:8000 `pwd`/index.php - -Go to http://localhost:8000/ in your browser. - ---------- -Run tests ---------- - -Run tests: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/nette/native_db/notejam/www/ - $ php -t `pwd` -S 127.0.0.1:8000 `pwd`/index.php - $ cd ../ - $ ./vendor/bin/codecept run - - -============ -Contribution -============ - - -Do you have php/nette experience? Help the app to follow php and Nette Framework best practices. - -Please send your pull requests in the ``master`` branch. -Always prepend your commits with framework name: - -.. code-block:: bash - - Nette: Implemented sign in functionality - -Read `contribution guide `_ for details. diff --git a/padrino/README.rst b/padrino/README.rst deleted file mode 100644 index 37221a864..000000000 --- a/padrino/README.rst +++ /dev/null @@ -1,73 +0,0 @@ -**************** -Notejam: Padrino -**************** - -Notejam application implemented using `Padrino `_ framework. - -========================== -Installation and launching -========================== - ------ -Clone ------ - -Clone the repo: - -.. code-block:: bash - - $ git clone git@github.com:komarserjio/notejam.git YOUR_PROJECT_DIR/ - -------- -Install -------- - -Use `RVM `_ or `rbenv `_ -for environment management. - -Install dependencies: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/padrino/notejam/ - $ bundle install - ------- -Launch ------- - -Start built-in web server: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/padrino/notejam/ - $ padrino start - -Go to http://127.0.0.1:3000/ in your browser. - - ---------- -Run tests ---------- - -Start functional and unit tests: - -.. code-block:: bash - - $ cd YOUR_PROJECT_DIR/padrino/notejam/ - $ padrino rake spec - - -============ -Contribution -============ -Do you have ruby/padrino experience? Help the app to follow ruby and padrino best practices. - -Please send your pull requests in the ``master`` branch. -Always prepend your commits with framework name: - -.. code-block:: bash - - Padrino: Implemented sign in functionality - -Read `contribution guide `_ for details. diff --git a/padrino/notejam/.components b/padrino/notejam/.components deleted file mode 100644 index 9e717cd7c..000000000 --- a/padrino/notejam/.components +++ /dev/null @@ -1,10 +0,0 @@ ---- -:orm: datamapper -:test: rspec -:mock: none -:script: none -:renderer: erb -:stylesheet: none -:namespace: Notejam -:migration_format: number -:admin_renderer: erb diff --git a/padrino/notejam/.gitignore b/padrino/notejam/.gitignore deleted file mode 100644 index 9fa1cf0a7..000000000 --- a/padrino/notejam/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -.DS_Store -log/**/* -tmp/**/* -bin/* -vendor/gems/* -!vendor/gems/cache/ -.sass-cache/* -db/*.db -.*.sw* diff --git a/padrino/notejam/Gemfile b/padrino/notejam/Gemfile deleted file mode 100644 index 0745cf8d3..000000000 --- a/padrino/notejam/Gemfile +++ /dev/null @@ -1,43 +0,0 @@ -source 'https://rubygems.org' - -# Distribute your app as a gem -# gemspec - -# Server requirements -# gem 'thin' # or mongrel -# gem 'trinidad', :platform => 'jruby' - -# Optional JSON codec (faster performance) -# gem 'oj' - -# Project requirements -gem 'rake' - -# Component requirements -gem 'bcrypt' -gem 'erubis', '~> 2.7.0' -gem 'dm-sqlite-adapter' -gem 'dm-validations' -gem 'dm-timestamps' -gem 'dm-migrations' -gem 'dm-constraints' -gem 'dm-aggregates' -gem 'dm-types' -gem 'dm-core' - -# Test requirements -gem 'rspec', :group => 'test' -gem 'rack-test', :require => 'rack/test', :group => 'test' - -gem 'database_cleaner' - -# Padrino Stable Gem -gem 'padrino', '0.12.2' - -# Or Padrino Edge -# gem 'padrino', :github => 'padrino/padrino-framework' - -# Or Individual Gems -# %w(core support gen helpers cache mailer admin).each do |g| -# gem 'padrino-' + g, '0.12.2' -# end diff --git a/padrino/notejam/Gemfile.lock b/padrino/notejam/Gemfile.lock deleted file mode 100644 index ced4f9db8..000000000 --- a/padrino/notejam/Gemfile.lock +++ /dev/null @@ -1,144 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - activesupport (4.1.1) - i18n (~> 0.6, >= 0.6.9) - json (~> 1.7, >= 1.7.7) - minitest (~> 5.1) - thread_safe (~> 0.1) - tzinfo (~> 1.1) - addressable (2.3.6) - bcrypt (3.1.7) - bcrypt-ruby (3.1.5) - bcrypt (>= 3.1.3) - data_objects (0.10.14) - addressable (~> 2.1) - database_cleaner (0.9.1) - diff-lcs (1.2.5) - dm-aggregates (1.2.0) - dm-core (~> 1.2.0) - dm-constraints (1.2.0) - dm-core (~> 1.2.0) - dm-core (1.2.1) - addressable (~> 2.3) - dm-do-adapter (1.2.0) - data_objects (~> 0.10.6) - dm-core (~> 1.2.0) - dm-migrations (1.2.0) - dm-core (~> 1.2.0) - dm-sqlite-adapter (1.2.0) - dm-do-adapter (~> 1.2.0) - do_sqlite3 (~> 0.10.6) - dm-timestamps (1.2.0) - dm-core (~> 1.2.0) - dm-types (1.2.2) - bcrypt-ruby (~> 3.0) - dm-core (~> 1.2.0) - fastercsv (~> 1.5) - json (~> 1.6) - multi_json (~> 1.0) - stringex (~> 1.4) - uuidtools (~> 2.1) - dm-validations (1.2.0) - dm-core (~> 1.2.0) - do_sqlite3 (0.10.14) - data_objects (= 0.10.14) - erubis (2.7.0) - fastercsv (1.5.5) - http_router (0.11.1) - rack (>= 1.0.0) - url_mount (~> 0.2.1) - i18n (0.6.9) - json (1.8.1) - mail (2.5.4) - mime-types (~> 1.16) - treetop (~> 1.4.8) - mime-types (1.25.1) - minitest (5.3.4) - moneta (0.7.20) - multi_json (1.10.1) - padrino (0.12.2) - padrino-admin (= 0.12.2) - padrino-cache (= 0.12.2) - padrino-core (= 0.12.2) - padrino-gen (= 0.12.2) - padrino-helpers (= 0.12.2) - padrino-mailer (= 0.12.2) - padrino-support (= 0.12.2) - padrino-admin (0.12.2) - padrino-core (= 0.12.2) - padrino-helpers (= 0.12.2) - padrino-cache (0.12.2) - moneta (~> 0.7.0) - padrino-core (= 0.12.2) - padrino-helpers (= 0.12.2) - padrino-core (0.12.2) - activesupport (>= 3.1) - http_router (~> 0.11.0) - padrino-support (= 0.12.2) - rack-protection (>= 1.5.0) - sinatra (~> 1.4.2) - thor (~> 0.18.0) - padrino-gen (0.12.2) - bundler (~> 1.0) - padrino-core (= 0.12.2) - padrino-helpers (0.12.2) - i18n (~> 0.6, >= 0.6.7) - padrino-support (= 0.12.2) - tilt (~> 1.4.1) - padrino-mailer (0.12.2) - mail (~> 2.5.3) - padrino-core (= 0.12.2) - padrino-support (0.12.2) - activesupport (>= 3.1) - polyglot (0.3.4) - rack (1.5.2) - rack-protection (1.5.3) - rack - rack-test (0.6.2) - rack (>= 1.0) - rake (10.3.2) - rspec (2.14.1) - rspec-core (~> 2.14.0) - rspec-expectations (~> 2.14.0) - rspec-mocks (~> 2.14.0) - rspec-core (2.14.8) - rspec-expectations (2.14.5) - diff-lcs (>= 1.1.3, < 2.0) - rspec-mocks (2.14.6) - sinatra (1.4.5) - rack (~> 1.4) - rack-protection (~> 1.4) - tilt (~> 1.3, >= 1.3.4) - stringex (1.5.1) - thor (0.18.1) - thread_safe (0.3.3) - tilt (1.4.1) - treetop (1.4.15) - polyglot - polyglot (>= 0.3.1) - tzinfo (1.1.0) - thread_safe (~> 0.1) - url_mount (0.2.1) - rack - uuidtools (2.1.4) - -PLATFORMS - ruby - -DEPENDENCIES - bcrypt - database_cleaner - dm-aggregates - dm-constraints - dm-core - dm-migrations - dm-sqlite-adapter - dm-timestamps - dm-types - dm-validations - erubis (~> 2.7.0) - padrino (= 0.12.2) - rack-test - rake - rspec diff --git a/padrino/notejam/Rakefile b/padrino/notejam/Rakefile deleted file mode 100644 index 98c59df4b..000000000 --- a/padrino/notejam/Rakefile +++ /dev/null @@ -1,6 +0,0 @@ -require 'bundler/setup' -require 'padrino-core/cli/rake' - -PadrinoTasks.use(:database) -PadrinoTasks.use(:datamapper) -PadrinoTasks.init diff --git a/padrino/notejam/admin/app.rb b/padrino/notejam/admin/app.rb deleted file mode 100644 index 1e960c1ea..000000000 --- a/padrino/notejam/admin/app.rb +++ /dev/null @@ -1,43 +0,0 @@ -module Notejam - class Admin < Padrino::Application - register Padrino::Mailer - register Padrino::Helpers - register Padrino::Admin::AccessControl - - ## - # Application configuration options - # - # set :raise_errors, true # Raise exceptions (will stop application) (default for test) - # set :dump_errors, true # Exception backtraces are written to STDERR (default for production/development) - # set :show_exceptions, true # Shows a stack trace in browser (default for development) - # set :logging, true # Logging in STDOUT for development and file for production (default only for development) - # set :public_folder, "foo/bar" # Location for static assets (default root/public) - # set :reload, false # Reload application files (default in development) - # set :default_builder, "foo" # Set a custom form builder (default 'StandardFormBuilder') - # set :locale_path, "bar" # Set path for I18n translations (default your_app/locales) - # disable :sessions # Disabled sessions by default (enable if needed) - # disable :flash # Disables sinatra-flash (enabled by default if Sinatra::Flash is defined) - # layout :my_layout # Layout can be in views/layouts/foo.ext or views/foo.ext (default :application) - # - - set :admin_model, 'Account' - set :login_page, '/sessions/new' - - enable :sessions - disable :store_location - - access_control.roles_for :any do |role| - role.protect '/' - role.allow '/sessions' - end - - access_control.roles_for :admin do |role| - role.project_module :accounts, '/accounts' - end - - # Custom error management - error(403) { @title = "Error 403"; render('errors/403', :layout => :error) } - error(404) { @title = "Error 404"; render('errors/404', :layout => :error) } - error(500) { @title = "Error 500"; render('errors/500', :layout => :error) } - end -end diff --git a/padrino/notejam/admin/controllers/accounts.rb b/padrino/notejam/admin/controllers/accounts.rb deleted file mode 100644 index c5230d05f..000000000 --- a/padrino/notejam/admin/controllers/accounts.rb +++ /dev/null @@ -1,90 +0,0 @@ -Notejam::Admin.controllers :accounts do - get :index do - @title = "Accounts" - @accounts = Account.all - render 'accounts/index' - end - - get :new do - @title = pat(:new_title, :model => 'account') - @account = Account.new - render 'accounts/new' - end - - post :create do - @account = Account.new(params[:account]) - if @account.save - @title = pat(:create_title, :model => "account #{@account.id}") - flash[:success] = pat(:create_success, :model => 'Account') - params[:save_and_continue] ? redirect(url(:accounts, :index)) : redirect(url(:accounts, :edit, :id => @account.id)) - else - @title = pat(:create_title, :model => 'account') - flash.now[:error] = pat(:create_error, :model => 'account') - render 'accounts/new' - end - end - - get :edit, :with => :id do - @title = pat(:edit_title, :model => "account #{params[:id]}") - @account = Account.get(params[:id]) - if @account - render 'accounts/edit' - else - flash[:warning] = pat(:create_error, :model => 'account', :id => "#{params[:id]}") - halt 404 - end - end - - put :update, :with => :id do - @title = pat(:update_title, :model => "account #{params[:id]}") - @account = Account.get(params[:id]) - if @account - if @account.update(params[:account]) - flash[:success] = pat(:update_success, :model => 'Account', :id => "#{params[:id]}") - params[:save_and_continue] ? - redirect(url(:accounts, :index)) : - redirect(url(:accounts, :edit, :id => @account.id)) - else - flash.now[:error] = pat(:update_error, :model => 'account') - render 'accounts/edit' - end - else - flash[:warning] = pat(:update_warning, :model => 'account', :id => "#{params[:id]}") - halt 404 - end - end - - delete :destroy, :with => :id do - @title = "Accounts" - account = Account.get(params[:id]) - if account - if account != current_account && account.destroy - flash[:success] = pat(:delete_success, :model => 'Account', :id => "#{params[:id]}") - else - flash[:error] = pat(:delete_error, :model => 'account') - end - redirect url(:accounts, :index) - else - flash[:warning] = pat(:delete_warning, :model => 'account', :id => "#{params[:id]}") - halt 404 - end - end - - delete :destroy_many do - @title = "Accounts" - unless params[:account_ids] - flash[:error] = pat(:destroy_many_error, :model => 'account') - redirect(url(:accounts, :index)) - end - ids = params[:account_ids].split(',').map(&:strip) - accounts = Account.all(:id => ids) - - if accounts.include? current_account - flash[:error] = pat(:delete_error, :model => 'account') - elsif accounts.destroy - - flash[:success] = pat(:destroy_many_success, :model => 'Accounts', :ids => "#{ids.to_sentence}") - end - redirect url(:accounts, :index) - end -end diff --git a/padrino/notejam/admin/controllers/base.rb b/padrino/notejam/admin/controllers/base.rb deleted file mode 100644 index 22e502e59..000000000 --- a/padrino/notejam/admin/controllers/base.rb +++ /dev/null @@ -1,5 +0,0 @@ -Notejam::Admin.controllers :base do - get :index, :map => "/" do - render "base/index" - end -end diff --git a/padrino/notejam/admin/controllers/sessions.rb b/padrino/notejam/admin/controllers/sessions.rb deleted file mode 100644 index 7bc4491f4..000000000 --- a/padrino/notejam/admin/controllers/sessions.rb +++ /dev/null @@ -1,25 +0,0 @@ -Notejam::Admin.controllers :sessions do - get :new do - render "/sessions/new", nil, :layout => false - end - - post :create do - if account = Account.authenticate(params[:email], params[:password]) - set_current_account(account) - redirect url(:base, :index) - elsif Padrino.env == :development && params[:bypass] - account = Account.first - set_current_account(account) - redirect url(:base, :index) - else - params[:email] = h(params[:email]) - flash.now[:error] = pat('login.error') - render "/sessions/new", nil, :layout => false - end - end - - delete :destroy do - set_current_account(nil) - redirect url(:sessions, :new) - end -end diff --git a/padrino/notejam/admin/views/accounts/_form.erb b/padrino/notejam/admin/views/accounts/_form.erb deleted file mode 100644 index 8f5c1fedd..000000000 --- a/padrino/notejam/admin/views/accounts/_form.erb +++ /dev/null @@ -1,57 +0,0 @@ -<% error = @account.errors.key?(:name) && @account.errors[:name].count > 0 %> -
'> - <%= f.label :name, :class => 'control-label' %> -
- <%= f.text_field :name, :class => 'form-control input-xlarge input-with-feedback', :autofocus => true %> - <%= error ? f.error_message_on(:name) : "Ex: a simple text" %> -
-
-<% error = @account.errors.key?(:surname) && @account.errors[:surname].count > 0 %> -
'> - <%= f.label :surname, :class => 'control-label' %> -
- <%= f.text_field :surname, :class => 'form-control input-xlarge input-with-feedback' %> - <%= error ? f.error_message_on(:surname) : "Ex: a simple text" %> -
-
-<% error = @account.errors.key?(:email) && @account.errors[:email].count > 0 %> -
'> - <%= f.label :email, :class => 'control-label' %> -
- <%= f.text_field :email, :class => 'form-control input-xlarge input-with-feedback' %> - <%= error ? f.error_message_on(:email) : "Ex: a simple text" %> -
-
-<% error = @account.errors.key?(:password) && @account.errors[:password].count > 0 %> -
'> - <%= f.label :password, :class => 'control-label' %> -
- <%= f.password_field :password, :class => 'form-control input-xlarge input-with-feedback' %> - <%= error ? f.error_message_on(:password) : "Ex: a simple text" %> -
-
-<% error = @account.errors.key?(:password_confirmation) && @account.errors[:password_confirmation].count > 0 %> -
'> - <%= f.label :password_confirmation, :class => 'control-label' %> -
- <%= f.password_field :password_confirmation, :class => 'form-control input-xlarge input-with-feedback' %> - <%= error ? f.error_message_on(:password_confirmation) : "Ex: a simple text" %> -
-
-<% error = @account.errors.key?(:role) && @account.errors[:role].count > 0 %> -
'> - <%= f.label :role, :class => 'control-label' %> -
- <%= f.text_field :role, :class => 'form-control input-xlarge input-with-feedback' %> - <%= error ? f.error_message_on(:role) : "Ex: a simple text" %> -
-
- - -
- <%= f.submit pat(:save), :class => 'btn btn-primary' %> -   - <%= f.submit pat(:save_and_continue), :class => 'btn btn-info', :name => 'save_and_continue' %> -   - <%= link_to pat(:cancel), url(:accounts, :index), :class => 'btn btn-default' %> -
\ No newline at end of file diff --git a/padrino/notejam/admin/views/accounts/edit.erb b/padrino/notejam/admin/views/accounts/edit.erb deleted file mode 100644 index 9adf99f14..000000000 --- a/padrino/notejam/admin/views/accounts/edit.erb +++ /dev/null @@ -1,10 +0,0 @@ - -
- <% form_for :account, url(:accounts, :update, :id => @account.id), :method => :put, :class => 'form-horizontal' do |f| %> - <%= partial 'accounts/form', :locals => { :f => f } %> - <% end %> -
diff --git a/padrino/notejam/admin/views/accounts/index.erb b/padrino/notejam/admin/views/accounts/index.erb deleted file mode 100644 index c12efdc4c..000000000 --- a/padrino/notejam/admin/views/accounts/index.erb +++ /dev/null @@ -1,74 +0,0 @@ - -
- - - - - - - - - - - - - <% @accounts.each do |account| %> - - - - - - - - <% end %> - -
- - <%= mat(:account, :id) %> <%= mat(:account, :name) %> <%= mat(:account, :surname) %> <%= mat(:account, :email) %>
- <%= check_box_tag 'account_ids[]', :value => account.id, :class => 'list-selectable-checkbox' %> - <%= account.id %> <%= account.name %> <%= account.surname %> <%= account.email %> -
- <%= link_to tag_icon(:edit), :href => url(:accounts, :edit, :id => account.id), :rel => :tooltip, :title => "#{pat(:edit)} account", :class => 'list-row-action-wrapper-link' %> - <%= link_to tag_icon(:trash), :rel => :tooltip, :title => "#{pat(:delete)} account", :class => 'list-row-action-delete-one list-row-action-wrapper-link' %> -
-
-

<%= pat(:delete, :model => "account") %>

-
- <%- form_tag url(:accounts, :destroy, :id => account.id), :method => :delete do %> - <%= submit_tag pat(:delete), :class =>'list-row-action-popover-delete-one-btn btn btn-danger btn-small' %> -
<%= pat(:cancel) %>
- <% end %> -
-
-
-
\ No newline at end of file diff --git a/padrino/notejam/admin/views/accounts/new.erb b/padrino/notejam/admin/views/accounts/new.erb deleted file mode 100644 index d0222f1dd..000000000 --- a/padrino/notejam/admin/views/accounts/new.erb +++ /dev/null @@ -1,9 +0,0 @@ - -
- <% form_for :account, url(:accounts, :create), :class => 'form-horizontal' do |f| %> - <%= partial 'accounts/form', :locals => { :f => f } %> - <% end %> -
diff --git a/padrino/notejam/admin/views/base/index.erb b/padrino/notejam/admin/views/base/index.erb deleted file mode 100644 index fcfdbb224..000000000 --- a/padrino/notejam/admin/views/base/index.erb +++ /dev/null @@ -1,15 +0,0 @@ -
-

Padrino is a ruby framework built upon the Sinatra web library.

-

It was created to make it fun and easy to code more advanced web applications while still adhering to the spirit that makes Sinatra great!

-

Padrino comes shipped with a slick and beautiful Admin Interface, with the following features:

-
- -
-
-
<%= tag_icon("cogs icon-2x", "Orm Agnostic") %>
-
<%= tag_icon("group icon-2x", "Authentication") %>
-
<%= tag_icon("tasks icon-2x", "Template Agnostic") %>
-
<%= tag_icon("flag icon-2x", "Multi Language") %>
-
<%= tag_icon("magic icon-2x", "Scaffold") %>
-
-
diff --git a/padrino/notejam/admin/views/errors/403.erb b/padrino/notejam/admin/views/errors/403.erb deleted file mode 100644 index 4ceaca627..000000000 --- a/padrino/notejam/admin/views/errors/403.erb +++ /dev/null @@ -1,3 +0,0 @@ -

<%= tag_icon 'minus-sign icon-3x' %>

-

<%= pat('custom_errors.403.title') %>

-

<%= pat('custom_errors.403.description') %>

diff --git a/padrino/notejam/admin/views/errors/404.erb b/padrino/notejam/admin/views/errors/404.erb deleted file mode 100644 index 630469e15..000000000 --- a/padrino/notejam/admin/views/errors/404.erb +++ /dev/null @@ -1,3 +0,0 @@ -

<%= tag_icon 'warning-sign icon-3x' %>

-

<%= pat('custom_errors.404.title') %>

-

<%= pat('custom_errors.404.description') %>

diff --git a/padrino/notejam/admin/views/errors/500.erb b/padrino/notejam/admin/views/errors/500.erb deleted file mode 100644 index 8c44b9a27..000000000 --- a/padrino/notejam/admin/views/errors/500.erb +++ /dev/null @@ -1,3 +0,0 @@ -

<%= tag_icon 'beaker icon-3x' %>

-

<%= pat('custom_errors.500.title') %>

-

<%= pat('custom_errors.500.description') %>

diff --git a/padrino/notejam/admin/views/layouts/application.erb b/padrino/notejam/admin/views/layouts/application.erb deleted file mode 100644 index 49c251e25..000000000 --- a/padrino/notejam/admin/views/layouts/application.erb +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - <%= @title.present? ? "#{@title} | Padrino Admin" : "Padrino Admin" %> - <%= favicon_tag "favicon.ico" %> - - <%= stylesheet_link_tag 'bootstrap', 'application' %> - - - - -
-
- <%= {:error => 'danger', :warning => 'warning', :success => 'success', :notice => 'info'}.map { |type, class_name| flash_tag(type, :class => "alert alert-#{class_name} fade in", :bootstrap => true) }.join.html_safe %> -
<%= yield %>
-
-
-
- -
- -
- - <%= javascript_include_tag 'jquery-1.9.0.min', (Padrino.env == :production ? 'bootstrap/bootstrap.min' : %w[bootstrap/affix bootstrap/alert bootstrap/button bootstrap/carousel bootstrap/collapse bootstrap/dropdown bootstrap/tooltip bootstrap/transition bootstrap/modal bootstrap/popover bootstrap/scrollspy bootstrap/tab]), :application %> - - diff --git a/padrino/notejam/admin/views/layouts/error.erb b/padrino/notejam/admin/views/layouts/error.erb deleted file mode 100644 index d2cce35f2..000000000 --- a/padrino/notejam/admin/views/layouts/error.erb +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - <%= @title.present? ? "#{@title} | Padrino Admin" : "#{pat(:custom_errors.title)} | Padrino Admin" %> - <%= favicon_tag "favicon.ico" %> - - <%= stylesheet_link_tag 'bootstrap', 'application' %> - - -
-
<%= yield %>
- -
- - \ No newline at end of file diff --git a/padrino/notejam/admin/views/sessions/new.erb b/padrino/notejam/admin/views/sessions/new.erb deleted file mode 100644 index 45cf67e31..000000000 --- a/padrino/notejam/admin/views/sessions/new.erb +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - <%= @title.present? ? "#{@title} | Padrino Admin" : "#{pat('login.title')} | Padrino Admin" %> - <%= favicon_tag "favicon.ico" %> - <%= stylesheet_link_tag "bootstrap", "application" %> - - - <% form_tag url(:sessions, :create), :class=>"login form-horizontal" do %> - - - - <% end %> - <%= javascript_include_tag 'jquery-1.9.0.min', (Padrino.env == :production ? 'bootstrap/bootstrap.min' : %w[bootstrap/affix bootstrap/alert bootstrap/button bootstrap/carousel bootstrap/collapse bootstrap/dropdown bootstrap/tooltip bootstrap/transition bootstrap/modal bootstrap/popover bootstrap/scrollspy bootstrap/tab]), :application %> - - diff --git a/padrino/notejam/app/app.rb b/padrino/notejam/app/app.rb deleted file mode 100644 index fd6bceeb7..000000000 --- a/padrino/notejam/app/app.rb +++ /dev/null @@ -1,84 +0,0 @@ -module Notejam - class App < Padrino::Application - register Padrino::Admin::AccessControl - register Padrino::Mailer - register Padrino::Helpers - - enable :sessions - - enable :authentication - enable :store_location - set :login_page, "/signin" - - access_control.roles_for :any do |role| - role.protect '/' - role.allow '/signin' - role.allow '/signup' - role.allow '/forgot-password' - role.allow '/set-session-variable' - end - - set :delivery_method, :test - - ## - # Caching support. - # - # register Padrino::Cache - # enable :caching - # - # You can customize caching store engines: - # - # set :cache, Padrino::Cache.new(:LRUHash) # Keeps cached values in memory - # set :cache, Padrino::Cache.new(:Memcached) # Uses default server at localhost - # set :cache, Padrino::Cache.new(:Memcached, '127.0.0.1:11211', :exception_retry_limit => 1) - # set :cache, Padrino::Cache.new(:Memcached, :backend => memcached_or_dalli_instance) - # set :cache, Padrino::Cache.new(:Redis) # Uses default server at localhost - # set :cache, Padrino::Cache.new(:Redis, :host => '127.0.0.1', :port => 6379, :db => 0) - # set :cache, Padrino::Cache.new(:Redis, :backend => redis_instance) - # set :cache, Padrino::Cache.new(:Mongo) # Uses default server at localhost - # set :cache, Padrino::Cache.new(:Mongo, :backend => mongo_client_instance) - # set :cache, Padrino::Cache.new(:File, :dir => Padrino.root('tmp', app_name.to_s, 'cache')) # default choice - # - - ## - # Application configuration options. - # - # set :raise_errors, true # Raise exceptions (will stop application) (default for test) - # set :dump_errors, true # Exception backtraces are written to STDERR (default for production/development) - # set :show_exceptions, true # Shows a stack trace in browser (default for development) - # set :logging, true # Logging in STDOUT for development and file for production (default only for development) - # set :public_folder, 'foo/bar' # Location for static assets (default root/public) - # set :reload, false # Reload application files (default in development) - # set :default_builder, 'foo' # Set a custom form builder (default 'StandardFormBuilder') - # set :locale_path, 'bar' # Set path for I18n translations (default your_apps_root_path/locale) - # disable :sessions # Disabled sessions by default (enable if needed) - # disable :flash # Disables sinatra-flash (enabled by default if Sinatra::Flash is defined) - # layout :my_layout # Layout can be in views/layouts/foo.ext or views/foo.ext (default :application) - # - - ## - # You can configure for a specified environment like: - # - # configure :development do - # set :foo, :bar - # disable :asset_stamp # no asset timestamping for dev - # end - # - configure :test do - set :protect_from_csrf, false - end - - ## - # You can manage errors like: - # - # error 404 do - # render 'errors/404' - # end - # - # error 505 do - # render 'errors/505' - # end - # - DataMapper.auto_upgrade! - end -end diff --git a/padrino/notejam/app/controllers/note.rb b/padrino/notejam/app/controllers/note.rb deleted file mode 100644 index dae4210bf..000000000 --- a/padrino/notejam/app/controllers/note.rb +++ /dev/null @@ -1,72 +0,0 @@ -Notejam::App.controllers :note do - - layout :layout - - get :all_notes, :map => '/' do - @notes = Note.all( - :user_id => current_account.id, :order => order_param(params) - ) - render "note/list" - end - - get :create, :map => '/notes/create' do - render "note/create" - end - - post :create, :map => '/notes/create' do - # @TODO datamapper validation issue? - if params[:note][:pad_id] == "0" - params[:note].delete("pad_id") - else - @pad = get_or_404(current_account.pads, params[:note][:pad_id]) - end - - @note = Note.new(params[:note]) - current_account.notes << @note - if @note.save - flash[:success] = 'Note is successfully created.' - redirect url(:note, :view, :id => @note.id) - end - render "note/create" - end - - get :edit, :map => '/notes/:id/edit' do - @note = get_or_404(current_account.notes, params[:id]) - render "note/edit" - end - - post :edit, :map => '/notes/:id/edit' do - @note = get_or_404(current_account.notes, params[:id]) - - # @TODO datamapper validation issue? - if params[:note][:pad_id] == "0" - params[:note].delete("pad_id") - end - - @note.update(params[:note]) - if @note.save - flash[:success] = 'Note is successfully updated.' - redirect url(:note, :view, :id => @note.id) - end - render "note/edit" - end - - get :view, :map => '/notes/:id' do - @note = get_or_404(current_account.notes, params[:id]) - render "note/view" - end - - get :delete, :map => '/notes/:id/delete' do - @note = get_or_404(current_account.notes, params[:id]) - render "note/delete" - end - - post :delete, :map => '/notes/:id/delete' do - @note = get_or_404(current_account.notes, params[:id]) - @note.destroy - flash[:success] = 'Note is successfully deleted.' - redirect url(:note, :all_notes) - end - -end - diff --git a/padrino/notejam/app/controllers/pad.rb b/padrino/notejam/app/controllers/pad.rb deleted file mode 100644 index a0fec2b44..000000000 --- a/padrino/notejam/app/controllers/pad.rb +++ /dev/null @@ -1,56 +0,0 @@ -Notejam::App.controllers :pad do - - layout :layout - - get :create, :map => '/pads/create' do - render "pad/create" - end - - post :create, :map => '/pads/create' do - @pad = Pad.new(params[:pad]) - current_account.pads << @pad - if @pad.save - flash[:success] = 'Pad is created!' - redirect url(:pad, :view, :id => @pad.id) - end - @pad.destroy - render "pad/create" - end - - get :edit, :map => '/pads/:id/edit' do - @pad = get_or_404(current_account.pads, params[:id]) - render "pad/edit" - end - - post :edit, :map => '/pads/:id/edit' do - @pad = get_or_404(current_account.pads, params[:id]) - @pad.update(params[:pad]) - if @pad.save - flash[:success] = 'Pad is updated!' - redirect url(:pad, :view, :id => @pad.id) - end - render "pad/edit" - end - - get :delete, :map => '/pads/:id/delete' do - @pad = get_or_404(current_account.pads, params[:id]) - render "pad/delete" - end - - post :delete, :map => '/pads/:id/delete' do - @pad = get_or_404(current_account.pads, params[:id]) - @pad.destroy - flash[:success] = 'Pad is deleted!' - redirect url(:note, :all_notes) - end - - get :view, :map => '/pads/:id' do - @pad = get_or_404(current_account.pads, params[:id]) - @notes = Note.all( - :pad_id => @pad.id, :order => order_param(params) - ) - render "pad/view" - end -end - - diff --git a/padrino/notejam/app/controllers/user.rb b/padrino/notejam/app/controllers/user.rb deleted file mode 100644 index 4f8b78b2e..000000000 --- a/padrino/notejam/app/controllers/user.rb +++ /dev/null @@ -1,79 +0,0 @@ -Notejam::App.controllers :user do - - layout :user - - get :signup, :map => '/signup' do - render "user/signup" - end - - post :signup, :map => '/signup' do - @user = User.new(params[:user]) - if @user.save - flash[:success] = 'Account is created. Now you can sign in.' - redirect url(:user, :signin) - end - render "user/signup" - end - - get :signin, :map => '/signin' do - render "user/signin" - end - - post :signin, :map => '/signin' do - if user = User.authenticate(params[:email], params[:password]) - set_current_account(user) - redirect url(:note, :all_notes) - else - params[:email] = h(params[:email]) - flash.now[:error] = "Wrong email or password." - render "user/signin" - end - end - - get :signout, :map => '/signout' do - set_current_account nil - redirect url(:pad, :create) - end - - get :settings, :map => '/settings' do - @user = current_account - render "user/settings" - end - - post :settings, :map => '/settings' do - @user = current_account - if @user.has_password? params[:current_password] - params[:user][:crypted_password] = nil - @user.update(params[:user]) - if @user.save - flash[:success] = 'Password was successfully changed.' - redirect url(:note, :all_notes) - end - else - flash[:error] = 'Entered current password is incorrect.' - redirect url(:user, :settings) - end - - render "user/settings" - end - - get :forgot_password, :map => '/forgot-password' do - render "user/forgot-password" - end - - post :forgot_password, :map => '/forgot-password' do - @user = User.first(:email => params[:email]) - if @user - new_password = generate_password - @user.password = new_password - @user.save - - deliver(:mailer, :new_password_email, @user.email, new_password) - - flash[:success] = 'New password sent to your email.' - redirect url(:user, :signin) - end - flash[:error] = 'No users found' - redirect url(:user, :forgot_password) - end -end diff --git a/padrino/notejam/app/helpers.rb b/padrino/notejam/app/helpers.rb deleted file mode 100644 index 30145873f..000000000 --- a/padrino/notejam/app/helpers.rb +++ /dev/null @@ -1,47 +0,0 @@ -# Helper methods defined here can be accessed in any controller or view in the application - -module Notejam - class App - def get_or_404(model, id) - model.get(id) or halt 404, "Page not found" - end - - def smart_date(datetime) - diff = Date.today - datetime.to_date - days = diff.to_i - if days == 0 - 'Today at ' + datetime.strftime("%H:%M") - elsif days == 1 - 'Yesterday' - elsif days > 1 && days <= 7 - days.to_s + " days ago" - else - datetime.strftime("%d %b %Y") - end - end - - def field_errors(field, model) - if model && model.errors[field].any? - errors = "
    " - model.errors[field].each do |message| - errors << "
  • #{message}
  • " - end - errors << "
" - errors.html_safe - end - end - - def order_param(params) - order = params[:order] || "-updated_at" - {"name" => :name.asc, - "-name" => :name.desc, - "updated_at" => :updated_at.asc, - "-updated_at" => :updated_at.desc}[order] - end - - def generate_password - # weak password generation - (0...8).map { ('a'..'z').to_a[rand(26)] }.join - end - end -end diff --git a/padrino/notejam/app/helpers/user_helper.rb b/padrino/notejam/app/helpers/user_helper.rb deleted file mode 100644 index 6ae8670de..000000000 --- a/padrino/notejam/app/helpers/user_helper.rb +++ /dev/null @@ -1,10 +0,0 @@ -# Helper methods defined here can be accessed in any controller or view in the application - -module Notejam - class App - module UserHelper - end - - helpers UserHelper - end -end diff --git a/padrino/notejam/app/mailers.rb b/padrino/notejam/app/mailers.rb deleted file mode 100644 index 08739db6f..000000000 --- a/padrino/notejam/app/mailers.rb +++ /dev/null @@ -1,44 +0,0 @@ -## -# Mailer methods can be defined using the simple format: -# -# email :registration_email do |name, user| -# from 'admin@site.com' -# to user.email -# subject 'Welcome to the site!' -# locals :name => name -# content_type 'text/html' # optional, defaults to plain/text -# via :sendmail # optional, to smtp if defined, otherwise sendmail -# render 'registration_email' -# end -# -# You can set the default delivery settings from your app through: -# -# set :delivery_method, :smtp => { -# :address => 'smtp.yourserver.com', -# :port => '25', -# :user_name => 'user', -# :password => 'pass', -# :authentication => :plain, # :plain, :login, :cram_md5, no auth by default -# :domain => "localhost.localdomain" # the HELO domain provided by the client to the server -# } -# -# or sendmail (default): -# -# set :delivery_method, :sendmail -# -# or for tests: -# -# set :delivery_method, :test -# -# or storing emails locally: -# -# set :delivery_method, :file => { -# :location => "#{Padrino.root}/tmp/emails", -# } -# -# and then all delivered mail will use these settings unless otherwise specified. -# - -Notejam::App.mailer :notifier do - # Message definitions here ... -end diff --git a/padrino/notejam/app/mailers/mailer.rb b/padrino/notejam/app/mailers/mailer.rb deleted file mode 100644 index 51101ee5f..000000000 --- a/padrino/notejam/app/mailers/mailer.rb +++ /dev/null @@ -1,11 +0,0 @@ -Notejam::App.mailer :mailer do - - email :new_password_email do |email, password| - from 'noreply@notejamapp.com' - to email - subject 'New notejam password' - locals :password => password, :email => email - render 'mailer/new_password_email' - end - -end diff --git a/padrino/notejam/app/views/layouts/layout.html.erb b/padrino/notejam/app/views/layouts/layout.html.erb deleted file mode 100644 index 15e0edb51..000000000 --- a/padrino/notejam/app/views/layouts/layout.html.erb +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - <%= yield_content(:page_title) %> - - - - - - - - <%= stylesheet_link_tag "http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/base.min.css", media: "all" %> - <%= stylesheet_link_tag "http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/skeleton.min.css", media: "all" %> - <%= stylesheet_link_tag "http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/layout.css", media: "all" %> - <%= stylesheet_link_tag "style", media: "all" %> - - - <%= csrf_meta_tags %> - - - - -
-
- -
-
-

- notejam: - <%= yield_content(:page_title) %> -

-
- <% if content_for?(:pad_menu) %> - <%= yield_content(:pad_menu) %> - <% else %> -
- - -
- <% end %> -
-
- <% flash.each do |name, msg| -%> -
<%= msg %>
- <% end -%> -
- <%= content_for?(:content) ? yield_content(:content) : yield %> -
- - -
- Fork me on GitHub - - diff --git a/padrino/notejam/app/views/layouts/user.html.erb b/padrino/notejam/app/views/layouts/user.html.erb deleted file mode 100644 index 34579b994..000000000 --- a/padrino/notejam/app/views/layouts/user.html.erb +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - <%= yield_content(:page_title) %> - - - - - - - - <%= stylesheet_link_tag "http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/base.min.css", media: "all" %> - <%= stylesheet_link_tag "http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/skeleton.min.css", media: "all" %> - <%= stylesheet_link_tag "http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/layout.css", media: "all" %> - <%= stylesheet_link_tag "style", media: "all" %> - - - <%= csrf_meta_tags %> - - - - -
-
- -
-
-

- notejam: - <%= yield_content(:page_title) %> -

-
-
-
- <% flash.each do |name, msg| -%> -
<%= msg %>
- <% end -%> -
- <%= content_for?(:content) ? yield_content(:content) : yield %> -
- - -
- Fork me on GitHub - - diff --git a/padrino/notejam/app/views/mailers/mailer/new_password_email.erb b/padrino/notejam/app/views/mailers/mailer/new_password_email.erb deleted file mode 100644 index 3d48fc0b9..000000000 --- a/padrino/notejam/app/views/mailers/mailer/new_password_email.erb +++ /dev/null @@ -1,5 +0,0 @@ -Hi, <%= @email %> -========================================= -  -Your new password is <%= @password %> - diff --git a/padrino/notejam/app/views/note/create.html.erb b/padrino/notejam/app/views/note/create.html.erb deleted file mode 100644 index 8aa32eeea..000000000 --- a/padrino/notejam/app/views/note/create.html.erb +++ /dev/null @@ -1,18 +0,0 @@ -<% content_for :page_title do %>New note<% end %> - -<% form_for :note, url(:note, :create), {:class => "note"} do |f| %> - <%= f.label :name %> - <%= f.text_field :name %> - <%= field_errors :name, @note %> - - <%= f.label :text %> - <%= f.text_area :text %> - <%= field_errors :text, @note %> - - <%= f.label :pad %> - <%= f.select :pad_id, :collection => current_account.pads, :fields => ['name', 'id'], :include_blank => ['-------', 0], :selected => params[:pad] %> - - <%= f.submit "Create" %> -<% end %> - - diff --git a/padrino/notejam/app/views/note/delete.html.erb b/padrino/notejam/app/views/note/delete.html.erb deleted file mode 100644 index fff921148..000000000 --- a/padrino/notejam/app/views/note/delete.html.erb +++ /dev/null @@ -1,9 +0,0 @@ -<% content_for :page_title do %><%= @note.name %><% end %> - -

Are you sure you want to delete <%= @note.name %>?

-<% form_for :note, url(:note, :delete, :id => @note.id) do |f| %> - <%= f.submit "Yes, I want to delete this note", :class => "red" %> - <%= link_to "Cancel", url(:note, :view, {:id => @note.id}) %> -<% end %> - - diff --git a/padrino/notejam/app/views/note/edit.html.erb b/padrino/notejam/app/views/note/edit.html.erb deleted file mode 100644 index a734442fa..000000000 --- a/padrino/notejam/app/views/note/edit.html.erb +++ /dev/null @@ -1,19 +0,0 @@ -<% content_for :page_title do %><%= @note.name %><% end %> - -<% form_for :note, url(:note, :edit, {:id => @note.id}), {:class => "note"} do |f| %> - <%= f.label :name %> - <%= f.text_field :name %> - <%= field_errors :name, @note %> - - <%= f.label :text %> - <%= f.text_area :text %> - <%= field_errors :text, @note %> - - <%= f.label :pad %> - <%= f.select :pad_id, :collection => current_account.pads, :fields => ['name', 'id'], :include_blank => ['-------', 0], :selected => params[:pad] %> - - <%= f.submit "Save" %> -<% end %> - - - diff --git a/padrino/notejam/app/views/note/list.html.erb b/padrino/notejam/app/views/note/list.html.erb deleted file mode 100644 index 9d435d93e..000000000 --- a/padrino/notejam/app/views/note/list.html.erb +++ /dev/null @@ -1,27 +0,0 @@ -<% content_for :page_title do %>All notes (<%= @notes.count %>)<% end %> -<% if @notes.count.nonzero? %> - - - - - - - <% @notes.each do |note| -%> - - - - - - <% end -%> -
Note " class="sort_arrow">↑" class="sort_arrow">↓PadLast modified " class="sort_arrow">↑" class="sort_arrow">↓
<%= link_to note.name, url(:note, :view, :id => note.id) %> - <% if note.pad %> - <%= link_to note.pad.name, url(:pad, :view, :id => note.pad.id) %> - <% else %> - No pad - <% end %> - <%= smart_date note.updated_at %>
-<% else %> -

Create your first note.

-<% end %> -<%= link_to "New note", url(:note, :create), :class => "button" %> - diff --git a/padrino/notejam/app/views/note/view.html.erb b/padrino/notejam/app/views/note/view.html.erb deleted file mode 100644 index 8675c97cd..000000000 --- a/padrino/notejam/app/views/note/view.html.erb +++ /dev/null @@ -1,11 +0,0 @@ -<% content_for :page_title do %><%= @note.name %><% end %> - -

Last edited: <%= smart_date @note.updated_at %>

-
-

- <%= @note.text %> -

-
-<%= link_to "Edit", url(:note, :edit, :id => @note.id), {:class => "button"} %> -<%= link_to "Delete", url(:note, :delete, :id => @note.id), {:class => "delete-note"} %> - diff --git a/padrino/notejam/app/views/pad/create.html.erb b/padrino/notejam/app/views/pad/create.html.erb deleted file mode 100644 index 34de38d99..000000000 --- a/padrino/notejam/app/views/pad/create.html.erb +++ /dev/null @@ -1,10 +0,0 @@ -<% content_for :page_title do %>New pad<% end %> - -<% form_for :pad, url(:pad, :create) do |f| %> - <%= f.label :name %> - <%= f.text_field :name %> - <%= field_errors :name, @pad %> - - <%= f.submit "Create" %> -<% end %> - diff --git a/padrino/notejam/app/views/pad/delete.html.erb b/padrino/notejam/app/views/pad/delete.html.erb deleted file mode 100644 index 5388b1086..000000000 --- a/padrino/notejam/app/views/pad/delete.html.erb +++ /dev/null @@ -1,8 +0,0 @@ -<% content_for :page_title do %>Delete pad: <%= @pad.name %><% end %> - -

Are you sure you want to delete <%= @pad.name %>?

-<% form_for :pad, url(:pad, :delete, :id => @pad.id) do |f| %> - <%= f.submit "Yes, I want to delete this pad", :class => "red" %> - <%= link_to "Cancel", url(:pad, :edit, :id => @pad.id) %> -<% end %> - diff --git a/padrino/notejam/app/views/pad/edit.html.erb b/padrino/notejam/app/views/pad/edit.html.erb deleted file mode 100644 index 16100c5f4..000000000 --- a/padrino/notejam/app/views/pad/edit.html.erb +++ /dev/null @@ -1,12 +0,0 @@ -<% content_for :page_title do %><%= @pad.name %><% end %> - -<% form_for :pad, url(:pad, :edit, :id => @pad.id) do |f| %> - <%= f.label :name %> - <%= f.text_field :name %> - <%= field_errors :name, @pad %> - - <%= f.submit "Save" %> - <%= link_to "Delete pad", url(:pad, :delete, {:id => @pad.id}), :class => "red" %> -<% end %> - - diff --git a/padrino/notejam/app/views/pad/view.html.erb b/padrino/notejam/app/views/pad/view.html.erb deleted file mode 100644 index de5345b2d..000000000 --- a/padrino/notejam/app/views/pad/view.html.erb +++ /dev/null @@ -1,19 +0,0 @@ -<% content_for :page_title do %><%= @pad.name %> (<%= @notes.count %>)<% end %> -<% if @notes.count.nonzero? %> - - - - - - <% @notes.each do |note| -%> - - - - - <% end -%> -
Note " class="sort_arrow">↑" class="sort_arrow">↓Last modified " class="sort_arrow">↑" class="sort_arrow">↓
<%= link_to note.name, url(:note, :view, :id => note.id) %><%= smart_date note.updated_at %>
-<% else %> -

Create first note in the pad.

-<% end %> -<%= link_to "Create a note", url(:note, :create, {:pad => @pad.id}), :class => "button" %> -<%= link_to "Pad settings", url(:pad, :edit, {:id => @pad.id}) %> diff --git a/padrino/notejam/app/views/user/forgot-password.html.erb b/padrino/notejam/app/views/user/forgot-password.html.erb deleted file mode 100644 index 63c58028a..000000000 --- a/padrino/notejam/app/views/user/forgot-password.html.erb +++ /dev/null @@ -1,10 +0,0 @@ -<% content_for :page_title do %>Forgot password?<% end %> - -<% form_tag({}, {:class => "offset-by-six sign-in"}) do %> - <%= label_tag :email %> - <%= text_field_tag :email, :required => true %> - - <%= submit_tag "Generate password" %> -<% end %> - - diff --git a/padrino/notejam/app/views/user/settings.html.erb b/padrino/notejam/app/views/user/settings.html.erb deleted file mode 100644 index 3379ffdbb..000000000 --- a/padrino/notejam/app/views/user/settings.html.erb +++ /dev/null @@ -1,17 +0,0 @@ -<% content_for :page_title do %>Account Settings<% end %> - -<% form_for :user, url(:user, :settings), :class => "offset-by-six sign-in" do |f| %> - <%= label_tag :current_password %> - <%= password_field_tag :current_password %> - - <%= f.label "New password" %> - <%= f.password_field :password %> - <%= field_errors :password, @user %> - - <%= f.label :password_confirmation %> - <%= f.password_field :password_confirmation %> - <%= field_errors :password_confirmation, @user %> - - <%= f.submit "Change Password" %> -<% end %> - diff --git a/padrino/notejam/app/views/user/signin.html.erb b/padrino/notejam/app/views/user/signin.html.erb deleted file mode 100644 index fd292056a..000000000 --- a/padrino/notejam/app/views/user/signin.html.erb +++ /dev/null @@ -1,14 +0,0 @@ -<% content_for :page_title do %>Sign In<% end %> - -<% form_tag({}, {:class => "offset-by-six sign-in"}) do %> - <%= label_tag :email %> - <%= text_field_tag :email, :required => true %> - - <%= label_tag :password %> - <%= password_field_tag :password %> - - <%= submit_tag "Sign In" %> or Sign Up -
- Forgot password? -<% end %> - diff --git a/padrino/notejam/app/views/user/signup.html.erb b/padrino/notejam/app/views/user/signup.html.erb deleted file mode 100644 index 510f35e0f..000000000 --- a/padrino/notejam/app/views/user/signup.html.erb +++ /dev/null @@ -1,17 +0,0 @@ -<% content_for :page_title do %>Sign Up<% end %> - -<% form_for :user, '/signup', {:class => "offset-by-six sign-in"} do |f| %> - <%= f.label :email %> - <%= f.text_field :email %> - <%= field_errors :email, @user %> - - <%= f.label :password %> - <%= f.password_field :password %> - <%= field_errors :password, @user %> - - <%= f.label :password_confirmation %> - <%= f.password_field :password_confirmation %> - <%= field_errors :password_confirmation, @user %> - - <%= f.submit "Sign Up" %> or Sign In -<% end %> diff --git a/padrino/notejam/config.ru b/padrino/notejam/config.ru deleted file mode 100644 index 63045a023..000000000 --- a/padrino/notejam/config.ru +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env rackup -# encoding: utf-8 - -# This file can be used to start Padrino, -# just execute it from the command line. - -require File.expand_path("../config/boot.rb", __FILE__) - -run Padrino.application diff --git a/padrino/notejam/config/apps.rb b/padrino/notejam/config/apps.rb deleted file mode 100644 index 665a82fc8..000000000 --- a/padrino/notejam/config/apps.rb +++ /dev/null @@ -1,39 +0,0 @@ -## -# This file mounts each app in the Padrino project to a specified sub-uri. -# You can mount additional applications using any of these commands below: -# -# Padrino.mount('blog').to('/blog') -# Padrino.mount('blog', :app_class => 'BlogApp').to('/blog') -# Padrino.mount('blog', :app_file => 'path/to/blog/app.rb').to('/blog') -# -# You can also map apps to a specified host: -# -# Padrino.mount('Admin').host('admin.example.org') -# Padrino.mount('WebSite').host(/.*\.?example.org/) -# Padrino.mount('Foo').to('/foo').host('bar.example.org') -# -# Note 1: Mounted apps (by default) should be placed into the project root at '/app_name'. -# Note 2: If you use the host matching remember to respect the order of the rules. -# -# By default, this file mounts the primary app which was generated with this project. -# However, the mounted app can be modified as needed: -# -# Padrino.mount('AppName', :app_file => 'path/to/file', :app_class => 'BlogApp').to('/') -# - -## -# Setup global project settings for your apps. These settings are inherited by every subapp. You can -# override these settings in the subapps as needed. -# -Padrino.configure_apps do - # enable :sessions - set :session_secret, '8c96fce57ed6f0b8e5d2eeb3dc635f959a9b092df8e3485080a2c944f25118bc' - set :protection, :except => :path_traversal - set :protect_from_csrf, true - set :admin_model, 'User' -end - -# Mounts the core application for this project - -Padrino.mount("Notejam::Admin", :app_file => Padrino.root('admin/app.rb')).to("/admin") -Padrino.mount('Notejam::App', :app_file => Padrino.root('app/app.rb')).to('/') diff --git a/padrino/notejam/config/boot.rb b/padrino/notejam/config/boot.rb deleted file mode 100644 index 4d17cacae..000000000 --- a/padrino/notejam/config/boot.rb +++ /dev/null @@ -1,47 +0,0 @@ -# Defines our constants -RACK_ENV = ENV['RACK_ENV'] ||= 'development' unless defined?(RACK_ENV) -PADRINO_ROOT = File.expand_path('../..', __FILE__) unless defined?(PADRINO_ROOT) - -# Load our dependencies -require 'rubygems' unless defined?(Gem) -require 'bundler/setup' -Bundler.require(:default, RACK_ENV) - -## -# ## Enable devel logging -# -# Padrino::Logger::Config[:development][:log_level] = :devel -# Padrino::Logger::Config[:development][:log_static] = true -# -# ## Configure your I18n -# -# I18n.default_locale = :en -# I18n.enforce_available_locales = false -# -# ## Configure your HTML5 data helpers -# -# Padrino::Helpers::TagHelpers::DATA_ATTRIBUTES.push(:dialog) -# text_field :foo, :dialog => true -# Generates: -# -# ## Add helpers to mailer -# -# Mail::Message.class_eval do -# include Padrino::Helpers::NumberHelpers -# include Padrino::Helpers::TranslationHelpers -# end - -## -# Add your before (RE)load hooks here -# -Padrino.before_load do -end - -## -# Add your after (RE)load hooks here -# -Padrino.after_load do - DataMapper.finalize -end - -Padrino.load! diff --git a/padrino/notejam/config/database.rb b/padrino/notejam/config/database.rb deleted file mode 100644 index 4ac6dca24..000000000 --- a/padrino/notejam/config/database.rb +++ /dev/null @@ -1,40 +0,0 @@ -## -# A MySQL connection: -# DataMapper.setup(:default, 'mysql://user:password@localhost/the_database_name') -# -# # A Postgres connection: -# DataMapper.setup(:default, 'postgres://user:password@localhost/the_database_name') -# -# # A Sqlite3 connection -# DataMapper.setup(:default, "sqlite3://" + Padrino.root('db', "development.db")) -# -# # Setup DataMapper using config/database.yml -# DataMapper.setup(:default, YAML.load_file(Padrino.root('config/database.yml'))[RACK_ENV]) -# -# config/database.yml file: -# -# --- -# development: &defaults -# adapter: mysql -# database: example_development -# username: user -# password: Pa55w0rd -# host: 127.0.0.1 -# -# test: -# <<: *defaults -# database: example_test -# -# production: -# <<: *defaults -# database: example_production -# - -DataMapper.logger = logger -DataMapper::Property::String.length(255) - -case Padrino.env - when :development then DataMapper.setup(:default, "sqlite3://" + Padrino.root('db', "notejam.db")) - when :production then DataMapper.setup(:default, "sqlite3://" + Padrino.root('db', "notejam_production.db")) - when :test then DataMapper.setup(:default, "sqlite::memory:") -end diff --git a/padrino/notejam/db/migrate/001_create_users.rb b/padrino/notejam/db/migrate/001_create_users.rb deleted file mode 100644 index 3688f23d9..000000000 --- a/padrino/notejam/db/migrate/001_create_users.rb +++ /dev/null @@ -1,14 +0,0 @@ -migration 1, :create_users do - up do - create_table :users do - column :id, Integer, :serial => true - column :email, DataMapper::Property::String, :length => 255 - column :crypted_password, DataMapper::Property::String, :length => 255 - column :role, DataMapper::Property::String, :length => 255 - end - end - - down do - drop_table :users - end -end diff --git a/padrino/notejam/db/seeds.rb b/padrino/notejam/db/seeds.rb deleted file mode 100644 index b230f549c..000000000 --- a/padrino/notejam/db/seeds.rb +++ /dev/null @@ -1,28 +0,0 @@ -# Seed add you the ability to populate your db. -# We provide you a basic shell for interaction with the end user. -# So try some code like below: -# -# name = shell.ask("What's your name?") -# shell.say name -# -email = shell.ask "Which email do you want use for logging into admin?" -password = shell.ask "Tell me the password to use:" - -shell.say "" - -account = Account.create(:email => email, :name => "Foo", :surname => "Bar", :password => password, :password_confirmation => password, :role => "admin") - -if account.valid? - shell.say "=================================================================" - shell.say "Account has been successfully created, now you can login with:" - shell.say "=================================================================" - shell.say " email: #{email}" - shell.say " password: #{password}" - shell.say "=================================================================" -else - shell.say "Sorry but some thing went wrong!" - shell.say "" - account.errors.full_messages.each { |m| shell.say " - #{m}" } -end - -shell.say "" diff --git a/padrino/notejam/models/note.rb b/padrino/notejam/models/note.rb deleted file mode 100644 index 13edfc386..000000000 --- a/padrino/notejam/models/note.rb +++ /dev/null @@ -1,21 +0,0 @@ -class Note - include DataMapper::Resource - include DataMapper::Validate - - # Properties - property :id, Serial - property :name, String - property :text, Text - - belongs_to :user - belongs_to :pad, :required => false - - property :created_at, DateTime - property :updated_at, DateTime - - # Validations - validates_presence_of :name - validates_presence_of :text -end - - diff --git a/padrino/notejam/models/pad.rb b/padrino/notejam/models/pad.rb deleted file mode 100644 index c4d6c3de1..000000000 --- a/padrino/notejam/models/pad.rb +++ /dev/null @@ -1,16 +0,0 @@ -class Pad - include DataMapper::Resource - include DataMapper::Validate - - # Properties - property :id, Serial - property :name, String - - belongs_to :user - - has n, :notes - - # Validations - validates_presence_of :name -end - diff --git a/padrino/notejam/models/user.rb b/padrino/notejam/models/user.rb deleted file mode 100644 index 11e5a73c1..000000000 --- a/padrino/notejam/models/user.rb +++ /dev/null @@ -1,56 +0,0 @@ -class User - include DataMapper::Resource - include DataMapper::Validate - attr_accessor :password, :password_confirmation - - # Properties - property :id, Serial - property :email, String - property :crypted_password, String, :length => 70 - property :role, String - - has n, :pads - has n, :notes - - # Validations - validates_presence_of :email - validates_format_of :email, :with => :email_address - validates_uniqueness_of :email - validates_presence_of :password, :if => :password_required - validates_presence_of :password_confirmation, :if => :password_required - validates_length_of :password, :min => 6, :max => 32, :if => :password_required - validates_confirmation_of :password, :if => :password_required - - - # Callbacks - before :save, :encrypt_password - - ## - # This method is for authentication purpose. - # - def self.authenticate(email, password) - account = first(:conditions => ["lower(email) = lower(?)", email]) if email.present? - account && account.has_password?(password) ? account : nil - end - - ## - # This method is used by AuthenticationHelper - # - def self.find_by_id(id) - get(id) rescue nil - end - - def has_password?(password) - ::BCrypt::Password.new(crypted_password) == password - end - - private - - def password_required - crypted_password.blank? || password.present? - end - - def encrypt_password - self.crypted_password = ::BCrypt::Password.create(password) if password.present? - end -end diff --git a/padrino/notejam/public/admin/images/favicon.ico b/padrino/notejam/public/admin/images/favicon.ico deleted file mode 100644 index 4e26b1989902dcfd1644229471b18fd981860f1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3784 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 diff --git a/padrino/notejam/public/admin/images/font/fontawesome-webfont.eot b/padrino/notejam/public/admin/images/font/fontawesome-webfont.eot deleted file mode 100644 index 0662cb96bfb78cb2603df4bc9995314bd6806312..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37405 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�-A&iY%khEsGVMaq&$BJA^QAs8x>7-g_ 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 k3oQ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/padrino/notejam/public/admin/images/font/fontawesome-webfont.ttf b/padrino/notejam/public/admin/images/font/fontawesome-webfont.ttf deleted file mode 100644 index d3659246915cacb0c9204271f1f9fc5f77049eac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79076 zcmd4434B!5y$62Jx!dgfl1wJaOp=*N2qchXlCUL1*hxS(6#+4z2!bdGh~hR1qKGS6 zYHii1)k;^p*w+o;)K!q$t7haS?ZrNXZgbQTi5;wSKh*ZbndL#bJ&+8MUt2W`Pezjnp+O= z-9F^&k?+5F%i68~oqpyWh9y zdnHv;lslDH&^fAw_pG7f1dcyuf`&t3QxpS<_UX3o}ee-@q2t8 zugBw&J>0`QlKYg~aOd4a?vw5l?)Th(cmK^nqyK;W!vF)tN*T>6{g?jWCQZTrAAWQ# zY*EXt1%NzLiwHFTr60gHX5Nk7W4+2A42mr2lGG9R#$|8ZJIHcIW-A}qs>V)i)ua>R z9mQc2nMpK^7oL)|C)BJ|iA+Fe-grwWpw-4}l5Op+aW6}z+qzh5yrqh1Pc-IlXPHPc z85zpbk!A9?H`djM)oi%FPMuSW+j%M3mc*Yd@oO4u!xa`wg_tV5L&7^6k?{sxyrzk_ zb@A4guvZfarld`-D8|Qa^;mrn98b{dgRLM+4%{M0!%jx8`-wLBs=f= zkrG!PF;3p|+82$(2?3I)vN{&O6p^M&3neMx)pSL7@kR^?OC=M@ls6EZqBbz5LDg3$tr_PGox4tm#p6J!@jJR9AI$Z{x&C zlO{IqJz7uf?YNoloz0@JV%2B;oTVB9qi7A8fp@|0JGU)1y!w<{VSs zvcPkaf+1~E(r95z6%TjGm{1y1`Jpyn{$5*c-?V09up5nYy~n{Kmh(_MdO$pEm3M4CZc7szC-7`B5FsTSCPV0NUXvFzrbA z+grkZ6=M=HK6D-n2K+&z+vvuG2Kjl$1Ld9U-Piro{I9cjJLPLb5#tfVp*w?>jl5lmR;v+p!C7?bB)X^jxvnD4d{^jcZMj>(r3YOx(>Z-%mswHPap95Gh1 zmicTqyOw=Nw5#Fl&Ef&p(8X>vZs{_9ZmjywcVt_!nJw?rN@^n@8)IKBr2th02x;q5 zY5ZGgp;f7pM~fvr?J+fb@Y*ut`g1V7=-FW`> z*ICz|YYrT^CcS>=B^S-CZ%jAhuYTr5m+V|G|K7a+x+K|YP3iPrH{RSVbxY?+7fDx2 zH%a$Mk4m4DBsJZZY-BZBB@2Y6GJy35|$csWJF-L zvm6vD8Ock8`eYo3kSi8cOP(~49x3%fbz&L5Cl->1g_J4Qmt+r}DVdLOyf_&#=%|bo zIXRM)ON$sI*Uwzx*G`Cct6~w0jY#0g;(QXe7JESv-INo;#NJTMf6#qd>T5Hkw!XeL zE{-E(U`|9_ny z`#vsp)*HF{&dz$4q2oxJXG?SWQMu9gM(5tIWND2oCSFSi_KV?Uek3W6BulQAB+p!+ zq%xC2$2L0#FZ`d+!aqK$D#m+AjI@kCpBy#%qwkfL`xnP*)KExFx>j;&w<%wcLfB2P zcj;P9Gh@lNZidauibFNiZj0u}-yU5Yz1=tzjZ%Uo`Ms2v-&rhfMQ>-DC?Aa)zvTC! z4C=k&)Z400IVgb(sSCK7R+F;g(2S}(tfT7>1#~M@eWGULSH`c*nphI4!rNG~Q2VcN zRlMhHcg-iL7L%SaX{uW6jkB;fV_h|xhnnPchP|0q+*F`#99lw^3>y)c1VMR8SdwR? zycEgr9P~RuwhV#<8A*X~SiGhwyxA{8SL*bC7yU=<;0bnCdH8IeS z;gFATwu!-s&fb00_?_`x<9A1QKX$P3vg(+7+`7$6?l|)Dkvo=bUN_DitKKy3;A8o0 z-^M=t@$AQ_BlwOb$0%nSk(h^Fbb)Xr<4nsgQHczcDy?^0{&@pE$7WKbP(=KIps3 z5J{FnP4DDInp2uxHAE+uOqbX@Cqzc2Oo3L!d;st1(iOr=;!1TZ7D zSfiSbU+M*xYf7hukW3K;3;G_Hniwq`Ac&6Q)mC7McF_M~8CA1TxC5j$I0GW9T}%&E zgB?+%L$4e<^a?-ZaeUPusGVoCR@@tMxb7I=>~ZRqzjg&#bW+1zHn+=uV@kKU=lLpJ z|K{{~>|b-0*Uz+BBlm@z&e4VMwz{2;o9jg3h#Q4@h~99BZTYn$#G~zrmKBbOEpfN? z^052%mZ;bH6;E)p)qYjG&FQcQSCzL+s^CGVDBILDd5ObebJpEs+gw`MwyV|RG7C?P z@}Sr|3bd@bk583mN*e&%V`d#}<0vQ?oA-nN4O9`|+QnELqZ`+BRX`dZGzpjjc501d z)QOX-W;k#_kC;;&*jduqp{&a-%Ng12%J;L}MBQe5%cjd$`ds~MdWJwx^%I1!^c?ph z+TRzs=diTPC&x;_$aR){fn-l;|2OGZDpYj02-hRJ41?Kjks%oQUM%pjM6SDbQSz zB;(z@oBdap#VI>2`M!Lg!{M}aS-6e=M{GsxuVOL1YU4a+#85a(gf1Io3S+-Al6=Mj zE7$pq{J&cmw=S?%Soryo$Pd3oV_|IkGRXlTlEK{4`mlgwz`h0ff@o`;#gi$l1e)bi z>M{(l&MK18U*Bm+Jj<@JIgIZ(Dv5kLDTo)It?!Sr&S<@iOKiZ%Ryx>Zht1eHlqI@K z&D3|+M~&}B`^|TYwHd(vGv0(KdY8FFftw~|BYB!w%*8xaEY>c0IIt;%0+0#FKqMwc z7!;Gh1`eJuesSX9!4s_h1iR{}@u;!Jc=YH|ww684*2;s%Fboka0ar#&QmyKh%9$-FaKGPIok6G#hY#FY&apfr# zaia)Z7O1nZ$09tcFzjM}r;$?}9uK%;zmrLH;S`SZ+q;y2Kk9epXqIzMBu~E8C1kCj z3$QQgnCAp!9a3EZ7Z%U{Q8OJ5wRF?!Vw&BvXpFls*X}bi)n4y7CIK?RBQa^*Q$ikPN~KtAgwnpfv-9>& z?ro?vGJZeHRW_tpPOw&)5?Cpd>I4k{x~CPZi^+96AK4p^uuA8Ie73isNww%hw)9Tm1R8s03*0@83R7vQUYm5P6M4Yv=w*} zgKKV)rgVfTO?LLSt|@7ujdi2hEaU$1`!@A~fH6P~Wc@yu!@;_(RwL(O@4Zh`A)_GV z4j6aR%4cy1yyUoy%_|;`(;i<~_Z@x{8;AWN`4pSRWcEsa+ABD*X&12!?@vZf08y2{ zZA(YwOeAf4yPRiao6L?G9`4||$BinQME0Am>Ab$Yrlvgqi|Hj}9_g(b-$ptN3+?y7)m7jalwt8?Ym0)tAEX@s+{ldcdaLhv;Cn^lYu79Db&t!w z-^wgojPHMXgjBnq`8VGJ2v;Q|6G_&ms_xidAn`U{WaHL5EakSn_YqOYI$8AS?km^d zj72m|Ujkp(NpsQ4fX=0OO&ti95di==4{Wodv0_;i7dH4CbY+;%na+GtT(rFf3p=HK5l@0P2)mxTSYpB~4RJNBCwoH}!`h3J|;NuX$TGEgBGIoY2_7ZuW&Ohy|K$v+{FyF}T+6r0;-R4&DpwYk3W3EMSF(T?9r8el#ldwz zgk8F;6EBGUmpH)?mNSv8a;C_1$C!m}WtLcdr!3_*9Xhnh7|iDg(Q}~t+*g>z`1@CK zodlPe0w3X(Is{w}BRmk%?SL@kiK=emwKb-QnASPb%pjRtg+LT<&xpaz^ls`^bLAC3 ze`xv*s}Ic28OOYyNU}OO<*l!7{@RVnmiC)2T;_}IK=c_%q9-P^k}ua;N1 zc8qTuf6$tY@Hb;&SLHQRruxUVjUxcV`UbwEvFN21x;Y5{0vypi6R}Z=e=O#78wZ8K zgMn(=&WA}e6NOJF9)Y7*1=WO>ofi0NX#a{4Ds}GFHM1(8fw=e!#?POroKv`L z_J_V2n6___wXr_dHn@-9@zev8;>$M22zLv9#ub}8&2iDX2blJ;j~OQ(Sa*?Q+FWth zBv50Um&GSN@YIJ{*-N{3zhwNu>{m>dltIv(0&iivF3_8;acndp8GE(g_@Z$_;9-p| z#8OoTPSOfz3$aeK*p(NWYmne2resB36V6;4qy#jP7=SLhtx3k{5Z`mAcd+cab8PNN zvaF`2jQ*1mw{6ZDUTpXt+!Iw36~W42dDE<>a-1s?DyUPaEr651iaDE$zD(KvpS;uQs7R(d0}GZdTM+0>B_mGf zo$QmwPn-bLlwPej)m?YT9oN-0At`SD{fVzU(eADcqyYU> zzihM_H?6{*y0GF@$|I|ohqW-zsz^Dq;W`vqB{^sig&uCBK|h3nwm(zV`NZ#>wVrt9>}viOm+V7-X#pnoXUaXcmEvq}~h zvdD;YKAXp?%Zp30glpL$#%^Nb8HVfmEYBL^I?0*w6h{$RqRaG8U4Z37VQ)CSA1O$> z%)U&8zC&uQ^|t!|U;KCDCl*^%UHvfry1H(xuI?6p4|jLt??&;rrn~#dnl)6cyIakk zxLLjFU-~CpWbWx7QvZmwP8#1~8AX920tZpthCmjv9FSx0Cgtjc5lpqE6Zv#94Y~Y4 zI-BG_NGNu?*=uCd2_uk5@E<0!X*ST-mrmx}iO7;{_&WxpaxN z0~i2232--XTq@ZC^>ll(ql=TEh7u%E8=b%{Ev$omX(>Jj0|2mVppaO5Dx?zY)zR( zvv{5UKs*Jhv6H{IU~$NJyKe4NkOM$h%vvCX2o^SM z5>!B3VFDrcYvs;xFrG@q{pAyDjk(6$x@I#Ugw27~*;#YqZ#A7xON>2jtcX)ywIVN6 zL4?b*V*izamjco>2uV$3BIG{tA}EpyP>8He3XQfJu{{^KPolpCr^kSOhVVa7-$@w9 zWJDoYHffhZr+?cypkw#|>oezUW57==+gU%5H+j#D(eL!*Xt1K56dUNw=TOlA(iX$AFiE#ww1V zRa$~slEIRYIFi-U{)JyZo65kXkq~m^7ve~WGHYwxob($V?QP9Gfel<(F+lV$NFfmG!3WFKq~>CPz|b4IyW!xw%tgi??3be@^Fj zrzm?m9S*H|wb51C8}>#P%E45S@gC!iiA&@k8C{Gse$m0bCyjG-yT|Qm;~V)aK_m7~ z$ECMU*)((MB#U3sf+?`877MrY3Gt}Y=BV;s^*cV}N0~siBWPDNIa=kl1uQP=KjAK5 zOyB`OBpBm`9}% zgz&;9uVUq@!fed$Ypq(YKmvFD1l6aqhQNXq8yeG-CyXDL>5g3g`IW0HgDpJ^=HIe( z#|z7U7I(*%&YN@PRXuBBG26YLG2U_Wm-Jg6-P+sh93S8P@VdsK^=quM!(UO>lV!)5 z^uYNc#o~~;eVOKDj8!-zmCemp&6u;JIWW25vQ4-2o!iwhudc4ltti}y@e=DA;yR4k z0!a#*aMI2E9bHPgTTathbf_3H0^mZQ3w@W}97qzsbh*Zqhl}CxD)am5D;*V`4vWua z*DF0COT&h!&CjN%YI+`s&tY8AwT|{o!r`zg<3rPvjSennI_hAoq;sEI=Ck_!H@?_# z>w+84WqyAkkvYH|nej`~^+EP<_iZi7kjD827sqJ&{golV!{e@=JU;oI&Bpg0`QrpV z;MP>Nva;I7xU4uibLho&aRPn3OuAK){9#OLHw(wZq4sXx5{|NJrqh&yx)T6U1AL}y z)y(UseIP6rfjR3W^rw5Z$#g1BD+<3UIoWPfj>J2=IH?O@6qE)MAPpZ$a3O#KlEUhO zY#>Cko+a&pf4{}Q{pT!EC)%k-dGd2agw1pCe`y;r@Jbk z%C5i_3+Fwx;=YL?&Vo}81gx@!t9Ve+EXgYxuktv35xZ8Qk9TM<$9;ht15@zti!WYW zno)16P*E#q9*c#s$iwMNro{Yix$)exh3(v}aIUURJ!pK%_{jZDsdC-sQ7pCzDrV1S zaVa4sVvT!}j$m!>IQw+hw$&j;Wm<*ZI`PuDKT_dk4dMeJrhP(o zvQgSQJO}Cr&O!PgngegjW3JmVQxGC0E5yZdtX)h5Avmyb;Bni-g(+aqv97bs!G_N^ ztU22pEdB6=^5Pt5D(7MbTK?o3o&oiBF$hD$gFwUa4~>1>8HV1ejtu>NRzIFuopu`f zsI6q^PyFSK6Hc=)_@pti6QRX3cTm&9VysN$gYr7$S?_^0Oh#b5l_bT&Nr`eQjwH-I zA#xgy;$D{SDLCdtiVp134@mxh)Na!>QbuD$yG5f^9EDYo$Z;J1uiHJ=7UF~QqsO~+ zv`fbt*F}r}>5=}2#`=TWIQIV7HjltdDeRP{|EW=aUzy-oEj6``MC_*as3kNue-+Y zt_eP}J3AxE;Ndq@o4xT`Ycck=SYml{p zieun$K-q%DNBg{x_cCw-WVI1un^*mDRhC~Jvg!HX=s5B!y`2pV<&1vykBO&@{-^5N z)5$+3P-=5l9tcq>TZl@1-{>F8u>n4qPCUg1o=hhH2T~QmmkAnMhiq+>M8ySsgf%4u z?6PSL!Vbla2Rz;Ly4}Y8aW6=Q|*$`Wnc1y@9^Ep4rq=oJ@i z)0VJoU7R(>JHj4MxFg=k;&qVFKl_S-e!X(vE!HOv{PMyoc-LI`%L7kXZ!*`b_ILDC z1B^|Ux}7dO)vJxc)v(2T zFv|K-O=myP4cC+ZkLS!pAcrlA$7Tyn9#^XeYo{){ z@{VUW4FF|C{4DF|wMM?!PrtK5jnpW`UjEE)bC!85R`!~a1-=-U+q2(zCTs_jQ?sFe zZ|9`t{fn2)n34(!1cM@QH#7Tw6Xv>ESSXH07KLdQtk`K2OPCD(7yA_PTLo*)((Vq= zsLd&Zy(^tln^V&QzaRQ>Sx=dU!TVcSkg{?I>H-aqAL z(Bz1IYRk-iT2y+oAN}%2RLhutns38wj8rfBdcAs+x|h5&AWaqYhghQ4p7)MB_{j2}9u5jNzP` zArlSoZsJ&yruPu+7T2oqn+`M7AVO?&v8&K zXMa1I@e~b{*a&05+RF;2xbF}f{d8!_D9()W(;@0b^%v*Z~oY48vOoIv^MH<5y% zP+7@5Q)gWm#R81c8dF~!nW7}0P#oe&{!M6iCF;>B9L@1epZc<5SAPJCNm5N}Uu=;u zM;FqR8vbT}2Q)`_CN?K}6A2^2-b^5|Il&K@2az!%Mn!THl4hMdPd%&jqE1jhavbEPXe)q$$a2`{jTm#Pifv`DUr`p|UavfrRL zz9<-)L%_t1Il@<-&z}#nL-RqtpQ<$of>;Hq`O7WIPAj^lh>8B zl1xr>!mN@kk*|E}{J&(~;k~-UV@=0v+9vkaPwc)-lxU2{YNk||v+S7G4-}vF@z1U} zwDhNCzDqR6tg^DUc(N%J-8r+4D)&$K`+}327fc`1C26Ej#Dh&K_NidHWHuY*L}5v^ zw8Jz*tdnAgMp;8jFpVx6(DwHW!$CBzq=Wpl#t*oBT%wXl7&&qB$#)}TCcinhy(4R+ z89s>8i0=uEEHKoj>;=|_77zmM7W@R;8U??a#PO@`S5R(KZ_DL|Iwd;`2_`s5UR%hlNV zdDs4dE5CQ}yrFXbm)o8MJFUiGTJ>A_;QW@1tbh_aS>;Q7&tv=Y?hDR8_=9iocUB!7 zdf;)^ZM&QQkZ7g!li+GdZidLfZp1;xwi`W8rg^g*$`W*lYzA+&1lPK zSR$G1C9?5QECn&^vQ4{%w{Yq3N zI)bYB0jRBss^IDOX$!TL))Kw*S-dk_^fwppG|3C<)-WMh7+buQdI|fOofs)WTO|A1 z;Pu3kG=9CHJ8(}BIwb2MO6OM?Yq+>#E|Nr!nB$rS?U^IrgaS{O27-0LYb6{g_`5@; z2UDb@y2CBslzyClZxGxWm*92pM=2sl9M$dT z?i^U(F-xnpx&vNo1UqHrQ{UOg?k7qFrAldlFwsEN5+Dje7ZUAXTz(|M#k`xtkI4sm z!OTPW_7|J+rF-$Rg7xjatPhyuDmjd%+-rP^(l#6GqY`BF%l;G*<%f-csXU6$7q-9j z0Ln+i11N&#fJSqkx=a0wx*hZ%(P(FB$JyE~EC=5vZ^*GEg46l%30K$l=un{r(JL_|BV(1rM4Fe*>U@Ib%x9(|IMft+JINl`_&sKO> zaSfXFp3G2%3MvsbiF#o_%Ov7KiH{<$!74a>xLAs8@Xa-)YNo5u1ejoTWA6*A!|hG9 z!%Yf)g{u1friw@=vZ2X%S3tV)Zqo+jE1H-MN%I!7nTxqqd&6}bPe^U4C^e9dh!|&$;{o=X1`0pIyqgI5dkz zbL8*0xiR7rWWwN~B;Y0|ynCz3>LHQ#!nP5z{17OMcGgNnGkgHy_CmySYm4cphM_i@ z>4LctoOo#cU~vi3knX~ecEHHhMRUGIpfY`+`UN%h zl?(Umxp4FJY@u-xcquWM}q-=#^WED(g23s%;kmdHA{ z3+M@U9+Ut%i$4lL0q>p2r;XQsyBmwXELgE7u%GE)j__ol$@t@|KO21D4)?*Zr@67K zvT9tw%Pq3pwV*4?t>=IExh)-E`r;Qpl(MA)HL0>xcg!Qhmg?few*||9t;*K;uiwbD zi`ESq&u_WBSzVCn%Y-78ic53qwF}#)_?20<*7WutKf0^V=a#Lhge~O_TUYPhA^1G3 z8_3Vxuu7H4FOa6g+`XWU3J9c|3JXD}3Je}jRVk!X8qu(wk|v$g-+#`enF?EZ=l+!) zX0Asza|1$$KnKOYXzzu~=FMBx+Mi{tVfl`mKfSJaWz8*xD>USw-)P*GEPTM?5(VZ- zrhxUO7|F$9DFk2_b72b1L5;Sy0LN*#57gVyj&oScKKRCTGY-x4Hy*r|-N#;G_vN3B z25$Ibv_87~ynuXp;7%izf5%AO83^3TehHiOU*5?xZ|&T8?N=$#%~!A8xbv--{_+<- zxjy>E8v@a2;Jn?&k7w1sY5b9e-l&~b`vwac|MLdP&rc1Yt%IO@%HiELQ#u!r-vO&V zYN~H+I}_ASbK?eNpqSa>c#H62C0V~8yb!o{lp|jkfEX;zIzVXi#zp6^Ltj3@_mA{~ z-Nr66R&SbQ^Eq~V#@};%MIi7I_9Am$u&UkWQzLa%aoLl2^@*kVcfdz)DX0Yj$S=E5W#`HsPIGb3&?_>P^(jl6TsiX^#Oh`CW8id)W^hy4|k3 zj1HUADL-=}+udDRQ&UOi!qs(k!1wr3FIO*@;AaT*?M48d!hAqoB@`QtjNA;!0ZE`C z2vbBltU@89_K(l>JvN|vv${i(-J0>=Mn0`N`>ihSwjLR>b7n(Y|ep<>LCV@TP!|aj#guW6Zr0A2e`$!|Yys zI0ddR3kSkM)(`ikoG~yq%?HKxEFEE-j*>7`7bQoWcu;2eI?O|nhQ_goEEpo9oFHHM zHn{6RFT~6fu85K>mZ9q4x58qG!xv*Y^Ng!J#$u$kGzM`T`iv-ohQ?50`0~P&5>>6@ z*iX8de)HHTnfoi&vpNVarUSO960GN%6e0!)C1N8J^r+y5!PGQqsrHU4rIkj8s9~SU z1ds*-TLG4^OVAO8N3jt=vY`!^<_}F<7^-S*?HxZzJJ;X|RfF#!>9u2E~Z~%`CHyF&B$ZDb=f=ozO9_p;CxRhFnm8 z=b--1F(&J-a81+n)P-LX_pu?uT~ppwEKoJAyQynS&&q2SpVt}}50AQH7RR_@U6CFJ z=#WTL5F}ttG!-~3nMx#D=HqEQQfN6(r`O~M@ zf6AOUtQ3`K%~s(#91IAmsJN4XCaRJVIjoo$b{E*`ic)-{Mn+5ZUoajs<{6K@0P-AS zhvsQZo5nRQoz`q-Dc}*giJLhJhBT7nx$O6h=bn9*^?Xm10MsT!iV`A52v6`!M~ap{ zMgxa&OiMepUZq!Pvrctk*^aVmzTwsa?mLqkZV2uU)Moi-f`}QUT(Smc6;oLx%`GF$mX3D6+u?b!Y zdv;dI!Wsaqu^D%(NuGxA4WwxkO($_Q=nK-d5gTqwtRc$~Xa(NyqKm{jRmoAX{-ncG zu@eksEOuStxk%E@GKg6QkKAM=$1@)5fX=gSBM0+5I2YquK1bL5PB~Y60&8BeX{ zRv1d*OkRt+S_Qu~9mHw@jsWQ$GP*99!73$;J3I@;eeWju2jcXDSoz7fn68$|4-y;= zNs(kI!9V{)0aTKw+-+BMrhGnF3Mpp54rXv9)0Ro_y!psrPZ)kXo!O0>CHze10T2k?XOV;NnNbLP9~9fZ*V zx}!A609#Y;AoRs&tZ+mdT=II5{)NWjUFZ<}H)*bldpt#t!>qw_X4L=aXmDfwWI3=e z&yM`VcECAe>VwU5B(55{da*2*$b*Ai#yE0A;NMOTkfBe(=tp^})Zhp09FZwclrm_a zrb8vH6GsP`49HkIB_Umg-8v8p=v6v}ApZj=lxiOfga|Y>V^;Z$+0$2_f1P^sZ_cS) z)ttU$er3oR32vUXlDvvS_M(`8Y*m$H@enz_3^dU(0dI)U+#rw)&5zh6irI%);hNei)kZLn30_2?Zy ztq8wZ-Fe059^AWU57XEKr48YmUfnV&_3FKM?RhnSE5DAtTlzL#%&CMqrMO8IcwY*7 zgD$j!ILH#NrM-YZU^yL^Jjs~m3B@Qa#{q77X(#|8P?86HuAVi%sIRl$^$xs+54|#U zh+>&4*+QJcq1VX|Fsn&J-_GQ(*Rs9o6B3MnAQMgZ@-IYvYkG*zsPD9h&^1HPXJMh= z^*TMQz!5Na^&Q#lN%4S6M=|H~wENMIAo;wb^14@IlTK1e zpmZO$d0c@hP|;PjN|7@#G4nT!TTG^Abe6xh&TCE8G|K(2MHh{$kLK4tbL5Gao?|To zPrS5;UED7>)x_3$oi=Up@(U)*&%i`&@wf&*9u{Xq@~(^3G||KL;}%8vqkCR@Vt}?2hA62&5gBo40zm&dAUhCBAqPsi((U*{X@?{4i~10 zq*h=L3f?Kee%Pcy)Qk;S1cV4|4^h!S9Igl>Qw&ywcc4ZZD;l{JkPN*?#6SY)0eS^g zBW<7*yD}68&VkDu%yCd2hFB1<{Ob?PSph}zA%wHS_F^85tjqdQd$6Wc*TcK~cH8zu zz1^XQzh?Kba81M2y3=mESGRR}!j1=RuHmAgYp7^VV`))~gNiz)xx;o8<=GE8e67lE zZs~Ic0s&W_h3{5ceU1-($mwlWl&;Rgjn)QDxkhRAIzRN!mM?^4IwgpE05EK`K;=)wJ+y*{} z?u9Ge^09yADS}^tg9VM95b`Jw1;a=YI1=0>5#y8uO(c4t*u7YoI>?SHjUY{UacH$M zTCsJ2RjgeKck~V8>;Hb<%IhDhYmx1K4rYL>G7KT=Je5J)^>=@R&1N^U*?ijF*V}@X zo;o;2kl!VW1spAP4_&|VJmdKHrc^z~>UZ3*FMRVM`GE01Z|(Q2sJDWng*~ID=rT6X zWH3=*Ht)x~4!pI0e}4ZpKbluop9m&3hMS6}>9WhibZh+z&t7Ha^3})oE$p59vtfE3 z+oKMD#VsRIbFfNl<844b$=YEK3#0&gN@7Ozs|z-jbQ_5dED>5J^sgbXFa~La#3v^s zuqB{-$pwv+p|DW^J=LZ>wW!4y=+E>=$`TEs4kcMWzOEsKxF^m;Wpj9<`jb7^=G3ZM zUpnB9HD)JSlb~`xeOKLu{a?RsN5~i?gv)$&>!(aA3nv>>t;_e#nfT1c2cM#{12oRHee;4-tt8k0;aQlS@Pu4VAz?WR;5F5e5lBLkeO&I6R`m!_^pb2hzUU zDs|oY**!mjQB`wg!WoNsQVn(E%ack+s3B1n!FaO%mPOeIH$F45wszn0)>KWsz05yx z>iRn4Z82uC(2neLmuXm)~uWQgDDGJHavLog;&p-JtGlcx9q%N%fdbIqoh%*A3y$){p!N? zq2SDgb@2s6?w{HCbv~QV`bHMPpnYeF z6D@yw$@TM_Jgp07Mnj?K%!RFb$VGR6Cy_6wd zEd;Uk$V_8`%?kw+*eSe97E%vlmWPX(S~s5MOm!n77MXBTbgV*_q$(^16y()xiag-Y z50Xh`MzA(HQpLskl~^$1G|k~*V@{bhJ$ZUwU=uH3 zT?TcPAgxVDtG5DMgb@uF`Pq4cmdSvJNp8TC`Z_-yg z>0!RTl=dSWEh$9L+sR%Z`cWb!U?xS8%OGGtlqW30luY9YIPezuLt+}ez(9kb?(oOK zs~XE%x!1ue)IQ_#Nb=!}X)hDuBik;1m=7>WUSLL&!O{3EnAu8)w}QQqj9m8um(2K- zhV%j^8|@(!3Ot&k7!6|yakBrw)DIgw7wt=_97r8g?oguB9I~XU$hIHeMb7vFW|`;-B!wo-7Ow3&Of1}) zK#{eQJI65O@|+2|789%mPRUgOY<*|Hkd8u4N-?4!12Oj)7c_iTSbGy7X}b&fLqjwO z*vF?}5|2cxkPVldaW@>O)zWRPNKql0GpvIqjt-~b6OAn@l?0^?d$lHvOBhU2l?)eX z;m6U$nz6d8z^sUWxf`a37(ZG_!(s<^hsEKvS{#lRtJUJOTGOh8mQoC(dcetX(y^ z-Wr_PGb8Mu8VCeEnnTw^jW(OJYu-!>#t{k)3d?mMzpq#wb_@Q~4qc0=dNZ`bx+<#; zy3G!uu6?INgOji7fqA~2%Qj1y%;nD$+TfO;_s?r5Xl3o^>^b+^b60J%)|Zt z>$X+6aLeNMGOZ3&Yhy#KUXiUXm#W%2!{KDJ6Yj~$TjWq!hBF0P047)X#aQo|vI|9P6u^g-mGgSaJTK9-I za0)nd65@_vKP3lpECN6Y@H#O`P_)9P3r^u!J>bx231Lsg5xCyhf!M!-l`_kU2Z3yf z))Ojavn(DHFa|RCCYRk|v)F8k)xRh(?GIBMH_YtZKcoMqN#&ukP}$n@$*)g-cEim- z-Icv_=%d$vfAViSac%zkPIKRB5vsL%mtK`~= z=P++};X3Q$>P&0J>NV?w_5i%9{BtIkE8{9%foUzBK5K=mhVTD&9}DU>)a|O2-La&- z)(5$XiSvcch-rI2dT%<-!A!RlkZ8NG=++)bEXrSnIL<@!B%Z$0A30V+C zZ5?6ef8XFM5RtJ@TyO#VgyXDHSfrClcIe!5jZNyx_m9US;9KC**`zHdA247z3eZNR zH)JU#76g=3LClEg)!=cYa238}0YDz!^+1Tx?x0Fso|{gq(U8qIrPHJP9U=MRdpfvN z(;Fr=*aEU#7O4o^>=V;XvsBfo`}j0A`QzF|UqgAFXY&0)a6hFa4?EwkS{kF3a=e%YXaAP|#AO#M8`sTtMQ<_kZ~xnt z`;@gC*blg5<`5e?)g|N5?T zsq8CL7qa_K{>U^XBGe@Clc0AJ$e6o3ZO)*6MSw$co*3aVgkPqXO~Onn2@#aAz%f5c z0LoUx-jQ=fzX6Kjlk2Q6iGKK13eAIe0+flEX%48n~zArad~ji=|3sKX}BK&qx@O= zAv&*sm+4zdi0(V=p$lq=2oy{s*0Ye}O@&ceqqHa?b(l10ORTcKKHB_f_6j zUdKbm*WW0I6;(tXV0GKBx{W(|z!$wIl3HqrL*MG)5!i(2< zAsPtA%imzLL%gp1wo0GZdD~UnjMpBo2n1@&f6n%>$}c!sqWm5(8_u77{cA>?#*zf2 zI1%koji^iD7K(i->bc?r@6U@;U9mGmO2!lY*9Y; zuu|q4ddF3!D4#b++Vg^Ub%*TgSnYkm!`9L>g}-CPz{^ljus^ZiIK5tH{zfAw*vw3M z3tyA&=}G4wZxOhC4`gIna9?nF1T+w5g?}mG0&a0JY=16TbTldL9UvqGy&aDc(8yj% z^(q=<1-%IDW?W?KoYJEt1DbDAbF%WuPdCArszSDTcZ+upvM(~2?PZOtjXT)2GU@f` z+bnEV+`ndXDn6riYD3kOmWpxVo2Om9d|UgP9yFC~8iwlRuNgmXFy4VaP4EbkuPSRC4NPs|(ODyrN z^Se~v$Dhn+pHvg*K?WHB{bqTV=!OGCVuxF&?7F>a3qPw`%s>SZv;NFDyAykT|klK;4HgJFLWo)bZ9MAD>zfImT>Z zSQNU-_>5X-eNA(B@`fiu?CMg%V_w#<2gV08OO}*R&Sx{3Qh{S%`mzVRCY#d6 z*;7rinbq%&x})-fj^NU+Ozpniv!+4dDD>fCd^&(7V1JZ=1V+#;oF*P?OK7=3ffB9& zEXRp@34=^0z788bY(QvZfKa5sj|g%dQIbK!Cdt)AaJ=FOTL7YGVKf60r#}{}oiVMx zl0ytVuijP0{Jv1oGWP0b5FOBq($Oq*ywb8%-xfOL!KeD#nr)3;l|%ObE6~WK-Nxo74ga z049iBGlf6_sv_jti!9tzqo%s8b>SFj;DClKO*{4E4AZ`01UOa-QMNp-6eiCGxaa)? z5IPLb!#I)TRc(;_LzWF`Dt1qZPK3OK)|^W*frz)#UQU}jjvWxNbx@8M#uGdeRCPi> zBJ`3VMvwzcb;-2$w4&V)hLO0TOeQa;-Kw5x(wiom;%Az3h`7KCvt(he+h@>Rw=cN% zwlQ-p#LiP^^9&$yUIB0|%2~j+mgMKkT6ww{+WagNRIBv&2h{>#W7x#LXUb=)1r72AX)5=Yp(F(eH4fn^B#tEC*OyYXO+pjUDyUV_C}0S(R&R}qCWhdj*iq{Fr>dfE zvoVHE$dBJGG?i^y#hhcCwjM>%`a)wOBMn7qV~nHR2p?8xR|=aI+9euBgEj2kDn80E zs$I(IJs*Amb+9Bwc25bkTT6!G6I{i~=sIyQl zuMMH@j&=yJLWm?QN@(Gv3(PW0)lik~NTC`Mc2MjgRUPKNFc{hpe2KMGTN4M0Mq{Zl7$q%OlR~e$WNHmHn(mOrq`1mLAp1Z? zgwU>zwq!@BL%bYVkJ{Mzrw- z0@KS02|i9RWBIV8)@#wQkj^SZ#jQC0iX7Hsm&?_{R z*=3X9F*Rozj&&d*i5&ee#Df(Wo$?NepMIka+wHwLXAQe{NflsU6%+zxRIBNcg# zjyPUWzB?3zI>jf3WSQxWnp;;nj0ekA89h^N+-}hkc@jTv9e!mluM)%;bs2`+3Td=z zg=AW-mUV>h3~{e4`e~y7{DULJWhZV$Ix5LWYw+$ zyj2?_apDWI9Lg3Aky~NUU`60ftD;%`vgT5CuhW7!nL&*!G)8L3U9MWJPN!96_~?`t zripbs6t`N2v9ytsgAXsTVuZqgyK?5XxR?W>H&xw=DACNOFwCnGP}Fk8Dl>)a77Qqc z+Z{m@tjwjW9;+g2nnROa7|F$VBg(7?U9hvLSHYaQFpVshQkY|cEY~9zwcVi z$DUmD3=fPeSJa>)<86A-6XIG$z-Fn_bf<X~j}>pSeswiai#x7;04^a=|oHdzXu3Tiik z_twGB!iup-<%>wx!n(HuDjeATlAIHv#S~XL9g&T6i-|(Y@H9U`!KsRHFMu5Od(Rd%3fnX zJh)k2H5Zn!L{yS^1MM?yEh|7N!J0P#i#xKq6aOPbwUDZg{l@Fqydn|lZ)6o|2r06@ zBRBRBj>ecpS^68w6vbTFf!Uj9%YY1)RPf)|K|Vt=O2ktyhMfalYkniDMZFH+ee#QF zbFfG?{PgiBRT`)K65n<5=OZG}oaBeiHv1F4e}kcbzKF&{%pBP%lHDnd!|)i8!jd#Z z2zeDmyg3NZNY*Tvvw}Jj`hUrg6iCYG``M(nW)SK1Lj^9q2LU{TXC8g9g!T8VQKf8N zGGeCqWPk{c0Sv()8KXizPXdR5HPp|do)H#@R%~Q2bTivS5(VF4&%M#i52!mTZ%L^s=lE*jf zTe|gnt@oO#Gka8J^yjW^J&X6%d|tttRE}?5x^KhdOVpm3Q?KdO zt~ZSZIiPUKBDQv1V>nTHAn!WMr?J%*VPk4k7rv04e{|83>(reGDih(xacq;gN#IBR zV)trWA$yO*YvVGE0p-@Hj=tB9|k1ad6?A-rYcFlF?tyqDYM`vkWV6A3>yDBh70xqB)5Q0FU zQHAyMty0bSm`gCpYKBaBU*)4%CZ!_7~#?4z&4v2pLK?NK*^0X}ng*P%_l z-BmvV@311}(>`wMKtRK_H z1HydcE#nyfu5m1oU2(xpH(el?vwKV&ZETxmEMuRkPOy87Z3)p8iHYwP5dvByt(G=P z*GT)MJ8_F7wy=s(f#k^a7ONX;9K<2t`TAFe$;1QTEBkBn%p_=iBrx3&wX3VGs=?;3U{FLCw+2!nHR9369 zPLJ1>Uvz~<0ZqJa+1~qZKX0X7U$=Dc!DX|o&fUA6)>+FA?p?Z0R~s77-GATSW$Sd5 zv|Pcz;PQH$*(z0zo?PA3vSjro3sUB(X-P{{YQZI|%@cF=$6e<{WS0s$>F51?5EyfS z!rQx)h}@se|NZj_*Kcl;5#y>rU9Berl5bCs!X`~zcvpJ)qUG21-JM=u?X=FHZ*^8L zPv6})_43p?%iHc=IB^nFde|O|p7GSy1@0KPw{>bA9r9CK_l~O*2R<;xUKg-5M`RDk zBKF@gp2-+Xw)I<}*7hh7BbQ+h-XUYtz$OIzMf*lIqCzBK1%fY1kO+Nb;}8fMpZS13 zS|H-~R>a&uY)C(CA_To+FB#5g0{@c+C_hMFf?)J12=e-$H7#rWlr>_D#qry0nvo@s ze=gO_zc7;uE|{+UELQmD1Rh2m##icpYW$Rc%J`}AaeO;(fZV+CB^;@~f9UT@*31Fg zn53NAt6r~OPx=n>S^~J4f=AO?N#sot9N{2BvV@+1e@gDtj!4c;>h+K8yzP>qzioT% z(MPuP3vJUqPFw!*b1vO6P&VM~pQ<*Gh55a&M-{!ou`>LfYrt{gCe0b+0 zm&lgwAA9uI+wzaw9G>Yme$m21n=b1c`djz%%+hW?yDV85t1vFby)GMjX!?q!SD~_X zw1*e$a%8OCNz!cd+a3&dZwP=24sdu*pwTop$q;PeilPM57j&%e8+~gOANi2-5~e_S~|Irp&)&*3#MRCiQ>Jaqzjw)#*gm`21$ZE#v0izDa$n z^iJt$EnmF4XT^ldXvWfMo7v!FJpJH`?T!UJ^Jtx~b$MIk_;7i}l&P(gm(6Wi*3?lx z&G@D{pe~HBcoTg$8J8P34Br?tt|R&sH}p;G1uiWZW}0A|z#c~CJqQzk zZH!z$+%Om^Y;3?p;$m2i69qsLa{LPFM|h7A-JI?qK^Xmlu*6mgESA&;$>#4pVfn|t z6%9|^cPmp`cJ^Fpv%6Hsa#u@w#qO(S&Fty<>FkYD5^u4O>J8zEiFu3XFTU=oC3jB7 z_cXvaUh1xLtF;pvyQa?1^e&vxyrhOBl$mKw=<;Q1C#+rdZ1yIT%w5hs_uR97&v*YOHl5d46R8^O^!Q5cX1&$2acog6S|Nm|$MoZ)B_3~npry5Q z{+z}4c+}RaEhZfsbQzrYHP(TH#tmqA zS5ba1`SZ>89I+EQNfD2M{T2hX$ndCZ8^%WUq9wnj{y=!)yzNEfikQ%nY(WeoX4O_k zS{E4PK3xt8!eR#73DEe~q`{D9z0eZZ{z>`ZlG)9n>H=q|q+ndrv^(dlylG)` zhbIC?z(OOq7%_{^Z)PT~Eubqkxs-!HK7VG_#HR7VP*wGenLE4gVzZ9tm7Lg@9UG{< zlkSU#>ujj7lDrA5&`{jZ>ovy!IY+eJG2(t?-~4aikNnr?>c{SBY&@Gr824Dw}?UeiljrHK{FOOB$8qg+A^U%O-CSLD&Yr2 zrVaYQWSf#hNr)-enD$<02_V5G9)wWO1AEM1^kr=g;8h!1r(5+= z*b25S%vfUojN6$Bc=AdpY`1-A9-};+- z_doRUqSnZcCB?PvTNg~LQI=2Mu#{c$XRhy++ctR27{vRtt#hJrq{^r^j#42*_>#tv zP?iu=sh<$Jbom0Gp~ADS<>^07zWAB-Jx}jByL`?pi$^lbT1V|K@4w~#gX>$Uao$8t z>jM8uzvEeYjoT#v6TE0~`0@BS7XQ!rckP}wzWd_K+t=I~l#SL3htJiv_{dxLT=u|U z7qx_UEGn*x2xDApOe`!^MS6Z)2t=jMhDz6-UjtqUlG`tIxcI*u)s|Z zF(-JtiUieR3bs|6m59y?`H2{>YsAK(Q?XXa?RgYWI3{<%y|Hp&#clcivoGjr3_7$m zj!IXFBhP41e)r+6Yaa^6JbztuZr!rvSl`-n+Sj)Q#W!H4P!X@_nAK5H)jqK*QKPjR zO!C2l%8WyA&AewXX@8&6q)uVZrN+lXTb5Q%gwCQAHisSIypm9yP1nt4-@Z_8&Ff%~ zuHIdLR!>iL_n~=vuP90fcRo06e*2bblWLobN|Mc!w;#T-N^1lgIXP>^-p3x?*-aWk zykv9_r#005q5!)8tFTjOqV-jJqNr)Ki=bcJCLlDesT#|>gg2N@agJ$er3QaWvj z_Zo#aAhb|ur0I@cghH!_cTs}6NZe>J<~d4Sm5v&%Bh=8dd49u`ZF`f=8DwkZPbdl0R@JsnSv9`*qW$jbN#}R8PEVdw;}gzmH~Z}QdijN$uX(4~oh_ewP3aG`!6YelygkMic{ZBYEnW<;@>5@k7#lJGCXI% zum~SjKO`k{%i#f(QD?lHRNo!66yhElge0#sls51-ne${T4=;~N4gPWbd(c(~e)r+m z8e9r*6i0BsM~*}<^gj`D;e5DG=!P0-E-oOYPWHlkkJNoK{V8T{va@Lu~5!@|Dw+E0-B3mbb#WJ@YlRmQOS;RUQhrU2xVcxo_eMv1#CaLdV2F zP3#}5%BpK>s>?3^eVi?vb3>hSGO4RBEO9zZ3afR=kNjmfO_<%YoR9ev(0AR4D;w}9 z)EH&}6hx4NBdFvNhYFAlRDs74a@wIbb2imEnTlXJ9puP z1s;>~EJz|Y4N|}CSR2!?bx@0xo*0X6}&1Iz}4=1uU>TH z0b`#2kU=o6=t1_^@Ya;}Lpf57%g);b2fJXNLB97F`PbwZE0py=3+PR}QaJsmU{Zo#U?|V+gq3{0^-9Qdwm0M!vr!;%5rBJ*F z;}P72o;Dwn}6ufaep$WjZwYRbp=A&Zqf0zQLpot_o78YS!AQ<`$LB~BPF z@Cv>*h!;c=ZAt0_Wxy{mELltlg*ocxY4EDrWR)U(%k<}Jtc0LE&t7X=q(ym!8Tdn+&@G?K`Q1kUECx2g9_zu%PLxo)T zsqz%fYk~{t0Kf$=?SIe~BKn-%=Ib!GiFPk(u*b+lI_3>I3-R0n_g5XgxP1Ji)?ctyufNXb=J*klZT{07iG9lMWFN3Qr4+mmY<_uqZTHf-6E?=Q z`m6uSoPYi4kaIDQV-(+FkFof}4`=oV-Uc^d+v?m_47Q;@Mx*d09vRq|`(gmzFD^mE z`G4HCzWdxrxS%32d&X_dc-LL&Z;%g$<6q&aL2mk59vZHbQa#^UGw|E8I4m{Nk%UHe9^xb-)L9N+Vt(r$~xKGHNVw!1qQMS=U2w8fzVer>2#Ij~^%W4FqP$siLWllWn`d^6+dHk_o=u0aZ2%mbTS zY{77{n>za1QON6Nubv%h6GJYG$y~FzsdHDk&Lf!|PLt%(mG8WAC%<(%`0cLFro}a8 zcuZrJnp14S_pf1={`*2KttqQ0LrKC5>Ek^|kM%$&4++8>D+OUCA*Cee02~2ZT@P+SK3Pl1z|LsULZ>mF zAZg0X1ZWQDjw`Hoiy32QcPICyDCi!Cf4q`>~~y zeVLm}E`4>--6QQuY@@=E=MrKGa64!kcA}d2588UTB+@|;`dtCn#(HW;?W!5QlQtbZ zba2z8PU9G3%JQBig>z?WZDn(dRGpVsX_-*v?pogEu9{$}%*(5mTAC}@F1hj9?>~Fv z5)qx?vQ*WgwBXG8sh7;DtekVn)br+;DonTCc;jt2%{lLmEj2T@)fO~F^Yf$ig+6~( zZAE>3MQxSeS6EMJ4F$E^X4Y)EW7Wf3CQjV)Fo*xW+&^xB+v9MSKWB1qIU9Fqs9Lt$ ziO@jL@F7#BHJrNUA-OCkdR-Q?S@|KtS|)i|%Wj0IRGnp>=%s4Q-Ku{~){R!+&xm{o zgoz`h8!jP~b!f?D9pKZ!%O#BwKnSPND2@_*Nx;?^_8eL17#0kd^HDHEZiN#bUFI%> z!`ROY?x(<+-4r-;g;B^#;;*@oB=L7Lv3bf0NaFY1FLWc0NjKG6L9-C8vlq=;VSba# z=l8wcSY&~G{;?Y%pP$)QO!D~=bwt;xVHV-?W>7~N)Hdc95W_Rokv@Z7xZ9Xh*)OSM zFFLQ=fc$1NoMiV>ZCSTV`RELlL=`z5#cg+Wn#G##A!(P|cQjqaMzGSk(*qKvVyCZf z^adL-0f@y;m;slta&R>4J{GSh{nR39Q0YY#gG;f)y9bW!K5U9M^>lihCPN-JWqjTN zHu*r_`XfOYJq5wK|Wgp z|72aQtKBcR75DTMw_t1hnZeH*c&jgFQG*{+3(k2C%8;t*X&S{z1gAoljXlr(+{dWXD* z<1g8^(xdD+_U^mK4!D1P19#C;R06!usa(K0n}?maDJc@5Fr~TS*X{#6@oLY?HgpY# z#VO!JDU3K#vr()Y=#9x>+h+Dq&`xANOJrRkBk3|Xk^&V^+G0vC_cST>4rl;UNj*%^ z99Wh_q6CY|leiXfeG)ihF9)st1AWU5$eIJZPc<2Pxk|93a;@cP=5y#u@czqeQJW< z$8$I~!0iGtkq9%OYqj@jU40O$4^SWsxi6i&3g9nbs2=T`{pt(Xarcy}cJJ15Y3k=ER6C>`y zEY0lfA&TP4W1M6tUOuO27ncBY(@7G&WIfSjuLn|+hI9@T4OsZQjArGh=0e)lPxjGt z5>lk2Fb+Bj-TZAjd^UKMJ}e?9v_(>dW;Pxg8a)FkdP`1{T8i=#-`Jr`ni-GL9j*jr}pc*&b-k~W}W2g2U62~c<)ycTn=bJNds{r^XP;S6;cUT2m% znWDCF$64Txp2UJftVkUDvki0o*WlG)19Q^SLyy1w>VGSvGTLW`YIfo#a!A^*B4jyg z(8P`Wk~QYVY5}`&>1DW zjIVFyWyqne`X9sMM+1~<#`>3meRFkze%h}FFJS>5=*!BcQv?PAuAjJ)fnHTA!(W|2 zB56VQW3w^+DCfB$l9AOpyc{Z0s3LI=p=|WS){bpDiPE@kKJW>?Cv*Ibd}h=@^O5|M zeVwL%Ei8{yL!&ei@)E-SQXI39`cC%s4q<;mBr?*Z7^O8Ie<@N3?2F;2(WRsmmpo`K zOcx<7GwhgR0%A5@B%Y|l|9GM?5y5|`{~$F1kpyL7tj;IHEr%|}ly{Zh{-pA|N!0z_ zy~$*6Uw1H=>g!7dgWY{}-%U>@v1qcNbu$@eL&+figRZg~f~>bc*ca6MQ+_?p{j4{L zRN%V7CPXO#4wua6+GxSQ&@gOwu&p4CH*!OfaKsx!jUk`TA*4=eW+Wg-0xEp$-DHsU z2gSZ%l59&(X%LMr+1J{{3y@BGvc6T*{SSQ-#aZC z(^tR_IZOQaY`s+ZAlKtT{23nX(T94GD0W1ma2C}`{oGaf0{<3!1N9m$S(v3ZftrHK zQ&dZ82o*pr8<|Y?nx(l`s*}zd)?b-`6d8e~Q|+(eiBjEHwK`L2>P+?qg5RMcET;uj zEq39k$-KX2X&yzrwyE_RlBYsomW@u&qp|S8%}GSP&e+^hdO^TQQqSa$Ir@nzHcB$V zBFryg8y`oK@@AtugN)(5Rm?DvXyRlh#bD7QdO#UvilD8G=7wAWqpm#7c0-uohp3ewo*23p9T;D7{T!? zkO~>uyqi=^RG0>9Y3?Q`vkU7qBjO;W`-4GZY6N1zV7i}###+dng`mhWumQp*#95?n z7oFQ`A)sSz>545!_zGl2qcq?{bABPkOCzrVfVm*+vV;n^fB=HvrMe-J*OgE}UO6Cx za&0|;vb&D;(x-W;?I(NTMU;R3Bt9>9_o^ zO?XZ>b}6bBwi#3~g}p!rOCAUwv(iJ_6;AK9p=xJrO4zp$Y=wHjLcIaSh9Td2YdF`a zU*!-FP-VqehAAcTet{1);)(cF&HFQbUEp2N%!Xscz=L1o{+=|az!ud|EdUc;ebfcL zY%G{Ikf)H0rGDlL?iT7(;@M~T_u{NzFgU<7NOUB)mEC_#sEe@^qdu(#Bs9JwyTxoyTW)a+@Q6C6NO5WTh^pU8aZ;waT1Nl|6 zkCIMRKE2*n0rku>CqT4t)M0Q|quyVhLDZa9$b|BOnjwQ|OOrvK$7vo^Ox z3|iNiw$&3ae(j@U^A>MkGiQDzIB)iv?ThC2()bOnBOiIU%s^RMMqdhTp$kgUr(sZ) zW|;e(M;nmEkY?EuVo0OC)=#Hc4okG!Qhrl@xZ`BsU@$3Aa(xYFdu_rwk@8~Y7Qa1GQOq`YpX#M%s!e&AH76#0v#m+F zB{2!ye*SLoz_Q+&svz}iW*?JsW4Qs44zfTo&s9DuX1fY!LG8J|VviG3oZ3zfk(lab zDmxC;*Qx#Iq>~giR_Hrtzd#J)EIm4Osccn8g^yl#Kq&wI;dNJe!$bPfneCROi@AHT zsO}Rq5Y(tTv6sHD)q4pVNnK=%6BQ zswRm!!o|sCGfS#vm?UjrsAmCU*4d-RUL^#rg1tz1kvF$?lfwWHu4E;CSruWy5&9tgI zFW}cxTb0KDUfb&Os_ofk>GjolXsTfNpSH~e%@6Wa0gVSVgXRh69e({LrDB0J=wn!E zrvggszt<8~K+2x}Z&f~nBjco6rgUJ&eGTqXR<|w7j4QEgAQO#XTO(H?p;|EsrjpZ| zvO4)17`zmcnJJe!DQ~{nclhnYeQzp|qQ5Do-ei5Jy+b9f<&DZ{yS=F_R^Eg^iVF4s z11tx2kAIw}MEhCdfQKG#sOo2mSNrF7tC{R7`bDY9~8o3THRKKP1wThEL4c7^R?lSf*Ksu_DnrU;@w( z2Sn>d0{1HcEPa?bH6u06T2YcY1J_msfDKT zbFA*7<6c8?aWVUg(6cmH(|Bq6!7a9EUcS{UZizHGPFgw4|IE=u0{$IoIqsCD?GbCJ zs9F8^43^eqieHSwmU(7YX{pd12Zc_wByN|t+WocI!}X(A8`#$%XpOm z-9egiFc0;3>uT{3odkd2|6jUAOg{bcD^EW1=C8y*|K%39OCD#bbyWo_A{Aa=z_sS- z4K8c zri4Lz+#%?`w^aW^8TMHh+^20h43g7+liFu{2h zd60+GiZ&i4W7KL2>*#Bzajk?&%GHw3+-9*zY=?RwTsvw5uA&yH?79s1iu0?a(239S zvP1G&WRrT4?isyt8M+*F%Xi_&sF_1gqFXWzBLAjvzUV{Ld4vx`a;(vbB{7TrRC8T%IV<>Y+=UCzRikeCzJvdDtDtA7nq7OkQ}1+`)mA;wLFv z$)aUe)2(~BpM+8>QO5rSsfzC=lDyir=7Q#U95SEQw@vMJfmKqHI?1zq=23dcLUpF4$ zo@4N0caCi7p9TYR|6|}$S}dFv<@%PSm*XQ1`z#O2nehsn#W6?^3luX@#6qCHXb2~r z8%djnE6@<^16nL6G6`@l!l`$D6rNMb|N07{zw=<~tcrSY1?np@r-s#y6K9si9sJhM z-;$o=r>XqdUB4txdH2#-d1>3EK;DviVtOD+tRK2oYytRHi(DwO+U{A4C{sV)F8(7AG%k;L4IEL?Z>Vfw#1n zYI2LUrz4dca*RWh1s>~jir_qjOwlrNcLzVpo;{^8TFfTsF=}Y|det~q{W(_CvY>03WhKFK&!8Q)Oorrub2z`EFG=6?yEyeLE74b2RxU+fo&2Fwer*&d^WU9q!w%lux_27$k z-Lr2V^Jic13sW1GH@D<_ee?4i#Zgz~SvN)Uo2tu_g?VS&^?Qs(7G`YgxfK=WybFQW zbP>fVBYh#7DeB@SRk7@52F?*w!*d=3hXwFedFbF!ay}&mNXG?IhdkKzahd}MhGc%7 z?u$ul`iK&t1Jz+A4n?Q~(aNW3g}Gn{Lv@OaF^;v8P;#jFq5>AD+c+y=QIc#&S+JkV zrh}wSYv@{}BZpcV_^#ie36l?&s3$_6AR^>m3JynHVk8mb&N1p5CI~R{5?v6>a^-3m z^Qt2h2dRv1fE}v@za`>jUmWwpC!@h=yF*b@FFt=2V)+Ojq=@>wYZ%+}+%JR=(~2n7 z&pvy0ee;;QDyw&0AbQri3$Co0v3O>q_`&`650n|q9=HF*{Vc-l545 z62E4f{+d=Kad?}$HePV$q*be@OJC8X-@KY%$xd%k`?`*%&Nwv)PJuvgU5fQ10&;7j zpHo=Z-5!WKFQ{;L`N`z+=3}`CG zgmIQ|rhQR!>TRw&+JhTRcJ5gndL23s+<^hbC+*}xqkA689eIF!z-4eeoN$o;6!IoQ z#_gop$|nO9_mSAp=ppVa`C%a|Jv`E;mdqJ5t+F$EL6CV(;Y)j}TIWZ`L^jTye_>Iy zs4CjE;)o$?u)yo6P#hJHtmukXA^pMyT^o^WerxiBY6eHT{zyfocYIA(`Mjmf zCC=qo9)zqRtCt~&pNMG)4saHgCYZUVT_DJJfuI+jw0`p&(i6?{7?|ca%5O;Jghz3~ z#VO5k<%{E_e=H_b?Suy{1-m)+rorkMIMyAG>(J>rl{~Ehap22C{xH1mC>U@we9U$pnW#wXlv|G{ zcO$~eAmOz3?70Ab$Bpw49*j`mc}C@;^i9VPthrB^bKcrbY6B8Nk#cM5z;Rc19USbb zX}L|cbSg%?8K5HQj1s7Y7pibLqaUlqO6GbYfHg2VhWlG=u&|oUNHV3QlH9rcFMS=W zuG+pgVK*0;?TNkHuUgfiDhLTlME1FU!u03FC(@dQ5AMHY-n4)Yu7d;9=3TP?!G$Uy z#PIo?+Nz=!Igxo0{#ml*#eUgjxWE{Im0NSk{A>ISL5YcZb;NUuVq8ik%M?E>I z5Cz^A@&L0N61g=%`v-ms_+w%VN+fJhgQ$eye}F8~Kvk%k_2Re8@C_^~Nt5-IX48%8 zX18ZmuzB;8R=4CRwOf1+v+No-aoxB)h|zcDyt;v{ET1+^_yY;p?SaKKD$D>)V9__hw(1cPmZ zduSjFqE<)51*SB}i@__Ze`7-l7O&jPkyGZs^*eL7!aP<<=@6GNX^|Hw|3~?&sI?lB z4s*ZJ&MxlmI?m=Z+3J>5ES07HrQGslSGRJx-PkV~lEA;+EN=lbBwcQng4yfVx!=9c zh57)Nf+l_huo{q>!BUL;pW}ZyU5CUFot_OsH)o2(Y$kBpR$XBK`nf~h?6`}j1_VRA=9 zQG6+4!SL@3ui$fPaVVD6DX;K~h?7TtpK3)_Q>*z3@=-;;>ie(;L83{`hUbb0sS;= zz=WNnj6ssy&NzsQWsR6s zY|1z}l}dj<{Uh<=$I~Camq=Wre7Kse5`s^&w@$3Q=N`0=Y0RgR+P}+$cWQuW2(FM$ zM!7Di;4zo{uJVt8x6_lSurY<~TkQSLlT(|d=VK?Q0=&Jfe9la4^-Xu*&CX(Devs)a zyAGHb;LrlxXQPj(aHyJTVe5k}hzPU{Bqtxmu>8y7*np-vL?`j#RJ8#IECIp)P_dpq z4phW7ZoOnNp0iWgqSPx}cAf)w?0UD;%DTOJy=`^J=eP6`l<8}l3`Nq(P3p}ppLeXb z>GfXLZFNfT^R0KFSLyZY1;aVl-+%x0=fL4Of9Q7ES1;Y;77lW3{hQ$(lSzAY@{aH~ zc|v-(d(YCmr$kaIku9Oe`xHnpw{jULPn7Jok?t^x;JLt zjO`aYSK&;5&hmd`NX|5>xJvj?b!U7oth?xaVLr(VRB1ta?^jByI1dHP6Y!`xty7JD z%b^8{Q!>&bV&px8pb`>Fejsa>(XPc{Hg)KE&K30~csclXiqC!SA9G|q$jM@sMx}a< zyw9yiPT7O?VMBFbzaFek&Si#A!)1~>NVXCrwa)TsqKK9k;|eom5nDtd=NqCip^Cv5 zhE7fQN>25`=`k<`RmGY;WKo{`!0L8bZhzavoR*Zu4d0JzzWrzA-P^4Oqto&Ww(NBs ze_%AR;@q&8FLRkt_yac8!rXY#$xLtGZgIFRx3l6ue|wG05dD`@b+0S;{=(uk8pKyd z>X&BcstIk=42zD!K{*HoiZ}#XLKqoA<2$61RvZcj?RJOlw5ST{TbWCsj65DG2n7nB#+I$=Ek zGR37yAHfcW$UoxM13RJ{qI<_}?j5%$8Wpd`%^teh8F(oO8HaPUaeugQ)r7%n2XA8c<;AKqc$72<@RUnom^o^^^ ziTj4~JcwmRt4%y1Ukb@Pyt{Li95k97assSl0|0y{ZB^zKPdH2a$ezuk*PD9{c9!fb zbvnS+aJFH{^Tqq3#3hBEZ6EwUN2A3o<@G|5o|ZD&JDoH>?ij9f!s0fInpAq!3j4)BR#< zSwX?kg06yPLT_%x*ds^lyT`GAv(PJ63%!y~3PFaosq_oo%kak0f`Vn;xi!u0r##Xt z&uDq*wD2UJ!Q8mBlha`qY2PbB9&jN2q1q9G_XcOa*%BWy?Ymh&;t-4}yaD-m&mkWI z4G3kqH5nSODA}_U>Wqm%pfha6mZCB-;sUsj&`PDdk%K3G#JT|wdg1+N=a2TEJ1%6r z-)MvTbg^Q6)dSa*n#}0HkXMJ@qq$mQg z`y4OLoKMf;zW~I^2@WL5P#DD2&^ZD5$2B#Fg(xG#7cx>(G-5DECG#|eO-TAvY)<+= zPl2tdyu+0`PjCfKVZ{g>6Du==Q&=>GL}l>_r7jvUnnps3k-a4CcKVb)SG!B;^En-4 zRC*M;vq@4&B^}w}BPX5{DOQsC`3Q&}iKK(WlxTB1=JYxdS~UnHzPe71(sZiS;q+mb zXm_!sZ^xPI#J(AcL=dMvKVL}}E5H5vb>e#6swf=JxW2MZNh%+oqHp~!SN=J?i-fy# zx)Lo=`qFbOR!R)U+XX541$$gNk9XY;4zN)`0K`#N9<6 z5|PT#J=76>O2Uwk)~8+)qq&HDY)JskKCk#%L^PXZ$>Q?oV*p$qD)&rSL1Wu4h#gd^ zl^yKd{x!=GJx44Ty%tHbx%2Xit$SapWpCOIM$s?lD}IE|dD#XG!4DpQvS;kempV&| z3p@zDW3ib3bj<9b5IzV?g_uN4e#d3mVsVWh>$GmQI^SR#AHHunMj}~+szOwr)Mj{L z*cym-n$5P&Cfkmy5PnBS0SJ^udjR#v0QzGBL7ve#`J89Ng@0(bPK)qf+_nw-1yLL1 zjz7c65eLxaop4@lId=uMbj3e^@ca>w2x}2{$tag~S1#ybHPjW#FWEPo)_cGtxL&!D zavs67ztm;fZ*~6R;otAk=NT_GF~J}glq{e5E2nk8#id;SG+sninWi3og5Chlv=TQE zwGE=2qy>r*K-8D9G-ll2KHS7r=~27JL0%I)DbeszGoU$2s-$o+rxoA$=`pAEpvBdG zaaU)a?69rX*=+`4%f4uI?!`sXuKI>}`I>%V~W=8xED(wNCe88)AWp&PbteVP~Kso*zL-U0-#qZQ|n0 znC-)uwV@Aq2f%ZWmx5jZ`;G$(Rz)%3E@#9tbs;cVhU79TmFV?>U=;T`tq=I#eCU2w zVm0bLKeii`SNq`hWb=W$y~+X_8+Oxf4Jmvn5a=YE> zG_y^=Fjy|NxE9WHTJd0u%W^s8#bxVRMDqb^i>FXuVCx}bmy?OUDkLI<3$?Z?$^mJ& z*9Y>|McSFLtRrJQb(*O@mH32nYlWqcU{dtcWP+0T2YS8H`6HL{SFWgWjP3_| z&kr0%gI@XRulSt%JqxR6G=)ufTGv`!3!K&-i%V#?+wD$eQEZWav4h>~vRfVL@3|~J zR_6kjWi9-dJY#VImnlB=e>h)_eAf?BV31l{^;t0-Bn_x}n_;Ne2MO}54QNK9Hv+fR zrj8!~3%Fm%D``#48^5%=Oe)YzUi}o=Xx0Vf;^L-IT~XZYGr>m|^{d38TR+ERxjEVgg4$b*O%>`(`E8>E<7_LTPc^ImTM<@XfiPZ#^{uKFa z6eIi$N!%cW9fGwYM>8?z-~-ZlXU|?8X-cWnREH};n0ssn{3C9UC~pVZ-B(8@vtzUG znTwQ7A>~(L0nLBwUY-A#U-zxo@5kBX5PDyurad0Ij!x$h}vh zI9iQD569#2aip`wHjCM>9A!Oz^=O7Orw1|_F#R>Kl$Jg~Kh|lc@)_hsfCH$n>k#Z9 z9QQ=v!nK?=g0yqgA>2H!6TaHUM4hLh4u>KUu5l$qMu3CY+BPlSVB5h>n^wBsdCQLN z7G2%!?U&BGy{qhY=Tz5A#hYpojL>MAx#`Vh==OP~x6iq#r}g!siYYCNYv<_oO|j0J ziB&a4t|@sXEw$6iC+g(paC=2_ti&m%o|##2trJc)80ZwoL9@n)ry*deqvmZ4-E?Ml45CFt@2VWmqnxo zeS_4HX31CjoX_FsgM=FT_L<#*u+eMPOACcZDq#GmUS4p9s-mu8$W8WODH%ZrwQJ^K z{nUZxNJMnlz!1_dqg%mAE)_y>N(^Gx1cPNbg~Y&G!bAyq7!Vc@WlSJAMgj{@S4U@8 zolCm^+f&UHT2V@W3I|oBQK9q^_YTBiAJ=;oJJZjxEr`j8Abe)$2fKtu<$A5nWHorc zcth!*QT<=lGn98HzkkpBQqOOz?UI{?%_obpj(>iM((4Iq3~zTmwL3c0ZZaYu-e!i>%xO1SHs`iX{L+5- z8tuMoSnFJ8?1jN*|L16}RtAQeCtZ447Z`!F?bOIL);i+p5-m3#*75MW7d>NB2~q-2 z&uoULD@%-2o)~#A^p8H&QV<&gMqS;tF$2;mx)E^1jgq7rhUd6Zw-lzaI=e?}^-wSZ z_8DH_bICdSC5`z|`)xz*AKA(?_Xiiu=JbbaME{JumxeV!369kfZU zsNTAjJ)!fo#irBh$e%UEqk}95 zgG@Li4q&q&f+cxDhUO3u1p$<&mppysN2B?HST8s~VClfIK`;=LdK+zGmBV3+8=8`r zm&|mu-??bk#gRa)B+uVd(;0FG3mnKuF3XDw!q()Xkh3LP7O!Y=yFA6Ur7cDN*vyKs z*6+6Rc|d)kL0^#W1@8;4Gn1LiBdPwV*TX4jguaGK40izyXMOmi{>XL-^+&Uam4W!$ z)Nk%Hb;P^R7fEjw!SZAVTc~ z2+=&@GH8&o@<4vEFmux8=y-J8%piI0&+>^3klgrShtrCgu^KUQuF-r$^Bv8PFiR3} zM5iOw`9?Us3wxknhFA}g1pMJ8GJ?Ol49nkviNJ+{$UxmcJOkss z+Q#~ZdWw-nh9kACp1Lv?3UZIGVBJAH0?&yw&w#e;;uMJ-W!0fFWM9c;B`UMe2WKbT z?g1nlqQUXRER!H3lJttV7CInwD15HHJ^fgWiT zj4|s@3ZgkbQD5kB7p}?oTpsponQ~b&DR^AQ_VOzc0`j9PD<&GF%hq43Lq zb#c>k>A-VMODq9gH$N-9&#wmpYj&@;R!0lgPhrm#L??B`3JPK!lcEJ|&eB9}l|{dl ziO&2YR`Ty1URLSttg7lfvV3{^r|e_piZYKFWE+*;HU4Pp@)xHC#x?vVy>4t{WByr| zI%CPCMQi6o>*}I&9>pnqW(H|NVzd2c+1%y;`6I`>>O_gwZ66ffcC(FoT4U7_n1;&5o$3F46jcLa2hMu(VlhT0rbCW6kDeE#Bjowen z{K}(Ff#t>j<`vI#D$}dN6e0tQ+GeX{tL>hFvswB!x5HK`To4qmBekH+enoUW)uj=& z!P-Y{Nb2B0*dQ-H+{kzebiDapL!5yeAr*1LShLGtcyzC)_&F!y$M1Oofy3?37rVqp zo#VSjF6BIs(eB`LPDB(}2H0)--{me)V9W1>O=ichner{G)lwqPHAm8MK?y}bIJ38z z@bC63hc6eRB{?sG^rRuN)Tq*ltVk5`t7xBucX&RRDK-ijaAsyREEhCIil#Um3fXON zNdP9lV6)lRPx<}8-rrBzV7JyDYp<-M4d4UHpapgixOJN5Ry z7nKj(*G2+TWnPK$9s&nG{q&_N_IhdIV}+&s@YwdbClAftzJ0EA;oR*P2v<(%-22ug z%+}XAA-yXQiLfWXc>M7%9v5!9uVBoWg8T5&M?=}S=d2gn$uX`_Z^%^;tjlWeWVI30 zkW}gnX18DR#3h$JAw0oPGRcDnWm*Fd(4)*>?z$APD|ql7S4gfiu)4<3Fx559&y)*< zhUH2^Ni6RXjO^qHoiXvS@@l{EWO`OFLkOkh9gQWh zPlChrYW$*0t|$);D7Sxc*ygdwI>8X}1Po$fcw9-* zp5yFdHs+2NI}`4kFf-_wH_zcTH#;_Ltti+%X=zHYKPp_5A2H~wYjnnNpdez<6&C3A zkpXAmypCz^vDKnO?+zy--7nY;H{Yxcj}xD}U-1{!7dZCD@;93c$K=-=YG1nek*R^o zq9U8A${Af$HPhWjM1DpNsOM0$3AFw?f~1g{0#9vdk$=5&Q?ub|1 z@nA))!(*um7yaaoP)Y4LlWeAA-&2W-`M{p-nak?o+tQNH=t%HIwwkCoR+dT)uA z>9tPFx+j_Vw7 zipjdXw5W^cN$b~Z&9{%6n_socHF3T0(}cG%G$G#{wzIIyWW1XH1o{L#WxM%{M3LNH&-(fqy*=mW` zcI?=;X6CH!b#rI8G&rHVFB@DQak( zHJiRUB=c5%;Hg+QeFOdq;o*_+Ygo9d^-z)Gk>eq)TD-6>S_pL@SO?u}DlDuS+j%Jj z+U2cnvpd?xvk!B-^wOut`5XmBt62PL7CC$T__9*pHaH@N#%D>o2Hb|nS7%aq;alKP2xb25lhNbf@< zq~$&;GoxEVhzK{qQw{x?S4a<*&)CHpo35*A8&aJ`ZLC@5i`?@sGdkzgn5RF-4g!HDJ(n(4G$z) zoe4DU03h97c}sl$WvQB_3n#YDom+SGmYcS0eq`#po^a*LHB)vjudkmInRrNfx3FkJ zLqoJfoH6|ghTxBE;+{P(1cRY4ZsgD2JA6Y?Q8+xYB-v57e9I+2kuGYTF=Il5)1!;BKC9>_HsyRqfmDs%Y5}LJd|EYKW%DY2dQ5P&h(Duu$KHk>GOp| zdgs8$dxTrW3kKd7?n3(sW?_ZNdr_JVx!{ZTz8tAyLxEsZbk*zscHev3|PK2TP6z^v6- z(zj&aDsOJa{%S&B{0m*8M_+`YTf`3Q34wyVq``Tr74c5F=WRMi|0C+ zsl^(6F#SOh9EJ4}^rtX~*eW2aRzDn%sXGO>RWk6f5{D#4v(qa0Cudi081*u6bg3|&tsUeP7qts;lcTZrr z0e`>>@&ups5^4?QyCQ)qLkI)y{DiaVtdP3%j-c`hr$AO%EbZAICMs>WYRepbNd}`#=Hi7oLLYo)N9Q5RyPV| z`9T?RHbsNkJaD=M@&eRB{MTdVg3 zB?NGjrIISSRB}IHu#3e-`Z8-(T(W4H=r&gEy1c??G7I>m)+71^!6A5UC9Gq1`fkyr zH3(1|5KSWcreJVrWrM60L~EJTV0y}E7Ogr#fY$do*&^DYw6zUsG`hWl z&hLu`V*1#M0>_$|(`O79RV;MPbXQC%sVgYFH|a{2l>234m_d`38LbN)MSf2rSQj=} zoPrq|C1FtvyDy9QS5Nenmy1rfarfBHN|OY@=Pc48>T1k=fz>Pt^tb#Y@w7Xr#ac7q{w@yopHN}IWkZ5IATfm+#oyS~Ei>5G} zXtHRPc}x#?WO}2(>_$Xd!*C1A?M}ZfFW+8h4C~6}u@|`A6YkkwDoB+VRmEG1p{vj~ zuc*Z9nHbiKh@4ql&&2jT7wp%Qa#5+rAnNzp45FkP5BAmgVp~PAAes!U(B&;+WhIi$ zYW6W}K-T+gP*8C&v%z7oYEctWTP(RGV5Ly!L6||a-DNXK1_63DS`ogoS^{QMTd_gZ zK)7fB^LvW^?~Yk5J#D5mH3K-Y79=zsaG8)*$57`J((+L8}*R z%wo|>78%S2v&f_qFPZavUN5wgosw&MzFp@u6nZg@F-Qf$JjPlqnAT>8$+yU49~&(( zm?fh#9G(_(%c8|rruCb>CR?Y~VbJF3wLz<>t*D#m+73nqON~Go@4z!cla(-eoS7qt^M2llM%VB8O@sd1zLi$uxb6 zxwx(<--Jyr>#r{boAn?#6jks-(gumbO3;fjF+zg#IJjJ5EG~s;hxVzVoB>GyCW3Md zjNc1D8?kVH3INX6>C+Ph&AaY#RZJwklTPXV0;el39Q2Cj1 zge~r>z3I@!v8d!+yX%reeL+?wzWv5e7me9;^T6M*p$l`K|6=Bx{o5v8G^NG%o_LrU z+#NIaOv-aX#9A_Ia%W4TyvT^?ipO$kuo8Mx>zTFax>=?p!c8@8=jg1Lyt`z{9m_kd z7AF74TlY=;?AA|Oia&XO#-GIV8N2ab*F$dxCN;Epl<)`NVdlK#_-O@+GOZ8OO9aIr z3oqps|LUt*JcsK^wrQ4QH>zOs}dgbKzHrcx}H%z7*_M6(X8Y=uI zzfNbj2OP8fp|C$$*|?;tc*3S>txH>?))KGPT^g?oR#paEDwpk#PTq0Dv3I-do4&{7 z>!;1?*{9wpC+TLe4F>gZ8Jz1L`MQ7r3%N~87KiR5gojPFzG~!x2~DaCxa{9m*6#_i|hsOfR_~z8m3PhD&*%=HqeEWa1j@gH#13kShUA zATH8W?Xl7ASvwq3{-`VbW92^$us~|B>aA*rEXMH9%0Cv?m5zfG+i7cAYV9=mh*G-u z|J(lk|HhyRQqC3}P|mYC;e7m43gHartO2Ku-Ely9xO`k`p`WETY*12uv727luhtc` zWj`Vgk;X1CRO%aWn?^lD?210i)=$#FE;0$HocxDtI7fxUQKg^PModz~7{oT{9@xxl z@|rT1&f*P9FHi4%uWr5V%N-M*x)%*>AklyNd(BP)bV+!YokSJ>7fVC~%FxL9tUtyXj8)b zOyANw-um#ZJC>>^wn?%pZ(D3ufUodT5kK$|dlIK&TuwCN~?T%!?cN-1)d+ z+%wA0pX&M9DVTWey8)YIY`JoI|D6=}cH4{0d0U0U8CtmX@QIr*ykJbRRrhDKrs0{s z`&yL8ezgw{2rvHe%l~!JtE}M8+nDbcd$husF~zfgx$Wi?hwGfh)>5o#m0zsNjLT^> zVqmS4szB&8-TIL-WGR{B(Lz|0yMpoLgoc*07DwS*+-{F)29lJ-rJU?rL%uMuk_Aoh zRIj!h{D5}orfD$i%R%rGB&2Bo535)vaCuOjnWS+40@WpQB?t=<*ap#b2w_rW9Q82J zgF&yh8{RZJUW1^y!TA%}oort@HdS}tv}UXAS$BaSE}$JhZ|bKC^*`!@7uiR}nUBJU ztn1PKfHFCq`YtnmS3sEPhj+dX`v8~gMcFBa5jo zs>LY36*QNB_q$l&r=at%+apcUT!9-<3o7mAt1A|O0SF-OWNi#PBDk57&kdytM32={ z8>>VRR@{RPFcnzrVjdK;BC!@m-yk!fwZ)eLWa-1)%ifyZkdR=qP^ z))sB4mVk*1TDOq}aNmI|X(sqkEY!JLIQ$S#5 z*-;#7s$UW_wS}vT4T2OXU)t8Q+h~J$2Y-TWGmywebLt`OKjj(VHxtyWhPCTDNWnGH zK{^=J9y%6-1fmnvEP5K9iEf20ehKI|T8uDJhms6oY-IE5#4Qnl2z3mlZ_*UDl4UF$ zRghLCFQ5T5B??8+7)hj|OnjsYvzYU_y}~!)S}{D^<8^k<-L6N#$3mT>$XfJt<$rG4 zFt@t;_4S)pfHLe=P96S(@;j@cm$ActU{MyEe!~xywDP|4_qX<4oqCWhnLe>n(pqg= z?bZKLRaq&>R-<|Rvd-=E^IZCJA1dZvJi%Wk$pL>0Td=4uZm4Yt=nG2P+8$X{FxFgL zaPemY;mI~@AQYYy%)i5uFT)X9u~jxLU(;O@etyL{%km4KZt1>xveoy|VfA!f=k@!0 z+B$YVyKx(nQV(7+J$a+mjASHuavPz(?gvDgV_#zDS=k?(*D0dVs) zGNDX>nGP>k-y3>ZLr$R(M^eWhYQ*S8S6{np<)OU1L&}pkUdBY>yQ$QTPre|Q4y8YH z`0~py6DMAF=AIsrPudmgmdd z^Y7$b(|b~izn`Rh)D8(}y5`^343^*M-mBq_LUaBMgsDIFxN&X(CY1H3fS(GP}M$g3TJp*Zlp= zIa}B47~^{tG;Y~E^le^Gr13J;_XN5gEECr}|HyMnr%SU{=}482VNG^=^g$o zg)@HHKBBbj_jnra2cO})*>{jQ;&0;60U3KRlx`)@bR6YyJzW z_u21ezb)Z8{ditYCJ*j;SsGrCB=TBtUzvGVKs^O|pW2o=ccUH}{8pkInSRL6_%oy< zza_gqaV;XfgqKC{=lrPsNH^0n3D@+D(pcu2?(wW4n~v{`^vf+{v}>wo=2s7YV;V`+ zNT@?GeFya#M|I28FO2js()kZ%h50X~wlh<9KI%kmRL2#4M0LzO8>}@`}U<52!UovXgY)~5qg29 z!Gtu>bf9V0L3Vgl)w}ho`qir{YUwQmFq4E#CX+$Ld@+u3WSEE%}f^kSXTQ_%-e43O$A4!s~UNb^Ghi*7ww(Yna;5-|#}??#3q@uT5Gs>BY%ClfQY} z@RY78r>A^)d*AJ6r*58ld0P84b=rk#A2-cy+S>H&^v3B=Pyb}bp&2J-dCl`K&iicsq4`hEzqnx0f=3p-u;7D*Eem%q zJin;0Xw9M*?y0}my!X4f96M$4%EhM^f4HQ3$rDSixAwH2Z#&v{t=(w9+A+Cfd&e6~ zXDnT{^y1Qwmvt@sN@uKdXXp9lEz2+9?EC79BP(8CId!GH@*DSGT2;TwSoO@Rs}F2{ z;N5Pc`?>D7S6^7uv}SnCwY9OeJ!@a;+1qnt-7~#T@7oXdJa}RKo$FuP(7WNxhRYki zv*EM88GZeI$NQe|ySQ=6#{C;#>hJ5nvT4z#OPfB~tZn{aOYfE|Tbs5HY`wItXWNBs zH@3HLAJ~57bL~6c*qPaRYUiiB`gaZQdUbc>?)|&Z?f(9r?mYv0PVc$2=e@nHdynqD zxG%Az`@9ls2K<9zs1J@3AAAI8A$Hh|dl|yr-l=P^)K-T0pm3HO0@}hFH zWbpg=Y5tCyQ$6+X%7yYX8f0)yl?ayCylqN z-POVB8`Ya;uQ_a?!s^`<(sJ;nBlyIXj&5ZoT`Yx7d5pd&j@mKR4Ji zcxI?&=&Qqb4xb%aFxvG{>qCPNy?Lbhho^ zj`tmRj(_s`*B(_Leebc&k3IX?jmO&`cOHN5MAwNUC$2wn{tHLHaIN+)M(`Ua*mUeV zEdCfiB=Tb2_=JCTu`@7DO5o%G*L8)N3YuU;?Gepz-FJON$73zH@*9>(U}ZWS(Mh~b z^L#|7Q1_LHPNVgABRUgnqS1)X#-`Azh{nFw^g={miQ)HyBKljgR=SS8+BaZlu;$nn ztoS(IcWaLI#w?^BsD7NgC_%1^V>8yti}9&_zZyHd^O%d$RixYTDPyNqBPL-7?OwFE zIkp2Wtj3x4N^m=nw+_F1vK939fD3z>*h=&NYiB1~b@;ek=`@38Vrx>dz3^;mra9Dtoj&J^b5EL23uqxN zqIU9^H$V)L8(=zd&We1N)XHDb(K>Y;Vii+kJa zX#@4qM(U?cw3)WhR@z3}u_e_Gy!^Nm4;}8NJ+znh(SABW2dPMhNFtdODiJ4@%6Onp zrva*vK~*xzLi9QeTm4?FjvR8yBcBFoh=yr|M)6eE5qg-8(lI(tKS__!=jl;;j2@>G z^aSDO59y2a6n%-FrZ3Y;`YAjY`O|coeukdG6NS&x&(d@BbMzJZd3v6Hfxb$=NN4D4 zbe6u3jkSIWzqIhn^dkKVou^-=m+05%8}#dRfqsL26VE1olYWa{rr)ODq2Hy8^m}xP zejks+{sFy0e@L&=AJJ>{$8?3hMX%GJ&>Qrp^k?+v^d|iUe)#Y&>23NedWZg+-le~x zZ`0r6LDave@6bQcRr*J|M*l?LrGKXD^e^-t{VTms|3)9sztau+9(_pvK_Ah7Vq5M1 zqL1mn=@a@N`jqhgB>gYlq#q!@;|?^=(Gx7mQY_7|g%-=&0#IpmbOKFdz5xW>Cz}&7Nwn0x;#p|qI5-+ zt`5`o-Y{Jjr0dX6vTR7Mo2>e-uB2QpIf|Cy<{&pLn|@}T3XP$>oKd6a(LAmL_FNFzl>cNBx8Pn%0# z+Tp6hT`eO-2^uskrIJt$shq=LO15U1+|3PIhF|4H$divq(Lpw%eLHp7QLGYA%TNc> zxF?kp__zt#vML#Is7g*HX*;^btECilGn`=%7yhJIw)JON(vWRD-P-< zZl!Hq@qCA;Y;G#Lk*i8}QOL@jlvEN8Lc@@gmvk@bYLdf~ipHTKF=2JC$L*plDU~6~ zDb=YGR9NFOH6kIDp0p)^0Kl;9v}!q`cp)fWV}h0bEpK3h{9RjRIRX@t2msSu4Z|4QMC{iSyT+EoGh6& zQgR$?D9~g+Bm*fjA?@3_kO&YFs7T-l;<)-KFRH#_6e8NKN`}$MhZRGrN@HRr%DU<$ z3@)j#5r=2^2!Mv!$O=L+ESDFcFH<+mf$T}>)8rXNGPqfioRlM(C99fNtZEhWovKP@ zlY6oCTYM2naRN3^8v)ej_Pa18?w2eKu|dy4LDO9YbtCx<--jrl{_E@ zqY(-&#U0m;Yo$^~1{$C|Ga+-s$SXpvDirJSoQ7#EhUgARVejdH^6hMp3WZDx!CAb8 z$jK9Of(9BUWcl{QN}?I~a7*T?AqO_EB|XWlxG8v4=qxKcI#(6RoJkz{PxnSq40YqgS}6 zp~142_2Hu&G|M4_Z15z&t1EExzEa6z8X*tNw|idwdO-I&=u?kp51g4uH^t~I0V(w0R`i!MK%Eu#E1}U3CL{$FlFGs zgped#nB#l|XHl|HgSKFVkN1FAkHfcSfOH3QFTo?i=jGtrH8@S*kTdWLnCCLD4^$k8 zAwpLnWJ9E;MJO#+OL^4wG|PqZdB*j1Ps~_GfJ*e3QV^&(M})E9l|`fs!igAy?CS=s zrJO-!Tg08LR7LNSsqj>lmnyoKSA|IEWq?C;jyRwNdQYgWDxXxcd`wgka^fhIIe9`( zh`$M0z~2O3%u4Q7{d`CU6*D0%JZjLsD4H&Dw}P;dG9+6h0Z_a`)sn@y0&6Tpcn|QF zJM3FtC|W)w!+FMNO%sC&%O(;1jgegB3ZR(A@h(v4uwk4V6nu^k+rmUaVs%XEOb(?rgNiIUkfy$G?PS#D#E=2L%!~6(5M4v$3@^7R!VSC zQPd7RKmd>lIUztMWC;f~zEa?zG_PtbODL|}kped1GIOC<6^abJsEg=$8}P2%uI?6Z z1*A!1d9|RGD0Z}VV99``pAagANCtT^+SCblATwidEN6w!2#El(5K#%ESvGL% zqA9f8)}9MPzTia=hFOcq76RlJQUG01dU>4tPP{DJao;V)b<>Ft*duYp9En$)p}6cR zVwuddV>a6u_#t@&BHEfH!y=0v?JFja<$7?ZvhQ(s>JMj$Vb#^L10OtT0w=yla~(^? zVOe1W(bSiD7}_ExF^p->ibIe+Rz@f@T>@^fsD?|&057E^WOc;6oXt-w{|xNk!fAHp)%8gkPx zQ^(RvNf?Gd3^8?C#1^+QVk4+ozT+PD5frc-0934$3b$9m zrn;t&tDKk^2q?&RD`y2k`0hYi5B|sgkNw{!CZ;6w?I7|^asQLCo&KD-h^W{%)BCmw zzC{Sy2m&Fe$iV!~{(js1-_nZ!^FT4Q*0=j+z271P0Rgi(Wvjh2)pz`6U^^fnAkhCS zBvUJQlW%qc0+L(<0*X55#~ku(W~^@n0+N>c?Zfmfb}+30VzY1f%_hI?|MHT;`$O%T zSv$FXvy1N>{U9I!jI|2{WGh?4Z@-M%?|VLifPf>}BQ>2_>$`pD%`W}lSVGWEFkBmb zYvXS=`W^dU{#ITv<8(V)M<)=FTt*NOm{$-Gq;BRZ$R1Z?gYWrr+V5Dve~MI)Z~gB7 z{}Y_#%b)okgG?y-f5(7;Ol|Sbxd9FJjP&$&zztvkNO}g}VS{DO)?hEo0f^5BJ7&{;(MUO5E?jpdmFzytbK0qntFzxZ*$3z%aKL=^IS zd!a$V6kt$5zT>Cjx}?D6k%EqGd=?2kN45tkCrk)_dHW;P)@dlLs$sQA;N3wGB^lqq zkQT8Eio`mpB=5nIsw2@JN+U0pw%KSQqgf61gF6O;ht#AJ?Er_TDh0ZRV_}7riYa zW;2(tlo%G-fVqAN5Z85s5CbJkM9z&SN0=L?qPGt~LPEh%WiKK%hAE_cgNRw|-FTIm7&@6#pkFa2B!_ z@Pgn=l~gQOT2I{2jk$;U4kc66uuzutbNpjf;xqgWu*d9V^Sv^lUtb`IZotki7%!#6 zB}Sha$Cfmnw+;39F(c+TBR^83W)St@+60I-2#CSZd}#Vy!tiy<&^>zUqGpT5@}dgu zixrF8ETDy|x3#6}$8&^r(}zw~Q?r03k>l(1{YKgtDQUj<*ELj{XO1`D%zdU~w&V06 zbW7I0TSp+G>`|-LDDoa2(FinJ=Mnnl0Hxe72bjLM3 zz7xD&GCg`S_MIH~JB}uvh9y|M{2O(RLzgz{9`xNPg-;AaYfGT-&p7e0c0v^5YB+bR zfHXM$l}oMIPmm65SrGnwdjnUKe8Ikbr+r4Zz|JQ>myjpWQ9CLI#6o8I%h45`4n-cH zhxp&o{?MREF**)xm0`%zAoba56D5GX+J9$tXeqc$(c7=Ul|~XKZk~;>&dD&`R37eFaeR${wNpZxSDI-t9^H~at%iM(k z@Fc|HMql34N$o|1Ss!`&*W9NVwLeXvkP)!?M(nr~>WiM;_w}qanbyvrtr`ux>hlxZ zW0`5&tFE*wE%t^vYA5Sh2W@6MMc#CmEGCUD7oJo|bPgEG=-6QkCybQ&7Oxl612JJN zUQ8t{M;S!?F0F@GdHay*nz_a&j?!<*$M3ilJF(5M=2rURf89LYGXHQFzkg7f-qMpX z&n^{5J!tuk)tfo3k*z#On%SaVPxFj%3qMpkUZ=hRdo(bP^XE49l6||LzPjY!D|MbQ z?XSdIYY_^lF~pDQ$oEh|St}G6r-m1$LsZf2rM-aO6@8Zqn;JFC5vXV66-}O&Ji8w& zOZ1PMwsa!d}}V;n*`hzMGS8}qAY zreB;u8QD-w9V#*B}NcMi*tcb~JroNW>RUZ0ceD8Hs^lm319Tyh-PJQ%cL=D3MF!9uk`kBDls z$M(aJ%+~LhRoZ*K;-^?a%#BGc`&4|WFu?4cP%i;)6;6AGW)Y(vRi)-`e|qmq74YDbZ8tsVVI69C?kxO}fAf19NqOS+sy*}%&aHA^ zXg+Mg^?p5}n`p7NXokdTW+(7!O(j@m{_9KnWuERZ^Lyv(fg|@iKewsq)qf{mSEmg! z!LXW6_0vJ}#{USz@`m_Qy}odi-K?M8?43fzZm`bVFG9Ij6e>Pd_<7+;<|st*m8+yl z&$%AzKp@+*^ukW3oQdM#=2a)I4aRw(sNli)&>X4LHPT(=>}Lj|n4wnWrxGu18!sN3 zzn%9uCkcIK9CWq3O3U(TXZU!#^OqSF>Z-jUs+4=pFd?^8(tsnc%RnkYzh)`hQt#!tZHn zBN`2IVVnA$vz8rg1J|`)3s+kvtlH`Fv?d9j-qs_L+d^EG`~)l@&A6mBogtW0CV&}G6kIl zb+PR|ta_F~b7RMF#MJ&Qf+WNb6{s~$R*dWjt-`1^`D6w(nMll~Yz3DNKyqnnf7VN!?6-L_Ga0P^o513Ave z$Lj%59=QXqq$=NKwhK3yFDab91kqm+wFyLm`cVoi&{9PotCu%>#r`j4$pU_yn0w`g zDG&W$S4?Vd5qX?{a2Ye`g7LxSM|}Y+fUmyf;R;wHK{^R!&G3_cXlRh0r9Go*6q2~H z%spSMzgQ`h&Vc&iUOyUrV)j$f+G)5< z_QlmQds0MIN|VdCBM*;R0@D!MF%E>+yoK#iL!=*;uO2LutTe#nIo>FYTUy%(OMx52 zQ|E@J)BY|`AeKqRH4ju>I?{cu9(gkC+V%hArjMOiEkKyEBfaR%IPG1q8l9QK&nVt`h12_1bY zXvr&q359!4Q)&ZeUr-;g1M3Q`q$t($v2P%_6i&q;6kZsAgp^$xj7D1?ocDsn2Xu9; z5FMgnGy0*}0(2a^HnaD5Pda8t;iFu1n}hCz_tQl#EjpGG#cba|i^G7jsH^r}Wn`*x zWnu2ODuJ6(_{cBb-|BMQKU(qf5af@k1v9(wudR58V_9ELWg7VT&Q08Y_U-=^4@h=2 z$<(Os+cg7_PW?sE)w1t}&(brdH&N>Es3$% z-8s6K;EH-IiLm`P(?+Sqw){Ll|M72{>&1B7nwy(y6ABXrHxW3->4R&}c1c5PPA$!M zXV)dHwN~zNqC7WF9w+mlpST%R$z6=Nw9%`$E}o277KD9>+7AbHWU^IytffrxF=evK zH1971Dtt=7#L5fNFgJ!l5`7xMOu99}nKuNF+KKo-g3JkcVA&s`KzlTW47})I&8rXn zpRd4=af3A*HatfEUE)h|T`b|HD^TZkc<5c?l0&cCVUe9=a56O833XVeErU|!r%f3} zA&M7WpySxlxjnM-K8w5!ktSpyTu?!1ZKU;_g!>NDy1bz5I2_MVyF#C1d*4`)+WKwf zC+a~X9gqjAsmG>6M`rG{KdA&??d7rI`ODp}>}TIx{_^~%KBY?y+KYDtH`Eo>BVlXv z=HE3v5mKN)V~w`g)?>Mj2yYSoiKf#)QM6+hb3`QVi0UK{6ig`!h++?DEP-)eUJ@2^SHpb6Nnx(OeYY+~C913Igw}B1 zubUInnT>)*e*M~Xn91eV-1}9W6KuJK%`I*3azzcK8C@wD4?8Z!#H5*|uq#3=JsvFo zs4QO9RgaTd73;!Mf_p6O7jmpdU+;!l$z5jEd=gx(c2b3LCPx+Ubm< z^US@;P-cps!f2K=bqI(5TAm_;fbF`Q+ul>bnwXf4u6QoGoqc@gm$ufP|A21dN9`=C z8eaBsnrH$xMR=H75e!n#&)3x9P0q_%3knMe*!%o=eHqn#973xOGqshe)z}ei6C z^(qV9h3GnOHGe^^^8Oq9_I`aNVajx_(i%Zn20@~k@pOK7^GyD@#I&gr4R@EKovcQL z(VXsIb+3DDyLRv&L*DGheWd7?(*vF#29?v=*VWcpD;g2k?Wt-bzc8OWY)OL+M2twLpz+k6K}<)s;7kx$`K4_{YpNN5CTecW^Y zT8^2H@G0J==pK4H`A3Z}3PU0UYY_Qz_Y0I`(kZCGQqR4Q_iI*?df7gj$)(00= znzdecqR23v27^Q(>~MiG6I)^=B2DBcN0;1|N;!>pIZ%WTZS2x?jHFCjH~1F?;4+YrG|d(~e}#?&z-cEvQ5o<|s5p9d=x%imfjD zYxw=i_L=+?+>BCpla~doX|q%>JAH$hAszO z37;b{Rur#zb&@fDcA(^vP;fkx^Mb&Fx9^g23~<8g7;4#%|A*!?`YDcDf9j!j*79pSHpKBpA%>qDGUN2_xSwnOQ-vAe-Mie ze|AVX?f{l;T69jFW^}_KiKNh49MTxGmOw?n)i2^Ho~xd9G7@xDn04qb-%%3>dE8izwhTPG@xlAGqNL`ZmjzWEXt*!w zLRUZ)LZ5^PC>kSIf}b)NwB4iA9FHyk@x z+WW{qOtMo|q%c5A8(z-Vf%I7odZrncCJT_7wpg596djb}HtVc2^$cF9`K<69=Y-HA?AwrxDG`z!~EL&{(5AG|Nme<*uioVw@B$Pwvuk zn&b}j$u{$eg(w@h+~?xxR&nA3FPgqNr6rFTi{^D~6WIt~-;AdLsO@z64y$;|`fL-YW?kuJs z|2cBA!VR7r#XMQ5)gk_2jn6wZ#*< z)pYZW`3^vAASTE>$Y9g9Xk-6RS|N*fina^ap}pF9sy~ON(Mr8Zyt7(%PyuEY9ssfp ze(Gonsf@Gj;4!5ayb2*S*nk?+RAZUbS;8hyL*vqyD~)OYgchKD1I=$ZiqFwO64cX& z>EU8^15GU9Om6t*PPC+Y{I_^%L~`;u6!FUdOw}bS`KkCLlA$hWT{R8-HqkNmQ^Ija zVih$(2GrPD;^CyXX}wstmKY|4)n-^T9n1~Gqc}C-zGtz~zMM<#Hte+NkSkV1X!VEF z`;bN&=NZ7|-Px|w=N0D`OvljM z^~T|Z*2Xhvf>fLo3hPK3TEu8->-V<#D4|sW_czr}10(sO!xmNMR}8Q!LhSBUp(9O> z_BSLG!7G7T%f8{ik(LgR#)^@D+xVwn6xRGrZ-&jU!fyVkwqN5P7&bzYXTtZyybR`ec9lsTZd9(tDP)3kUEF0T-9#Hzo4Db5Jaf z-$y7Ij#-KwC!<#eHqUV+9g_Ob$gLylrp=_3EahuN<#sdshp8kT1OWl%C#AF2_0z)5 z4xrUZ(WFHI%y<&rMW9gi;m*pZf{Te`fqi-2f;7~a0InJ5>BL7Wy#HG z7p%Ka27(jlY6{SMJ9VI_jK6O<4b$L);;l&M!EM9VIbq7iGzwu_|F9EvB-lt00YD}8 z2~8qM`I~1zL#aWGIY`0*>&rb&{Brcqln%Gg%>0tSrh9M91aVNd!}+S=`S7O-_icw5 zmzsG6F7nFI5M>@otj!uh28>AYJaK~wB1XPwbd42sJO> zxgyMox#;;`kAz_)Ae3C;YbmhXsM^>Bq?stfGu67_a4C!jd<~gi#3l>#WBVunS+;EP zY{&2y;>6{==V;-#=#j$kz0=F*4^Js6ZJ#l0ZF2B!P)5r>OB($ zxpK~@R^7IE2hJWm#C~GkK^qKbR@p=Q4-r|5tkw$RtnKI?30#B_(H1*~qER2Bech{f zC2opa7MV+dtD)W6{@noxB-d9me_rr+2WfK17rTmyhXIOE zpp^LvN^4gN&YlZ5kzmH-&-5#@rJkNgAIL)_iS$#3yxJl*U?R?NE|dx{54X5J_&d%% zBa%%keARe7)~-%FR|r?phgcf8h&xCcQgj?96g5NaCvM7G6B0sIXrC3E7Q?!0|6Cn1 zC=V$Za$xPU(Z#%pI_h78UP{)$AYa_P3cqoiR$^;3J4{ywhFCMEk}6-lIdiU9OAF00 ztu-<;?-Yg=@uZb+zr~~!^cD3zBo}p6_AT z%X`|qD^V9RCt=GL_2cZIPilhe8vL|qL}a9)D=Zvv1WTcuKHiw;8c@?nlu^b|(xau7 zDod18Z|7p!QdP(OJ0>K52FcgDA!la+Yp)~{l$yYg#3WRh#HGBm8UztlEc>t5EO)Lq z?oB|)!`aJP*$ccpAW{FFo*IEwuz2Ef)aW&*f-R;s-f5njGX-~yg^O#De=XkDWQ=} zxy-#tr$Mk#PPwQlELhTVU=EKa`|;7@mfN0SX_}F^PpV^R`6Stp!Bd#1X7!596cZdH zMUM7G3&TmY&AvXOc^*dK>JK_aIi5WkJb1A+V|vX~SQ}G$Njg|~ihhgMjAWCmEWecLlm%TV*sKSQP|DBI!LIyy0%C4$L<*T(i26{j=fEAHFG z*%)Jw2?up+>GN@koGuTJz)!5?4mNhAh`x+;1`M1~9jqY@38Ey*tA2&kN5oDT+gVp% z-e~>(6_Bo)gHm>R(t}y$;Em|mYL3JoTuz61jo@fP?zx9XYh~20MG76`Ra|ZG%I)F_%NqIKn&ff9v?~k!R~CxazkY66E5(lhB5UMs zHvq9~3keq|kPM#DwgYTuigIOV+)dNsc-`Di*|=by6pirs@3jX-NN(oib+^oI%s>s1 z5#%l->&JN&1+KC3r!apAg5PnLy|x-mW6M9vScX-&HPTu?2|! z+9@7ZL-aP5HKc$IPxy(YF7lSpV2`zn{b8UFP4qGSldoXa>Y$xgc7TsbpyV~~2mZoY zI@`kB_q7)yDb$ZhF{5<5;?v6cFjfy7rl#!#l?oY66v}uuJ3qPmtSZkAx%T`ubnJeX zjflSW&UGYDG_6oi%X(cGvpS8#MRIJ^K2`?7_{tnNW>5S_f50g#Gd?&LOG~j4AFKNy z1WGk#IlgE60V{sNz-}f2NYF@N=9?>|(n{te^buinJ@6LM%(9I8e%mtUd5##p^#=W5 z!C=;7ijoDI3i-GwIy0~l#@d`mAYNWrQJ7N|*^|8d)9PXpGFWd)65SCgV&tuC6`T)l ztSXf{Iwbdr8b8KSf-KQHh-Uw>;0W*^esUalNxt!r8(g<*^40p~x zv~!W+sC1b>kw>M^hkC@fOsI_DcfN*7kFjW7w4VIIvIM&@GHm>3Z1Ze$@@;ZS?X;Kr zb|-IYk&Uul?fj}iQDcg^*PaB^1~Gr^cnN?|cBF>jHrh#A+=;R##DKeJs16@1*Acno zWEAU4J@-Z@|FrbIS$R-+QhDChmJG(<+c`Ksnt8KWUdqB~p@hH9P*F|<4UfG;oqhe~ zd_E?YAeyjAloP*bl70@_ez1lF?38(g5>w z&+wE+sF#(GTzAsQ*Bl^yZTM5+HhwbqaPV?(duZa}NoFa!3^;XgL2f>Zc1hkQi6eBC z*0_fLhMixHs;&`(u2)qV3kxDY9)5O)z~n7oek`=4mI@V&!}Gdhlt=4bM(^)@%T34T zrz<_dH$7+(Bve*duTU-1s2Z+h085%<-mp*&eE_%(;=rw~5B6~e*vVi5UR_(ZI@DeHqWz%cys zcFi#IE8aYyM=h+3ACa<(IZHB%dxGavB+FMvhRh6Pue2Or2>3wP(Rr9q!%YVnF%g7F zVNV_Y$X1chskLmYu53??@9x@cqsnU}=yKd1V>&?T z9wnTNYo4fOK)e4f{sLp|FsvBsF7smcak1Qa)=4TtT~oirQGugpes?#dNoY~`M!aeI zTIbxdFO8(<%F60i`(BHLH_R=u8obC*ahuoidW)sS`S^Zwy%et7+}WoKRfh_#(LAfk z+4=n_1cy7tc~5s>U;quCW+1V8xApn7D`5=SJ+yPY&c65Eq|Ssi;*weBIvD9Qw{(Q__|$sNwf||j4Z#=kEq5Tj0HT+To=vv zqry_-?cAbpo-P-y`$7{5EDC^_dxIGmnCnicI>RSu_E68{U|?N}*c}W!eN&v)W+#n5 z9U;|R*ZrK;H&;f^yLZDIJ9FtbU5~~^BbF&b?m%QJTy(yIWDaAaI1+`VS|RXU{l*(Z zQuVXlz+Anv80g3FAzauoxd$>O;T@eY{BdpE*M4+&DSY1GY_{jBKI4Sg26pVCw|2ZF zZaYt{yhnZVRcOBlRj)US-15=cXG}Qbya%i8ayZ!!DuZZpEcbwk805HKF(!Haa_bm`>Sf2SBDwDN3b_2#=5}q3KTW~dkd^%->O61xm;up zXzN`7zLnE$E6CaM4mWe<*nNLlqutE+ywvc}*0BHiKp#+o6jZuO^-PM->mXW=c2X4b z$JsQZBYx;1eM|wEM9YgA#$^%`W52r=trmEUs}0wVKO805G!JzVK#*aaAlYo8K4h?) z!<&44S%nyKUe;rNz5a{Nu?tm95BCNm*8-pf8fGmlHoK{VoYKk3 zO2=_?Q+qNxVdB>!3H+K1H=koRYDCGnJt+u(dr3)M-k=58>qd3lg901jzSsf^{; z+A7h6Ala*_r$oblT#N8C%>1F$swH)XT?pIl2K&NAaf_Irl{dD4Vh!e_de3O>yngY~ ze8U*`m`*Z!guF8ksH?w~__SZ{v<72e2ctnv=D?t2+|ip5lFJSz9J>GuybS`4N>z z3N1)({5uLS(kG5A?-eu~}4ZkHzmz~wSV#&GsniwuEs$rU!Ii@ak9FNfNADGD@k{w~- zakA61wHK9U)P5AG2+%>UV1h7ccI_@-4W{Xu-YQ+ozajK=WD?FUtpgq9x7%rwt7L=K zj_ip%?&>_THV~*R!l7ZRDJ2K_XtO0oSnNFj;p!IAc~GT$*^^xrS#L3r9}H$ACX@Dy zFrCn_OsH*}n@XsRd^d}D*ZsX5pP)HMnoToiJ+Ga+6OL7YJ$rvWOsmc$tog0!Wzi_p zzfLE?Jzo0v$0G~xlEqvXE=-lBUh%u1s5?9!FXLk_Qq`aLzyTofHugz$Rsp z;h_QN5+%ws^A}K=k|*bg2GyC{8MdQYftKqP7Afek}E8lMJ2(u z@r3E_QpQcOWaA}Mb}3GCA~9pSKvwBW`H(kzjj8;wXnoV-up<{|*nI2E1xiR7JJ(Av zW!d)Rfu4DQxRXHA*CT|&K`CZNFCNmrF$mtlA_bO9b3>JotHWN6+&x3ZZpy(N5?h6K zma+U^b=uET=MQPffxkYMSmFezdyM!5k3}g`dYPWTFdG8h^&=RZe`lK>Yn1U^aQTa* zyZp*-wv6@Ui2|0;sZ0}wG1IRN`ZfcmSRs$(n3G~~9x(ruFhj;m_|K7x$9=ua+ZI6# z%a?)4Xu|lcY^>LDIj7~8u4NMxBc$%Vh?2Cc;Lj0E)@t(M>$r1EG*2G%l4tdVdkFpr z*@%Wd)P#NIe=gMt*GXqTuSt4r2W~flz2DeD_{VO7z2EKPUSGky0nbrWr`Y7ro0Y;* zKC&rGmt~D8ON$^}Y~5b&G67FU6D9wmG5b#eYQgkGn6j4QVsJRRXUpBRLS=h|pBQW+ zjag$s-M@q(Yz8qI@uhjJ0 zDms0rY)->!9WtwIPY_Z#dI{E4c$M(p0^HxdZwn!#Hvw|3A9R~f$yQ#YOCARB+;jvE zkzd}e*|dF|DF-7yO0ZVai>8^{Y~^Q=?)~!c(WufZaCZd~J$M8dPN!7C6+LQnH!RVZ z^V5f`WvPPiD&jU>p~Lg4yndn8DK@mBHS?H7ayRSF$kTQl>H8DovY&u^9v@*0!f zJvmouKWlesFYtnn>Bvd4Cy_;?-YJc)A_xG% z-{S4o0bJ~~@;sgLbxjyZg>JbKu6a#i=lB<4D&YPwhnW);y(_M}0eAf4wrY2WJVZ1u zxr*D6{OjQ6>2e}HWAU=6WtfW{@;0__GHUAg$3b2f13&i0 zG;_P5_U^my0#6N3Ow&=ndj~w%L>?V7j^bxT&!f`T@(c7ffkC~w5e`))<4Wk%NqI?t zKz6T8@bW+K@Wi#f9tr8j8o8S!k6gu)ldiB#fe}OR}WJD?3JleQq%G8(+tY?yCfZ4nQrfsk_4N>cML6j|u$yEz15{*>ysLCZaD$4TmEzr4wy|cr&)_0eI=7o0w z^kR=5yCEI?fl%7`q{}y`Uq}hWQ%X|xLKShxPgvcyl~~)#xHe}|=!7upvcySVAv_Ye zI{=~dputf^!rR>_jDtT8|7u|%lU<2alZ9a|wHhG!yRv&~o&MA7Ith{q$-Y>-S?{+` zFjKVJ6{by0HrK`B7ttK5iq!>n9>-PAVP;<}az&co#>r%Uh6S~rlM z-zJmjq&*)Sa}6Z=3iyiGM;37jx_wH6ff~|B{(GpC1zQq|XV85s8HeH7dV}?CqyfM) zE#NhsmNJteK!E{lbZF`@w6l%kw}@IO=5zanyK!MZgBKZ`eBzS$id%4xyv{vl!IYC> zmZXNu_4Gbw5>l~3wzQiiY0IzaF7~k?|3lNAmpQI;JlSpura8CBYhoi0UbA|&vvhcE zzf!&NHJlD7_^6pz_$a}Bd%8!ybDb+F%j^?wqDE)KLJnd2(UbSHEkM%qe6J$K_bF{} zqVRG(r)W4oD<57io}riQw4dnNu>#CTNc zkf>0>$1_dlUr zt*>ad0B?KKqmfXf#!IaP`z0(L4CK@`h}_h>daV%FAhtzElPJ6e`OK2yVf=+61>ml^ z$b(lmF@#m+RnjOSKhFk1FNJj9{T!)}NEDBGe+B!6MKG>g08?U9t2lVhcA{FZ%a377 z)=L&!k7-zOH^osC))=c-tkG0ykdjaC%s`4)}oFrLsJ}@*e z9Y&P*kuZkwCv?BDxQn8(7oefnBR?upuNf^k_46YkfS5F*je3*}63+piTTRsspj5rp zPgm@UWnM_gSLZZJwm){@a$15}J5hMYd-6?y=TH4Z-{DbNuZ^JKig*OcJGpg2Ztz>uHa%p&yb?+BQ6Jl?&IQ3 zSirmRvw`6dbF1l|m1zMDU)m(OGN(p!EUm{!lAH_6W<0dyveQz(yH4>q!sYCr9=bO) z&G9Z+>r=6#6Xc{& zl43l>i7HNd9jyt_t=}UQ($)iwyJrX>qRF=-&tT|adT{2Ge-`Ng4MS#(89b3<0Sji* z5rCj$^dSZ+v7f%45IEV`PxKuFSE-`@{+rW1c1F*ko4fJ~EGs#DC8v$6PG8F+?~|C* zjU^0KIT$=uRIX3|(xSv%J-2adxYrLI*2!4*+UUX!PSsgcu=j7=#Kz&iGQ=9j{`NGg zCwt{@kVoXx-WeoRrizT20gaO(VhDjUg9gN%2Bo_&U+C@DNCE4&D-9*T+0quCvV9Iu z&t0)_EG@kF746#XM?8MC>Z=!vg%d9W=h3Xt+zOVc!=*}AaBLg?5)Rt#@ac359VB1! zqG9EPS3M)Pu#HCgo76kKJaoA8g=^^2)SVaCv%k1Mb8YrI=j;d1uml85DcL1RS!eH* z60uWqvdB`h4wf)-uC|%Un^OF=pk){l8x(^pFFyoJx>w@$t7Q-1Ny#oza_7pTR>#bx zU_+SC$gE3kR2eI3Ttw|Z4|Yh*(EDd5}HZQnZ9VWQDh zLd5-{y3_v1beXolX8!n?LR+nVZtc~28n4^=5XIHdkD-nelnNpO? z9WZGCR@Ct`d3df%i1MeVL9-olNA89MH~%8c7D!FTzkFFCHon2miG!_9dtq(nmD4*eZZD2Y`KQzsV}r?$$+DWS_r z$TP68kl}W=CcG@kHFMaTxTl5QID!o$t>xI?%hs!{Yt|08D8(7-G^{I{+S+(ovW8h~ z(gxY@ z*3}a2AEHo3UAaD`w@L4mP;!~}0ABsNh)2TEouL*N5iRv%k9t z;_!{~iycX%<)qN1iXukA>NR56A@=|g6R&-vWb9qc;)VR}0!~wBpz+eh?o1oYZ`$|` z)&fcUTd$~^>55d~Le;&<95Ih1=Hz?i;+0i-6wq{QU(Bf+`_PY#d~SBH=2&|?lV80) z_9E-}2ETz?Gd-V&tm=v!CuDy+JhL znWiI$@1;`EgdE1O28xA^T@bMO1E2Q4BC>TC;@1u$ z@L1rvje++oga^giCd^m#ZT|%EMfS$`6KBTEw=s}JP-Pm`N=J2;ZG3D|q`$|rbGK|v zo?hdRomA%2Sa*$PQhhD?7{Lnt&+qyhfv;z|ta~@pC{Acsg0C`qsllj* zTTC3&JZ{<7im_W4PfD=?NG9ivkhiZqRRs7bZz~WcO%u-$hD2wOQtNCXQ^Tak0bBV6 zUUZzZe>(D-_2R=awaAH13xGf85uv(@e30#FMhlDC8l!Ykvmb({QJP9rH5#;MP%pS( z^oVL#!`)2uoPd}}wZ;8R3nJkm{RpY4;zMV3^tyMtqAO~6?U-rO!gZE?SOo+^p{5Zk z6$5BYya*N+&xiJY`ZZZ4(+`;@`MtSp_X73Aj{y2q|*2 z4x5}@`rbpIc6U47#vwGfTp2gI(WDs6{-UCJw`ZccqEqSJpMibooHU|QnF&BMbAzJb zhMXUjv(W7vRR9?FXlhd81?;Eso6tTN?#nj!n5OV@c1Z znF?5ow8WBF{`d!W^za6?-9a6Q}G2aRBQ))D1<{E2tgvOzCe^QC0DbNskH3x6MBlyW=#p^+39G&n!AoyZ_I zZ?@!NQ8@5>Oh7OQ1h6$S7~LAIL9-~YbIh#yDhJ; zWa`i1*;+REqWd7O=5)Q zi`SfX8C=ep{p>Zz7yo-i*Qxaef%tRv-D&z=dnCN_x}N?DV=rrfrjR>n>1m(}bOVp_ zTHZDqcj}tXrU~xbOf>WGYI3=3n@XJssL{hUfH~NIWTLi&8Rq$=wM;e(0v;ldNUo%d z^R+QY0Dyb`FoW%)JaC}&x8onlFEhx@wzFGFd+o#&na82kL!SMV*)J7ADB^f0#(sv& z+|~jpRout8aCGR63{n??{wuOF53{j9bP4_C^Jj&Nf9O?>7HrTcG9H%G3>~u>#xtV+TYq2ylBch_vdoipu1~`~XOFg3lAe}eE{nf} z4lwtSF30QFI^q1c+n!iytrhO`5OzjtP(a0!a_9YURRK+2th$Z&oQ&v{% z%%?`qZtWP{)V+wcttQOW#9q{GRHhB1t%~wc{P6z(KtR90LPfikeUu?OUT^ZGo>wXZ z>%>-_$6D*0qA$f$wX2N{S4BuuSLk$kfi-KKO%kflIZ4l*Y*bEe*STY}JP8bNCq7Ic z%>=(DH52p?tRQ#vlAKo=n2SQb^vo6=)4%T4aV6$gn*RHC!io zWJ+UFLMzVLl2l|x)(i1wJ>EFIL`T{z5oV?+10?H_GYmta?eb)COOd_!mP*VOK#v@j zB8;Ds&FBWKI|5h{i;YmjEtKm*pLA!UpPag?C-WHV_gk!mHB*~{|MQIgzYdTH6i z#~E*n%1%;RxCdA$c$iQ@#Dne1rs7#omQ{|s9&Kk2Ao7(;V+Q?JGtrR^BW|9dS+O?u z%B0wYWFjh=KsTVC7reB}ufCutBs+GImHNg3W5MO9#)8 zMS<{&QGyng@D{KGFU#0E!aFRM5VqWD76h|_cma6eYk44oM0_@il@J5w;uWilNOptK zBZ(3r7PE^N>kNw7A=>p4y zMIM$dD!qI+3xqZvhY{o!$tH_Ltl?`#9(yJ##AJ{SK>yifMFFcra7(fPINU~A6h)(1 zmc#~LCcNMw4xV>f6gzJ=@(yD2IF7z_H?Q(e31p+4CyHQ_WI9y@+&0l{G)W@C#U%1J zqgAjFoI9ctftS@fBG~P4lA@6IJUBoxgKUr_gGxMrVBrC~1wo47&>L%b(Ig^xi;6-3 za9jz9k^q8T5{w2S8U@Ly@{(1Q9TtOKFt{Zm&@mD{wp!6(v{;NHSZ%!Ir4ws23pTL^ z$5Nq64omlYlFROp0qocX6Zjnh&Y2ab5rPQ;%+q#2oAb{eGLn$0W3}vFF7SaG}I8j-WCEQ!j0?{3^lxwAQU46 zAg*Ayn6U*aZ!_>b5e&_CCFHOZ8&Bx$r zsTx5v2&&zPHJNxjF)IdxEK3AORWyJ}AQtQat~4NuB#zz?{Up|d$by-+)_~JYA&tih za9I&aL@2J6aOIkakr(XP8D8nIG&pK)9zm`%Ff9f53Ac1Dqnq4Rim{C48%vt8RBkkY zV9rDgI6KF_LE(}`w^#oRg^pU0&lOiwiQ}#DI60E|1bNNd_SWsXQqHXFrrGV|4#7@*NJ|Cqo}`@7r0USQ7&pi|07vuWajztZ!}kCb5S!CZ%*Z*^tXug_f;at zc$6NwVs?%y{<3dGb%<9v8Z?zzn>)d&no2+ZBy!EdZ<^{gwdiAp<~Y>{Z^B>dn-XJo zDcQ_XImI^iosz0C2)WBPpd#)N`~JYh>qtVs9KZ>sZ>rF1Yx+_2p%Ym42i(R!7}8mG zFx0nEM^j{w~T=U{;9Gn*UfeH2Rr z=U^uG1+9WF&Mb2Af0#U9ATc2qHONJC(G;w1mV(wTs=6E^$LyOsxEb6`ZVtDSThF-S zlt8iT+=MJ5LNNK)t4rLt@>i^x2?r+M!vtmWzFJXJ64TU9AfX5`@C#OX2M17H_Qn z)}nQaPh*Q6OcqaTD19Nj_|VejSBblBt&e$Inqe!8EbEKiC2beqaeV<8`bn#0{T$In^WiIha|I7Zy<^Ufwsd8td zt=4C5;6whG>Y5t;_xOu*{4e<%6ZQA_{V&%wO-#jKcltdmuefsMODor|UA^auRWGla z;D=lzmLB9A%)VM%W2dZ|(B0hV|Ia$#K|lF3I{bA9{RvD|*DyX&@%49C9$b0)f3CdZ zs?}@PV#(vZC7Y9!&s@ju{}3*?w9W|R=!dZMD@{27a{l#)ju&vdykjSUX|Fs8Fnht! z)%r9HpJjgZAVPscAzB7D054>4cu1l3T{7l+nB9?5g3n=?Qsk_x0aSV!`YKekd?_a zhS|4c*wrq>wy98UY0@c!F{7KPm)O^i_#S4u2g{;9YV`yQp(W!V=1PEDW+v&;ou#$% zI`a%JgyVi*4CF0#hqbu$VuOG<@urpg?!I~TI+MI<#lC|p=NT<~_E?PbRvz59Vv{U3 zwVZz7?tLpa$(Yh`G5M<1VYlQ1BJV%Gp|xZAhI5xB^jGWhj@HDIb2sQOunvW+r}=oR zhL;2#rzCuhyKO}wHrLJhiouUfk5s)0Mw zs~RlE#fy!WhE?f124-KFIBiwxj=}aBAoRgrgPgNRqOMz-_a$dX>7zJ1xvx3O9%Oiy zDe5w``FJ~`Meu)uB$v~c?-()=L9h!xt&oGmxA1~~@1ma@4P2OuaY_0`iE;NXr4zEO zCE|8uk}`yh5K`$OQu;J!DpT=D!{r;G;t2f`1kg`GQ2qXSU3u*n&{Aa2??IQwECdj) zk^i;s6e_Cy5G;Lj0yAS7+BX}2q5Xnqy{!7T~KE~G;PV5t} z7O!SjnO$YADBXfaNua%?QrJsw+KT|F#E{fn(o| z8Pl(KB+D$XiMpWTB;OhZ`XL~W&*xo=_9vy?rr*HjakzOLZY^J>p^IV1*zFw8hQG$& z$UaJxx6V+YR&kXT?2mK0#RkGv-R7vHLsefV{j-1Q)OPWzuc?Kh@z>1yeH^>TDrwSu zTua;I?e0zGuCk{6=44KG#usF24?(|AOK@3=(UdjEoaI}>3AJ-mgr98XncWlWf8x8< zH*3f8lLS_~UuN0hF5TeoaK*4O|A&bo@b@aK$8=b2Ovm$|TmV=60Pflsa#!Paz*a$4 zUmbFyhh)=XDZ)Nrh3Ap#4l$;yerJ;CVVA*_nVU?XY#2P0PNpcfDana!(s9Z`xaOke zTl;3tm|5R)fzL1_s@mt+x5D6A$u6QDlG^(E+UjdtBd6D#HEZ#?^H$7<>%{-k$H8gU z2TJ?OHXw%Pg*R^%->#0S9<5c&HuSBXUhmHtI+eLiP9W*SYcDe|A-RX5&g808%QSCo z-K^QknJX7|tZdEJc4^%ZSKlRy$ts#xSv%5e_gp$}ZeQOo=5Lu5dmBC_H+kD*iJ>W!odFnjI{3t{-Cf-tyQ5ZI?X-@4K3xnEvK9oHM;hOn zGa75Hms=9j8`__*UOGF}=68mo{?1v8KYiM!dsfe$>y7~7S1Y`Q#4U1-8BCJRCpVf@ z?WXTuG|)O{*34k2wXJ_(_p%3I@Y}V~V>guN#>sI?MP_57jsH8jhjhyg)qQtN@WcPG ze`0+n>pYh2=rJkcD);ypjhi~|qo=HPQ*xKd9*9)5tYTXb?x;AmF(+@GEcBEKstSXp z)n68+`*7WfPnGOKs7$}Gg<9G`!WW`tE1)I&qA@SsDS82>cngn1Y@7BfX?7kv=FB)> za5_bazK{KQ)22WGe{l8pzSq@-KmK>6km7?S2mcJq`-=?Ci&--?uk(ewS!7_7Hp=pK zeXqE&6hZ5T#Joabl(TuQMjn6)OVA$xZ?t-C)V8Q0<7ul4VybVa?q$+p?5ak^`3 z_m$6X+5P)FF8IcE>syu$1`NbZBuDb6M?P`nz_#usRzu92>F8NqdyYeRNh@3NT+aBk z!7~?zzmk}F;N3%){@~hKL)Yw|yXC>4IViVFURU?JPyFUHdq4Nin(oN1GaCMHbMFBk zM{)NL@649#dw09nPr6=IPnJ%1r>;|RZ*sS>v4w4Hxqv&iF*b*7FgDE?Fs233tAPYe zNu1=8Kte*O4?Jm*h$n=H5L(DXAXvA4XJ)VIBxCZt@BjaK!Mbg;voo`^Gr#$j@3*0Q z^SsIR($Wd*7K2Ov`nqfdD%5RSk=&oFoq#F_^OcjSoW7}YIov0PI8$e;=UG)X<~406 z{xV_L(`yG#>^`S@=5(EzQL~(};nfFjdf>p?He5MNtiFAoZMn_(48D!TB_K)g;)TA) z!%ZOkUvux+Ik~xi*X7--ZuhWizQ$-3I~E>&>+Z`Q{AfX&Z`%TQeb=Trlj^1AD{qyh zN2)ls#ERB6QED}oZ4?-n28ZfcT`IsSh^-lwT$Gg)*;pPqQWsA$3}HgWzWd>50((Z~ zm1Ts*(~E>~c)wcOzw8#L?VJk-5*{O0Z>$vqM!Q-i{o%u#S3m3tnLk=^UUW%voOSiN z-D^8M^cxRtmukW_J=1$?BHdk)SUqP@Y1jh?q^XDAns)adT>8@#4*I52%^~lm#kE~N z9x^_y&*-xUykRg!F#~+}BDUS$1CFoU**IrlpsxSW>^)bwGM?=ZO`hAmY4Z4nR#za| zI$`UP>m!_+<<-gQ%l16>(Dr`pAw+V{@lnY0MHy9#=HLxzj%bW1u^58iHYV!sfOKQl zWdXY!$7!#^kHhQ8br#RKUeaoq-az)r&bnwP;z;_#O%%gTM6Xw=?Z$vuYpmyt-uS@A zx$%ix_9R=^Eluq3wy*0xca?Qqa!K^O1^d8>0|zF~h;(;Hys>05=Dqru^gpdTcP(uT zdQx}aI4#L=YFOdA>8&4KwUk+(Yo&?ius2{w&7<`(kPkF1ZR=gv?y|?0(s#5S*faZ3 zf8D^qoW`B7b7t+`3#V+E(ApVrG(;NOC$4B7ym+6fZu|v3?NgHH)?4A6ZmreeRI<kJ9C$ZV1K#Dh5M|QW7JICPhN*M4veQf4^f3LWQY8=ySawY_GCrQOv{i+Yb{g5np^|3%eNjt{ z(T3zX=y7L#cOx>&-b+*2GM?q#(WTEV#3nm1LULi%Zm}{}7i@*ZFCZAl@Me^PXR09y zUI-8icb3vhHX_tCgS7{mCtefr7M@HyQ#BDBF%0ILmlv%{Ul@)oGU#ImVwoC;p~;G z?_bGWCp|N3e&;;1MtTMxRAbpFqRp<;y2eIq$sTcQP+RVa@jO zQCBqc8*m-?Y}~lRo^eg?Kab=BXe9Ci4($$vLl{aRiZzmWXq87+MTrRngAg(nj=K02 z>Al+@m40=B0w@ov^#;Y{H@6S`@X)MThkiJ){HX~Ci>wxV*8%Z{+d zaR?4wMVT~ErczlnF4`4R8;oirXM#KrmW-7Y92+C)9za!N4c@w7EVw=x1lVd=4bZcA zXyQ;JgF1w6&{$L|qD9o9tTaxPsS;&whUhWqS)-GpQjL*x&uOX})g?^j@jztXYRqVh ztv*u=aoTx7SByshj)*6|FqmICP?93&EeH$>*(PRel);n*AY%&wjlB8te9qYrQJmkl z)L`nn^^nO>1DBI485w*CX474Djp+aS3cq*_M%)7H!L-k=1v1hQ%u+_*3HCT@d8b3# z%T8~beyE~vdfR4RPVo}iY?ITarBi<_FMkJcPvcCk{Y-i)H!jGyU=}?8QAmhIav_Gz zSHxw+{6O3gVhVs^7|LKIVi*Cko+b@Qcf5Yx-UUuuo5n`WZAP zqOomdaV_$7Xbj=E@C}Fz;G3}+kZ4RVl3tPidB@uR^ZdTDn%In~w*d7WcVxbUF&Ivs z1*w5;`Bn%G*D|Sr@2#4Btf^_PNp!3Ef$#nLdmkM9=q#`er@lHnV#BT-ucPq+oTlhY z&=}^GZPc=HCLyx2;U*gxfJO;Ah(39Go1n?Orz>aFMkDirw3bl{I)VKqV>5tBqJw<| zT&-k8`d22~sa($ zB+*AT5=XO0hYG5xLJnQ*mnfpG9`k5gBb1LxfMZ2J#OQ(*O~ql4>2xmj7)OoM(z$!_ z+4Qu=bW=e#Nu!niOlnb9F3P$8V-y}^yg}B$;w2@QGm~LYJ5X{+CNml5AWq>~1Dnf$ zIpkB2?C8|7*N%l6Lo-&+@OIE%QK!+?FKp@EQLQjD8l#|L%!=ymS8gYVf{`5V=xte8 zuhr;8P)nT#^L}(S&<)+^1sSTUrV6`7Kc6`{aO~Is7GWA@%xHkUnvhOZMgl})l|WtJ+mIq1u1Oi0E57j$Ft2` zfYQ&)kas>Pn=r81NvB8iL4RJZB)l~Ss)AZV?6xFKUAC*@U`#Zn9%lounn|D-d2_ix>}ww*O9u#tM2EP(5tplB#ni#^8x9;guwi_!x>B9ey{Ai| zZEtFIZEG7-XSdhtIwPjOrG2JIr>@p+uVdO;YgaG2{+S;=bNwQkXr&_!C^yfv#z~jV ztgW4S$)xjVYHBpMTz~y7XfyNt+cwot+tN@L4?3N}#&WAI(ooabSkn-(S<4&oxp-N_ zmTC2yZd>ulrmn6{kC5?S#>aJ#cpRd_FWAjw&P(D-VkpAS3>5<3Wr#K1*Mp)?tCfDD zQh_9)wd}{ljRXnv>p_A<+%F?tf__vB^iPe_VRpzQMzIv3HwS1*)b4rM${cPX;Zcf_ zSmWw~bu4G+!(@i+H`v@+O5le`#zUAmvmX;@E>pvtCI0G*uqFO>K(|g@w)SY{-Unbm zFMxhx0~;i4or9=a%d~G2`~2Rw6E5AGpysi|9Y@zr>u|q5x{P7s)Ggy(6O>-7NKa1!bpZVJ=8)0CWH=ge911sL|5O)~cY2Y{;7mw%Y0(5*26`TB{$8<)XLt0mY_yTXI)%=Pt5zfcOE*lvv<$YEsOPyy)T(o zw)bt^*w?<&^iqd=V8GpxJi2yKc@_S+tI8K){EfmKAW0x`+O4*4ZT= z!!EbQ^n#?9K+7MaiSYz5sY;d(m6*iH7lGcTCoab+5Pg~a_HanDS-wIfiH3Yg$HZnC z;`-jVLk>=DZ1dxg0I&NbP@Z&q@xH&!sOB7@x9`QLnkS;xp=F1RWXE!|wC&D!-@S9c z>9>aoM29PYq&PvkkZ3lK2(g$)g-m+WV$ z{jw~XjhCw}iI)4;F>-YBtf6sd3x|{C!DLpR_mQ_tDhRxCM@OBsx`YpwOKt2+Cj0*N znSwgH_7t`Ds3Q69oyq-6FzO~&yxd8T8{8i zG=-;mDOIio&04iIFq|s#Pk50`?4}~j{Lyx^$EhDvuTp=aK1C9d9=Jg*Xdlg)9Vj>2lfXr_6wtAG(s74}aT?bByCfBOGodU%HO zBg+g@r&73X1UQQ-W}Y9)*YqEwD_(Ri^N%r3{^S2(Lg^phShBBgz<{JfvOrek`iwP- z-|)>mL;ZpJ;{X0v^1tb&`Jt+)zuG~L#q=~>kdqUO<<`cZFwMe={7cYoX7cN(v3 z(a0v_1%uqBqVlA&`Q`d1NTSgZbMGYoKkK7s=~2TsFewinf<32Fq+ii#xuE_1c_%V? zzqauC0CI;kgy)}RoNk?UiCJI9>(A|Ce#~^vHch@8hxl_b=@^u)GFg=z zTCqaK&$Q~yaTyHUGb$gv3nSQ^le1D||J6Z966HpG^Fuk@3>hmwOx2@rak3mSde*9c zD=CkxhQ_F3Mwb3kM6zMhr_zH3>Cb~sg2AzC^T{^~g*ogIf<2Ed51bAt{IW=0O~;}} zzrr7mMbZD^SR&>}|0kkWbT-xsWxr++wX%%WqDTShU1@MADg9wQZvOtkWO6Xw@A0J4 z>6FLQpT@^T&>0VcNz8V^Isi<1(En&%#j8AEaLAMPC~Ya55^aaTphtyQc1cf*pT;s= zGV5!@pwE&}mN+$CjL?VpFAL zI-P#^PLNEdQfbfd&p_P7gg}%QROJtQMtxA3FqL4%lRHePav6sH&D68It{1GWhF-k!NF{a zBkHkF<8n=>u3@6goDuD%DsnQytS4ifWTI!Q^@!6Sk18sDKDcPi)0AAU#yE|~BGkX&7V;i(sdDVjh2DfZQa1I7enWpec4Lw8 z4fPE;C!goH?gVFg+a%BFK*vPsIdY!=#tQ@&oavq5JZn*&TMFg;mW@x>o}oFjc4b*^ ztdsFnNAn<o7|c8Lb)Om(bqsm@ zsWet>4$6>JgY-s&VbEXzl#DJaqvO*31%iPd8>$WU`W;w591QhFOP6aWaI)6orqQTyg$>^A!&kEP)ctAUL#;n z)M+HuQKXLOH;tQM5R9AFC{eOzp>f(W854>$fvmr$r+Yk}VUmEszs2*9hA`=5*>O97 zY;4RkOW&9$!aZ_i6csKrSVWZj!?AEJvU9qZXf+D;>42>uN3NWwJ}age8an|^ZS0d$ zeH*dKp3G*+wMUyOhWa+rsWV)FNql-^A53FYKbiWDu0_JHoP3P))R^VwVbL-N$$Dg- zE~ZBM<^(h~s$d)YKnj=p3>TPmCRtiyKuUau^HdQAZJJV1M#`SIq<0Zbb5?1ZkB&UU zHc)b$i@+{DaY6r3%FmBoS460%HBS=-Hw0Y zE&1K&4qa4v>%>PV9;?3SP;&W^D`r19`-&sWlSA#H12_ES=#m+!2M%4i*4uHVGrIoX zbvN976w=(>J#HRh(Ga zv9fE|Yaib^d*RkqGw1p}vuCW@x?tAe$nVIC-$Hhr!(Yiaj_XY8wH&$9Ov`}RWY)-}HA{K9} zh5I6QDqXSIA^l#6G0BQ0b`TOyU4?a{G7cjyG@xn@v&|9dchyIFPNnnZMk~2={2YrO zp6jo6OE=jJ{u(z}XL)L{P?bkOYi#^I9WByLvGIkx`+)}!*p=fN zY?4~`E0TH2z|>Wbd@K!r{KzV_12ANS26~UT{jDXca(h}u=fcbdj5^NDQykovbCzSJ8Vi^S1IxD)h%kTGvunJ zMA@LKLe>AaZW_!KY5kukYln9NotyOG{}GkxUkBk4D#H$lyt zbm~oz9(51iT}`T!^>%wxS}47lN`V^iAi%8i`n*mF&uf14CAU%&sX5d#Y8|zm+DEk3 z_fSugu?f`)eY&U~iK6{*(LPFp-W%FSwFsU$%~{W%X`e0LH|Fui^utnK!#5ep4i6~QJ|00;G7+Do;Bq=^C z`ptYc>XbCbL3RV=P4=HONYWW_oHC}f8zv8;@vl4H>c` z8G+0FsBf`pzgqG8n-@+fOHSC>vP$}5nO-m$JZ}GjYwn%A@uwR@(Th)7RBpE${0$B) z_S7dX%{;V8AGAAp3%$wTVm!r@G5>R83pVg?%dlaAWw!cxud8ffi%Ka5;ro7*xw<{n zkq|d(S%YB0F=Dy8v#1AGQ4Q1tYBT;0IfXecl3%nRj-jDag_^@mDrGgJdZCM`u4c>s zt7f5-CtiB_$w%M(4gJ@@-DDEkCS8LVan$&0ELMlO>cl$HR8_y@_(KP4y*HkE^ncY> z(3Uow|6D(K;sxbJKinWSJ-fAbh*QyJoJ}Ee8it|&*b-B5Cyh|?!^O(ytH3A!yN1Mi zIV9r|-Ae$+*p1S?SWKnnY&dx=WsI7s75HH?HPd+1svKJbCDj&1XyQIxd-?{&9Oh&4 z{AMI&Dn_X$EhZJ3(J}cP23)`};$s#Qt{F>HsfOdFs~D@cL#JcFHhBkLGiC)2j;+OG zykCETZZ^c@T`WmtMo&P? z0)liTFI~zj!_pQ}=Zv<+Ki(j zrnlU@dv}x82$T+R_`ZoVb*Dz?gzn&ZV;2cBWb-s?MEMJgI>%-F4j&hC@q3Jn+l-kvrxtWjLW%!8 z_QR6-cgg`#9?C&zxpB^n$37$$v$5<6;2|r1`5$~%Uj8@Mz@gp)sW~-`XnEgQlikEu zCc36og^lFUMs8uAC7Vg)x4&_bU3&M@P<2Jec!zyaBUXB#Q*>itU(!3=MtiWTZD#gl zPWOTJpgiTELR1%ZF13c*h9r^fTh6L&Ehek%AWWQpLPY{2n-ACsV-z+tD&R$Dn`3Q+j<4az)LLq$>3ER?~Lr0|3TmFGS zb($i50gz3!C~$j-q#xXY0hPc^vtN)taRM2J35cJX(WBTYbfh=$ozdEGZhKd?f09nn>h9IC%0V!$@9w>`fh~7~4Ni(LZEbT} ztaI%~cTlXIbA#X6QdgBMx1VEB?pC{WK;1ELb53^w@i**CxbM)nCCna+L$)I(4h!l{@8WuC@5VMLH=Hwu0NG(S{t~}RE$wNe1)=z}# zP&VGbID1za2;;*rC<8%k*$x8F5Wa|i7%oE+(gZvYk6IKfvFj)w#$XAW{TK!&W9mY_d);DO;PmDX&s zefqLLcI(?Lp7R!{+ z(i`q0^#N$Tbtx-j5mG_y!*9WAEYbr)WbPtb9MG4cq$jv9^cwqcD%6spLY)S*PosSr z?Gp?}Cgz)3HcZu2`p}j^TUlTFHW@z$Wc)OOtd6mU%{~PWWn}PtTson0m*>tp;0ya= zMvR|=g7kBSwf3~MKdcW*Y*Z4^Z<*-cj-W+eXhUKzkb%- zi(ElhB-pp?s4A$^0SKWxNFQC+7mT3u7tQNik5bKTPkvAbSQgm)HMN%J`o8Mfi^0>g z@TE(_$HFWUHPo@@U~lc@%9)E6&#vyPZ?@Fd_-&AZ5CDcMxiwpo=9sJGX<1o}NfB)>834+opiQ0ei^Uq@+|#ChMND-zDs6Lb|^Sb;g~%8l6?=&mj}W^41X3o#E-{AtJmlamUxSd zJ}!xv$_jVI8dx-$e2qT8g8GrB3j3J+9lD%tC$!BRJGc=JU#xI}yV;1=-IU$K~Z6#J%WZ zkU$AR*|VO$U#rwIw3O8Fr>PCs%ah&i6`t0O6WdLUvBIFU8nvw0)U~F`zI6Xm9z=Kz zNYf0ui0jdg=WI0d$wzc*{M3Gz}( zq0(xSI(DA)-_l1k$E%V??U334cJ=q21akq)n;2P21*v~YH$B4>2nI(oDcU z52%u&38Z*v+C1wA*NSjNS?Z##MRr>};84Ltyb-Ocay$kc ziN+~5mC@I%5=H4{5EaE$coo+ois0vBBfO$SlX(rk3Zf`oqloWlkrTt;oDq9pem;71 zI7?PwRb`0*ik}Z(Mvs%TL)n6;^fD<3J)!jZxKy}kaxq^<>F^zAdp=0SbJ0FBJ%Xy_ z`OGy%wGj)I1f>lCG+s9~w zB#E6d;#Dk2pk9UHiu@uQjRi$-7F7;q4{q3!nijZ@B9&Fb7orINMeRh0NzNujpHq z$DumFp;iiy!YFnDYtd4+94=!ssB1(Uv@_+O!h7kCn3}<{E=y(_359j7@t;y^;t2Kw{P>{%; zq6>Dxv-p~i@;y&ARgiW{V~^Rf_i0aVZ_J;(eG(Kf-$s?gc$VYha*Xu@3S|Jl9c#B3 zXGuXhsTj6e=Y54RnJKXi5&jH7WRDPxfB@+!5U`!!hdx`JF#Yk<4hlT=1D@O=O#>3|7c7l7vNTXja0 z?pEOb>vvbNK&>Wc6|YP8{#qxfRrJfH{-p)GowI};g$(6{xQVPKMloo754)tfy&jLj zVAPLdRmj{dOc6j*6vSXA6%>^!^e*G4W86#ZuZS#%-ld8y%occ%mes&<)V7LnP68&{ zFRR6b77A^d=cVVt8n_k>$e5QVa}@gGDCD~Nm<#kvc9qE-Sr)B%|f<%WQk z!-7+*3zu~Jet;Gc;mUHHjwuvV&GjTok4A!iY$6#9cP{I{ z`24mLf6~$_8(6-*v2L)+$ino9#wv{e5WQJ}auFK}Fajf*yg}Aea|A^hB#>$#B~i4e z$R%@>!zM_lQebB0zfMzVMg9(P>XcK%WhGN`fyW9Xe${62O5~3QHACr0QQAt(PQfar z#cokbTLmKyDm|9>zRWG8ro} zsS2ZDMYBY=2$I%qXD$=C$M5&MLE7n*l5Xku-@Z)5uUoeH#;xG2WlG}w{qnQ^P;CD! z>D+e}HKh@^ZRR7IjKt&)`jz4`5&4t;2P#uP8j;XaQxABB-$#Y>B6TQ{-;Gm*5giHL z#6-$s5ENMmM+N1q@-9|16O1jU6B`)m*Zj0r!!kP2=0q<*{7|~Pa~W=+Zb)J=~5x!E;Ab# zR;Sbcf7>GBgY;5DEcPgC?8X#KEU=CaR=nAi)n69Zpa z$I0-`Sl>#ABT8(X%j=pj4|=v5S*B48twg`^i#rAWfKKe*)z@ohjr!FJgI)zU?F|NJ z?Q#YC8sp*G8Fk&25xepEJ4D?9UT9v|(y*kvueqMW5aLg8 zK5vzQ6HG_+fL7CjzuY>%*HII8`bEKHtqXN@EzG{Nz382Fx#iXSV@KQ^jWO6eEBA${(Tz$b4}RlpR1U#%183H*Rggxv;%L68=N7T6XV z!M&n^H)eh)>IQgWo~T>R3)0g%5zRL4)BjEMYSRcBk2#Nwz$^2Z=>&qOLzVEBHg!It zw-7r#f;S*_a(`<7$suSDw8v&QFRrU%%9M;nIgwRs6%N+zZt+H4VT)A*PE*7Sg^X@P zM2;l}Z7DTkcYVn9+K#D9Hg^j=@e3Wq z=+(p^hlk70bLRwV1n-rS(jrO9jz;neQT;`~XfatE<6^>V^+v;fd;%@7}yVIt)|MdsZR%3*Nui)rNx(_8hSKJcVtKO|cwYa4zdO zXi%%!#T#&v>wQn6mYWBv(bAm3%yN&WQmG7Drb}<319a+mD&;{9lsRUz!2$HktKk5V z<7KTiSg6-&ZPGC?V3U8fI=%E@HUVBcH=U-K4^TTssY#>k@ezR6h7JxNplJskba2dd!cE(@>J-r#TQ8k` zYhTr^!X)uU_l5?gfm7?IZFn>3y>)iQturqkXn);RGqG)9!%U^JCDdEr6{&ZL6YYVv zhRM}k3bxhPUDFy02z2V{X=O*Rnz(*KorO7l3Jg=H!81{C1ORvMy#Ne<3BMRtxLeQ5 z+!1IB*tHy#9s@M1H8^|`@Rc{}wW>J)q?gguqvWmbNRf@gD95gjh-60-f6$AOwU8*A z2id?}EaehCy8$#c(A4ly4nqT@YNbF%-ypr%Aj^SyY>;~FS#nm)`7=HH%y1xJ>{1Qp zmvDeD>|S_=qN1|;PE*`&4x{D=sBUUDYKJJMn(`~q1O{a6s@#%G9wEp|jK#!h@lJp# zF|fA`X2k$VU@_x_F%dIfg#C&r-ilF?dEmQ~w3u3v$$X}keu6zJq%_vvrO6P1-D7$) z&w@=_6(-@+3Lor%3F$gcui;hZuilV`rq=zVZmRU|g!k`$pBealoq;g{pZ1h12b^UP zO>94|>(_(A<$pZ~8U>Y#2K1J{EXsVM6f_XR?et}9*B(B+b}c-bSu5L%itF8o>m4lA zn>}N_K}pT%Z)}HeQSUoO)J{BOE99&FUt`r;8ZK0ixpY($sFBRJ9j!ZkS*$s{mTRUa zW8A&qH@xDJGXec?9>bxrtIT+cwGmi7kRp9LMGhpHxFbyt`T|_1D`B`>l zeQU1%`a=CnYZ?58S6`xaImBxKn&;m16eS?qiK0br1bc0imoFux7ky|A^hV{&i9 zgv@u&Q0Y$`O?}(OcSLMLSZ@f1=ALhW=2q2+aIzwm%xFT4~J5NB$J1Gd0AT1lTk~`WvI35P)ij(+#JM-xzF04L8k$k^6J{4;8UJRa5P#HC9rWQdd*o zp}t4`l*laDgC1+vq8N@Yhy+3Oe~d+cS;Jp6tMWIpS-&Eb1dD}OGhsI6SclMnNStNM zf!}OGsT<>sm?H}Zb2NZPLUZW#5JcB3V5o=mGbFYv!hQlEYK~&!T;kt_Bqmwehrv#a z*>d=^W&ch1ykY=+XK z@N1?3uerQF>NK03(fV@piJl$;0p7!DQ10N%Vx`bu?`SX#86NRPqaRF=7J&yQ?2)do zs4X*ufKU3|2K8=W+i;}OTvZtWAKz6`Wqw*!&Rc|vkhAr&R%a+w)-tUt>Hu1^hHkn& z8oj+SLw|QpO)IO{v#m7?jz2NCx()BQRnMhcLB-F0W?f=ko%rRBy)EUTPEsfb<`_7q=$eg zjdI7{8BsCU_vC(t`(AL29!kFywpuLKFqnPLIm0dMq!-t$1fE5UTuy-oix7U~%vECVwa#~LC!fyUdz#iG*{GE~*ZUU$A;+Fd7ZcJdQRo zr&C4$^o{Z3-XP{4`R$D%;vPs7U2<+j%Tj=uzX-dS0xgO9f z)az@(N`ra$9FV!iWYpKf3qAC;wFTY^JT{4hUl1e1VjU5-I+$tBiuDxl!zx6+@b*8nelF8y8l2`H!cNI#K22jd8D0LAVhzIyt6Y5dsRmyH3V z!t4!WQctf@2NXe(MSnn{f(j566*N7VX{Vn8r*8Cvo%G=FZ(&-O>6{H831{a03Z6GT zb0;_fuDwLs1iN?MwDZ8t;AXHm)8j|w8Oj`mYZrDM?E-H+bL1KDsdQ{F7yvJ4o|y+H z{WUYu0iP?f-utO}Sbw}fmKPwkddC9R5`YCJC5~b4A>;tCM+k0P-J}_P5 zcQCc~fb`yp)TJj*T$%!}SCl_iUO|2y+dAvip;=qE&SEZ_we>=HWoPf6w=MztbZ=*7 zhr{m&Pk#0I<6k`vZ@90lva;+xbkoO$X*`mFuqiZNwK8^Pz_F% zqCOmvUKxTTX+nuo`^ObsCO4p1h7*o?Y)!RySi1GABYLxrRX~;B>`>9=zNUa{_ern|RNmHR0Pw!fX&&S3*+xOz zYFxLurflc<#VMuo7`)i&S1If26>6WO%&$_EmnoJ0VZm{J&t%iMI@+i-`C|V5=MAbG zZ{&PU^s^60HdkYraZkv(QCnW=Y*aP8xa-kLj#`&XuZal31(9i{4#LwazbhpfMO)BX zm#~nB2xW9ULBh#NsJw{V2TQeBs7I2n*ccCm(LkjKgliHvEOCTnIfdNTE*hO@@ESlE zC2;l44pf8c@Z2fNh5OgiFi|_+bm1lRlUJfXZ0C@wd|7_b&}qM;WChzyT#E=+-<5=o2=#n;8cxMp)Kvt&UhsYXob& zz57D#lAij7CiiU6Vs>z>$;2t_Cefxq0z0d)XJ|#(&a7R_X>V#J*(;p+; zaNvqRpy~WZUKeiY*|ufXwCVk8X3c18FiRm-Oz?uujvQLQ-HZi}<>uHV}O$7?nQFh7|3+G3J%G)ytg3GBn99_|Iu>uBx!!BdwoNT@?tLOuUX^N3{uk zIteoz@t376V=tlM7Y3blw_3-mr8{&=l_`sXh!#l(DWz6}ltC03;vju0=l4Ou44WoC zxUz3a9_BfbjopHod_HD_4lKpFgB3bP6i*Q+Yi1~904Q@QWytbx0a`)P8IorXsXvF) zZs)^f|Ha5=mcO8=6Eq8UsXat{jb`qy-MgRnc)UJzz<&PT zk;5*R&({@5_C%L%y5#4~#qCq4cE$w_chmZHm9&9ow8gx6G@8>jGOKmaNEoNGTljEh zKK|oU!`ra?6%;btmcm;2-RChSin0T ztJPxxCp{L6$2xqfs;zZ?TN^VoSv$3De%qn8>Z&#{C6a`XtxFBBNUfi!(CQSEmc6-b zl0v6dfTQ?&TUB)%Q*Ooi$p2n#tCD6{x3yJ+$Ew=I%&JK8&-m!i@^3N%Zv{6cUf8zn zg~UFcg46D=s@kvR6uQh!xx1=cThaWgL2dCb!V99Od_VzAAOPyYMDQuWIq_rKsRk<- zQlLtK5Ed;J93Iy@=r#~S0&@o)YQ)M45XNc=bP>y)WCjeyv+4^x_@mh%ftKUwG-oyW zBd8mrt04~aG~rQ9L4uU54Hk|Bm6EBK#&ZIVrwSnRu%Ou^B+nFRTEzh#Jl2q4@fQiR zR-D3uli>HD2b?VNlAB%797humn#$45B)%SJMr^EcJT*l-kbIBJW42fu6dYP=;uI!gq5wyRK2s-X#7jg!kCrFskrtdmLmapuE({=mDKvp+Qt)(GZU~$|ZUQ2R$4CKD zZZ2A3!g=BXVl5ZZeTDEvqV+hD3L^j}o6!V-MWqY_9joRo zYNw?x0jr!IR;6KSmDV&_RpYS7)c_dmRmPCd>$K<~alN$~1`T|IOQ8%}LZ%COEdv|-!dQ#&ivMj^V3c$BHw3-gLidNV=$Mu$T4>k*{ zls2=wv#d-6Y}ff(4`V%`(nl(2eQSNh)~hrqA*)g}8uXJwN-kpWv6cgItH-=%kwXZ2 zG<22G0ilWodecvp3YwwSoB}{Yf&s#i#;62<1AuYT>_?DOLOsywI7Y{EG-@`$eEp)< zZnap9CY`{DQ=A5cpenbZZj4@1na2)5n+|nrtx;oLpfQXK22@%`E%8m)K z)}qn(@SHC@-Z@#p94sy2giXVsm(%eHS? z)B4(i`iT_~`huv@m7=zs4f1mn6Lxn^WWDu%JF1plqnR>M>yEmd8hrt;FGcZ`2g%kE zs)6dD=3}p)V2Ji(!#Un zezBl(!;Qm#M-w`n`P^62X71ZE{^E&k`uFG~KxOKgx_i7`gep2PeL` zz;|-y=?ku%t~m;CsP8ye!C&(3qD8kY?d5fV{m-}V>-zlWPutv|zCZOZ^aTK1f3NuP zn~w4EHnZgW;Cn!8Pc~03i&b$})V*l5VqoEmW8q6?+pmLKiq|9&x(;B5;b;RP*Uhp> zLmaQ_#)}ZMOiG-yS#&^|7!3UdFp*wDR^MZEJ;ownY(3_taLdB!^#iW5DnWm^y0;=w zn2Yh*ef4Mr|?0(4HzQZx5@Y`IrI~&3QuJ@*aC|iM2VBF3C+92 zOjVB;0a^SLH$Xq^OPLdmH^(w3Vlg;1b~FZ5(&m#@&8?L?s;aX^i}#y zNDrVE9Mf0vJM{Wt*r^|(e;~fh!BO6mXTfR3c3&bRgQ2WNG=DT0a(qop9xVDzGsK=c zOc5e^NGzqqUP|+YM4>!CBTKPE1W8l2@`P!>S+tlDV%{JYmj)yW`$e-8Mbnp z<#E!eroN_R_mXb%hxRx2!BpQyX^51DPD(O&U;pq%Qj*uCad=A~mI!Vk80_1)5xiU| zM^69c#Xj*JSVfRy+Ji`pvRDJfiXIj$H5kk5D(1J_0&T4UTl@UVNV(C#EG!vRJ_NtB zOzC$!kc3iEQRV{_y`TE9-F06F(ioc@T#Gg*z*Csvoo4p@DvTE1QUi!zyuYj`KZvoa{@8)1- zrF+J!TWpL(LbQOZioalVZT@<=(uXM;Kd^$?gl)AO_II{tjp0sc7iN% zMJq6d@%P~-NIhAg9^l2n{ak;@G1T*#C<<}m=d3B&y?k6Mdj8~AUjK}#%qEJo@mDP} zF^)F>XOryUm?L*nrvhcqFR`T zNG7nF2$6@M!*z_%XkkSVY>=daXGZ+%q8kz&3_)}tODx=1&^pFMP+73H4q&|=T8khV z1X_b=-J;lSJ#MRlTz$=5Hd<{H^+3Tef`7}zqnpmP z+138_1J|^1G^4Kqg4V*a2BoP{ZzzvfSCr`>C#cjc1gy@iwZ(CSj#sX!aWngkew@&L*L5rwy zK%ixfZf{HDqL8M;SLaqi#!IRPtySXgREX9a~MC&eaTLx)MV7Fqvla-s7uio znO_HEzGAYA7M<1{_9kl9U<3rv`VD`KiFhE0*1Bk9#4)b|I>d`W7j_K8hHv!gk_9Dn zfh>4u9IYwkg=CPNBd5Z6K`SrI;XT;AI>T%cdS`7_s&st0!sy~%Cu;v|!@5~@b+518 zunesX2c^?T{v`c@R}BJi zEU(r!FX`Pn*Dflnt*Bt8g`Ku4hIQE5z`O;~u&N>MP?iNcIv!n6Hcsm<+x7XdZ-Sn8 zczxqN&f9cOmeuIoJgZr{sz2a+ZrQm@oaHCl`fr@TTR%P`Z?5gVZr?yh&-Q25Zvjl| zp(~~&ujjR>8^G4~&Mi7#gL+iU8n|rft|s(!REExe9eTR0lGV-Z&unozga+sAr+UZ7 z1kT-5$2q3v{CxWrDdrfZLZf9F6+$Csi#%qA(JI>oXrl=#Ff$~JMJ6<68ZBVt#d-`1 zh24C}MT!nyeAP8OmLIa)4@pm6e;J_R4^pY?pM0LKD4c)#$mN$`Mt5Cy{gXch^gTU2 z?N6*;{RI82^x%`y?&u{aUft#HH1kT>Gxd@~G|Nqax-oOUpaxgG~C;(^V z4C(*?0C?JCU}RumWB7NMfq}i@KM=4tFaSl60b>gQsZ$4Y0C?JkRJ~5bFbsB^q>+FM z78V#lh=GAy_!DDa05(P>!~-BC!~j#olkrgO@cCjlPVP=r`sCKJ9s9Fgm*|!7^bbVc zcSfXDIAAcc2f74M2C?rY-H!JP3sBd{*jXTS&aFKRQW4`qAk4uX8c z_d;#ff&F}rJ+YmW@A>W$hjm*)^E5Wz+#mmgnt# zCW&*+h($k!G;{Z9xd}Dzd!gw?6)%}OGMAIBd1!br_mfM8htiX|ZYwp{P|nYt$_Ij`81qnciKw zFGz>^NOZKE6{6cfGP8+J7|<^YE z5bV!IavzRk`u(+gnx8)a?q!Jp0C?JCU|d*uHqm?`8btWbEQsHRw^cuet+l7v!$(jH|s0V!#$3sKlSP2V1IrrAQ&wVDNmd(d z_u28;<=9QLdte`Af5RciVV1)c$4yQWP8Cj%oEe;5oY%QTxx90o=2ql(#ofhylZTwg zI!`yxMV<#d?|J_5lJfHLYVexpwZ~h;JH~sRkC)F0UoGE#zCZjj{NDJx`JV`o2*?W9 z7w8hWDezs8QBYRUiD09UGhrNIlfr(5`-E47ABhl%h>2Jc@g>qBGAnXQw4auvL z|E1)l+N4fNy_Uw6R+4rnohN--`m>CPj0qWEGLtelWj@GK$V$jsl=UcEDBB`?Q}(MI zpPUIfmvS9)%W}`;{>yXAtH@iC_blHgzajrpfk;7I!HR-Ug;j-@ib9Ik6!R5#mFShM zD!EpwQ@Wx|scccXQu%@kxr!x~8dVn62GwQN7itu0(rPx<^3^)kmefhq9jNC z0C?JCU}RumY-f^W5MclTCLm@6LIws0FrNVc6$1eM0C?JMkjqZOKoo}m5xfwiD??m1 z#<*~SZH+Nu2P$4dgdjn;(4oc@C>M(VW5t8k*DC!lUMSY~n@p0`Ilnm=KxA6(!RWf-Vnhz>kb2?MSnsf-?4q6UlxEaW(o{Q@4S2F&_g zYn<1(!z~>6JX66r>U1ceh&;18wIf`iO0G#Z%fgG2%{-b-VKJ=uV52RCT%f6L;M44~5hnw5j%`-y3QU z)lmGJe8-=Q$2HVH8t@GzagAK2J3pkuz0^4-d2}C1Um^R!iEW zo%zhnOyhyxow=Qvo*R&~3ZoNq9EX{inVH#PW(J2jajJV}1uxN)x~h5_s;htfYE`JB ze;!<}TwnP=Ke$yj6{=K0mAfjpS8l7^S-A&Q7^tC+2AXK0jSjl#VFHttJ1X~9?#2|R zu>reaSL}w}u?P0VUf3J^U|;Nq{c!*uf&+074#puk6o=t(9DyTo6pqF*I2Om@c+6lU zW-*6N*o-Zh$5w2^2{;ia;bfeGQ*j!$<8+*XGjSHq#yL0_=iz)@fD3UEF2*Ie6qn(0 zT!AZb6|TlLxE9ypdfb2;aT9KaiCbX7h65J@eGK5i#|{h;AVdU-7&|Kyl?N(4BuJ4V z#{w3ygb|kUP&^C|$0P7aJPMD-WAIo!4v)tZa4VjOC*d~SjyrHC?!w);2T#Vmcna>r zQ}HxB9nZis@hm(W&%tx?JUkySzzgvrycjRROYt(i9IwDD@hZF;ufc2aI=milz#H)< zycuu7Tk$r$9q+(9@h-d@@49|WNAWRy9G}1^@hN;7pTTGGIeZ>p zz!z~pzJxF1EBGqDhOgrr_$I!EZ{s`oF20BF;|KU5euN+6C-^CThM(gX_$7XYU*k9U zEgrz{@O%6Lf5e~gXZ!_!#ozFE`~&~QzwmGT2MCkIF%`C+$Uh(>}B>?MM650rU_$kPf1Q=@2@U4x_{A2s)CEqNC{; zI+l*3<7tLA(k#uIjC>7 z-w(oO=9z(&3%(JTO_v@)Yh^(OM$U!Yjtkg3+ z8Hy&aCQK{HjLZ*(kx0w!x^giJSW(^0u~E-sC2D?T%cV{nSR>Q%6DJV7XDqC&k%)dG zQm?68(F+FB85;e-8npQ^ZtTfOr0oS6`P35ad>Xxe(RE}XIiBDMsSE3+nTSo>a)ygm;`aI$hj45) z$BLnXUW+XT0RuzEjlN7&e^(D58+xVEsEHlI$-2DHLL!Tk_r``kLMsmP)KtJ|hkjJ5 zodQH!Z^)sRy`8z>knlWZwfv|ri)pEo2oa^8%zEXt0u?QuSZHnAipHvyByv&v(J55z zMYGWJxcsgWp+lr_#O|d2vM~F35OhmD4Xq%U5=%~Ch1QB&#=!40?1a_l97#k|j2LKq z8!e?cflNi0qZ0YiKo75RJR{L`tUyGrmDCd}a%I?XWEk=t*F$R%iL5=2S01m#QTfMk z&lZKqdVKUaR!cgZu-!hRP$b1>ozhS)OqPx>h$QoQ$LZ4cWa2L~e666xh<iEs`zz z8RN1DyaJhmy|%gq;!WN>k=3CX8Jx{&vvfJ_WnLcIDf_AdH(6TBU1hg4k$6_n?`U=@ zIHjT1Ws2wpel%oo7NKm!dFt`8dYnBXVcIa&XH6k~ROiiOZ`2w1yn|ifpkN2JO)X#? zaBx+=cQnL{jV8v)TbOMD!^_vNz;E;NopD9aA}MB zV!}D^)iNs`rgdgiK1|C_e9?ETRJ0Xxi#(|f5}C(_ie-&4lDlR1Fw}cFD1OJU?1#2)EKjPaTY=GG=- zJK?*xm=T%t+JSPyWLVfu<^{gzftb)CHpdmLTbKn>8>*C=q1)lPnI}^YzG$YopQ#&b zDp08%>kbzxA-KXwW@S|=bvaQ-uya4)6AYR>IaYP2Wre)E6*;0F3U}ydoxXC3ciAD> zb-{JOD`=`e(-+gO%xwjwNJU)ZZ(UD;zja-Vzjd}cS9^7SXU)Xsct(45Xu}ohkjq9r zuwo@NP_k|)ZFMf4jolL88gK2Lxy;I?3$?gsK5Z27VT!ReuKvNOT~YxDW@;@3Y8qNY zgUW7;rC4QQal3qhaWSrzhU`eKtvL*X?B%yqHlHksx$E}H5sp+-(gw+oGjZJq1J`SP-goi7~01yn7l!Z@+2n)>18`66&9#)YQvW?GdflhMQ&%Kg;i zh$c*SLKU7R$7O;lt4%t7v}{<{QxeqLE=5plZB0;K76zLQCr#(-j7_G@cEPG8h?$wV zI_|=F_v6%0*A%4bmA-M&GR(P|xt4zVsrBpJ$^K5Pz8rM9E+}7jHUq&)uV7dx8nMN9 z{fyAGu2aIC+c?`UO1`cLoc5g7sW+9+b)r#q zm@HQ9%u&x|(OSvbDa}K+0!HjvHfN+cH@j`aN^iz=YUi0qcmLlmb*$dFTXXRAI!kkt zIXAaSHJiI5uBN$N9;7skCBEj?()j7IGDZcn;WAkGQO%UjFTF8&@f(ZnL1KmVKEG*) zN!4=d%TedXR wKR5n@sM`5}7KXJ&;oFk`aftYr2h7i^W==Jm{tIe%siXh^0003|xQtN%02oC%ivR!s diff --git a/padrino/notejam/public/admin/images/logo.png b/padrino/notejam/public/admin/images/logo.png deleted file mode 100644 index 984fe449d505d927a96b5da9015d4b42e56640e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29343 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 etpd=(>Hh;93KgszUSvf80000 0) { - setTimeout(function() { $('.alert').alert('close'); }, alertTimeout); - } - - // Only process list-related JavaScript if there's a list! - if (list.length > 0) { - listCheckboxes = list.find(listCheckboxesSelector); - listCheckboxesLength = listCheckboxes.length; - - // Confirm before deleting one item - $('.list-row-action-delete-one').on('click', function(ev) { - ev.preventDefault(); - $(this).addClass('list-row-action-wrapper-link-active') - .siblings('.list-row-action-popover-delete-one').first().show() - .find('.cancel').on('click', function() { - - $(this).parents('.list-row-action-popover-delete-one').hide() - .siblings('.list-row-action-delete-one').removeClass('list-row-action-wrapper-link-active'); - }); - }); - - // Select/deselect record on row's click - list.find('.list-row').on('click', function(ev) { - var checkbox, willBeChecked; - ev.stopPropagation(); - - if (ev.currentTarget.tagName == 'TR') { - checkbox = $(this).find('.list-selectable-checkbox'); - willBeChecked = !checkbox.prop('checked'); - checkbox.prop('checked', willBeChecked); - $(this)[willBeChecked ? 'addClass' : 'removeClass']('list-row-selected'); - generalToggle(); - } - }); - // Select all action - $('#select-all').on('click', function(ev) { - ev.preventDefault(); - ev.stopPropagation(); - if ($(this).is('.list-menu-link-disabled')) return; - - // We assume we want to stay on the dropdown to delete all perhaps - ev.stopPropagation(); - checkAll(list, true); - toggleAction('#select-all', true); - toggleAction('#deselect-all', false); - }); - // Deselect all action - $('#deselect-all').on('click', function(ev) { - ev.preventDefault(); - if ($(this).is('.list-menu-link-disabled')) return; - - checkAll(list, false); - toggleAction('#deselect-all', true); - toggleAction('#select-all', false); - }); - // Delete selected - $('#delete-selected').on('click', function(ev) { - ev.preventDefault(); - ev.stopPropagation(); - if ($(this).is('.list-menu-link-disabled')) return; - - // Open the popup to confirm deletion - $(this).parent().addClass('active').parent('.dropdown').addClass('open'); - $(this).addClass('active') - .siblings('.list-menu-popover-delete-selected').first().show() - .find('.cancel').on('click', function() { - - // Hide the popover on cancel - $(this).parents('.list-menu-popover-delete-selected').hide() - .siblings('#delete-selected').removeClass('active').parent().removeClass('active'); - // and close the dropdown - $(this).parents('.dropdown').removeClass('open'); - }); - - $(this).siblings('.list-menu-popover-delete-selected').find(':hidden[data-delete-many-ids=true]'). - val(listCheckboxes.filter(':checked').map(function() { return $(this).val(); }).toArray().join(',')); - }); - - // Catch checkboxes check/uncheck and enable/disable the delete selected functionality - listCheckboxes.on('click', function(ev) { - ev.stopPropagation(); - - $(this).parent('.list-row')[$(this).is(':checked') ? 'addClass' : 'removeClass']('list-row-selected'); - - generalToggle(); - }); - } - - // Autofocus first field with an error. (usability) - var error_input; - if (error_input = $('.has-error :input').first()) { error_input.focus(); } - }); -}(window.jQuery); diff --git a/padrino/notejam/public/admin/javascripts/bootstrap/affix.js b/padrino/notejam/public/admin/javascripts/bootstrap/affix.js deleted file mode 100644 index c7be96e1d..000000000 --- a/padrino/notejam/public/admin/javascripts/bootstrap/affix.js +++ /dev/null @@ -1,126 +0,0 @@ -/* ======================================================================== - * Bootstrap: affix.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#affix - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // AFFIX CLASS DEFINITION - // ====================== - - var Affix = function (element, options) { - this.options = $.extend({}, Affix.DEFAULTS, options) - this.$window = $(window) - .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) - .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) - - this.$element = $(element) - this.affixed = - this.unpin = null - - this.checkPosition() - } - - Affix.RESET = 'affix affix-top affix-bottom' - - Affix.DEFAULTS = { - offset: 0 - } - - Affix.prototype.checkPositionWithEventLoop = function () { - setTimeout($.proxy(this.checkPosition, this), 1) - } - - Affix.prototype.checkPosition = function () { - if (!this.$element.is(':visible')) return - - var scrollHeight = $(document).height() - var scrollTop = this.$window.scrollTop() - var position = this.$element.offset() - var offset = this.options.offset - var offsetTop = offset.top - var offsetBottom = offset.bottom - - if (typeof offset != 'object') offsetBottom = offsetTop = offset - if (typeof offsetTop == 'function') offsetTop = offset.top() - if (typeof offsetBottom == 'function') offsetBottom = offset.bottom() - - var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false : - offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' : - offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false - - if (this.affixed === affix) return - if (this.unpin) this.$element.css('top', '') - - this.affixed = affix - this.unpin = affix == 'bottom' ? position.top - scrollTop : null - - this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : '')) - - if (affix == 'bottom') { - this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() }) - } - } - - - // AFFIX PLUGIN DEFINITION - // ======================= - - var old = $.fn.affix - - $.fn.affix = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.affix') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.affix', (data = new Affix(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.affix.Constructor = Affix - - - // AFFIX NO CONFLICT - // ================= - - $.fn.affix.noConflict = function () { - $.fn.affix = old - return this - } - - - // AFFIX DATA-API - // ============== - - $(window).on('load', function () { - $('[data-spy="affix"]').each(function () { - var $spy = $(this) - var data = $spy.data() - - data.offset = data.offset || {} - - if (data.offsetBottom) data.offset.bottom = data.offsetBottom - if (data.offsetTop) data.offset.top = data.offsetTop - - $spy.affix(data) - }) - }) - -}(window.jQuery); diff --git a/padrino/notejam/public/admin/javascripts/bootstrap/alert.js b/padrino/notejam/public/admin/javascripts/bootstrap/alert.js deleted file mode 100644 index 663029ed8..000000000 --- a/padrino/notejam/public/admin/javascripts/bootstrap/alert.js +++ /dev/null @@ -1,98 +0,0 @@ -/* ======================================================================== - * Bootstrap: alert.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#alerts - * ======================================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // ALERT CLASS DEFINITION - // ====================== - - var dismiss = '[data-dismiss="alert"]' - var Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype.close = function (e) { - var $this = $(this) - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = $(selector) - - if (e) e.preventDefault() - - if (!$parent.length) { - $parent = $this.hasClass('alert') ? $this : $this.parent() - } - - $parent.trigger(e = $.Event('close.bs.alert')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - $parent.trigger('closed.bs.alert').remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent - .one($.support.transition.end, removeElement) - .emulateTransitionEnd(150) : - removeElement() - } - - - // ALERT PLUGIN DEFINITION - // ======================= - - var old = $.fn.alert - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.alert') - - if (!data) $this.data('bs.alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - // ALERT NO CONFLICT - // ================= - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - // ALERT DATA-API - // ============== - - $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) - -}(window.jQuery); diff --git a/padrino/notejam/public/admin/javascripts/bootstrap/bootstrap.min.js b/padrino/notejam/public/admin/javascripts/bootstrap/bootstrap.min.js deleted file mode 100644 index 1765631f4..000000000 --- a/padrino/notejam/public/admin/javascripts/bootstrap/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/** -* bootstrap.js v3.0.0 by @fat and @mdo -* Copyright 2013 Twitter Inc. -* http://www.apache.org/licenses/LICENSE-2.0 -*/ -if(!jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(window.jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]');if(a.length){var b=this.$element.find("input").prop("checked",!this.$element.hasClass("active")).trigger("change");"radio"===b.prop("type")&&a.find(".active").removeClass("active")}this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(window.jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('

'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(window.jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.attr("data-target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(window.jQuery); \ No newline at end of file diff --git a/padrino/notejam/public/admin/javascripts/bootstrap/button.js b/padrino/notejam/public/admin/javascripts/bootstrap/button.js deleted file mode 100644 index fc73b555f..000000000 --- a/padrino/notejam/public/admin/javascripts/bootstrap/button.js +++ /dev/null @@ -1,109 +0,0 @@ -/* ======================================================================== - * Bootstrap: button.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#buttons - * ======================================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // BUTTON PUBLIC CLASS DEFINITION - // ============================== - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Button.DEFAULTS, options) - } - - Button.DEFAULTS = { - loadingText: 'loading...' - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - var $el = this.$element - var val = $el.is('input') ? 'val' : 'html' - var data = $el.data() - - state = state + 'Text' - - if (!data.resetText) $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d); - }, 0) - } - - Button.prototype.toggle = function () { - var $parent = this.$element.closest('[data-toggle="buttons"]') - - if ($parent.length) { - var $input = this.$element.find('input') - .prop('checked', !this.$element.hasClass('active')) - .trigger('change') - if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active') - } - - this.$element.toggleClass('active') - } - - - // BUTTON PLUGIN DEFINITION - // ======================== - - var old = $.fn.button - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.button') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.button', (data = new Button(this, options))) - - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.Constructor = Button - - - // BUTTON NO CONFLICT - // ================== - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - // BUTTON DATA-API - // =============== - - $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - e.preventDefault() - }) - -}(window.jQuery); diff --git a/padrino/notejam/public/admin/javascripts/bootstrap/carousel.js b/padrino/notejam/public/admin/javascripts/bootstrap/carousel.js deleted file mode 100644 index d8c4c243c..000000000 --- a/padrino/notejam/public/admin/javascripts/bootstrap/carousel.js +++ /dev/null @@ -1,217 +0,0 @@ -/* ======================================================================== - * Bootstrap: carousel.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#carousel - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // CAROUSEL CLASS DEFINITION - // ========================= - - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.paused = - this.sliding = - this.interval = - this.$active = - this.$items = null - - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.DEFAULTS = { - interval: 5000 - , pause: 'hover' - , wrap: true - } - - Carousel.prototype.cycle = function (e) { - e || (this.paused = false) - - this.interval && clearInterval(this.interval) - - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - - return this - } - - Carousel.prototype.getActiveIndex = function () { - this.$active = this.$element.find('.item.active') - this.$items = this.$active.parent().children() - - return this.$items.index(this.$active) - } - - Carousel.prototype.to = function (pos) { - var that = this - var activeIndex = this.getActiveIndex() - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) return this.$element.one('slid', function () { that.to(pos) }) - if (activeIndex == pos) return this.pause().cycle() - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - Carousel.prototype.pause = function (e) { - e || (this.paused = true) - - if (this.$element.find('.next, .prev').length && $.support.transition.end) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - - this.interval = clearInterval(this.interval) - - return this - } - - Carousel.prototype.next = function () { - if (this.sliding) return - return this.slide('next') - } - - Carousel.prototype.prev = function () { - if (this.sliding) return - return this.slide('prev') - } - - Carousel.prototype.slide = function (type, next) { - var $active = this.$element.find('.item.active') - var $next = next || $active[type]() - var isCycling = this.interval - var direction = type == 'next' ? 'left' : 'right' - var fallback = type == 'next' ? 'first' : 'last' - var that = this - - if (!$next.length) { - if (!this.options.wrap) return - $next = this.$element.find('.item')[fallback]() - } - - this.sliding = true - - isCycling && this.pause() - - var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) - - if ($next.hasClass('active')) return - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - this.$element.one('slid', function () { - var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) - $nextIndicator && $nextIndicator.addClass('active') - }) - } - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - $active - .one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - .emulateTransitionEnd(600) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } - - isCycling && this.cycle() - - return this - } - - - // CAROUSEL PLUGIN DEFINITION - // ========================== - - var old = $.fn.carousel - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.carousel') - var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) - var action = typeof option == 'string' ? option : options.slide - - if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - $.fn.carousel.Constructor = Carousel - - - // CAROUSEL NO CONFLICT - // ==================== - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - - // CAROUSEL DATA-API - // ================= - - $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var $this = $(this), href - var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - var options = $.extend({}, $target.data(), $this.data()) - var slideIndex = $this.attr('data-slide-to') - if (slideIndex) options.interval = false - - $target.carousel(options) - - if (slideIndex = $this.attr('data-slide-to')) { - $target.data('bs.carousel').to(slideIndex) - } - - e.preventDefault() - }) - - $(window).on('load', function () { - $('[data-ride="carousel"]').each(function () { - var $carousel = $(this) - $carousel.carousel($carousel.data()) - }) - }) - -}(window.jQuery); diff --git a/padrino/notejam/public/admin/javascripts/bootstrap/collapse.js b/padrino/notejam/public/admin/javascripts/bootstrap/collapse.js deleted file mode 100644 index 92cc0bc76..000000000 --- a/padrino/notejam/public/admin/javascripts/bootstrap/collapse.js +++ /dev/null @@ -1,179 +0,0 @@ -/* ======================================================================== - * Bootstrap: collapse.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#collapse - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // COLLAPSE PUBLIC CLASS DEFINITION - // ================================ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Collapse.DEFAULTS, options) - this.transitioning = null - - if (this.options.parent) this.$parent = $(this.options.parent) - if (this.options.toggle) this.toggle() - } - - Collapse.DEFAULTS = { - toggle: true - } - - Collapse.prototype.dimension = function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - Collapse.prototype.show = function () { - if (this.transitioning || this.$element.hasClass('in')) return - - var startEvent = $.Event('show.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var actives = this.$parent && this.$parent.find('> .panel > .in') - - if (actives && actives.length) { - var hasData = actives.data('bs.collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('bs.collapse', null) - } - - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - .addClass('collapsing') - [dimension](0) - - this.transitioning = 1 - - var complete = function () { - this.$element - .removeClass('collapsing') - .addClass('in') - [dimension]('auto') - this.transitioning = 0 - this.$element.trigger('shown.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - var scrollSize = $.camelCase(['scroll', dimension].join('-')) - - this.$element - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - [dimension](this.$element[0][scrollSize]) - } - - Collapse.prototype.hide = function () { - if (this.transitioning || !this.$element.hasClass('in')) return - - var startEvent = $.Event('hide.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var dimension = this.dimension() - - this.$element - [dimension](this.$element[dimension]()) - [0].offsetHeight - - this.$element - .addClass('collapsing') - .removeClass('collapse') - .removeClass('in') - - this.transitioning = 1 - - var complete = function () { - this.transitioning = 0 - this.$element - .trigger('hidden.bs.collapse') - .removeClass('collapsing') - .addClass('collapse') - } - - if (!$.support.transition) return complete.call(this) - - this.$element - [dimension](0) - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - } - - Collapse.prototype.toggle = function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - - // COLLAPSE PLUGIN DEFINITION - // ========================== - - var old = $.fn.collapse - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.collapse') - var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.Constructor = Collapse - - - // COLLAPSE NO CONFLICT - // ==================== - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - // COLLAPSE DATA-API - // ================= - - $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - var target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - var $target = $(target) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - var parent = $this.attr('data-parent') - var $parent = parent && $(parent) - - if (!data || !data.transitioning) { - if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') - $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - } - - $target.collapse(option) - }) - -}(window.jQuery); diff --git a/padrino/notejam/public/admin/javascripts/bootstrap/dropdown.js b/padrino/notejam/public/admin/javascripts/bootstrap/dropdown.js deleted file mode 100644 index 6093f11a8..000000000 --- a/padrino/notejam/public/admin/javascripts/bootstrap/dropdown.js +++ /dev/null @@ -1,154 +0,0 @@ -/* ======================================================================== - * Bootstrap: dropdown.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#dropdowns - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // DROPDOWN CLASS DEFINITION - // ========================= - - var backdrop = '.dropdown-backdrop' - var toggle = '[data-toggle=dropdown]' - var Dropdown = function (element) { - var $el = $(element).on('click.bs.dropdown', this.toggle) - } - - Dropdown.prototype.toggle = function (e) { - var $this = $(this) - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { - // if mobile we we use a backdrop because click events don't delegate - $('