diff --git a/.gitignore b/.gitignore new file mode 100755 index 00000000..9a73e662 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.idea +/server/vendor +/client/node_modules +.env +public/assets/js/bundle.js diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..d3e5d1a1 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,19 @@ +The MIT License (MIT) + +Copyright (c) 2015 devfake + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..63470395 --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +![flox](http://80.240.132.120/flox/public/assets/img/logo-big.png) + +###[Try Demo](http://80.240.132.120/flox/public/) + +Flox is a self hosted Movies, Series and Anime watch list. It's build on top of PHP (Laravel), MySQL and React and uses [The Movie Database](https://www.themoviedb.org/) API. + +**The current status miss some important features. See Todo.** + +The rating based on an 5-Point system. + +### Requirements + +* PHP 5.5.9+ +* [Composer](https://getcomposer.org/) +* [The Movie Database](https://www.themoviedb.org/) Account for the [API-Key](https://www.themoviedb.org/faq/api). + +### Install + +##### Server + +* Download Flox and `cd` into `server`. +* Rename `.env.example` to `.env` and fill all your credentials out (your database and TMDb API-Key). +* Run `composer install`. +* Give `storage` recursive write access. +* Run `php artisan migrate`. This builds the database schema for Flox. +* Since the insertion of new items currently not working, run `php artisan db:seed` for prefabricated items. + +##### Client / Public + +* Open the `public/assets/js/config.js` file and modify them. The `uri` is needed for the react-router. If your app lives in the root folder, change it to `/`. The rest should be clear. + +**Only for development:** +* Run `npm install` in your `client` folder. +* Run `gulp watch` or `gulp watch --production` and make your work. + +### Todo + +* Fix load icon jerk. +* Edit, remove and add items. +* Login for admin (maybe with options). +* Detail page for items (rather than direct to youtube). +* Easy installer. +* Rewrite Server API. +* Light Theme. +* Modify and add own categorys. +* For series and animes a list of episodes. diff --git a/client/app/api.js b/client/app/api.js new file mode 100644 index 00000000..2ca0e2ac --- /dev/null +++ b/client/app/api.js @@ -0,0 +1,38 @@ +import React from 'react'; + +class Api extends React.Component { + + static categories() { + return $.get(config.api + 'all-categories'); + } + + static categoryItems(category) { + return $.get(config.api + 'category-items/' + category + '/' + this.usersFilterFor(category)); + } + + static usersFilterFor(category) { + if( ! localStorage.getItem('category-' + category)) { + localStorage.setItem('category-' + category, 'seen'); + } + + return localStorage.getItem('category-' + category); + } + + static changeUsersFilterFor(category, type) { + localStorage.setItem('category-' + category, type); + } + + static search(type, value) { + return $.get(config.api + 'search/' + type + '/' + value); + } + + /*static searchTMDBByID(id) { + return $.get(config.api + 'search/tmdb/id/' + id); + } + + static searchItemBySlug(slug) { + return $.get(config.api + 'item/' + slug) + }*/ +} + +export default Api; diff --git a/client/app/app.js b/client/app/app.js new file mode 100644 index 00000000..f1abdad2 --- /dev/null +++ b/client/app/app.js @@ -0,0 +1,38 @@ +import React from 'react'; +import Router from 'react-router'; +import Api from './api'; +import Home from './sites/home'; +import Category from './sites/category'; +//import Show from './partials/show'; +import Header from './partials/header'; +import Footer from './partials/footer'; + +let Route = Router.Route; + +let RouteHandler = Router.RouteHandler; + +class Flox extends React.Component { + + render() { + return ( +
+
+ +
+ ); + } +} + +// Mäh... +// +let routes = ( + + + + +); + +Router.run(routes, Router.HistoryLocation, (Root) => { + React.render(, document.querySelector('.flox')); +}); diff --git a/client/app/partials/box.js b/client/app/partials/box.js new file mode 100644 index 00000000..2430445d --- /dev/null +++ b/client/app/partials/box.js @@ -0,0 +1,60 @@ +import React from 'react'; +import Router from 'react-router'; +import FilterOptions from './filter-options'; +import Item from './item'; +import Api from '../api'; + +let Link = Router.Link; + +class Box extends React.Component { + + state = { + // No need to sync parent items. + items: this.props.items + } + + render() { + let items = this.state.items.map((value, key) => { + return + }); + + return ( + +
+
+ + + {this.props.category.name} ({this.props.category.items_count.aggregate}) + + + + +
+ { ! this.state.items.length ? : items} +
+ +
+
+ + ); + } + + changeFilter(filterBy, category) { + Api.changeUsersFilterFor(category, filterBy); + + this.setState({ + items: [] + }) + + // todo: Move to api. + setTimeout(() => { + $.get(config.api + this.props.type + '-items/' + this.props.category.slug + '/' + filterBy, (value) => { + this.setState({ + items: value.items + }) + }); + }, 200); + } +} + +export default Box; diff --git a/client/app/partials/filter-options.js b/client/app/partials/filter-options.js new file mode 100644 index 00000000..deafee0c --- /dev/null +++ b/client/app/partials/filter-options.js @@ -0,0 +1,22 @@ +import React from 'react'; +import Api from '../api'; + +class FilterOptions extends React.Component { + + render() { + return ( + +
+ + +
+ + ); + } + + setActiveIf(type) { + if(type === Api.usersFilterFor(this.props.category)) return 'active'; + } +} + +export default FilterOptions; diff --git a/client/app/partials/flox-item.js b/client/app/partials/flox-item.js new file mode 100644 index 00000000..febdd8b6 --- /dev/null +++ b/client/app/partials/flox-item.js @@ -0,0 +1,28 @@ +import React from 'react'; + +class FloxItem extends React.Component { + + render() { + return ( + +
+
+ +
+ + + {this.props.bgStyle.backgroundImage ? '' : } +
+
+ +
+ {this.props.released().year} + {this.props.data.title} +
+
+ + ); + } +} + +export default FloxItem; \ No newline at end of file diff --git a/client/app/partials/footer.js b/client/app/partials/footer.js new file mode 100644 index 00000000..933005b8 --- /dev/null +++ b/client/app/partials/footer.js @@ -0,0 +1,24 @@ +import React from 'react'; +import Router from 'react-router'; + +let Link = Router.Link; + +class Footer extends React.Component { + + render() { + return ( + +
+
+ + This product uses the TMDb API but is not endorsed or certified by TMDb + + +
+
+ + ); + } +} + +export default Footer; \ No newline at end of file diff --git a/client/app/partials/header.js b/client/app/partials/header.js new file mode 100644 index 00000000..8a2696ff --- /dev/null +++ b/client/app/partials/header.js @@ -0,0 +1,54 @@ +import React from 'react'; +import Router from 'react-router'; +import Modal from './modal'; + +let Link = Router.Link; + +class Header extends React.Component { + + state = { + showModal: false, + type: '' + } + + render() { + return ( + +
+ {this.state.showModal ? : ''} + +
+
+ Flox + +
+ +
+ + +
+
+
+ + ); + } + + changeModal(type = '') { + this.setState({ + showModal: ! this.state.showModal, + type: type + }) + } +} + +export default Header; diff --git a/client/app/partials/item.js b/client/app/partials/item.js new file mode 100644 index 00000000..27b2c75d --- /dev/null +++ b/client/app/partials/item.js @@ -0,0 +1,57 @@ +import React from 'react'; +import Router from 'react-router'; +import Api from '../api'; +import FloxItem from './flox-item'; +import TMDBItem from './tmdb-item'; + +let Link = Router.Link; + +class Item extends React.Component { + + state = { + loadClass: 'loading' + } + + componentDidMount() { + // todo: Move to React animation. + setTimeout(() => { + this.setState({ + loadClass: '' + }); + }, 20); + } + + render() { + let style = { + backgroundImage: + this.props.data.poster === 'null' || this.props.data.poster === null || typeof this.props.data.poster === 'undefined' + ? '' + : 'url(' + config.posterSmall + this.props.data.poster + ')' + } + + return ( + + this.props.tmdb + ? + : + + ) + } + + released() { + let released = new Date(this.props.data.released * 1000); + let language = navigator.language || navigator.userLanguage; + + return { + year: released.getFullYear(), + full: released.toLocaleDateString(language, { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric' + }) + } + } +} + +export default Item; \ No newline at end of file diff --git a/client/app/partials/modal.js b/client/app/partials/modal.js new file mode 100644 index 00000000..381cc435 --- /dev/null +++ b/client/app/partials/modal.js @@ -0,0 +1,92 @@ +import React from 'react'; +import Api from '../api'; +import Item from './item'; + +class Modal extends React.Component { + + state = { + items: [], + searching: false, + searched: false, + loadClass: 'loading' + } + + componentDidMount() { + // Avoid 'jerk' if overflow from body is hidden. + setTimeout(() => { + $('body').addClass('modal-active'); + }, 200); + + React.findDOMNode(this.refs.input).focus(); + + setTimeout(() => { + this.setState({ + loadClass: '' + }); + }, 20); + } + + componentWillUnmount() { + $('body').removeClass('modal-active'); + } + + render() { + let content = ''; + let items = this.state.items.map((value, key) => { + return + }); + + if( ! this.state.items.length && this.state.searched) { + content =
No items found :(
+ } else if(this.state.searching) { + content = + } else if(this.state.items.length && ! this.state.searching) { + content = items; + } + + return ( + +
+
+
+
+
+ + +
+
+ + {content} + +
+
+
+
+ + ); + } + + searchKeyEvents(event) { + if(event.key === 'Enter') { + this.setState({ + searching: true, + searched: false + }); + + Api.search(this.props.type, event.target.value).then((value) => { + console.log(value); + setTimeout(() => { + this.setState({ + searching: false, + searched: true, + items: value + }); + }, 200); + }); + } else if(event.key === 'Escape') { + this.props.closeModal(); + } + } +} + +export default Modal; \ No newline at end of file diff --git a/client/app/partials/tmdb-item.js b/client/app/partials/tmdb-item.js new file mode 100644 index 00000000..e099a1c7 --- /dev/null +++ b/client/app/partials/tmdb-item.js @@ -0,0 +1,24 @@ +import React from 'react'; + +class TMDBItem extends React.Component { + + render() { + return ( + +
+ +
+ {this.props.bgStyle.backgroundImage ? '' : } +
+ +
+ {this.props.released().year} +
{this.props.data.title}
+
+
+ + ); + } +} + +export default TMDBItem; \ No newline at end of file diff --git a/client/app/sites/category.js b/client/app/sites/category.js new file mode 100644 index 00000000..cbe2834f --- /dev/null +++ b/client/app/sites/category.js @@ -0,0 +1,47 @@ +import React from 'react'; +import Box from '../partials/box'; +import Api from '../api'; + +class Category extends React.Component { + + state = { + category: {}, + items: [] + } + + componentWillReceiveProps(nextProps) { + this.setState({ + category: {}, + items: [] + }); + + this.loadCategoryItems(nextProps); + } + + constructor(props) { + super(props); + this.loadCategoryItems(props); + } + + // todo: fix icon load. + render() { + return ( +
+ { ! this.state.items.length ? : } +
+ ); + } + + loadCategoryItems(props) { + setTimeout(() => { + Api.categoryItems(props.params.category).then((value) => { + this.setState({ + category: value.category, + items: value.items + }); + }); + }, 200); + } +} + +export default Category; diff --git a/client/app/sites/home.js b/client/app/sites/home.js new file mode 100644 index 00000000..796b0905 --- /dev/null +++ b/client/app/sites/home.js @@ -0,0 +1,56 @@ +import React from 'react'; +import Box from '../partials/box'; +import Api from '../api'; + +class Home extends React.Component { + + state = { + items: [] + } + + constructor() { + super(); + this.loadHomeItems(); + } + + render() { + let boxes = this.state.items.map((value, key) => { + return + }); + + return ( + +
+ { ! this.state.items.length ? : boxes} +
+ + ); + } + + loadHomeItems() { + let items = []; + let requests = []; + let self = this; + + Api.categories().then((value) => { + value.forEach((data) => { + requests.push($.get(config.api + 'home-items/' + data.slug + '/' + Api.usersFilterFor(data.slug))); + }); + + $.when.apply($, requests).then(function() { + for(let i = 0; i < arguments.length; i++) { + items.push({ + category: arguments[i][0].category, + items: arguments[i][0].items + }); + } + + self.setState({ + items: items + }); + }); + }); + } +} + +export default Home; diff --git a/client/app/sites/show.js b/client/app/sites/show.js new file mode 100644 index 00000000..010f0350 --- /dev/null +++ b/client/app/sites/show.js @@ -0,0 +1,51 @@ +import React from 'react'; +import Api from '../api'; + +// Todo: Make it work! +class Show extends React.Component { + + state = { + item: {} + } + + constructor(props) { + super(props); + this.loadItem(); + } + + render() { + let style = { + backgroundImage: + this.state.item.poster == 'null' || typeof this.state.item.poster === 'undefined' ? '' : 'url(' + config.posterBig + this.state.item.poster + ')' + } + + return ( + +
+
+ +
+
+ {style.backgroundImage ? '' : } +
+
+
+ +
+

{this.state.item.title}

+
+ +
+
+ + ); + } + + loadItem() { + Api.searchItemBySlug(this.props.params.item).then((value) => { + Api.searchTMDBByID(value.tmdb_id); + }); + } +} + +export default Show; diff --git a/client/assets/sass/_base.scss b/client/assets/sass/_base.scss new file mode 100644 index 00000000..ab55665e --- /dev/null +++ b/client/assets/sass/_base.scss @@ -0,0 +1,53 @@ +* { + margin: 0; + padding: 0; + + box-sizing: border-box; +} + +.wrap { + //max-width: 1200px; + //width: 100%; + width: 1100px; + margin: 0 auto; + padding: 0 20px; +} + +body { + background: $dark; + font-family: 'Titillium Web', sans-serif; + padding: 65px 0 0 0; + overflow-y: scroll; +} + +.modal-active { + overflow: hidden; +} + +::-moz-selection { + background: rgba(#474747, .99); + color: #fff; +} + +::selection { + background: rgba(#474747, .99); + color: #fff; +} + +::-webkit-input-placeholder { + color: #636363; +} + +::-moz-placeholder { + color: #636363; + opacity: 1; +} + +::-ms-input-placeholder { + color: #636363; +} + +ul { list-style: none; } +a { text-decoration: none; outline: 0; } +img { border: 0; } +textarea, input { outline: 0; } diff --git a/client/assets/sass/_content.scss b/client/assets/sass/_content.scss new file mode 100644 index 00000000..e632ef3f --- /dev/null +++ b/client/assets/sass/_content.scss @@ -0,0 +1,219 @@ +.flox { + position: relative; + width: 100%; + min-height: calc(100vh + 120px); + float: left; + padding: 0 0 120px 0; +} + +.box { + float: left; + width: 100%; + padding: 60px 0; + position: relative; + + &:nth-child(2) { + background: #242424; + } +} + +.box-headline { + font-size: 22px; + color: #555; + + &:hover, + &:hover { + background: $main; + color: #fff; + } +} + +.box-options { + float: right; + + i { + float: left; + cursor: pointer; + margin: 0 0 0 20px; + opacity: .8; + + &:active { + opacity: .6; + } + } +} + +.icon-time { + + &.active { + @extend .icon-time-active; + } +} + +.icon-star { + + &.active { + @extend .icon-star-active; + } +} + +.items { + float: left; + width: 100%; + min-height: 400px; +} + +.item { + float: left; + width: 185px; + margin: 50px 33px 0 0; + position: relative; + + &:nth-child(5n) { + margin: 50px 0 0 0; + } + + &:hover .icon-edit-wrap { + display: block; + } +} + +.icon-edit-wrap { + padding: 10px; + background: $main; + position: absolute; + left: 0; + top: 0; + z-index: 50; + display: none; + cursor: pointer; + opacity: .85; + transition: opacity .2s ease-in-out 0s; + + i { + float: left; + } + + &:hover { + opacity: 1; + } +} + +.rating { + float: right; + width: 10px; + height: 270px; + opacity: .9; + background: silver; + + .item-image-big & { + height: 450px; + } +} + +.rating-1 { background: #ac1b1b; } +.rating-2 { background: #c15e33; } +.rating-3 { background: #dea621; } +.rating-4 { background: #73a01c; } +.rating-5 { background: $main; } + +.item-image { + background-color: #101010; + float: left; + width: 185px; + height: 270px; + position: relative; + top: 0; + opacity: 1; + + transition: top .4s ease-in-out 0s, opacity .4s ease-in-out 0s; + + .loading & { + top: -5px; + opacity: 0; + } +} + +.item-image-big { + width: 300px; + height: 450px; +} + +.item-content { + float: left; + margin: 20px 0 0 0; + padding: 0 5px; + width: 100%; +} + +.icon-no-image { + position: absolute; + top: 95px; + left: 60px; + + .item-image-big & { + top: 175px; + left: 120px; + } +} + +.item-date { + float: left; + clear: both; + color: #555; + font-size: 15px; +} + +.item-title { + float: left; + clear: both; + font-size: 17px; + color: #909090; + border-bottom: 1px solid transparent; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 100%; + + &:hover, + &:active { + background: $main; + color: #fff; + } +} + +.icon-content-load, +.icon-box-load { + background: url(../img/content-load.gif) no-repeats; + width: 32px; + height: 32px; + position: absolute; + left: 50%; + top: 50vh; + transform: translateX(-50%); +} + +.icon-box-load { + top: 280px; +} + +.show-item-wrap { + float: left; + width: 100%; + margin: 50px 0 0 0; +} + +.image-wrap { + float: left; + width: 350px; +} + +.show-content { + float: left; + width: 710px; + + h2 { + color: $main; + font-size: 32px; + } +} \ No newline at end of file diff --git a/client/assets/sass/_fonts.scss b/client/assets/sass/_fonts.scss new file mode 100644 index 00000000..ca8dc2cc --- /dev/null +++ b/client/assets/sass/_fonts.scss @@ -0,0 +1,12 @@ +@font-face { + font-family: 'Titillium Web'; + font-style: normal; + font-weight: 400; + src: local('Titillium Web'), local('TitilliumWeb-Regular'), url(http://fonts.gstatic.com/s/titilliumweb/v4/7XUFZ5tgS-tD6QamInJTcZSnX671uNZIV63UdXh3Mg0.woff2) format('woff2'), url(http://fonts.gstatic.com/s/titilliumweb/v4/7XUFZ5tgS-tD6QamInJTcdGU7DQ8I6RFMlK0vgclk7w.woff) format('woff'); +} +@font-face { + font-family: 'Titillium Web'; + font-style: normal; + font-weight: 600; + src: local('Titillium WebSemiBold'), local('TitilliumWeb-SemiBold'), url(http://fonts.gstatic.com/s/titilliumweb/v4/anMUvcNT0H1YN4FII8wpr46gJz9aNFrmnwBdd69aqzY.woff2) format('woff2'), url(http://fonts.gstatic.com/s/titilliumweb/v4/anMUvcNT0H1YN4FII8wprx7IBmrqA5IG9z8WNe77b9o.woff) format('woff'); +} \ No newline at end of file diff --git a/client/assets/sass/_footer.scss b/client/assets/sass/_footer.scss new file mode 100644 index 00000000..7269b23d --- /dev/null +++ b/client/assets/sass/_footer.scss @@ -0,0 +1,27 @@ +.site-footer { + float: left; + width: 100%; + background: darken($dark, 3%); + padding: 40px 0; + position: absolute; + bottom: 0; + font-size: 14px; + + a:active { + opacity: .5; + } +} + +.attribution { + color: #555; + float: left; +} + +.icon-tmdb { + float: left; + margin: 3px 10px 0 0; +} + +.icon-github { + float: right; +} \ No newline at end of file diff --git a/client/assets/sass/_header.scss b/client/assets/sass/_header.scss new file mode 100644 index 00000000..4276a785 --- /dev/null +++ b/client/assets/sass/_header.scss @@ -0,0 +1,58 @@ +.site-header { + position: fixed; + width: 100%; + left: 0; + top: 0; + background: rgba($main, .95); + height: 65px; + overflow: hidden; + z-index: 100; +} + +.logo { + float: left; + padding: 19px 0; +} + +.site-nav { + float: right; + margin: 0 20px 0 0; + padding: 0 20px 0 0; + border-right: 1px solid #c86ede; + + li { + float: left; + } + + a { + color: #fff; + padding: 16px 20px 18px 20px; + float: left; + font-size: 17px; + border-top: 3px solid transparent; + transition: border .2s ease-in-out 0s; + + &.active { + border-top: 3px solid #fff; + } + } +} + +.add-wrap, +.icon-search-wrap { + float: right; + padding: 16px 0 19px 0; + cursor: pointer; + + i { + display: block; + } + + &:active { + opacity: .8; + } +} + +.icon-search-wrap { + margin: 0 0 0 10px; +} diff --git a/client/assets/sass/_mixins.scss b/client/assets/sass/_mixins.scss new file mode 100644 index 00000000..14cbf206 --- /dev/null +++ b/client/assets/sass/_mixins.scss @@ -0,0 +1,2 @@ +$main: #ba59d2; +$dark: #1b1b1b; diff --git a/client/assets/sass/_modal.scss b/client/assets/sass/_modal.scss new file mode 100644 index 00000000..4ce3f098 --- /dev/null +++ b/client/assets/sass/_modal.scss @@ -0,0 +1,89 @@ +.modal-wrap { + background: rgba(#0e0e0e, .98); + position: fixed; + left: 0; + top: 0; + height: 100%; + width: 100%; + z-index: 200; + opacity: 1; + transition: opacity .1s ease-in-out 0s; + + .modal-active & { + overflow-y: scroll; + } + + &.loading { + opacity: 0; + } +} + +.modal-header { + background: $main; + float: left; + width: 100%; + height: 65px; + position: fixed; + left: 0; + top: 0; + transition: top .5s ease-in-out 0s; + + .loading & { + top: -100%; + } + + .icon-search { + float: left; + margin: 17px 0 0 0; + } +} + +.icon-close-wrap { + padding: 16px; + float: right; + cursor: pointer; + margin: 5px 0 0 0; + + .icon-close { + float: left; + } + + &:active { + opacity: .6; + } +} + +.modal-input { + border: 0; + background: transparent; + font-size: 38px; + color: $main; + width: 100%; +} + +.search-wrap { + float: left; + width: calc(100% - 100px); +} + +.search-items { + width: 100%; + float: left; + padding: 80px 0; +} + +.no-items-found { + width: 100%; + float: left; + margin: 30vh 0 0 0; + text-align: center; + color: #474747; + font-size: 32px; +} + +.modal-label { + float: left; + text-transform: uppercase; + color: #3e3e3e; + font-size: 15px; +} \ No newline at end of file diff --git a/client/assets/sass/_normalize.scss b/client/assets/sass/_normalize.scss new file mode 100644 index 00000000..458eea1e --- /dev/null +++ b/client/assets/sass/_normalize.scss @@ -0,0 +1,427 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-family: sans-serif; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ + +audio, +canvas, +progress, +video { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. + */ + +[hidden], +template { + display: none; +} + +/* Links + ========================================================================== */ + +/** + * Remove the gray background color from active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9/10. + */ + +img { + border: 0; +} + +/** + * Correct overflow not hidden in IE 9/10/11. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari. + */ + +figure { + margin: 1em 40px; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +/** + * Contain overflow in all browsers. + */ + +pre { + overflow: auto; +} + +/** + * Address odd `em`-unit font size rendering in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Forms + ========================================================================== */ + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + +button, +input, +optgroup, +select, +textarea { + color: inherit; /* 1 */ + font: inherit; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +input { + line-height: normal; +} + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ + +textarea { + overflow: auto; +} + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ + +optgroup { + font-weight: bold; +} + +/* Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} diff --git a/client/assets/sass/_sprite.scss b/client/assets/sass/_sprite.scss new file mode 100644 index 00000000..c81c80da --- /dev/null +++ b/client/assets/sass/_sprite.scss @@ -0,0 +1,73 @@ +/* +Icon classes can be used entirely standalone. They are named after their original file names. + +```html + +``` +*/ +.icon-add { + background-image: url(../img/sprite.png); + background-position: -32px -64px; + width: 32px; + height: 32px; +} +.icon-close { + background-image: url(../img/sprite.png); + background-position: -64px -64px; + width: 32px; + height: 32px; +} +.icon-edit { + background-image: url(../img/sprite.png); + background-position: -128px -18px; + width: 16px; + height: 16px; +} +.icon-github { + background-image: url(../img/sprite.png); + background-position: 0px -96px; + width: 33px; + height: 27px; +} +.icon-no-image { + background-image: url(../img/sprite.png); + background-position: 0px 0px; + width: 64px; + height: 64px; +} +.icon-search { + background-image: url(../img/sprite.png); + background-position: -64px 0px; + width: 32px; + height: 32px; +} +.icon-star-active { + background-image: url(../img/sprite.png); + background-position: -96px 0px; + width: 32px; + height: 32px; +} +.icon-star { + background-image: url(../img/sprite.png); + background-position: -96px -32px; + width: 32px; + height: 32px; +} +.icon-time-active { + background-image: url(../img/sprite.png); + background-position: 0px -64px; + width: 32px; + height: 32px; +} +.icon-time { + background-image: url(../img/sprite.png); + background-position: -64px -32px; + width: 32px; + height: 32px; +} +.icon-tmdb { + background-image: url(../img/sprite.png); + background-position: -128px 0px; + width: 138px; + height: 18px; +} diff --git a/client/assets/sass/app.scss b/client/assets/sass/app.scss new file mode 100644 index 00000000..ef35555d --- /dev/null +++ b/client/assets/sass/app.scss @@ -0,0 +1,12 @@ +@import + +'normalize', +'mixins', +'fonts', +'base', +'sprite', + +'header', +'content', +'modal', +'footer'; diff --git a/client/assets/sprites/add.png b/client/assets/sprites/add.png new file mode 100644 index 00000000..2afeac55 Binary files /dev/null and b/client/assets/sprites/add.png differ diff --git a/client/assets/sprites/close.png b/client/assets/sprites/close.png new file mode 100644 index 00000000..8fd7c61d Binary files /dev/null and b/client/assets/sprites/close.png differ diff --git a/client/assets/sprites/edit.png b/client/assets/sprites/edit.png new file mode 100644 index 00000000..1329525b Binary files /dev/null and b/client/assets/sprites/edit.png differ diff --git a/client/assets/sprites/github.png b/client/assets/sprites/github.png new file mode 100644 index 00000000..58836e1a Binary files /dev/null and b/client/assets/sprites/github.png differ diff --git a/client/assets/sprites/no-image.png b/client/assets/sprites/no-image.png new file mode 100644 index 00000000..d26128cc Binary files /dev/null and b/client/assets/sprites/no-image.png differ diff --git a/client/assets/sprites/search.png b/client/assets/sprites/search.png new file mode 100644 index 00000000..490fb1f8 Binary files /dev/null and b/client/assets/sprites/search.png differ diff --git a/client/assets/sprites/star-active.png b/client/assets/sprites/star-active.png new file mode 100644 index 00000000..7122948f Binary files /dev/null and b/client/assets/sprites/star-active.png differ diff --git a/client/assets/sprites/star.png b/client/assets/sprites/star.png new file mode 100644 index 00000000..6160cbbb Binary files /dev/null and b/client/assets/sprites/star.png differ diff --git a/client/assets/sprites/time-active.png b/client/assets/sprites/time-active.png new file mode 100644 index 00000000..f9c5b50e Binary files /dev/null and b/client/assets/sprites/time-active.png differ diff --git a/client/assets/sprites/time.png b/client/assets/sprites/time.png new file mode 100644 index 00000000..006a3d91 Binary files /dev/null and b/client/assets/sprites/time.png differ diff --git a/client/assets/sprites/tmdb.png b/client/assets/sprites/tmdb.png new file mode 100644 index 00000000..09dd2eff Binary files /dev/null and b/client/assets/sprites/tmdb.png differ diff --git a/client/gulpfile.js b/client/gulpfile.js new file mode 100644 index 00000000..d05ba594 --- /dev/null +++ b/client/gulpfile.js @@ -0,0 +1,25 @@ +var elixir = require('laravel-elixir'); + +require('laravel-elixir-spritesmith'); + +elixir.config.sourcemaps = false; + +elixir.config.cssOutput = './../public/assets/css'; +elixir.config.jsOutput = './../public/assets/js'; +elixir.config.assetsDir = 'assets/'; +elixir.config.publicDir = '../public/'; + +elixir(function(mix) { + mix.sass('app.scss'); + + mix.browserify('../../app/app.js'); + + mix.spritesmith('assets/sprites', { + imgOutput: '../public/assets/img', + cssOutput: 'assets/sass', + cssName: '_sprite.scss', + cssFormat: 'css' + }); + + mix.task('browserify', '../../app/**/*.js'); +}); diff --git a/client/package.json b/client/package.json new file mode 100644 index 00000000..e7d031c2 --- /dev/null +++ b/client/package.json @@ -0,0 +1,12 @@ +{ + "private": true, + "devDependencies": { + "gulp": "^3.8.8" + }, + "dependencies": { + "laravel-elixir": "^2.0.0", + "laravel-elixir-spritesmith": "^0.1.5", + "react": "^0.13.3", + "react-router": "^0.13.3" + } +} diff --git a/client/views/app.blade.php b/client/views/app.blade.php new file mode 100644 index 00000000..ef321f2c --- /dev/null +++ b/client/views/app.blade.php @@ -0,0 +1,21 @@ + + + + + + Flox - Collect your Movies, Series and Anime watch list + + + + + + + +
+ + + + + + + \ No newline at end of file diff --git a/public/.htaccess b/public/.htaccess new file mode 100755 index 00000000..8eb2dd0d --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,16 @@ + + + Options -MultiViews + + + RewriteEngine On + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^(.*)/$ /$1 [L,R=301] + + # Handle Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/public/assets/css/app.css b/public/assets/css/app.css new file mode 100644 index 00000000..0fe49e15 --- /dev/null +++ b/public/assets/css/app.css @@ -0,0 +1 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@font-face{font-family:'Titillium Web';font-style:normal;font-weight:400;src:local("Titillium Web"),local("TitilliumWeb-Regular"),url(http://fonts.gstatic.com/s/titilliumweb/v4/7XUFZ5tgS-tD6QamInJTcZSnX671uNZIV63UdXh3Mg0.woff2) format("woff2"),url(http://fonts.gstatic.com/s/titilliumweb/v4/7XUFZ5tgS-tD6QamInJTcdGU7DQ8I6RFMlK0vgclk7w.woff) format("woff")}@font-face{font-family:'Titillium Web';font-style:normal;font-weight:600;src:local("Titillium WebSemiBold"),local("TitilliumWeb-SemiBold"),url(http://fonts.gstatic.com/s/titilliumweb/v4/anMUvcNT0H1YN4FII8wpr46gJz9aNFrmnwBdd69aqzY.woff2) format("woff2"),url(http://fonts.gstatic.com/s/titilliumweb/v4/anMUvcNT0H1YN4FII8wprx7IBmrqA5IG9z8WNe77b9o.woff) format("woff")}*{margin:0;padding:0;box-sizing:border-box}.wrap{width:1100px;margin:0 auto;padding:0 20px}body{background:#1b1b1b;font-family:'Titillium Web',sans-serif;padding:65px 0 0;overflow-y:scroll}.modal-active{overflow:hidden}::-moz-selection{background:rgba(71,71,71,.99);color:#fff}::selection{background:rgba(71,71,71,.99);color:#fff}::-webkit-input-placeholder{color:#636363}::-moz-placeholder{color:#636363;opacity:1}::-ms-input-placeholder{color:#636363}ul{list-style:none}a{text-decoration:none;outline:0}img{border:0}input,textarea{outline:0}.icon-add{background-image:url(../img/sprite.png);background-position:-32px -64px;width:32px;height:32px}.icon-close{background-image:url(../img/sprite.png);background-position:-64px -64px;width:32px;height:32px}.icon-edit{background-image:url(../img/sprite.png);background-position:-128px -18px;width:16px;height:16px}.icon-github{background-image:url(../img/sprite.png);background-position:0 -96px;width:33px;height:27px}.icon-no-image{background-image:url(../img/sprite.png);background-position:0 0;width:64px;height:64px}.icon-search{background-image:url(../img/sprite.png);background-position:-64px 0;width:32px;height:32px}.icon-star-active,.icon-star.active{background-image:url(../img/sprite.png);background-position:-96px 0;width:32px;height:32px}.icon-star{background-image:url(../img/sprite.png);background-position:-96px -32px;width:32px;height:32px}.icon-time-active,.icon-time.active{background-image:url(../img/sprite.png);background-position:0 -64px;width:32px;height:32px}.icon-time{background-image:url(../img/sprite.png);background-position:-64px -32px;width:32px;height:32px}.icon-tmdb{background-image:url(../img/sprite.png);background-position:-128px 0;width:138px;height:18px}.site-header{position:fixed;width:100%;left:0;top:0;background:rgba(186,89,210,.95);height:65px;overflow:hidden;z-index:100}.logo{float:left;padding:19px 0}.site-nav{float:right;margin:0 20px 0 0;padding:0 20px 0 0;border-right:1px solid #c86ede}.site-nav li{float:left}.site-nav a{color:#fff;padding:16px 20px 18px;float:left;font-size:17px;border-top:3px solid transparent;transition:border .2s ease-in-out 0s}.site-nav a.active{border-top:3px solid #fff}.add-wrap,.icon-search-wrap{float:right;padding:16px 0 19px;cursor:pointer}.add-wrap i,.icon-search-wrap i{display:block}.add-wrap:active,.icon-search-wrap:active{opacity:.8}.icon-search-wrap{margin:0 0 0 10px}.flox{position:relative;width:100%;min-height:calc(100vh + 120px);float:left;padding:0 0 120px}.box{float:left;width:100%;padding:60px 0;position:relative}.box:nth-child(2){background:#242424}.box-headline{font-size:22px;color:#555}.box-headline:hover{background:#ba59d2;color:#fff}.box-options{float:right}.box-options i{float:left;cursor:pointer;margin:0 0 0 20px;opacity:.8}.box-options i:active{opacity:.6}.items{float:left;width:100%;min-height:400px}.item{float:left;width:185px;margin:50px 33px 0 0;position:relative}.item:nth-child(5n){margin:50px 0 0}.item:hover .icon-edit-wrap{display:block}.icon-edit-wrap{padding:10px;background:#ba59d2;position:absolute;left:0;top:0;z-index:50;display:none;cursor:pointer;opacity:.85;transition:opacity .2s ease-in-out 0s}.icon-edit-wrap i{float:left}.icon-edit-wrap:hover{opacity:1}.rating{float:right;width:10px;height:270px;opacity:.9;background:silver}.item-image-big .rating{height:450px}.rating-1{background:#ac1b1b}.rating-2{background:#c15e33}.rating-3{background:#dea621}.rating-4{background:#73a01c}.rating-5{background:#ba59d2}.item-image{background-color:#101010;float:left;width:185px;height:270px;position:relative;top:0;opacity:1;transition:top .4s ease-in-out 0s,opacity .4s ease-in-out 0s}.loading .item-image{top:-5px;opacity:0}.item-image-big{width:300px;height:450px}.item-content{float:left;margin:20px 0 0;padding:0 5px;width:100%}.icon-no-image{position:absolute;top:95px;left:60px}.item-image-big .icon-no-image{top:175px;left:120px}.item-date{float:left;clear:both;color:#555;font-size:15px}.item-title{float:left;clear:both;font-size:17px;color:#909090;border-bottom:1px solid transparent;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.item-title:active,.item-title:hover{background:#ba59d2;color:#fff}.icon-box-load,.icon-content-load{background:url(../img/content-load.gif);width:32px;height:32px;position:absolute;left:50%;top:50vh;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.icon-box-load{top:280px}.show-item-wrap{float:left;width:100%;margin:50px 0 0}.image-wrap{float:left;width:350px}.show-content{float:left;width:710px}.show-content h2{color:#ba59d2;font-size:32px}.modal-wrap{background:rgba(14,14,14,.98);position:fixed;left:0;top:0;height:100%;width:100%;z-index:200;opacity:1;transition:opacity .1s ease-in-out 0s}.modal-active .modal-wrap{overflow-y:scroll}.modal-wrap.loading{opacity:0}.modal-header{background:#ba59d2;float:left;width:100%;height:65px;position:fixed;left:0;top:0;transition:top .5s ease-in-out 0s}.loading .modal-header{top:-100%}.modal-header .icon-search{float:left;margin:17px 0 0}.icon-close-wrap{padding:16px;float:right;cursor:pointer;margin:5px 0 0}.icon-close-wrap .icon-close{float:left}.icon-close-wrap:active{opacity:.6}.modal-input{border:0;background:0 0;font-size:38px;color:#ba59d2;width:100%}.search-wrap{float:left;width:calc(100% - 100px)}.search-items{width:100%;float:left;padding:80px 0}.no-items-found{width:100%;float:left;margin:30vh 0 0;text-align:center;color:#474747;font-size:32px}.modal-label{float:left;text-transform:uppercase;color:#3e3e3e;font-size:15px}.site-footer{float:left;width:100%;background:#131313;padding:40px 0;position:absolute;bottom:0;font-size:14px}.site-footer a:active{opacity:.5}.attribution{color:#555;float:left}.icon-tmdb{float:left;margin:3px 10px 0 0}.icon-github{float:right} \ No newline at end of file diff --git a/public/assets/favicon.ico b/public/assets/favicon.ico new file mode 100644 index 00000000..5f5735ea Binary files /dev/null and b/public/assets/favicon.ico differ diff --git a/public/assets/img/content-load.gif b/public/assets/img/content-load.gif new file mode 100644 index 00000000..267f07b7 Binary files /dev/null and b/public/assets/img/content-load.gif differ diff --git a/public/assets/img/logo-big.png b/public/assets/img/logo-big.png new file mode 100644 index 00000000..3333b934 Binary files /dev/null and b/public/assets/img/logo-big.png differ diff --git a/public/assets/img/logo.png b/public/assets/img/logo.png new file mode 100644 index 00000000..a728fbe6 Binary files /dev/null and b/public/assets/img/logo.png differ diff --git a/public/assets/img/sprite.png b/public/assets/img/sprite.png new file mode 100644 index 00000000..069aa3ab Binary files /dev/null and b/public/assets/img/sprite.png differ diff --git a/public/assets/js/config.js b/public/assets/js/config.js new file mode 100644 index 00000000..baa9635d --- /dev/null +++ b/public/assets/js/config.js @@ -0,0 +1,9 @@ +window.config = { + + uri: '/flox/public/', + url: 'http://localhost:8888/flox/public/', + api: 'http://localhost:8888/flox/public/api/', + posterSmall: 'http://image.tmdb.org/t/p/w185', + posterBig: 'http://image.tmdb.org/t/p/w300' + +}; diff --git a/public/index.php b/public/index.php new file mode 100755 index 00000000..d3199e48 --- /dev/null +++ b/public/index.php @@ -0,0 +1,58 @@ + + */ + +/* +|-------------------------------------------------------------------------- +| Register The Auto Loader +|-------------------------------------------------------------------------- +| +| Composer provides a convenient, automatically generated class loader for +| our application. We just need to utilize it! We'll simply require it +| into the script here so that we don't have to worry about manual +| loading any of our classes later on. It feels nice to relax. +| +*/ + +require __DIR__.'/../server/bootstrap/autoload.php'; + +/* +|-------------------------------------------------------------------------- +| Turn On The Lights +|-------------------------------------------------------------------------- +| +| We need to illuminate PHP development, so let us 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 our users. +| +*/ + +$app = require_once __DIR__.'/../server/bootstrap/app.php'; + +/* +|-------------------------------------------------------------------------- +| Run The Application +|-------------------------------------------------------------------------- +| +| Once we have the application, we can handle the incoming request +| through the kernel, and send the associated response back to +| the client's browser allowing them to enjoy the creative +| and wonderful application we have prepared for them. +| +*/ + +$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); + +$response = $kernel->handle( + $request = Illuminate\Http\Request::capture() +); + +$response->send(); + +$kernel->terminate($request, $response); diff --git a/server/.env.example b/server/.env.example new file mode 100644 index 00000000..e19d12f6 --- /dev/null +++ b/server/.env.example @@ -0,0 +1,14 @@ +APP_ENV=local +APP_DEBUG=true +APP_KEY=SomeRandomString + +DB_HOST=localhost +DB_DATABASE=homestead +DB_USERNAME=homestead +DB_PASSWORD=secret + +CACHE_DRIVER=file +SESSION_DRIVER=file +QUEUE_DRIVER=sync + +TMDB_API_KEY=xxx \ No newline at end of file diff --git a/server/.gitattributes b/server/.gitattributes new file mode 100644 index 00000000..95883dea --- /dev/null +++ b/server/.gitattributes @@ -0,0 +1,3 @@ +* text=auto +*.css linguist-vendored +*.less linguist-vendored diff --git a/server/app/Category.php b/server/app/Category.php new file mode 100644 index 00000000..c2da926b --- /dev/null +++ b/server/app/Category.php @@ -0,0 +1,44 @@ + 'title', + 'save_to' => 'slug', + ]; + + public function items() + { + return $this->hasMany('Flox\Item'); + } + + /** + * http://softonsofa.com/tweaking-eloquent-relations-how-to-get-hasmany-relation-count-efficiently/ + */ + public function itemsCount() + { + return $this->hasOne('Flox\Item') + ->selectRaw('category_id, count(*) as aggregate') + ->groupBy('category_id'); + } + + public function getItemsCountAttribute() + { + if ( ! $this->relationLoaded('itemsCount')) { + $this->load('itemsCount'); + } + + $related = $this->getRelation('itemsCount'); + + return ($related) ? (int) $related->aggregate : 0; + } +} diff --git a/server/app/Console/Commands/Inspire.php b/server/app/Console/Commands/Inspire.php new file mode 100644 index 00000000..4fcc4919 --- /dev/null +++ b/server/app/Console/Commands/Inspire.php @@ -0,0 +1,33 @@ +comment(PHP_EOL.Inspiring::quote().PHP_EOL); + } +} diff --git a/server/app/Console/Kernel.php b/server/app/Console/Kernel.php new file mode 100644 index 00000000..b2e6cfbe --- /dev/null +++ b/server/app/Console/Kernel.php @@ -0,0 +1,30 @@ +command('inspire') + ->hourly(); + } +} diff --git a/server/app/Events/Event.php b/server/app/Events/Event.php new file mode 100644 index 00000000..437369cd --- /dev/null +++ b/server/app/Events/Event.php @@ -0,0 +1,8 @@ +getItems($category, $orderBy, 5); + } + + public function categoryItems($category, $orderBy) + { + return $this->getItems($category, $orderBy, 20); + } + + public function allCategories() + { + return Category::all(); + } + + public function slugItem($slug) + { + return Item::where('slug', $slug)->first(); + } + + private function getItems($category, $orderBy, $count) + { + $category = Category::where('slug', $category)->with('itemsCount')->first(); + + $items = Item::where('category_id', $category->id)->orderBy($orderBy, 'desc')->take($count)->get(); + + return [ + 'items' => $items, + 'category' => $category + ]; + } + + public function searchFloxByTitle($title) + { + // todo: Implement Levenshtein ;) + return Item::where('title', 'LIKE', '%' . $title . '%')->with('categories')->get(); + } + + public function searchTMDBByTitle($title) + { + $items = []; + $client = new Client(['base_uri' => 'http://api.themoviedb.org/']); + + $response = $client->get('/3/search/multi', ['query' => ['api_key' => env('TMDB_API_KEY'), 'query' => $title]]); + $response = json_decode($response->getBody()); + + foreach($response->results as $result) { + if($result->media_type == 'person') continue; + + $dtime = DateTime::createFromFormat('Y-m-d', (array_key_exists('release_date', $result) + ? ($result->release_date ?: '1970-12-1') + : ($result->first_air_date ?: '1970-12-1') + )); + + $items[] = [ + 'tmdb_id' => $result->id, + 'title' => array_key_exists('name', $result) ? $result->name : $result->title, + 'poster' => $result->poster_path, + 'released' => $dtime->getTimestamp(), + ]; + } + + return $items; + } + } diff --git a/server/app/Http/Controllers/Controller.php b/server/app/Http/Controllers/Controller.php new file mode 100644 index 00000000..158c0a5e --- /dev/null +++ b/server/app/Http/Controllers/Controller.php @@ -0,0 +1,12 @@ + \Flox\Http\Middleware\Authenticate::class, + 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'guest' => \Flox\Http\Middleware\RedirectIfAuthenticated::class, + ]; +} diff --git a/server/app/Http/Middleware/Authenticate.php b/server/app/Http/Middleware/Authenticate.php new file mode 100644 index 00000000..237f57c4 --- /dev/null +++ b/server/app/Http/Middleware/Authenticate.php @@ -0,0 +1,47 @@ +auth = $auth; + } + + /** + * Handle an incoming request. + * + * @param \Illuminate\Http\Request $request + * @param \Closure $next + * @return mixed + */ + public function handle($request, Closure $next) + { + if ($this->auth->guest()) { + if ($request->ajax()) { + return response('Unauthorized.', 401); + } else { + return redirect()->guest('auth/login'); + } + } + + return $next($request); + } +} diff --git a/server/app/Http/Middleware/EncryptCookies.php b/server/app/Http/Middleware/EncryptCookies.php new file mode 100644 index 00000000..57b90a02 --- /dev/null +++ b/server/app/Http/Middleware/EncryptCookies.php @@ -0,0 +1,17 @@ +auth = $auth; + } + + /** + * Handle an incoming request. + * + * @param \Illuminate\Http\Request $request + * @param \Closure $next + * @return mixed + */ + public function handle($request, Closure $next) + { + if ($this->auth->check()) { + return redirect('/home'); + } + + return $next($request); + } +} diff --git a/server/app/Http/Middleware/VerifyCsrfToken.php b/server/app/Http/Middleware/VerifyCsrfToken.php new file mode 100644 index 00000000..91937d01 --- /dev/null +++ b/server/app/Http/Middleware/VerifyCsrfToken.php @@ -0,0 +1,17 @@ + 'api'], function() { + + get('all-categories', 'APIController@allCategories'); + get('home-items/{category}/{orderBy}', 'APIController@homeItems'); + get('category-items/{category}/{orderBy}', 'APIController@categoryItems'); + //get('item/{slug}', 'APIController@slugItem'); + + get('search/flox/{title}', 'APIController@searchFloxByTitle'); + get('search/tmdb/{title}', 'APIController@searchTMDBByTitle'); + //get('search/tmdb/id/{id}', 'APIController@searchTMDBByID'); + + }); + + Route::get('/{uri}', function() { + return view('app'); + })->where('uri', '(.*)'); diff --git a/server/app/Item.php b/server/app/Item.php new file mode 100644 index 00000000..d71eb811 --- /dev/null +++ b/server/app/Item.php @@ -0,0 +1,25 @@ + 'title', + 'save_to' => 'slug', + ]; + + public $timestamps = false; + + public function categories() + { + return $this->belongsTo('Flox\Category', 'category_id'); + } +} diff --git a/server/app/Jobs/Job.php b/server/app/Jobs/Job.php new file mode 100644 index 00000000..c11270a4 --- /dev/null +++ b/server/app/Jobs/Job.php @@ -0,0 +1,21 @@ + [ + 'Flox\Listeners\EventListener', + ], + ]; + + /** + * Register any other events for your application. + * + * @param \Illuminate\Contracts\Events\Dispatcher $events + * @return void + */ + public function boot(DispatcherContract $events) + { + parent::boot($events); + + // + } +} diff --git a/server/app/Providers/RouteServiceProvider.php b/server/app/Providers/RouteServiceProvider.php new file mode 100644 index 00000000..afc0eeec --- /dev/null +++ b/server/app/Providers/RouteServiceProvider.php @@ -0,0 +1,44 @@ +group(['namespace' => $this->namespace], function ($router) { + require app_path('Http/routes.php'); + }); + } +} diff --git a/server/app/User.php b/server/app/User.php new file mode 100644 index 00000000..990b3141 --- /dev/null +++ b/server/app/User.php @@ -0,0 +1,35 @@ +make(Illuminate\Contracts\Console\Kernel::class); + +$status = $kernel->handle( + $input = new Symfony\Component\Console\Input\ArgvInput, + new Symfony\Component\Console\Output\ConsoleOutput +); + +/* +|-------------------------------------------------------------------------- +| 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. +| +*/ + +$kernel->terminate($input, $status); + +exit($status); diff --git a/server/bootstrap/app.php b/server/bootstrap/app.php new file mode 100644 index 00000000..6cfb2b1d --- /dev/null +++ b/server/bootstrap/app.php @@ -0,0 +1,55 @@ +singleton( + Illuminate\Contracts\Http\Kernel::class, + Flox\Http\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Console\Kernel::class, + Flox\Console\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Debug\ExceptionHandler::class, + Flox\Exceptions\Handler::class +); + +/* +|-------------------------------------------------------------------------- +| 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/server/bootstrap/autoload.php b/server/bootstrap/autoload.php new file mode 100644 index 00000000..38301379 --- /dev/null +++ b/server/bootstrap/autoload.php @@ -0,0 +1,34 @@ +=5.5.9", + "laravel/framework": "5.1.*", + "guzzlehttp/guzzle": "~6.0", + "cviebrock/eloquent-sluggable": "^3.0" + }, + "require-dev": { + "fzaninotto/faker": "~1.4", + "mockery/mockery": "0.9.*", + "phpunit/phpunit": "~4.0", + "phpspec/phpspec": "~2.1" + }, + "autoload": { + "classmap": [ + "database" + ], + "psr-4": { + "Flox\\": "app/" + } + }, + "autoload-dev": { + "classmap": [ + "tests/TestCase.php" + ] + }, + "scripts": { + "post-install-cmd": [ + "php artisan clear-compiled", + "php artisan optimize" + ], + "pre-update-cmd": [ + "php artisan clear-compiled" + ], + "post-update-cmd": [ + "php artisan optimize" + ], + "post-root-package-install": [ + "php -r \"copy('.env.example', '.env');\"" + ], + "post-create-project-cmd": [ + "php artisan key:generate" + ] + }, + "config": { + "preferred-install": "dist" + } +} diff --git a/server/composer.lock b/server/composer.lock new file mode 100644 index 00000000..792ef70e --- /dev/null +++ b/server/composer.lock @@ -0,0 +1,3265 @@ +{ + "_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": "55aa4c85b5e8ecb7599781ad35e4def9", + "packages": [ + { + "name": "classpreloader/classpreloader", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ClassPreloader/ClassPreloader.git", + "reference": "8c3c14b10309e3b40bce833913a6c0c0b8c8f962" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ClassPreloader/ClassPreloader/zipball/8c3c14b10309e3b40bce833913a6c0c0b8c8f962", + "reference": "8c3c14b10309e3b40bce833913a6c0c0b8c8f962", + "shasum": "" + }, + "require": { + "nikic/php-parser": "~1.3", + "php": ">=5.5.9" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "ClassPreloader\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com" + } + ], + "description": "Helps class loading performance by generating a single PHP file containing all of the autoloaded files for a specific use case", + "keywords": [ + "autoload", + "class", + "preload" + ], + "time": "2015-06-28 21:39:13" + }, + { + "name": "cocur/slugify", + "version": "v1.1", + "source": { + "type": "git", + "url": "https://github.com/cocur/slugify.git", + "reference": "2b67d4e2b75dbaed2ebefa9eb5683e8940513847" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cocur/slugify/zipball/2b67d4e2b75dbaed2ebefa9eb5683e8940513847", + "reference": "2b67d4e2b75dbaed2ebefa9eb5683e8940513847", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "codeclimate/php-test-reporter": "dev-master", + "laravel/framework": "~4.1", + "latte/latte": "~2.2", + "mockery/mockery": "~0.9", + "nette/di": "~2.2", + "phpunit/phpunit": "~3.7", + "sami/sami": "~1.3", + "satooshi/php-coveralls": "0.6.*", + "silex/silex": "~1.2", + "symfony/dependency-injection": "~2.4", + "symfony/http-kernel": "~2.4", + "twig/twig": "~1", + "zendframework/zend-modulemanager": "~2.2", + "zendframework/zend-servicemanager": "~2.2", + "zendframework/zend-view": "~2.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cocur\\Slugify\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ivo Bathke", + "email": "ivo.bathke@gmail.com" + }, + { + "name": "Florian Eckerstorfer", + "email": "florian@eckerstorfer.co", + "homepage": "https://florian.ec" + } + ], + "description": "Converts a string into a slug.", + "keywords": [ + "slug", + "slugify" + ], + "time": "2015-03-18 08:21:30" + }, + { + "name": "cviebrock/eloquent-sluggable", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/cviebrock/eloquent-sluggable.git", + "reference": "eaf7b573d7c82f004fc3efde0e0f9f63200d4c32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cviebrock/eloquent-sluggable/zipball/eaf7b573d7c82f004fc3efde0e0f9f63200d4c32", + "reference": "eaf7b573d7c82f004fc3efde0e0f9f63200d4c32", + "shasum": "" + }, + "require": { + "cocur/slugify": "1.1.*", + "illuminate/config": "5.*", + "illuminate/database": "5.*", + "illuminate/support": "5.*", + "php": ">=5.4.0" + }, + "require-dev": { + "orchestra/testbench": "3.0.*", + "phpunit/phpunit": "4.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cviebrock\\EloquentSluggable\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Colin Viebrock", + "email": "colin@viebrock.ca" + } + ], + "description": "Easy creation of slugs for your Eloquent models in Laravel", + "homepage": "https://github.com/cviebrock/eloquent-sluggable", + "keywords": [ + "eloquent", + "laravel", + "slug" + ], + "time": "2015-07-06 15:09:35" + }, + { + "name": "danielstjules/stringy", + "version": "1.9.0", + "source": { + "type": "git", + "url": "https://github.com/danielstjules/Stringy.git", + "reference": "3cf18e9e424a6dedc38b7eb7ef580edb0929461b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/danielstjules/Stringy/zipball/3cf18e9e424a6dedc38b7eb7ef580edb0929461b", + "reference": "3cf18e9e424a6dedc38b7eb7ef580edb0929461b", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Stringy\\": "src/" + }, + "files": [ + "src/Create.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel St. Jules", + "email": "danielst.jules@gmail.com", + "homepage": "http://www.danielstjules.com" + } + ], + "description": "A string manipulation library with multibyte support", + "homepage": "https://github.com/danielstjules/Stringy", + "keywords": [ + "UTF", + "helpers", + "manipulation", + "methods", + "multibyte", + "string", + "utf-8", + "utility", + "utils" + ], + "time": "2015-02-10 06:19:18" + }, + { + "name": "dnoegel/php-xdg-base-dir", + "version": "0.1", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/265b8593498b997dc2d31e75b89f053b5cc9621a", + "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "@stable" + }, + "type": "project", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "time": "2014-10-24 07:27:01" + }, + { + "name": "doctrine/inflector", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "0bcb2e79d8571787f18b7eb036ed3d004908e604" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/0bcb2e79d8571787f18b7eb036ed3d004908e604", + "reference": "0bcb2e79d8571787f18b7eb036ed3d004908e604", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "4.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.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": "2014-12-20 21:24:13" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "a8dfeff00eb84616a17fea7a4d72af35e750410f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a8dfeff00eb84616a17fea7a4d72af35e750410f", + "reference": "a8dfeff00eb84616a17fea7a4d72af35e750410f", + "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.0-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-07-04 20:09:24" + }, + { + "name": "guzzlehttp/promises", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "2ee5bc7f1a92efecc90da7f6711a53a7be26b5b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/2ee5bc7f1a92efecc90da7f6711a53a7be26b5b7", + "reference": "2ee5bc7f1a92efecc90da7f6711a53a7be26b5b7", + "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.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-06-24 16:16:25" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "af0e1758de355eb113917ad79c3c0e3604bce4bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/af0e1758de355eb113917ad79c3c0e3604bce4bd", + "reference": "af0e1758de355eb113917ad79c3c0e3604bce4bd", + "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.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-06-24 19:55:15" + }, + { + "name": "jakub-onderka/php-console-color", + "version": "0.1", + "source": { + "type": "git", + "url": "https://github.com/JakubOnderka/PHP-Console-Color.git", + "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/e0b393dacf7703fc36a4efc3df1435485197e6c1", + "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "jakub-onderka/php-code-style": "1.0", + "jakub-onderka/php-parallel-lint": "0.*", + "jakub-onderka/php-var-dump-check": "0.*", + "phpunit/phpunit": "3.7.*", + "squizlabs/php_codesniffer": "1.*" + }, + "type": "library", + "autoload": { + "psr-0": { + "JakubOnderka\\PhpConsoleColor": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Jakub Onderka", + "email": "jakub.onderka@gmail.com", + "homepage": "http://www.acci.cz" + } + ], + "time": "2014-04-08 15:00:19" + }, + { + "name": "jakub-onderka/php-console-highlighter", + "version": "v0.3.2", + "source": { + "type": "git", + "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git", + "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/7daa75df45242c8d5b75a22c00a201e7954e4fb5", + "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5", + "shasum": "" + }, + "require": { + "jakub-onderka/php-console-color": "~0.1", + "php": ">=5.3.0" + }, + "require-dev": { + "jakub-onderka/php-code-style": "~1.0", + "jakub-onderka/php-parallel-lint": "~0.5", + "jakub-onderka/php-var-dump-check": "~0.1", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~1.5" + }, + "type": "library", + "autoload": { + "psr-0": { + "JakubOnderka\\PhpConsoleHighlighter": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jakub Onderka", + "email": "acci@acci.cz", + "homepage": "http://www.acci.cz/" + } + ], + "time": "2015-04-20 18:58:01" + }, + { + "name": "jeremeamia/SuperClosure", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/jeremeamia/super_closure.git", + "reference": "b712f39c671e5ead60c7ebfe662545456aade833" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jeremeamia/super_closure/zipball/b712f39c671e5ead60c7ebfe662545456aade833", + "reference": "b712f39c671e5ead60c7ebfe662545456aade833", + "shasum": "" + }, + "require": { + "nikic/php-parser": "~1.0", + "php": ">=5.4" + }, + "require-dev": { + "codeclimate/php-test-reporter": "~0.1.2", + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "SuperClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia", + "role": "Developer" + } + ], + "description": "Serialize Closure objects, including their context and binding", + "homepage": "https://github.com/jeremeamia/super_closure", + "keywords": [ + "closure", + "function", + "lambda", + "parser", + "serializable", + "serialize", + "tokenizer" + ], + "time": "2015-03-11 20:06:43" + }, + { + "name": "laravel/framework", + "version": "v5.1.7", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "5e942882319845f71c681ce6e85831129bf66426" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/5e942882319845f71c681ce6e85831129bf66426", + "reference": "5e942882319845f71c681ce6e85831129bf66426", + "shasum": "" + }, + "require": { + "classpreloader/classpreloader": "~2.0", + "danielstjules/stringy": "~1.8", + "doctrine/inflector": "~1.0", + "ext-mbstring": "*", + "ext-openssl": "*", + "jeremeamia/superclosure": "~2.0", + "league/flysystem": "~1.0", + "monolog/monolog": "~1.11", + "mtdowling/cron-expression": "~1.0", + "nesbot/carbon": "~1.19", + "php": ">=5.5.9", + "psy/psysh": "~0.5.1", + "swiftmailer/swiftmailer": "~5.1", + "symfony/console": "2.7.*", + "symfony/css-selector": "2.7.*", + "symfony/debug": "2.7.*", + "symfony/dom-crawler": "2.7.*", + "symfony/finder": "2.7.*", + "symfony/http-foundation": "2.7.*", + "symfony/http-kernel": "2.7.*", + "symfony/process": "2.7.*", + "symfony/routing": "2.7.*", + "symfony/translation": "2.7.*", + "symfony/var-dumper": "2.7.*", + "vlucas/phpdotenv": "~1.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/exception": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/foundation": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/mail": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "aws/aws-sdk-php": "~3.0", + "iron-io/iron_mq": "~2.0", + "mockery/mockery": "~0.9.1", + "pda/pheanstalk": "~3.0", + "phpunit/phpunit": "~4.0", + "predis/predis": "~1.0" + }, + "suggest": { + "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.4).", + "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", + "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers (~5.3|~6.0).", + "iron-io/iron_mq": "Required to use the iron queue driver (~2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", + "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", + "predis/predis": "Required to use the redis cache and queue drivers (~1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~2.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/Illuminate/Queue/IlluminateQueueClosure.php" + ], + "files": [ + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylorotwell@gmail.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "http://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "time": "2015-07-12 02:27:36" + }, + { + "name": "league/flysystem", + "version": "1.0.9", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "c42bed650525ec9ea1a83b715e37f4fc690f99aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/c42bed650525ec9ea1a83b715e37f4fc690f99aa", + "reference": "c42bed650525ec9ea1a83b715e37f4fc690f99aa", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "ext-fileinfo": "*", + "mockery/mockery": "~0.9", + "phpspec/phpspec": "^2.2", + "phpspec/prophecy-phpunit": "~1.0", + "phpunit/phpunit": "~4.1" + }, + "suggest": { + "ext-fileinfo": "Required for MimeType", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-copy": "Allows you to use Copy.com storage", + "league/flysystem-dropbox": "Allows you to use Dropbox storage", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], + "time": "2015-07-13 09:25:28" + }, + { + "name": "monolog/monolog", + "version": "1.15.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "dc5150cc608f2334c72c3b6a553ec9668a4156b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/dc5150cc608f2334c72c3b6a553ec9668a4156b0", + "reference": "dc5150cc608f2334c72c3b6a553ec9668a4156b0", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "php-console/php-console": "^3.1.3", + "phpunit/phpunit": "~4.5", + "phpunit/phpunit-mock-objects": "2.3.0", + "raven/raven": "~0.8", + "ruflin/elastica": ">=0.90 <3.0", + "swiftmailer/swiftmailer": "~5.3", + "videlalvaro/php-amqplib": "~2.4" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "raven/raven": "Allow sending log messages to a Sentry server", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "videlalvaro/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.15.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "time": "2015-07-12 13:54:09" + }, + { + "name": "mtdowling/cron-expression", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/mtdowling/cron-expression.git", + "reference": "fd92e883195e5dfa77720b1868cf084b08be4412" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/fd92e883195e5dfa77720b1868cf084b08be4412", + "reference": "fd92e883195e5dfa77720b1868cf084b08be4412", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "4.*" + }, + "type": "library", + "autoload": { + "psr-0": { + "Cron": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "time": "2015-01-11 23:07:46" + }, + { + "name": "nesbot/carbon", + "version": "1.20.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "bfd3eaba109c9a2405c92174c8e17f20c2b9caf3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bfd3eaba109c9a2405c92174c8e17f20c2b9caf3", + "reference": "bfd3eaba109c9a2405c92174c8e17f20c2b9caf3", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "symfony/translation": "~2.6|~3.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Carbon": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "http://nesbot.com" + } + ], + "description": "A simple API extension for DateTime.", + "homepage": "http://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "time": "2015-06-25 04:19:39" + }, + { + "name": "nikic/php-parser", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "196f177cfefa0f1f7166c0a05d8255889be12418" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/196f177cfefa0f1f7166c0a05d8255889be12418", + "reference": "196f177cfefa0f1f7166c0a05d8255889be12418", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "files": [ + "lib/bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "time": "2015-07-14 17:31:05" + }, + { + "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": "psr/log", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "Psr\\Log\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2012-12-21 11:40:51" + }, + { + "name": "psy/psysh", + "version": "v0.5.2", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "aaf8772ade08b5f0f6830774a5d5c2f800415975" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/aaf8772ade08b5f0f6830774a5d5c2f800415975", + "reference": "aaf8772ade08b5f0f6830774a5d5c2f800415975", + "shasum": "" + }, + "require": { + "dnoegel/php-xdg-base-dir": "0.1", + "jakub-onderka/php-console-highlighter": "0.3.*", + "nikic/php-parser": "^1.2.1", + "php": ">=5.3.9", + "symfony/console": "~2.3.10|^2.4.2|~3.0", + "symfony/var-dumper": "~2.7|~3.0" + }, + "require-dev": { + "fabpot/php-cs-fixer": "~1.5", + "phpunit/phpunit": "~3.7|~4.0", + "squizlabs/php_codesniffer": "~2.0", + "symfony/finder": "~2.1|~3.0" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "0.6.x-dev" + } + }, + "autoload": { + "files": [ + "src/Psy/functions.php" + ], + "psr-0": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "time": "2015-07-16 15:26:57" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v5.4.1", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "0697e6aa65c83edf97bb0f23d8763f94e3f11421" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/0697e6aa65c83edf97bb0f23d8763f94e3f11421", + "reference": "0697e6aa65c83edf97bb0f23d8763f94e3f11421", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "mockery/mockery": "~0.9.1,<0.9.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "http://swiftmailer.org", + "keywords": [ + "email", + "mail", + "mailer" + ], + "time": "2015-06-06 14:19:39" + }, + { + "name": "symfony/console", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/Console.git", + "reference": "8cf484449130cabfd98dcb4694ca9945802a21ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Console/zipball/8cf484449130cabfd98dcb4694ca9945802a21ed", + "reference": "8cf484449130cabfd98dcb4694ca9945802a21ed", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.1", + "symfony/phpunit-bridge": "~2.7", + "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\\": "" + } + }, + "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-07-09 16:07:40" + }, + { + "name": "symfony/css-selector", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/CssSelector.git", + "reference": "0b5c07b516226b7dd32afbbc82fe547a469c5092" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/CssSelector/zipball/0b5c07b516226b7dd32afbbc82fe547a469c5092", + "reference": "0b5c07b516226b7dd32afbbc82fe547a469c5092", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + } + }, + "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-05-15 13:33:16" + }, + { + "name": "symfony/debug", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/Debug.git", + "reference": "9daa1bf9f7e615fa2fba30357e479a90141222e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Debug/zipball/9daa1bf9f7e615fa2fba30357e479a90141222e3", + "reference": "9daa1bf9f7e615fa2fba30357e479a90141222e3", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + }, + "require-dev": { + "symfony/class-loader": "~2.2", + "symfony/http-foundation": "~2.1", + "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2", + "symfony/phpunit-bridge": "~2.7" + }, + "suggest": { + "symfony/http-foundation": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + } + }, + "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 Debug Component", + "homepage": "https://symfony.com", + "time": "2015-07-09 16:07:40" + }, + { + "name": "symfony/dom-crawler", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/DomCrawler.git", + "reference": "9dabece63182e95c42b06967a0d929a5df78bc35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/DomCrawler/zipball/9dabece63182e95c42b06967a0d929a5df78bc35", + "reference": "9dabece63182e95c42b06967a0d929a5df78bc35", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "symfony/css-selector": "~2.3", + "symfony/phpunit-bridge": "~2.7" + }, + "suggest": { + "symfony/css-selector": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + } + }, + "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-07-09 16:07:40" + }, + { + "name": "symfony/event-dispatcher", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/EventDispatcher.git", + "reference": "9310b5f9a87ec2ea75d20fec0b0017c77c66dac3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/9310b5f9a87ec2ea75d20fec0b0017c77c66dac3", + "reference": "9310b5f9a87ec2ea75d20fec0b0017c77c66dac3", + "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/phpunit-bridge": "~2.7", + "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\\": "" + } + }, + "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-06-18 19:21:56" + }, + { + "name": "symfony/finder", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/Finder.git", + "reference": "ae0f363277485094edc04c9f3cbe595b183b78e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Finder/zipball/ae0f363277485094edc04c9f3cbe595b183b78e4", + "reference": "ae0f363277485094edc04c9f3cbe595b183b78e4", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + } + }, + "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-07-09 16:07:40" + }, + { + "name": "symfony/http-foundation", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/HttpFoundation.git", + "reference": "88903c0531b90d4ecd90282b18f08c0c77bde0b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/88903c0531b90d4ecd90282b18f08c0c77bde0b2", + "reference": "88903c0531b90d4ecd90282b18f08c0c77bde0b2", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "symfony/expression-language": "~2.4", + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "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 HttpFoundation Component", + "homepage": "https://symfony.com", + "time": "2015-07-09 16:07:40" + }, + { + "name": "symfony/http-kernel", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/HttpKernel.git", + "reference": "4a8a6f2a847475b3a38da50363a07f69b5cbf37e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/4a8a6f2a847475b3a38da50363a07f69b5cbf37e", + "reference": "4a8a6f2a847475b3a38da50363a07f69b5cbf37e", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "psr/log": "~1.0", + "symfony/debug": "~2.6,>=2.6.2", + "symfony/event-dispatcher": "~2.5.9|~2.6,>=2.6.2", + "symfony/http-foundation": "~2.5,>=2.5.4" + }, + "conflict": { + "symfony/config": "<2.7" + }, + "require-dev": { + "symfony/browser-kit": "~2.3", + "symfony/class-loader": "~2.1", + "symfony/config": "~2.7", + "symfony/console": "~2.3", + "symfony/css-selector": "~2.0,>=2.0.5", + "symfony/dependency-injection": "~2.2", + "symfony/dom-crawler": "~2.0,>=2.0.5", + "symfony/expression-language": "~2.4", + "symfony/finder": "~2.0,>=2.0.5", + "symfony/phpunit-bridge": "~2.7", + "symfony/process": "~2.0,>=2.0.5", + "symfony/routing": "~2.2", + "symfony/stopwatch": "~2.3", + "symfony/templating": "~2.2", + "symfony/translation": "~2.0,>=2.0.5", + "symfony/var-dumper": "~2.6" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/class-loader": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "", + "symfony/finder": "", + "symfony/var-dumper": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + } + }, + "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 HttpKernel Component", + "homepage": "https://symfony.com", + "time": "2015-07-13 19:27:49" + }, + { + "name": "symfony/process", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/Process.git", + "reference": "48aeb0e48600321c272955132d7606ab0a49adb3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Process/zipball/48aeb0e48600321c272955132d7606ab0a49adb3", + "reference": "48aeb0e48600321c272955132d7606ab0a49adb3", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + } + }, + "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 Process Component", + "homepage": "https://symfony.com", + "time": "2015-07-01 11:25:50" + }, + { + "name": "symfony/routing", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/Routing.git", + "reference": "ea9134f277162b02e5f80ac058b75a77637b0d26" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Routing/zipball/ea9134f277162b02e5f80ac058b75a77637b0d26", + "reference": "ea9134f277162b02e5f80ac058b75a77637b0d26", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "conflict": { + "symfony/config": "<2.7" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/common": "~2.2", + "psr/log": "~1.0", + "symfony/config": "~2.7", + "symfony/expression-language": "~2.4", + "symfony/http-foundation": "~2.3", + "symfony/phpunit-bridge": "~2.7", + "symfony/yaml": "~2.0,>=2.0.5" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + } + }, + "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 Routing Component", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "time": "2015-07-09 16:07:40" + }, + { + "name": "symfony/translation", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/Translation.git", + "reference": "c8dc34cc936152c609cdd722af317e4239d10dd6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Translation/zipball/c8dc34cc936152c609cdd722af317e4239d10dd6", + "reference": "c8dc34cc936152c609cdd722af317e4239d10dd6", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "conflict": { + "symfony/config": "<2.7" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.7", + "symfony/intl": "~2.3", + "symfony/phpunit-bridge": "~2.7", + "symfony/yaml": "~2.2" + }, + "suggest": { + "psr/log": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Translation\\": "" + } + }, + "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 Translation Component", + "homepage": "https://symfony.com", + "time": "2015-07-09 16:07:40" + }, + { + "name": "symfony/var-dumper", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "fde603d9f4b2418ff0f0315b93eb039c9aa41205" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/fde603d9f4b2418ff0f0315b93eb039c9aa41205", + "reference": "fde603d9f4b2418ff0f0315b93eb039c9aa41205", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "suggest": { + "ext-symfony_debug": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "time": "2015-07-01 12:07:40" + }, + { + "name": "vlucas/phpdotenv", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa", + "reference": "0cac554ce06277e33ddf9f0b7ade4b8bbf2af3fa", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Dotenv": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD" + ], + "authors": [ + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "http://www.vancelucas.com" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "homepage": "http://github.com/vlucas/phpdotenv", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "time": "2015-05-30 15:59:26" + } + ], + "packages-dev": [ + { + "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": "fzaninotto/faker", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/fzaninotto/Faker.git", + "reference": "d0190b156bcca848d401fb80f31f504f37141c8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/d0190b156bcca848d401fb80f31f504f37141c8d", + "reference": "d0190b156bcca848d401fb80f31f504f37141c8d", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~1.5" + }, + "suggest": { + "ext-intl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "time": "2015-05-29 06:29:14" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v1.2.2", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/b37020aa976fa52d3de9aa904aa2522dc518f79c", + "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "1.3.3", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "autoload": { + "classmap": [ + "hamcrest" + ], + "files": [ + "hamcrest/Hamcrest.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "time": "2015-05-11 14:41:42" + }, + { + "name": "mockery/mockery", + "version": "0.9.4", + "source": { + "type": "git", + "url": "https://github.com/padraic/mockery.git", + "reference": "70bba85e4aabc9449626651f48b9018ede04f86b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/padraic/mockery/zipball/70bba85e4aabc9449626651f48b9018ede04f86b", + "reference": "70bba85e4aabc9449626651f48b9018ede04f86b", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "~1.1", + "lib-pcre": ">=7.0", + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.9.x-dev" + } + }, + "autoload": { + "psr-0": { + "Mockery": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "http://davedevelopment.co.uk" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succinct API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.", + "homepage": "http://github.com/padraic/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "time": "2015-04-02 19:54:00" + }, + { + "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/php-diff", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/phpspec/php-diff.git", + "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/php-diff/zipball/30e103d19519fe678ae64a60d77884ef3d71b28a", + "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "Diff": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Chris Boulton", + "homepage": "http://github.com/chrisboulton", + "role": "Original developer" + } + ], + "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).", + "time": "2013-11-01 13:02:21" + }, + { + "name": "phpspec/phpspec", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/phpspec/phpspec.git", + "reference": "e9a40577323e67f1de2e214abf32976a0352d8f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/phpspec/zipball/e9a40577323e67f1de2e214abf32976a0352d8f8", + "reference": "e9a40577323e67f1de2e214abf32976a0352d8f8", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.1", + "php": ">=5.3.3", + "phpspec/php-diff": "~1.0.0", + "phpspec/prophecy": "~1.4", + "sebastian/exporter": "~1.0", + "symfony/console": "~2.3", + "symfony/event-dispatcher": "~2.1", + "symfony/finder": "~2.1", + "symfony/process": "~2.1", + "symfony/yaml": "~2.1" + }, + "require-dev": { + "behat/behat": "^3.0.11", + "bossa/phpspec2-expect": "~1.0", + "phpunit/phpunit": "~4.4", + "symfony/filesystem": "~2.1", + "symfony/process": "~2.1" + }, + "suggest": { + "phpspec/nyan-formatters": "~1.0 – Adds Nyan formatters" + }, + "bin": [ + "bin/phpspec" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-0": { + "PhpSpec": "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", + "homepage": "http://marcelloduarte.net/" + } + ], + "description": "Specification-oriented BDD framework for PHP 5.3+", + "homepage": "http://phpspec.net/", + "keywords": [ + "BDD", + "SpecBDD", + "TDD", + "spec", + "specification", + "testing", + "tests" + ], + "time": "2015-05-30 15:21:40" + }, + { + "name": "phpspec/prophecy", + "version": "v1.4.1", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373", + "reference": "3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373", + "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-04-27 22:15:08" + }, + { + "name": "phpunit/php-code-coverage", + "version": "2.1.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "6044546998c7627ab997501a3d0db972b3db9790" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6044546998c7627ab997501a3d0db972b3db9790", + "reference": "6044546998c7627ab997501a3d0db972b3db9790", + "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.0", + "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.1.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-07-13 11:25:58" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a923bb15680d0089e2316f7a4af8f437046e96bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a923bb15680d0089e2316f7a4af8f437046e96bb", + "reference": "a923bb15680d0089e2316f7a4af8f437046e96bb", + "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-04-02 05:19:05" + }, + { + "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.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/83fe1bdc5d47658b727595c14da140da92b3d66d", + "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d", + "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-13 07:35:30" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/7a9b0969488c3c54fd62b4d504b3ec758fd005d9", + "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9", + "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-06-19 03:43:16" + }, + { + "name": "phpunit/phpunit", + "version": "4.7.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "9b97f9d807b862c2de2a36e86690000801c85724" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9b97f9d807b862c2de2a36e86690000801c85724", + "reference": "9b97f9d807b862c2de2a36e86690000801c85724", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpspec/prophecy": "~1.3,>=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.2", + "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.7.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-07-13 11:28:34" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "2.3.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "1c330b1b6e1ea8fd15f2fbea46770576e366855c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/1c330b1b6e1ea8fd15f2fbea46770576e366855c", + "reference": "1c330b1b6e1ea8fd15f2fbea46770576e366855c", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "~1.0,>=1.0.2", + "php": ">=5.3.3", + "phpunit/php-text-template": "~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-07-04 05:41:32" + }, + { + "name": "sebastian/comparator", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "1dd8869519a225f7f2b9eb663e225298fade819e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dd8869519a225f7f2b9eb663e225298fade819e", + "reference": "1dd8869519a225f7f2b9eb663e225298fade819e", + "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.1.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-01-29 16:28:08" + }, + { + "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.2.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5a8c7d31914337b69923db26c4221b81ff5a196e", + "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e", + "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-01-01 10:01:08" + }, + { + "name": "sebastian/exporter", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "84839970d05254c73cde183a721c7af13aede943" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/84839970d05254c73cde183a721c7af13aede943", + "reference": "84839970d05254c73cde183a721c7af13aede943", + "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-01-27 07:23:06" + }, + { + "name": "sebastian/global-state", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c7428acdb62ece0a45e6306f1ae85e1c05b09c01", + "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01", + "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": "2014-10-06 09:23:50" + }, + { + "name": "sebastian/recursion-context", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "3989662bbb30a29d20d9faa04a846af79b276252" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/3989662bbb30a29d20d9faa04a846af79b276252", + "reference": "3989662bbb30a29d20d9faa04a846af79b276252", + "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-01-24 09:48:32" + }, + { + "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/yaml", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/Yaml.git", + "reference": "4bfbe0ed3909bfddd75b70c094391ec1f142f860" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/4bfbe0ed3909bfddd75b70c094391ec1f142f860", + "reference": "4bfbe0ed3909bfddd75b70c094391ec1f142f860", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "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-07-01 11:25:50" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.5.9" + }, + "platform-dev": [] +} diff --git a/server/config/app.php b/server/config/app.php new file mode 100644 index 00000000..ff02fb8d --- /dev/null +++ b/server/config/app.php @@ -0,0 +1,198 @@ + env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | 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' => env('APP_KEY', 'SomeRandomString'), + + 'cipher' => 'AES-256-CBC', + + /* + |-------------------------------------------------------------------------- + | Logging Configuration + |-------------------------------------------------------------------------- + | + | Here you may configure the log settings for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Settings: "single", "daily", "syslog", "errorlog" + | + */ + + 'log' => 'single', + + /* + |-------------------------------------------------------------------------- + | 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' => [ + + /* + * Laravel Framework Service Providers... + */ + Illuminate\Foundation\Providers\ArtisanServiceProvider::class, + Illuminate\Auth\AuthServiceProvider::class, + Illuminate\Broadcasting\BroadcastServiceProvider::class, + Illuminate\Bus\BusServiceProvider::class, + Illuminate\Cache\CacheServiceProvider::class, + Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, + Illuminate\Routing\ControllerServiceProvider::class, + Illuminate\Cookie\CookieServiceProvider::class, + Illuminate\Database\DatabaseServiceProvider::class, + Illuminate\Encryption\EncryptionServiceProvider::class, + Illuminate\Filesystem\FilesystemServiceProvider::class, + Illuminate\Foundation\Providers\FoundationServiceProvider::class, + Illuminate\Hashing\HashServiceProvider::class, + Illuminate\Mail\MailServiceProvider::class, + Illuminate\Pagination\PaginationServiceProvider::class, + Illuminate\Pipeline\PipelineServiceProvider::class, + Illuminate\Queue\QueueServiceProvider::class, + Illuminate\Redis\RedisServiceProvider::class, + Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, + Illuminate\Session\SessionServiceProvider::class, + Illuminate\Translation\TranslationServiceProvider::class, + Illuminate\Validation\ValidationServiceProvider::class, + Illuminate\View\ViewServiceProvider::class, + 'Cviebrock\EloquentSluggable\SluggableServiceProvider', + + /* + * Application Service Providers... + */ + Flox\Providers\AppServiceProvider::class, + Flox\Providers\EventServiceProvider::class, + Flox\Providers\RouteServiceProvider::class, + + ], + + /* + |-------------------------------------------------------------------------- + | 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' => [ + + 'App' => Illuminate\Support\Facades\App::class, + 'Artisan' => Illuminate\Support\Facades\Artisan::class, + 'Auth' => Illuminate\Support\Facades\Auth::class, + 'Blade' => Illuminate\Support\Facades\Blade::class, + 'Bus' => Illuminate\Support\Facades\Bus::class, + 'Cache' => Illuminate\Support\Facades\Cache::class, + 'Config' => Illuminate\Support\Facades\Config::class, + 'Cookie' => Illuminate\Support\Facades\Cookie::class, + 'Crypt' => Illuminate\Support\Facades\Crypt::class, + 'DB' => Illuminate\Support\Facades\DB::class, + 'Eloquent' => Illuminate\Database\Eloquent\Model::class, + 'Event' => Illuminate\Support\Facades\Event::class, + 'File' => Illuminate\Support\Facades\File::class, + 'Hash' => Illuminate\Support\Facades\Hash::class, + 'Input' => Illuminate\Support\Facades\Input::class, + 'Inspiring' => Illuminate\Foundation\Inspiring::class, + 'Lang' => Illuminate\Support\Facades\Lang::class, + 'Log' => Illuminate\Support\Facades\Log::class, + 'Mail' => Illuminate\Support\Facades\Mail::class, + 'Password' => Illuminate\Support\Facades\Password::class, + 'Queue' => Illuminate\Support\Facades\Queue::class, + 'Redirect' => Illuminate\Support\Facades\Redirect::class, + 'Redis' => Illuminate\Support\Facades\Redis::class, + 'Request' => Illuminate\Support\Facades\Request::class, + 'Response' => Illuminate\Support\Facades\Response::class, + 'Route' => Illuminate\Support\Facades\Route::class, + 'Schema' => Illuminate\Support\Facades\Schema::class, + 'Session' => Illuminate\Support\Facades\Session::class, + 'Storage' => Illuminate\Support\Facades\Storage::class, + 'URL' => Illuminate\Support\Facades\URL::class, + 'Validator' => Illuminate\Support\Facades\Validator::class, + 'View' => Illuminate\Support\Facades\View::class, + + ], + +]; diff --git a/server/config/auth.php b/server/config/auth.php new file mode 100644 index 00000000..fe99db85 --- /dev/null +++ b/server/config/auth.php @@ -0,0 +1,67 @@ + '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' => Flox\User::class, + + /* + |-------------------------------------------------------------------------- + | 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 Reset Settings + |-------------------------------------------------------------------------- + | + | Here you may set the options for resetting passwords including the view + | that is your password reset e-mail. You can also set the name of the + | table that maintains all of the reset tokens for your application. + | + | The expire time is the number of minutes that the reset token 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. + | + */ + + 'password' => [ + 'email' => 'emails.password', + 'table' => 'password_resets', + 'expire' => 60, + ], + +]; diff --git a/server/config/broadcasting.php b/server/config/broadcasting.php new file mode 100644 index 00000000..36f9b3c1 --- /dev/null +++ b/server/config/broadcasting.php @@ -0,0 +1,49 @@ + env('BROADCAST_DRIVER', 'pusher'), + + /* + |-------------------------------------------------------------------------- + | Broadcast Connections + |-------------------------------------------------------------------------- + | + | Here you may define all of the broadcast connections that will be used + | to broadcast events to other systems or over websockets. Samples of + | each available type of connection are provided inside this array. + | + */ + + 'connections' => [ + + 'pusher' => [ + 'driver' => 'pusher', + 'key' => env('PUSHER_KEY'), + 'secret' => env('PUSHER_SECRET'), + 'app_id' => env('PUSHER_APP_ID'), + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + ], + + 'log' => [ + 'driver' => 'log', + ], + + ], + +]; diff --git a/server/config/cache.php b/server/config/cache.php new file mode 100644 index 00000000..379135b0 --- /dev/null +++ b/server/config/cache.php @@ -0,0 +1,79 @@ + env('CACHE_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + */ + + 'stores' => [ + + 'apc' => [ + 'driver' => 'apc', + ], + + 'array' => [ + 'driver' => 'array', + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'cache', + 'connection' => null, + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'servers' => [ + [ + 'host' => '127.0.0.1', 'port' => 11211, 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | 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/server/config/compile.php b/server/config/compile.php new file mode 100644 index 00000000..04807eac --- /dev/null +++ b/server/config/compile.php @@ -0,0 +1,35 @@ + [ + // + ], + + /* + |-------------------------------------------------------------------------- + | Compiled File Providers + |-------------------------------------------------------------------------- + | + | Here you may list service providers which define a "compiles" function + | that returns additional files that should be compiled, providing an + | easy way to get common files from any packages you are utilizing. + | + */ + + 'providers' => [ + // + ], + +]; diff --git a/server/config/database.php b/server/config/database.php new file mode 100644 index 00000000..62a504fc --- /dev/null +++ b/server/config/database.php @@ -0,0 +1,128 @@ + 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' => env('DB_CONNECTION', 'mysql'), + + /* + |-------------------------------------------------------------------------- + | 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' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'database' => storage_path('database.sqlite'), + 'prefix' => '', + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'host' => env('DB_HOST', 'localhost'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'collation' => 'utf8_unicode_ci', + 'prefix' => '', + 'strict' => false, + // mamp :P + //'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock', + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'host' => env('DB_HOST', 'localhost'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'schema' => 'public', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'host' => env('DB_HOST', 'localhost'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + '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' => [ + + 'cluster' => false, + + 'default' => [ + 'host' => '127.0.0.1', + 'port' => 6379, + 'database' => 0, + ], + + ], + +]; diff --git a/server/config/filesystems.php b/server/config/filesystems.php new file mode 100644 index 00000000..3fffcf0a --- /dev/null +++ b/server/config/filesystems.php @@ -0,0 +1,85 @@ + 'local', + + /* + |-------------------------------------------------------------------------- + | Default Cloud Filesystem Disk + |-------------------------------------------------------------------------- + | + | Many applications store files both locally and in the cloud. For this + | reason, you may specify a default "cloud" driver here. This driver + | will be bound as the Cloud disk implementation in the container. + | + */ + + 'cloud' => 's3', + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Here you may configure as many filesystem "disks" as you wish, and you + | may even configure multiple disks of the same driver. Defaults have + | been setup for each driver as an example of the required options. + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app'), + ], + + 'ftp' => [ + 'driver' => 'ftp', + 'host' => 'ftp.example.com', + 'username' => 'your-username', + 'password' => 'your-password', + + // Optional FTP Settings... + // 'port' => 21, + // 'root' => '', + // 'passive' => true, + // 'ssl' => true, + // 'timeout' => 30, + ], + + 's3' => [ + 'driver' => 's3', + 'key' => 'your-key', + 'secret' => 'your-secret', + 'region' => 'your-region', + 'bucket' => 'your-bucket', + ], + + 'rackspace' => [ + 'driver' => 'rackspace', + 'username' => 'your-username', + 'key' => 'your-key', + 'container' => 'your-container', + 'endpoint' => 'https://identity.api.rackspacecloud.com/v2.0/', + 'region' => 'IAD', + 'url_type' => 'publicURL', + ], + + ], + +]; diff --git a/server/config/mail.php b/server/config/mail.php new file mode 100644 index 00000000..a22807e7 --- /dev/null +++ b/server/config/mail.php @@ -0,0 +1,124 @@ + env('MAIL_DRIVER', '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' => env('MAIL_HOST', 'smtp.mailgun.org'), + + /* + |-------------------------------------------------------------------------- + | SMTP Host Port + |-------------------------------------------------------------------------- + | + | This is the SMTP port used by your application to deliver e-mails to + | users of the application. Like the host we have set this value to + | stay compatible with the Mailgun e-mail application by default. + | + */ + + 'port' => env('MAIL_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' => ['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' => env('MAIL_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' => env('MAIL_USERNAME'), + + /* + |-------------------------------------------------------------------------- + | 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' => env('MAIL_PASSWORD'), + + /* + |-------------------------------------------------------------------------- + | 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' => false, + +]; diff --git a/server/config/queue.php b/server/config/queue.php new file mode 100644 index 00000000..cf9b09da --- /dev/null +++ b/server/config/queue.php @@ -0,0 +1,93 @@ + env('QUEUE_DRIVER', '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' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'jobs', + 'queue' => 'default', + 'expire' => 60, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => 'localhost', + 'queue' => 'default', + 'ttr' => 60, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => 'your-public-key', + 'secret' => 'your-secret-key', + 'queue' => 'your-queue-url', + 'region' => 'us-east-1', + ], + + 'iron' => [ + 'driver' => 'iron', + 'host' => 'mq-aws-us-east-1.iron.io', + 'token' => 'your-token', + 'project' => 'your-project-id', + 'queue' => 'your-queue-name', + 'encrypt' => true, + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + 'queue' => 'default', + 'expire' => 60, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | 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' => [ + 'database' => 'mysql', 'table' => 'failed_jobs', + ], + +]; diff --git a/server/config/services.php b/server/config/services.php new file mode 100644 index 00000000..8cea9dc0 --- /dev/null +++ b/server/config/services.php @@ -0,0 +1,38 @@ + [ + 'domain' => '', + 'secret' => '', + ], + + 'mandrill' => [ + 'secret' => '', + ], + + 'ses' => [ + 'key' => '', + 'secret' => '', + 'region' => 'us-east-1', + ], + + 'stripe' => [ + 'model' => Flox\User::class, + 'key' => '', + 'secret' => '', + ], + +]; diff --git a/server/config/session.php b/server/config/session.php new file mode 100644 index 00000000..f1b00421 --- /dev/null +++ b/server/config/session.php @@ -0,0 +1,153 @@ + env('SESSION_DRIVER', '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 Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it is stored. All encryption will be run + | automatically by Laravel and you can use the Session like normal. + | + */ + + 'encrypt' => 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('framework/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' => [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/server/config/sluggable.php b/server/config/sluggable.php new file mode 100644 index 00000000..d4aaf7ca --- /dev/null +++ b/server/config/sluggable.php @@ -0,0 +1,113 @@ +name; + * + * Or it can be an array of fields, like ("name", "company"), which builds a slug from: + * + * $model->name . ' ' . $model->company; + * + * If you've defined custom getters in your model, you can use those too, + * since Eloquent will call them when you request a custom attribute. + * + * Defaults to null, which uses the toString() method on your model. + */ + 'build_from' => null, + + /** + * What field to we store the slug in? Defaults to "slug". + * You need to configure this when building the SQL for your database, e.g.: + * + * Schema::create('users', function($table) + * { + * $table->string('slug'); + * }); + */ + 'save_to' => 'slug', + + /** + * The maximum length of a generated slug. Defaults to "null", which means + * no length restrictions are enforced. Set it to a positive integer if you + * want to make sure your slugs aren't too long. + */ + 'max_length' => null, + + /** + * If left to "null", then use the cocur/slugify package to generate the slug + * (with the separator defined below). + * + * Set this to a closure that accepts two parameters (string and separator) + * to define a custom slugger. e.g.: + * + * 'method' => function( $string, $sep ) { + * return preg_replace('/[^a-z]+/i', $sep, $string); + * }, + * + * Otherwise, this will be treated as a callable to be used. e.g.: + * + * 'method' => array('Str','slug'), + */ + 'method' => null, + + /** + * Separator to use when generating slugs. Defaults to a hyphen. + */ + 'separator' => '-', + + /** + * Enforce uniqueness of slugs? Defaults to true. + * If a generated slug already exists, an incremental numeric + * value will be appended to the end until a unique slug is found. e.g.: + * + * my-slug + * my-slug-1 + * my-slug-2 + */ + 'unique' => true, + + /** + * Should we include the trashed items when generating a unique slug? + * This only applies if the softDelete property is set for the Eloquent model. + * If set to "false", then a new slug could duplicate one that exists on a trashed model. + * If set to "true", then uniqueness is enforced across trashed and existing models. + */ + 'include_trashed' => false, + + /** + * Whether to update the slug value when a model is being + * re-saved (i.e. already exists). Defaults to false, which + * means slugs are not updated. + */ + 'on_update' => false, + + /** + * An array of slug names that can never be used for this model, + * e.g. to prevent collisions with existing routes or controller methods, etc.. + * Defaults to null (i.e. no reserved names). + * Can be a static array, e.g.: + * + * 'reserved' => array('add', 'delete'), + * + * or a closure that returns an array of reserved names. + * If using a closure, it will accept one parameter: the model itself, and should + * return an array of reserved names, or null. e.g. + * + * 'reserved' => function( Model $model) { + * return $model->some_method_that_returns_an_array(); + * } + * + * In the case of a slug that gets generated with one of these reserved names, + * we will do: + * + * $slug .= $seperator + "1" + * + * and continue from there. + */ + 'reserved' => null, + +]; diff --git a/server/config/view.php b/server/config/view.php new file mode 100644 index 00000000..14450eae --- /dev/null +++ b/server/config/view.php @@ -0,0 +1,33 @@ + [ + realpath(base_path('../client/views')), + ], + + /* + |-------------------------------------------------------------------------- + | Compiled View Path + |-------------------------------------------------------------------------- + | + | This option determines where all the compiled Blade templates will be + | stored for your application. Typically, this is within the storage + | directory. However, as usual, you are free to change this value. + | + */ + + 'compiled' => realpath(storage_path('framework/views')), + +]; diff --git a/server/database/.gitignore b/server/database/.gitignore new file mode 100644 index 00000000..9b1dffd9 --- /dev/null +++ b/server/database/.gitignore @@ -0,0 +1 @@ +*.sqlite diff --git a/server/database/factories/ModelFactory.php b/server/database/factories/ModelFactory.php new file mode 100644 index 00000000..8992c49f --- /dev/null +++ b/server/database/factories/ModelFactory.php @@ -0,0 +1,21 @@ +define(Flox\User::class, function ($faker) { + return [ + 'name' => $faker->name, + 'email' => $faker->email, + 'password' => str_random(10), + 'remember_token' => str_random(10), + ]; +}); diff --git a/server/database/migrations/.gitkeep b/server/database/migrations/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/server/database/migrations/2014_10_12_000000_create_users_table.php b/server/database/migrations/2014_10_12_000000_create_users_table.php new file mode 100644 index 00000000..65d3d083 --- /dev/null +++ b/server/database/migrations/2014_10_12_000000_create_users_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->string('name'); + $table->string('email')->unique(); + $table->string('password', 60); + $table->rememberToken(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('users'); + } +} diff --git a/server/database/migrations/2015_07_09_061820_create_categories_table.php b/server/database/migrations/2015_07_09_061820_create_categories_table.php new file mode 100644 index 00000000..80fd3fa2 --- /dev/null +++ b/server/database/migrations/2015_07_09_061820_create_categories_table.php @@ -0,0 +1,31 @@ +increments('id'); + $table->string('name'); + $table->string('slug'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('categories'); + } +} diff --git a/server/database/migrations/2015_07_09_071718_create_items_table.php b/server/database/migrations/2015_07_09_071718_create_items_table.php new file mode 100644 index 00000000..ce8590fa --- /dev/null +++ b/server/database/migrations/2015_07_09_071718_create_items_table.php @@ -0,0 +1,39 @@ +increments('id'); + $table->integer('tmdb_id'); + $table->string('title'); + $table->string('slug'); + $table->string('poster'); + $table->integer('category_id')->unsigned(); + $table->foreign('category_id')->references('id')->on('categories'); + $table->integer('rating'); + $table->integer('released'); + $table->integer('seen'); + $table->integer('created_at'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('items'); + } +} diff --git a/server/database/seeds/.gitkeep b/server/database/seeds/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/server/database/seeds/CategoryTableSeeder.php b/server/database/seeds/CategoryTableSeeder.php new file mode 100644 index 00000000..fe1a7506 --- /dev/null +++ b/server/database/seeds/CategoryTableSeeder.php @@ -0,0 +1,29 @@ +insert([ + 'name' => 'Movies', + 'slug' => 'movies' + ]); + + DB::table('categories')->insert([ + 'name' => 'Series', + 'slug' => 'series' + ]); + + DB::table('categories')->insert([ + 'name' => 'Animes', + 'slug' => 'animes' + ]); + } +} diff --git a/server/database/seeds/DatabaseSeeder.php b/server/database/seeds/DatabaseSeeder.php new file mode 100644 index 00000000..7c52f188 --- /dev/null +++ b/server/database/seeds/DatabaseSeeder.php @@ -0,0 +1,22 @@ +call(CategoryTableSeeder::class); + $this->call(ItemTableSeeder::class); + + Model::reguard(); + } + } diff --git a/server/database/seeds/ItemTableSeeder.php b/server/database/seeds/ItemTableSeeder.php new file mode 100644 index 00000000..3527a4a3 --- /dev/null +++ b/server/database/seeds/ItemTableSeeder.php @@ -0,0 +1,209 @@ +insert([ + 'tmdb_id' => 99861, + 'title' => 'Avengers: Age of Ultron', + 'slug' => Str::slug('Avengers: Age of Ultron'), + 'poster' => '/t90Y3G8UGQp0f0DrP60wRu9gfrH.jpg', + 'category_id' => 1, + 'rating' => 2, + 'released' => '1429912800', + 'seen' => '1429912800', + 'created_at' => '1429912800', + ]); + + DB::table('items')->insert([ + 'tmdb_id' => 135397, + 'title' => 'Jurassic World', + 'slug' => Str::slug('Jurassic World'), + 'poster' => '/uXZYawqUsChGSj54wcuBtEdUJbh.jpg', + 'category_id' => 1, + 'rating' => 4, + 'released' => '1429912800', + 'seen' => '1429912800', + 'created_at' => '1429912800', + ]); + + DB::table('items')->insert([ + 'tmdb_id' => 68726, + 'title' => 'Pacific Rim', + 'slug' => Str::slug('Pacific Rim'), + 'poster' => '/sCJEwEShZvruTpQ2a4yiX3Q9EyZ.jpg', + 'category_id' => 1, + 'rating' => 3, + 'released' => '1429912800', + 'seen' => '1429912800', + 'created_at' => '1429912800', + ]); + + DB::table('items')->insert([ + 'tmdb_id' => 242224, + 'title' => 'The Babadook', + 'slug' => Str::slug('The Babadook'), + 'poster' => '/b3YzM03YxkOaJw2PglfKlcwr8bM.jpg', + 'category_id' => 1, + 'rating' => 4, + 'released' => '1429912800', + 'seen' => '1429912800', + 'created_at' => '1429912800', + ]); + + DB::table('items')->insert([ + 'tmdb_id' => 26447, + 'title' => 'Dragon Ball Z', + 'slug' => Str::slug('Dragon Ball Z'), + 'poster' => '/4YJSp7sAcxD3nea9n9mjwU2Y3DV.jpg', + 'category_id' => 3, + 'rating' => 5, + 'released' => '1429912800', + 'seen' => '1429912800', + 'created_at' => '1429912800', + ]); + + DB::table('items')->insert([ + 'tmdb_id' => 184346, + + 'title' => 'Deliver Us from Evil', + 'slug' => Str::slug('Deliver Us from Evil'), + 'poster' => '/yEIMu6tgUPNmbLfH7fugKOe12id.jpg', + 'category_id' => 1, + 'rating' => 4, + 'released' => '1429912800', + 'seen' => '1429912800', + 'created_at' => '1429912800', + ]); + + DB::table('items')->insert([ + 'tmdb_id' => 21208, + + 'title' => 'Orphan', + 'slug' => Str::slug('Orphan'), + 'poster' => '/dVP8tE9bV2oIv1l0aWtTUJndZvc.jpg', + 'category_id' => 1, + 'rating' => 5, + 'released' => '1429912800', + 'seen' => '1429912800', + 'created_at' => '1429912800', + ]); + + DB::table('items')->insert([ + 'tmdb_id' => 4607, + 'title' => 'Lost', + 'slug' => Str::slug('Lost'), + 'poster' => '/jyGspygDXJMydTOJj7iWNx9Elyd.jpg', + 'category_id' => 2, + 'rating' => 4, + 'released' => '1429912800', + 'seen' => '1429912800', + 'created_at' => '1429912800', + ]); + + DB::table('items')->insert([ + 'tmdb_id' => 2288, + 'title' => 'Prison Break', + 'slug' => Str::slug('Prison Break'), + 'poster' => '/38KlJOm67KyZqT9ZcBSsmET04HG.jpg', + 'category_id' => 2, + 'rating' => 4, + 'released' => '1429912800', + 'seen' => '1429912800', + 'created_at' => '1429912800', + ]); + + DB::table('items')->insert([ + 'tmdb_id' => 44217, + 'title' => 'Vikings', + 'slug' => Str::slug('Vikings'), + 'poster' => '/mBDlsOhNOV1MkNii81aT14EYQ4S.jpg', + 'category_id' => 2, + 'rating' => 5, + 'released' => '1429912800', + 'seen' => '1429912800', + 'created_at' => '1429912800', + ]); + + DB::table('items')->insert([ + 'tmdb_id' => 1399, + 'title' => 'Game of Thrones', + 'slug' => Str::slug('Game of Thrones'), + 'poster' => '/jIhL6mlT7AblhbHJgEoiBIOUVl1.jpg', + 'category_id' => 2, + 'rating' => 5, + 'released' => '1429912800', + 'seen' => '1429912800', + 'created_at' => '1429912800', + ]); + + DB::table('items')->insert([ + 'tmdb_id' => 1413, + 'title' => 'American Horror Story', + 'slug' => Str::slug('American Horror Story'), + 'poster' => '/uRl2hCJw2SXOMJhmcJF6UlBmBij.jpg', + 'category_id' => 2, + 'rating' => 4, + 'released' => '1429912800', + 'seen' => '1429912800', + 'created_at' => '1429912800', + ]); + + DB::table('items')->insert([ + 'tmdb_id' => 61459, + 'title' => 'Parasyte -the maxim-', + 'slug' => Str::slug('Parasyte -the maxim-'), + 'poster' => '/pUdUxvuqabs6JDru00wmMIjibbS.jpg', + 'category_id' => 3, + 'rating' => 5, + 'released' => '1429912800', + 'seen' => '1429912800', + 'created_at' => '1429912800', + ]); + + DB::table('items')->insert([ + 'tmdb_id' => 13916, + 'title' => 'Death Note', + 'slug' => Str::slug('Death Note'), + 'poster' => '/nhIkKuOpOXOE6ud0naCHTjRoOwq.jpg', + 'category_id' => 3, + 'rating' => 5, + 'released' => '1429912800', + 'seen' => '1429912800', + 'created_at' => '1429912800', + ]); + + DB::table('items')->insert([ + 'tmdb_id' => 16830, + 'title' => 'Hellsing', + 'slug' => Str::slug('Hellsing'), + 'poster' => '/fK5eCcDxukp75lmDWvQkhJvYtOj.jpg', + 'category_id' => 3, + 'rating' => 4, + 'released' => '1429912800', + 'seen' => '1429912800', + 'created_at' => '1429912800', + ]); + + DB::table('items')->insert([ + 'tmdb_id' => 46298, + 'title' => 'Hunter x Hunter', + 'slug' => Str::slug('Hunter x Hunter'), + 'poster' => '/l5CLmiz0yPwusw3D10XaQDuSFTm.jpg', + 'category_id' => 3, + 'rating' => 5, + 'released' => '1429912800', + 'seen' => '1429912800', + 'created_at' => '1429912800', + ]); + } + } diff --git a/server/server.php b/server/server.php new file mode 100644 index 00000000..f65c7c44 --- /dev/null +++ b/server/server.php @@ -0,0 +1,21 @@ + + */ + +$uri = urldecode( + parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) +); + +// This file allows us to emulate Apache's "mod_rewrite" functionality from the +// built-in PHP web server. This provides a convenient way to test a Laravel +// application without having installed a "real" web server software here. +if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) { + return false; +} + +require_once __DIR__.'/public/index.php'; diff --git a/server/storage/app/.gitignore b/server/storage/app/.gitignore new file mode 100644 index 00000000..c96a04f0 --- /dev/null +++ b/server/storage/app/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/server/storage/framework/.gitignore b/server/storage/framework/.gitignore new file mode 100644 index 00000000..953edb7a --- /dev/null +++ b/server/storage/framework/.gitignore @@ -0,0 +1,7 @@ +config.php +routes.php +compiled.php +services.json +events.scanned.php +routes.scanned.php +down diff --git a/server/storage/framework/cache/.gitignore b/server/storage/framework/cache/.gitignore new file mode 100644 index 00000000..c96a04f0 --- /dev/null +++ b/server/storage/framework/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/server/storage/framework/sessions/.gitignore b/server/storage/framework/sessions/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/server/storage/framework/sessions/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/server/storage/framework/views/.gitignore b/server/storage/framework/views/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/server/storage/framework/views/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/server/storage/logs/.gitignore b/server/storage/logs/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/server/storage/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/server/tests/ExampleTest.php b/server/tests/ExampleTest.php new file mode 100644 index 00000000..7e81d37a --- /dev/null +++ b/server/tests/ExampleTest.php @@ -0,0 +1,19 @@ +visit('/') + ->see('Laravel 5'); + } +} diff --git a/server/tests/TestCase.php b/server/tests/TestCase.php new file mode 100644 index 00000000..8578b17e --- /dev/null +++ b/server/tests/TestCase.php @@ -0,0 +1,25 @@ +make(Illuminate\Contracts\Console\Kernel::class)->bootstrap(); + + return $app; + } +}