1
0
mirror of https://github.com/jcwimer/wrestlingApp synced 2026-03-25 01:14:43 +00:00

Removed frontend and updated production to use puma instead of pasenger

This commit is contained in:
2017-05-31 09:40:31 -04:00
parent 3f72a912b6
commit b37004cbbf
55 changed files with 128 additions and 3676 deletions

42
Gemfile
View File

@@ -39,26 +39,24 @@ gem 'spring', :group => :development
#Installed by me #Installed by me
#For Heroku group :production do
group :production do gem 'rails_12factor'
gem 'rails_12factor' gem 'mysql2'
gem 'mysql2' gem 'therubyracer'
gem 'passenger' gem 'newrelic_rpm'
gem 'therubyracer' gem 'dalli'
gem 'newrelic_rpm' end
gem 'dalli'
end gem 'devise'
#Other gem 'cancancan'
gem 'devise' gem 'round_robin_tournament'
gem 'cancancan' gem 'rb-readline'
gem 'round_robin_tournament' gem 'delayed_job_active_record'
gem 'rb-readline' gem 'puma'
gem 'delayed_job_active_record'
gem 'puma' group :development do
gem 'brakeman' gem 'rubocop'
gem 'rails-lineman' gem 'bullet'
group :development do gem 'brakeman'
end
#gem 'bullet'
end

View File

@@ -36,80 +36,73 @@ GEM
minitest (~> 5.1) minitest (~> 5.1)
thread_safe (~> 0.3, >= 0.3.4) thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1) tzinfo (~> 1.1)
arel (6.0.3) arel (6.0.4)
bcrypt (3.1.10) ast (2.3.0)
brakeman (3.1.5) bcrypt (3.1.11)
erubis (~> 2.6) brakeman (3.6.1)
fastercsv (~> 1.5) builder (3.2.3)
haml (>= 3.0, < 5.0) bullet (5.5.1)
highline (>= 1.6.20, < 2.0) activesupport (>= 3.0.0)
multi_json (~> 1.2) uniform_notifier (~> 1.10.0)
ruby2ruby (>= 2.1.1, < 2.3.0) cancancan (2.0.0)
ruby_parser (~> 3.7.0)
safe_yaml (>= 1.0)
sass (~> 3.0)
slim (>= 1.3.6, < 4.0)
terminal-table (~> 1.4)
builder (3.2.2)
cancancan (1.10.1)
coffee-rails (4.0.1) coffee-rails (4.0.1)
coffee-script (>= 2.2.0) coffee-script (>= 2.2.0)
railties (>= 4.0.0, < 5.0) railties (>= 4.0.0, < 5.0)
coffee-script (2.4.1) coffee-script (2.4.1)
coffee-script-source coffee-script-source
execjs execjs
coffee-script-source (1.9.1.1) coffee-script-source (1.12.2)
concurrent-ruby (1.0.0) concurrent-ruby (1.0.5)
dalli (2.7.5) dalli (2.7.6)
delayed_job (4.1.1) delayed_job (4.1.2)
activesupport (>= 3.0, < 5.0) activesupport (>= 3.0, < 5.1)
delayed_job_active_record (4.1.0) delayed_job_active_record (4.1.1)
activerecord (>= 3.0, < 5) activerecord (>= 3.0, < 5.1)
delayed_job (>= 3.0, < 5) delayed_job (>= 3.0, < 5)
devise (3.4.1) devise (4.3.0)
bcrypt (~> 3.0) bcrypt (~> 3.0)
orm_adapter (~> 0.1) orm_adapter (~> 0.1)
railties (>= 3.2.6, < 5) railties (>= 4.1.0, < 5.2)
responders responders
thread_safe (~> 0.1)
warden (~> 1.2.3) warden (~> 1.2.3)
erubis (2.7.0) erubis (2.7.0)
execjs (2.5.2) execjs (2.7.0)
fastercsv (1.5.5) globalid (0.4.0)
globalid (0.3.6) activesupport (>= 4.2.0)
activesupport (>= 4.1.0) i18n (0.8.1)
haml (4.0.7) jbuilder (2.6.4)
tilt activesupport (>= 3.0.0)
highline (1.7.8) multi_json (>= 1.2)
i18n (0.7.0) jquery-rails (4.3.1)
jbuilder (2.2.13) rails-dom-testing (>= 1, < 3)
activesupport (>= 3.0.0, < 5)
multi_json (~> 1.2)
jquery-rails (4.0.3)
rails-dom-testing (~> 1.0)
railties (>= 4.2.0) railties (>= 4.2.0)
thor (>= 0.14, < 2.0) thor (>= 0.14, < 2.0)
json (1.8.3) json (1.8.6)
libv8 (3.16.14.7) libv8 (3.16.14.19)
loofah (2.0.3) loofah (2.0.3)
nokogiri (>= 1.5.9) nokogiri (>= 1.5.9)
mail (2.6.3) mail (2.6.5)
mime-types (>= 1.16, < 3) mime-types (>= 1.16, < 4)
mime-types (2.99) mime-types (3.1)
mini_portile2 (2.0.0) mime-types-data (~> 3.2015)
minitest (5.8.3) mime-types-data (3.2016.0521)
multi_json (1.11.0) mini_portile2 (2.1.0)
mysql2 (0.3.18) minitest (5.10.2)
newrelic_rpm (3.13.2.302) multi_json (1.12.1)
nokogiri (1.6.7) mysql2 (0.4.6)
mini_portile2 (~> 2.0.0.rc2) newrelic_rpm (4.1.0.333)
nokogiri (1.7.2)
mini_portile2 (~> 2.1.0)
orm_adapter (0.5.0) orm_adapter (0.5.0)
passenger (5.0.7) parallel (1.11.2)
parser (2.4.0.0)
ast (~> 2.2)
passenger (5.1.4)
rack rack
rake (>= 0.8.1) rake (>= 0.8.1)
puma (2.11.2) powerpack (0.1.1)
rack (>= 1.1, < 2.0) puma (3.8.2)
rack (1.6.4) rack (1.6.8)
rack-test (0.6.3) rack-test (0.6.3)
rack (>= 1.0) rack (>= 1.0)
rails (4.2.5) rails (4.2.5)
@@ -125,71 +118,70 @@ GEM
sprockets-rails sprockets-rails
rails-deprecated_sanitizer (1.0.3) rails-deprecated_sanitizer (1.0.3)
activesupport (>= 4.2.0.alpha) activesupport (>= 4.2.0.alpha)
rails-dom-testing (1.0.7) rails-dom-testing (1.0.8)
activesupport (>= 4.2.0.beta, < 5.0) activesupport (>= 4.2.0.beta, < 5.0)
nokogiri (~> 1.6.0) nokogiri (~> 1.6)
rails-deprecated_sanitizer (>= 1.0.1) rails-deprecated_sanitizer (>= 1.0.1)
rails-html-sanitizer (1.0.2) rails-html-sanitizer (1.0.3)
loofah (~> 2.0) loofah (~> 2.0)
rails-lineman (0.3.0) rails-lineman (0.3.0)
rake rake
rails_12factor (0.0.3) rails_12factor (0.0.3)
rails_serve_static_assets rails_serve_static_assets
rails_stdout_logging rails_stdout_logging
rails_serve_static_assets (0.0.4) rails_serve_static_assets (0.0.5)
rails_stdout_logging (0.0.3) rails_stdout_logging (0.0.5)
railties (4.2.5) railties (4.2.5)
actionpack (= 4.2.5) actionpack (= 4.2.5)
activesupport (= 4.2.5) activesupport (= 4.2.5)
rake (>= 0.8.7) rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0) thor (>= 0.18.1, < 2.0)
rake (10.4.2) rainbow (2.2.2)
rb-readline (0.5.2) rake
rdoc (4.2.0) rake (12.0.0)
json (~> 1.4) rb-readline (0.5.4)
ref (1.0.5) rdoc (4.3.0)
responders (2.1.0) ref (2.0.0)
railties (>= 4.2.0, < 5) responders (2.4.0)
actionpack (>= 4.2.0, < 5.3)
railties (>= 4.2.0, < 5.3)
round_robin_tournament (0.0.1) round_robin_tournament (0.0.1)
ruby2ruby (2.2.0) rubocop (0.49.1)
ruby_parser (~> 3.1) parallel (~> 1.10)
sexp_processor (~> 4.0) parser (>= 2.3.3.1, < 3.0)
ruby_parser (3.7.3) powerpack (~> 0.1)
sexp_processor (~> 4.1) rainbow (>= 1.99.1, < 3.0)
safe_yaml (1.0.4) ruby-progressbar (~> 1.7)
sass (3.4.21) unicode-display_width (~> 1.0, >= 1.0.1)
sdoc (0.4.1) ruby-progressbar (1.8.1)
sdoc (0.4.2)
json (~> 1.7, >= 1.7.7) json (~> 1.7, >= 1.7.7)
rdoc (~> 4.0) rdoc (~> 4.0)
sexp_processor (4.6.1) spring (2.0.1)
slim (3.0.6) activesupport (>= 4.2)
temple (~> 0.7.3) sprockets (3.7.1)
tilt (>= 1.3.3, < 2.1)
spring (1.3.5)
sprockets (3.5.0)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
rack (> 1, < 3) rack (> 1, < 3)
sprockets-rails (2.3.3) sprockets-rails (3.2.0)
actionpack (>= 3.0) actionpack (>= 4.0)
activesupport (>= 3.0) activesupport (>= 4.0)
sprockets (>= 2.8, < 4.0) sprockets (>= 3.0.0)
sqlite3 (1.3.10) sqlite3 (1.3.13)
temple (0.7.6) therubyracer (0.12.3)
terminal-table (1.5.2) libv8 (~> 3.16.14.15)
therubyracer (0.12.2)
libv8 (~> 3.16.14.0)
ref ref
thor (0.19.1) thor (0.19.4)
thread_safe (0.3.5) thread_safe (0.3.6)
tilt (2.0.2) turbolinks (5.0.1)
turbolinks (2.5.3) turbolinks-source (~> 5)
coffee-rails turbolinks-source (5.0.3)
tzinfo (1.2.2) tzinfo (1.2.3)
thread_safe (~> 0.1) thread_safe (~> 0.1)
uglifier (2.7.1) uglifier (3.2.0)
execjs (>= 0.3.0) execjs (>= 0.3.0, < 3)
json (>= 1.8.0) unicode-display_width (1.2.1)
warden (1.2.3) uniform_notifier (1.10.0)
warden (1.2.7)
rack (>= 1.0) rack (>= 1.0)
PLATFORMS PLATFORMS
@@ -197,6 +189,7 @@ PLATFORMS
DEPENDENCIES DEPENDENCIES
brakeman brakeman
bullet
cancancan cancancan
coffee-rails (~> 4.0.0) coffee-rails (~> 4.0.0)
dalli dalli
@@ -213,6 +206,7 @@ DEPENDENCIES
rails_12factor rails_12factor
rb-readline rb-readline
round_robin_tournament round_robin_tournament
rubocop
sdoc (~> 0.4.0) sdoc (~> 0.4.0)
spring spring
sqlite3 sqlite3
@@ -224,4 +218,4 @@ RUBY VERSION
ruby 2.3.0p0 ruby 2.3.0p0
BUNDLED WITH BUNDLED WITH
1.13.5 1.14.6

View File

@@ -1,2 +1,2 @@
worker: bundle exec rake jobs:work worker: bundle exec rake jobs:work
web: bundle exec passenger start -p $PORT --max-pool-size 3 web: bundle exec puma -t 5:5 -p ${PORT:-3000} -e ${RACK_ENV:-development}

View File

@@ -29,8 +29,6 @@ module Wrestling
config.active_job.queue_adapter = :delayed_job config.active_job.queue_adapter = :delayed_job
config.rails_lineman.lineman_project_location = "frontend"
config.to_prepare do config.to_prepare do
DeviseController.respond_to :html, :json DeviseController.respond_to :html, :json
end end

View File

@@ -22,4 +22,4 @@ memcached:
worker: worker:
image: wrestlingdev image: wrestlingdev
command: /bin/bash -c "cd /var/www && bundle exec rake jobs:work RAILS_ENV=production" command: /bin/bash -c "cd /rails && bundle exec rake jobs:work RAILS_ENV=production"

9
frontend/.gitignore vendored
View File

@@ -1,9 +0,0 @@
.DS_Store
#ignore node_modules, as the node project is not "deployed" per se: http://www.mikealrogers.com/posts/nodemodules-in-git.html
/node_modules
/dist
/generated
.sass-cache

View File

@@ -1,9 +0,0 @@
.DS_Store
#ignore node_modules, as the node project is not "deployed" per se: http://www.mikealrogers.com/posts/nodemodules-in-git.html
/node_modules
/dist
/generated
.sass-cache

View File

@@ -1,4 +0,0 @@
language: node_js
node_js:
- 0.10
script: "lineman spec-ci"

View File

@@ -1,4 +0,0 @@
/*global module:false*/
module.exports = function(grunt) {
require('./config/lineman').config.grunt.run(grunt);
};

View File

@@ -1 +0,0 @@
web: npm run production

View File

@@ -1 +0,0 @@
# My Lineman Application

View File

@@ -1,4 +0,0 @@
.hello {
background-color: #efefef;
border: 1px solid #dedede;
}

View File

View File

View File

@@ -1,11 +0,0 @@
var app = angular.module("wrestlingdev", ["ngRoute","Devise"]).run(function($rootScope) {
// adds some basic utilities to the $rootScope for debugging purposes
$rootScope.log = function(thing) {
console.log(thing);
};
$rootScope.alert = function(thing) {
alert(thing);
};
});

View File

@@ -1,51 +0,0 @@
'use strict';
app.controller("loginController", function($scope, $routeParams, Auth, $rootScope) {
$scope.credentials = {
email: '',
password: ''
};
var config = {
headers: {
'X-HTTP-Method-Override': 'POST'
}
};
$scope.login = function(){
Auth.login($scope.credentials, config).then(function(user) {
console.log(user); // => {id: 1, ect: '...'}
$rootScope.user = user;
$rootScope.alertClass = "alert alert-success";
$rootScope.alertMessage = "Logged in successfully";
}, function(error) {
console.log(error);
$rootScope.alertClass = "alert alert-danger";
$rootScope.alertMessage = "Username and/or password is incorrect";
});
};
$scope.logout = function(){
Auth.logout(config).then(function(oldUser) {
// alert(oldUser.name + "you're signed out now.");
$rootScope.user = null;
$rootScope.alertClass = "alert alert-success";
$rootScope.alertMessage = "Logged out successfully";
}, function(error) {
// An error occurred logging out.
$rootScope.alertClass = "alert alert-danger";
$rootScope.alertMessage = "There was an error logging out";
});
};
Auth.currentUser().then(function(user) {
// User was logged in, or Devise returned
// previously authenticated session.
$rootScope.user = user;
}, function(error) {
// unauthenticated error
$rootScope.user = null;
});
});

View File

@@ -1,11 +0,0 @@
'use strict';
app.controller("myTournamentsController", function($scope, tournamentsService, $rootScope) {
tournamentsService.getMyTournaments().then(function(data) {
//this will execute when the
//AJAX call completes.
$scope.allTournaments = data;
});
});

View File

@@ -1,86 +0,0 @@
'use strict';
app.controller("tournamentController", function($scope, tournamentsService, $routeParams, Wrestler, Auth, $rootScope) {
$scope.message = "Test message in scope.";
// $scope.tournamentData = "test";
tournamentsService.tournamentDetails($routeParams.id).then(function(data) {
//this will execute when the
//AJAX call completes.
$scope.tournament = data;
});
$scope.refreshTournamentData = function(){
tournamentsService.tournamentDetails($routeParams.id).then(function(data) {
//this will execute when the
//AJAX call completes.
$scope.tournament = data;
});
};
// refresh tournament data every 10 seconds
// setInterval(function(){
// tournamentsService.tournamentDetails($routeParams.id).then(function(data) {
// //this will execute when the
// //AJAX call completes.
// $scope.tournament = data;
// });
// }, 10000);
$scope.wrestler = Wrestler;
$scope.showSchools = false;
$scope.toggleSchools = function(){
$scope.showSchools = !$scope.showSchools;
};
$scope.showWeightSeeds = false;
$scope.toggleWeightSeeds = function(){
$scope.showWeightSeeds = !$scope.showWeightSeeds;
};
$scope.showBoutBoard = false;
$scope.toggleBoutBoard = function(){
$scope.showBoutBoard = !$scope.showBoutBoard;
};
$scope.isTournamentOwner = function(tournamentId,userId){
if(userId == tournamentId){
return true;
} else {
return false;
}
};
$scope.newSchool = null;
$scope.saveNewSchool = function(){
$scope.newSchool.tournament_id = $scope.tournament.id;
tournamentsService.saveNewSchool($scope.newSchool).then(function(data) {
$scope.tournament.schools.push(data);
});
$scope.newSchool = null;
$('#NewSchool').modal('hide');
};
$scope.deleteSchool = function(school){
if (confirm('Are you sure you want to delete ' + school.name + '?')) {
tournamentsService.deleteSchool(school).then(function(data) {
$scope.tournament.schools.splice( $scope.tournament.schools.indexOf(school), 1 );
});
}
};
$scope.updateSchool = function(school){
tournamentsService.updateSchool(school);
$('#EditSchool' + school.id).modal('hide');
};
});

View File

@@ -1,19 +0,0 @@
'use strict';
app.controller("tournamentsController", function($scope, tournamentsService) {
tournamentsService.getAllTournaments().then(function(data) {
//this will execute when the
//AJAX call completes.
$scope.allTournaments = data;
});
$scope.searchTournaments = function (){
tournamentsService.searchTournaments($scope.searchTerms).then(function(data) {
//this will execute when the
//AJAX call completes.
$scope.allTournaments = data;
});
};
});

View File

@@ -1,24 +0,0 @@
(function(){
app.directive('usSpinner', ['$http', '$rootScope' ,function ($http, $rootScope){
return {
link: function (scope, elm, attrs)
{
$rootScope.spinnerActive = false;
scope.isLoading = function () {
return $http.pendingRequests.length > 0;
};
scope.$watch(scope.isLoading, function (loading)
{
$rootScope.spinnerActive = loading;
if(loading){
elm.removeClass('ng-hide');
}else{
elm.addClass('ng-hide');
}
});
}
};
}]);
}).call(this);

View File

@@ -1,18 +0,0 @@
'use strict';
app.factory('Wrestler', function Wrestler(){
var vm = this;
vm.matches = function(wrestler,matches){
console.log(matches);
return _.filter(matches, function(match){
return match.w1 == wrestler.id || match.w2 == wrestler.id;
});
};
return vm;
});

View File

@@ -1,49 +0,0 @@
// $routeProvider.when('/list-of-books', {
// templateUrl: 'angular/books.html',
// controller: 'BooksController'
// // uncomment if you want to see an example of a route that resolves a request prior to rendering
// // resolve: {
// // books : function(BookService) {
// // return BookService.get();
// // }
// // }
// });
app.config(['$routeProvider', '$locationProvider', function($routeProvider,$locationProvider) {
$routeProvider.when('/', {
templateUrl: 'home.html',
});
$routeProvider.when('/tournaments', {
templateUrl: 'tournaments-search.html',
controller: 'tournamentsController'
});
$routeProvider.when('/tournaments/user', {
templateUrl: 'my-tournaments.html',
controller: 'myTournamentsController'
});
$routeProvider.when('/tournaments/:id', {
templateUrl: 'tournaments-show.html',
controller: 'tournamentController'
});
$routeProvider.when('/about', {
templateUrl: 'about.html',
});
$routeProvider.when('/tutorials', {
templateUrl: 'tutorials.html',
});
$routeProvider.otherwise({redirectTo: '/'});
//this give me normal routes instead of /#/
// $locationProvider.html5Mode(true);
}]);

View File

@@ -1,101 +0,0 @@
app.factory('tournamentsService', tournamentsService);
function tournamentsService($http,$rootScope){
var service = {};
service.getMyTournaments = function(user){
return $http({
url: '/api/tournaments/user/',
method: "GET"
}).then(successResponse, errorCallback);
};
service.getAllTournaments = function(){
return $http({
url: '/api/tournaments/',
method: "GET"
}).then(successResponse, errorCallback);
};
service.searchTournaments = function(search){
return $http({
method: 'GET',
url: '/api/tournaments/',
params: {
search: search
}
}).then(successResponse, errorCallback);
};
service.tournamentDetails = function(tournamentId){
return $http({
url: '/api/tournaments/' + tournamentId,
method: "GET"
}).then(successResponse, errorCallback);
};
service.saveNewSchool = function(newSchool){
return $http({
url: '/schools.json',
method: "POST",
data: {
school: {
'name': newSchool.name,
'tournament_id': newSchool.tournament_id
}
},
headers: {
"Content-Type": "application/json"
}
}).then(successResponse, errorCallback);
};
service.deleteSchool = function(school){
return $http({
url: '/schools/' + school.id + '/',
method: "DELETE"
}).then(successResponse, errorCallback);
};
service.updateSchool = function(schoolToEdit){
return $http({
url: '/schools/' + schoolToEdit.id,
method: "PATCH",
data: {
school: {
'name': schoolToEdit.name,
'tournament_id': schoolToEdit.tournament_id
}
},
headers: {
"Content-Type": "application/json"
}
}).then(successResponse, errorCallback);
};
function successResponse(response){
// console.log("success log below");
// console.log(response);
if(response.config.method == "POST" || response.config.method == "DELETE" || response.config.method == "PATCH"){
$rootScope.alertClass = "alert alert-success";
$rootScope.alertMessage = response.statusText;
}
return response.data;
}
function errorCallback(err){
// console.log("error log below");
// console.log(err);
if(err.status > 0){
$rootScope.alertClass = "alert alert-danger";
$rootScope.alertMessage = err.statusText;
}
return err;
}
return service;
}

View File

@@ -1,98 +0,0 @@
<!DOCTYPE html>
<html ng-app="wrestlingdev">
<head>
<base href="/#/">
<title>WrestlingDev</title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">
</head>
<body style="padding-top: 70px;">
<div class="container">
<div class="navbar-roof"></div>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/#/">WrestlingDev</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav navbar-right navbar-custom-link">
<li><a href="/#/tournaments">Browse Tournaments</a></li>
<li><a href="/#/about">About</a></li>
<li><a href="/#/tutorials">Tutorials</a></li>
<li class="dropdown" ng-controller="loginController">
<a ng-if="user == null" class="dropdown-toggle" data-toggle="dropdown">Login<span class="caret"></a>
<div ng-if="user == null" class="dropdown-menu" style="padding:17px;">
<form class="form" id="formLogin">
<div class="form-group">
<input name="username" class="form-control" id="username" type="text" placeholder="Email" ng-model="credentials.email">
<input name="password" class="form-control" id="password" type="password" placeholder="Password" ng-model="credentials.password"><br>
<button type="button" id="btnLogin" class="btn btn-primary" ng-click="login()">Login</button>
</div>
</form>
</div>
<a ng-if="user != null" class="dropdown-toggle" data-toggle="dropdown">{{user.email}}<span class="caret"></a>
<ul ng-if="user != null" class="dropdown-menu" style="list-style-type: none;">
<li><a href="/#/tournaments/user">My Tournaments and schools</a></li>
<li><a ng-click="logout()">Logout</a></li>
</ul>
</li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div id="page-content">
<div class="row no-margin">
<div ng-if="alertMessage != null" ng-class="alertClass">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
{{alertMessage}}
</div>
<div class="col-md-2">
<!--left sidebar-->
</div>
<div class="col-md-8" style="padding-left: 2%;">
<div id="view" ng-view></div>
</div>
<div class="col-md-2" >
<!--right sidebar-->
</div>
</div>
</div>
<!--footer-->
</div>
</body>
<!-- Latest compiled and minified JavaScript -->
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular-route.js"></script>
<script type="text/javascript" src="/js/app.js"></script>
<script src="//code.jquery.com/jquery-1.12.0.min.js"></script>
<script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
<script src="https://cdn.datatables.net/1.10.6/js/jquery.dataTables.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<!--Mobile and tablet detection-->
<script type='text/javascript' src="//wurfl.io/wurfl.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</html>

View File

@@ -1,46 +0,0 @@
<h3>About WrestlingDev</h3>
<br>
<p>WrestlingDev was created to help bring wrestling into the 21st century for <strong>free</strong>. This site is <a href="https://github.com/jcwimer/wrestlingApp">open source</a> and is supported by the ads on the sidebar.</p>
<br>
<h4>Features</h4>
<br>
<p>At this moment in time, WrestlingDev supports a pool to bracket type tournament for up to 16 teams. The bracket format follows OHSAA's 5 match per day rule. WrestlingDev will automatically generate brackets, generate bout numbers, generate and update a bout board, track team points, and update brackets.</p>
<p>For pool to bracket tournaments, pool tie breakers are the following:</p>
<ul>
<li>Least team points deducted</li>
<li>Head to head</li>
<li>Most team points scored</li>
<li>Most wins by fall, default, dq</li>
<li>Most wins by tech fall</li>
<li>Most wins by major</li>
<li>Most points scored in decisions</li>
<li>Quickest pin</li>
<li>Coin flip</li>
</ul>
<p>If three wrestlers are tied, they will be put through this sequence until two wrestlers are left. Once two wrestlers are left, the pool runner up will be decided by head to head.</p>
<p>For pool to bracket tournaments, team points will be calculated as follows:</p>
<ul>
<li>Pool win: 2pt</li>
<li>Win in championship bracket: 2pt</li>
<li>Win in consolation bracket: 1pt</li>
<li>Win by major: 1pt extra</li>
<li>Win by tech fall: 1.5pt extra</li>
<li>Win by fall, default, dq: 2pt extra</li>
<li>1st place: 16pt</li>
<li>2nd place: 12pt</li>
<li>3rd place: 10pt</li>
<li>4th place: 9pt</li>
<li>5th place: 7pt</li>
<li>6th place: 6pt</li>
<li>7th place: 4pt</li>
<li>8th place: 3pt</li>
</ul>
<p>Finals matches will only recieve extra placement points for placing higher and bonus points for pin, tech, major, etc. Please note, only brackets with four pools place up to 8. Brackets with 1 or 2 pools only place top 4.</p>
<br>
<h4>Future Plans</h4>
<br>
<p>Future development plans to support normal double elimination brackets are underway and are planned to be finished in time for the 2016-2017 wrestling season.</p>
<br>
<h4>Contact</h4>
<br>
<p>Suggestions, criticism, and kind words are welcomed. Please contact us.</p>

View File

@@ -1,10 +0,0 @@
<div class="center hero-unit" >
<h1>Welcome to WrestlingDev</h1>
<br>
<p>This website was created to help wrestling coaches run their tournaments. It is 2015, why are we still running bout sheets to tables and why are we still using resources to push cards on a bout board? This website was created as a <strong>free</strong> way for coaches to run a tournament smoothly with as few workers as possible.</p>
<br>
<p>If you would like to run a tournament, please click log in and then click sign up.</p>
<br>
<a href='/#/tournaments' class="btn btn-large btn-primary">Browse Tournaments</a>
<p></p>
</div>

View File

@@ -1,17 +0,0 @@
<h3>Tutorials</h3>
<br>
<p>Unfortunately, I do not have tutorials available at this moment in time. If you would like to learn how to use this software, please email me at jacob.wimer@gmail.com and I will gladly provide an overview of how to use this software. I've done my best to make the software intuitive and easy to use.</p>
<br>
<h4>Planning on using this software?</h4>
<br>
<p>Here is a list of features available:</p>
<br>
<ul>
<li>Pool to bracket type bracket generation for up to 16 man brackets</li>
<li>Delegate control to coaches for lineup entry</li>
<li>Automatically updated bout board</li>
<li>Automatically updated brackets</li>
<li>Automatically updated team scores</li>
<li>Delegate director privileges to multiple people for tournament administration</li>
<li>Matches can be scored at the tables and submitted via computer or bout sheets can be brought to the head table and entered there</li>
</ul>

View File

@@ -1,17 +0,0 @@
<h2>My Tournaments</h2>
<br>
<table class="table">
<thead class="font-spot-color">
<tr>
<th>Name</th>
<th>Date</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="tournament in allTournaments">
<td><a ng-href="/#/tournaments/{{tournament.id}}">{{ tournament.name }}</a></td>
<td>{{ tournament.date }}</td>
</tr>
</tbody>
</table>

View File

@@ -1,25 +0,0 @@
<h2>Upcoming Tournaments</h2>
<br>
<form ng-submit="searchTournaments()">
<div class="input-group">
<input type="text" class="form-control" placeholder="Search by name or date YYYY-MM-DD" ng-model="searchTerms">
<span class="input-group-btn">
<button class="btn btn-default" type="submit" id="submit">Search</button>
</span>
</div>
</form>
<br>
<table class="table">
<thead class="font-spot-color">
<tr>
<th>Name</th>
<th>Date</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="tournament in allTournaments">
<td><a ng-href="/#/tournaments/{{tournament.id}}">{{ tournament.name }}</a></td>
<td>{{ tournament.date }}</td>
</tr>
</tbody>
</table>

View File

@@ -1,222 +0,0 @@
<a href="/#/tournaments" class="btn btn-default">Back to browse tournaments</a>
<h1>
{{ tournament.name }}
</h1>
<p>
<strong>Address:</strong>
{{ tournament.address }}
</p>
<p>
<strong>Director:</strong>
{{ tournament.director }}
</p>
<p>
<strong>Director email:</strong>
{{ tournament.director_email }}
</p>
<p>
<strong>Tournament Type:</strong>
{{ tournament.tournament_type }}
</p>
<br>
<div class="panel panel-default">
<a class="panel-heading" ng-click="toggleSchools()" style="display: block;">
<h3 class="panel-title">School Lineups and Team Scores<span class="pull-left clickable"><i ng-if="showSchools == false" class="glyphicon glyphicon-chevron-down"></i>
<i ng-if="showSchools == true" class="glyphicon glyphicon-chevron-up"></i></span></h3>
</a>
<div id="Schools" ng-if="showSchools == true">
<div class="panel-body">
<button ng-if="isTournamentOwner(user.id,tournament.user_id)" class="btn btn-success btn-sm" data-toggle="modal" data-target="#NewSchool">Create New School</button>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th>Score</th>
<th ng-if="isTournamentOwner(user.id,tournament.user_id)">Actions</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="school in tournament.schools | orderBy : 'score'">
<td>{{ school.name }}</td>
<td>{{ school.score }}</td>
<td ng-if="isTournamentOwner(user.id,tournament.user_id)">
<button class="btn btn-sm" data-toggle="modal" data-target="#EditSchool{{school.id}}">Edit</button>
<button ng-click="deleteSchool(school)"class="btn btn-danger btn-sm">Destroy</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="panel panel-default">
<a class="panel-heading" ng-click="toggleWeightSeeds()" style="display: block;">
<h3 class="panel-title">Weights and Seeds<span class="pull-left clickable"><i ng-if="showWeightSeeds == false" class="glyphicon glyphicon-chevron-down"></i>
<i ng-if="showWeightSeeds == true" class="glyphicon glyphicon-chevron-up"></i></span></h3>
</a>
<div id="Weights" ng-if="showWeightSeeds == true">
<div class="panel-body">
<p>Click weight class for seeds</p>
<br>
<table class="table">
<thead>
<tr>
<th>Weight Class</th>
<th>Bracket Size</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="weight in tournament.weights | orderBy : 'max' : reverse">
<td><a data-toggle="modal" data-target="#Weight{{weight.id}}">{{ weight.max }}</a></td>
<td>{{ weight.bracket_size }}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="panel panel-default">
<a class="panel-heading" ng-click="toggleBoutBoard()" style="display: block;" >
<h3 class="panel-title">Mats and Bout Board<span class="pull-left clickable"><i ng-if="showBoutBoard == false" class="glyphicon glyphicon-chevron-down"></i>
<i ng-if="showBoutBoard == true" class="glyphicon glyphicon-chevron-up"></i></span></h3>
</a>
<div id="Mats" ng-if="showBoutBoard == true">
<div class="panel-body">
<p ng-if="tournament.matches.length == 0">Matches have not been generated</p>
<table ng-if="tournament.matches.length > 0" class="table">
<thead>
<tr>
<th>Name</th>
<th>On Mat</th>
<th>On Deck</th>
<th>In The Hole</th>
<th>Warm Up</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="mat in tournament.mats">
<td>{{ mat.name }}</td>
<td>{{ mat.unfinishedMatches[0].bout_number }} {{ mat.unfinishedMatches[0].w1_name }} vs. {{ mat.unfinishedMatches[0].w2_name }}</td>
<td>{{ mat.unfinishedMatches[1].bout_number }} {{ mat.unfinishedMatches[0].w1_name }} vs. {{ mat.unfinishedMatches[0].w2_name }}</td>
<td>{{ mat.unfinishedMatches[2].bout_number }} {{ mat.unfinishedMatches[0].w1_name }} vs. {{ mat.unfinishedMatches[0].w2_name }}</td>
<td>{{ mat.unfinishedMatches[3].bout_number }} {{ mat.unfinishedMatches[0].w1_name }} vs. {{ mat.unfinishedMatches[0].w2_name }}</td>
</tr>
</tbody>
</table>
<br>
<h3 ng-if="tournament.matches.length > 0" >Matches not assigned</h3>
<br>
<table ng-if="tournament.matches.length > 0" class="table">
<thead>
<tr>
<th>Round</th>
<th>Bout Number</th>
<th>Weight Class</th>
<th>Matchup</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="match in tournament.unassignedMatches">
<td>Round {{ match.round }}</td>
<td>{{ match.bout_number }}</td>
<td>{{ match.weightClass }}</td>
<td>{{ match.w1_name }} vs. {{ match.w2_name }}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<!--Hidden modals for weight seeds-->
<div ng-repeat="weight in tournament.weights">
<div class="modal fade bs-example-modal-lg" id="Weight{{weight.id}}" tabindex="-1" role="dialog" aria-labelledby="Weight{{weight.id}}">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h3 class="modal-title" id="gridSystemModalLabel">{{weight.max}}</h3>
</div>
<div class="modal-body">
<table class="table">
<thead>
<tr>
<th>Name</th>
<th>School</th>
<th>Seed</th>
<th>Record</th>
<th>Criteria</th>
<th>Extra?</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="wrestler in weight.wrestlers | orderBy : 'original_seed' : reverse">
<td>{{wrestler.name}}</td>
<td>{{wrestler.school}}</td>
<td>{{wrestler.original_seed}}</td>
<td>{{wrestler.season_win}}-{{wrestler.season_loss}}</td>
<td>{{wrestler.criteria}} Win %{{wrestler.seasonWinPercentage}}</td>
<td>{{wrestler.extra}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!--Hidden model for new school-->
<div class="modal fade bs-example-modal-lg" id="NewSchool" tabindex="-1" role="dialog" aria-labelledby="NewSchool">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h3 class="modal-title" id="gridSystemModalLabel">New School for {{tournament.name}}</h3>
</div>
<div class="modal-body">
<form class="form" id="formNewSchool" name="form" ng-submit="saveNewSchool()">
<div class="form-group">
<input name="school[name]" class="form-control" id="name" type="text" placeholder="School Name" ng-model="newSchool.name"><br>
<input type="submit" id="btnSaveNewSchool" class="btn btn-success" value="Save School">
</div>
</form>
</div>
</div>
</div>
</div>
<!--Hidden modals for school edit forms-->
<div ng-repeat="school in tournament.schools">
<div class="modal fade bs-example-modal-lg" id="EditSchool{{school.id}}" tabindex="-1" role="dialog" aria-labelledby="EditSchool{{school.id}}">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h3 class="modal-title" id="gridSystemModalLabel">Edit {{school.name}}</h3>
</div>
<div class="modal-body">
<form class="form" id="formEditSchool{{school.id}}" name="form" ng-submit="updateSchool(school)">
<div class="form-group">
<input name="school[name]" class="form-control" id="name" type="text" placeholder="School Name" ng-model="school.name"><br>
<input type="submit" id="btnSaveNewSchool" class="btn btn-success" value="Save School">
</div>
</form>
</div>
</div>
</div>
</div>
</div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,3 +0,0 @@
<div class="hello">
<%= text %>
</div>

View File

@@ -1,66 +0,0 @@
/* Exports a function which returns an object that overrides the default &
* plugin grunt configuration object.
*
* You can familiarize yourself with Lineman's defaults by looking at:
*
* - https://github.com/linemanjs/lineman/blob/master/config/application.coffee
* - https://github.com/linemanjs/lineman/blob/master/config/plugins
*
* You can also ask about Lineman's config from the command line:
*
* $ lineman config #=> to print the entire config
* $ lineman config concat_sourcemap.js #=> to see the JS config for the concat task.
*/
module.exports = function(lineman) {
//Override application configuration here. Common examples follow in the comments.
return {
// API Proxying
//
// During development, you'll likely want to make XHR (AJAX) requests to an API on the same
// port as your lineman development server. By enabling the API proxy and setting the port, all
// requests for paths that don't match a static asset in ./generated will be forwarded to
// whatever service might be running on the specified port.
//
server: {
apiProxy: {
enabled: true,
host: 'localhost',
port: 8080
},
web: {
port: 8081
}
},
removeTasks: {
common: ["jshint"]
},
// Sass
//
// Lineman supports Sass via grunt-contrib-sass, which requires you first
// have Ruby installed as well as the `sass` gem. To enable it, uncomment the
// following line:
//
// enableSass: true,
// Asset Fingerprints
//
// Lineman can fingerprint your static assets by appending a hash to the filename
// and logging a manifest of logical-to-hashed filenames in dist/assets.json
// via grunt-asset-fingerprint
//
// enableAssetFingerprint: true,
// LiveReload
//
// Lineman can LiveReload browsers whenever a file is changed that results in
// assets to be processed, preventing the need to hit F5/Cmd-R every time you
// make a change in each browser you're working against. To enable LiveReload,
// comment out the following line:
//
// livereload: true
};
};

View File

@@ -1,26 +0,0 @@
/* Exports a function which returns an object that overrides the default &
* plugin file patterns (used widely through the app configuration)
*
* To see the default definitions for Lineman's file paths and globs, see:
*
* - https://github.com/linemanjs/lineman/blob/master/config/files.coffee
*/
module.exports = function(lineman) {
//Override file patterns here
return {
// As an example, to override the file patterns for
// the order in which to load third party JS libs:
//
// js: {
// vendor: [
// "vendor/js/underscore.js",
// "vendor/js/**/*.js"
// ]
// }
//Override file patterns here
};
};

View File

@@ -1 +0,0 @@
module.exports = require(process.env['LINEMAN_MAIN']);

View File

@@ -1,21 +0,0 @@
/* Define custom server-side HTTP routes for lineman's development server
* These might be as simple as stubbing a little JSON to
* facilitate development of code that interacts with an HTTP service
* (presumably, mirroring one that will be reachable in a live environment).
*
* It's important to remember that any custom endpoints defined here
* will only be available in development, as lineman only builds
* static assets, it can't run server-side code.
*
* This file can be very useful for rapid prototyping or even organically
* defining a spec based on the needs of the client code that emerge.
*
*/
module.exports = {
drawRoutes: function(app) {
// app.get('/api/greeting/:message', function(req, res){
// res.json({ message: "OK, "+req.params.message });
// });
}
};

View File

@@ -1,9 +0,0 @@
{
"framework" : "jasmine",
"launch_in_dev" : ["Chrome"],
"launch_in_ci" : ["PhantomJS"],
"src_files" : [
"generated/js/app.js",
"generated/js/spec.js"
]
}

View File

@@ -1,15 +0,0 @@
{
"name": "frontend",
"description": "Frontend for wrestlingdev",
"version": "0.0.1",
"private": true,
"author": "Jacob Cody Wimer",
"devDependencies": {
"lineman": "~0.36.6"
},
"scripts": {
"start": "lineman run",
"test": "lineman spec-ci",
"production": "lineman clean build && npm i express@3 && node -e \"var e = require('express'), a = e(); a.use(e.static('dist/')); a.listen(process.env.PORT)\""
}
}

View File

@@ -1,4 +0,0 @@
describe(".helloText", function(){
When(function(){ this.result = helloText(); });
Then(function(){ expect(this.result).toEqual("Hello, World!"); });
});

View File

@@ -1,2 +0,0 @@
window.context = window.describe;
window.xcontext = window.xdescribe;

View File

@@ -1,433 +0,0 @@
/* jasmine-fixture - 1.3.2
* Makes injecting HTML snippets into the DOM easy & clean!
* https://github.com/searls/jasmine-fixture
*/
(function() {
var createHTMLBlock,
__slice = [].slice;
(function($) {
var ewwSideEffects, jasmineFixture, originalAffix, originalJasmineDotFixture, originalJasmineFixture, root, _, _ref;
root = (1, eval)('this');
originalJasmineFixture = root.jasmineFixture;
originalJasmineDotFixture = (_ref = root.jasmine) != null ? _ref.fixture : void 0;
originalAffix = root.affix;
_ = function(list) {
return {
inject: function(iterator, memo) {
var item, _i, _len, _results;
_results = [];
for (_i = 0, _len = list.length; _i < _len; _i++) {
item = list[_i];
_results.push(memo = iterator(memo, item));
}
return _results;
}
};
};
root.jasmineFixture = function($) {
var $whatsTheRootOf, affix, create, jasmineFixture, noConflict;
affix = function(selectorOptions) {
return create.call(this, selectorOptions, true);
};
create = function(selectorOptions, attach) {
var $top;
$top = null;
_(selectorOptions.split(/[ ](?![^\{]*\})(?=[^\]]*?(?:\[|$))/)).inject(function($parent, elementSelector) {
var $el;
if (elementSelector === ">") {
return $parent;
}
$el = createHTMLBlock($, elementSelector);
if (attach || $top) {
$el.appendTo($parent);
}
$top || ($top = $el);
return $el;
}, $whatsTheRootOf(this));
return $top;
};
noConflict = function() {
var currentJasmineFixture, _ref1;
currentJasmineFixture = jasmine.fixture;
root.jasmineFixture = originalJasmineFixture;
if ((_ref1 = root.jasmine) != null) {
_ref1.fixture = originalJasmineDotFixture;
}
root.affix = originalAffix;
return currentJasmineFixture;
};
$whatsTheRootOf = function(that) {
if ((that != null ? that.jquery : void 0) != null) {
return that;
} else if ($('#jasmine_content').length > 0) {
return $('#jasmine_content');
} else {
return $('<div id="jasmine_content"></div>').appendTo('body');
}
};
jasmineFixture = {
affix: affix,
create: create,
noConflict: noConflict
};
ewwSideEffects(jasmineFixture);
return jasmineFixture;
};
ewwSideEffects = function(jasmineFixture) {
var _ref1;
if ((_ref1 = root.jasmine) != null) {
_ref1.fixture = jasmineFixture;
}
$.fn.affix = root.affix = jasmineFixture.affix;
return afterEach(function() {
return $('#jasmine_content').remove();
});
};
if ($) {
return jasmineFixture = root.jasmineFixture($);
} else {
return root.affix = function() {
var nowJQueryExists;
nowJQueryExists = window.jQuery || window.$;
if (nowJQueryExists != null) {
jasmineFixture = root.jasmineFixture(nowJQueryExists);
return affix.call.apply(affix, [this].concat(__slice.call(arguments)));
} else {
throw new Error("jasmine-fixture requires jQuery to be defined at window.jQuery or window.$");
}
};
}
})(window.jQuery || window.$);
createHTMLBlock = (function() {
var bindData, bindEvents, parseAttributes, parseClasses, parseContents, parseEnclosure, parseReferences, parseVariableScope, regAttr, regAttrDfn, regAttrs, regCBrace, regClass, regClasses, regData, regDatas, regEvent, regEvents, regExclamation, regId, regReference, regTag, regTagNotContent, regZenTagDfn;
createHTMLBlock = function($, ZenObject, data, functions, indexes) {
var ZenCode, arr, block, blockAttrs, blockClasses, blockHTML, blockId, blockTag, blocks, el, el2, els, forScope, indexName, inner, len, obj, origZenCode, paren, result, ret, zc, zo;
if ($.isPlainObject(ZenObject)) {
ZenCode = ZenObject.main;
} else {
ZenCode = ZenObject;
ZenObject = {
main: ZenCode
};
}
origZenCode = ZenCode;
if (indexes === undefined) {
indexes = {};
}
if (ZenCode.charAt(0) === "!" || $.isArray(data)) {
if ($.isArray(data)) {
forScope = ZenCode;
} else {
obj = parseEnclosure(ZenCode, "!");
obj = obj.substring(obj.indexOf(":") + 1, obj.length - 1);
forScope = parseVariableScope(ZenCode);
}
while (forScope.charAt(0) === "@") {
forScope = parseVariableScope("!for:!" + parseReferences(forScope, ZenObject));
}
zo = ZenObject;
zo.main = forScope;
el = $();
if (ZenCode.substring(0, 5) === "!for:" || $.isArray(data)) {
if (!$.isArray(data) && obj.indexOf(":") > 0) {
indexName = obj.substring(0, obj.indexOf(":"));
obj = obj.substr(obj.indexOf(":") + 1);
}
arr = ($.isArray(data) ? data : data[obj]);
zc = zo.main;
if ($.isArray(arr) || $.isPlainObject(arr)) {
$.map(arr, function(value, index) {
var next;
zo.main = zc;
if (indexName !== undefined) {
indexes[indexName] = index;
}
if (!$.isPlainObject(value)) {
value = {
value: value
};
}
next = createHTMLBlock($, zo, value, functions, indexes);
if (el.length !== 0) {
return $.each(next, function(index, value) {
return el.push(value);
});
}
});
}
if (!$.isArray(data)) {
ZenCode = ZenCode.substr(obj.length + 6 + forScope.length);
} else {
ZenCode = "";
}
} else if (ZenCode.substring(0, 4) === "!if:") {
result = parseContents("!" + obj + "!", data, indexes);
if (result !== "undefined" || result !== "false" || result !== "") {
el = createHTMLBlock($, zo, data, functions, indexes);
}
ZenCode = ZenCode.substr(obj.length + 5 + forScope.length);
}
ZenObject.main = ZenCode;
} else if (ZenCode.charAt(0) === "(") {
paren = parseEnclosure(ZenCode, "(", ")");
inner = paren.substring(1, paren.length - 1);
ZenCode = ZenCode.substr(paren.length);
zo = ZenObject;
zo.main = inner;
el = createHTMLBlock($, zo, data, functions, indexes);
} else {
blocks = ZenCode.match(regZenTagDfn);
block = blocks[0];
if (block.length === 0) {
return "";
}
if (block.indexOf("@") >= 0) {
ZenCode = parseReferences(ZenCode, ZenObject);
zo = ZenObject;
zo.main = ZenCode;
return createHTMLBlock($, zo, data, functions, indexes);
}
block = parseContents(block, data, indexes);
blockClasses = parseClasses($, block);
if (regId.test(block)) {
blockId = regId.exec(block)[1];
}
blockAttrs = parseAttributes(block, data);
blockTag = (block.charAt(0) === "{" ? "span" : "div");
if (ZenCode.charAt(0) !== "#" && ZenCode.charAt(0) !== "." && ZenCode.charAt(0) !== "{") {
blockTag = regTag.exec(block)[1];
}
if (block.search(regCBrace) !== -1) {
blockHTML = block.match(regCBrace)[1];
}
blockAttrs = $.extend(blockAttrs, {
id: blockId,
"class": blockClasses,
html: blockHTML
});
el = $("<" + blockTag + ">", blockAttrs);
el.attr(blockAttrs);
el = bindEvents(block, el, functions);
el = bindData(block, el, data);
ZenCode = ZenCode.substr(blocks[0].length);
ZenObject.main = ZenCode;
}
if (ZenCode.length > 0) {
if (ZenCode.charAt(0) === ">") {
if (ZenCode.charAt(1) === "(") {
zc = parseEnclosure(ZenCode.substr(1), "(", ")");
ZenCode = ZenCode.substr(zc.length + 1);
} else if (ZenCode.charAt(1) === "!") {
obj = parseEnclosure(ZenCode.substr(1), "!");
forScope = parseVariableScope(ZenCode.substr(1));
zc = obj + forScope;
ZenCode = ZenCode.substr(zc.length + 1);
} else {
len = Math.max(ZenCode.indexOf("+"), ZenCode.length);
zc = ZenCode.substring(1, len);
ZenCode = ZenCode.substr(len);
}
zo = ZenObject;
zo.main = zc;
els = $(createHTMLBlock($, zo, data, functions, indexes));
els.appendTo(el);
}
if (ZenCode.charAt(0) === "+") {
zo = ZenObject;
zo.main = ZenCode.substr(1);
el2 = createHTMLBlock($, zo, data, functions, indexes);
$.each(el2, function(index, value) {
return el.push(value);
});
}
}
ret = el;
return ret;
};
bindData = function(ZenCode, el, data) {
var datas, i, split;
if (ZenCode.search(regDatas) === 0) {
return el;
}
datas = ZenCode.match(regDatas);
if (datas === null) {
return el;
}
i = 0;
while (i < datas.length) {
split = regData.exec(datas[i]);
if (split[3] === undefined) {
$(el).data(split[1], data[split[1]]);
} else {
$(el).data(split[1], data[split[3]]);
}
i++;
}
return el;
};
bindEvents = function(ZenCode, el, functions) {
var bindings, fn, i, split;
if (ZenCode.search(regEvents) === 0) {
return el;
}
bindings = ZenCode.match(regEvents);
if (bindings === null) {
return el;
}
i = 0;
while (i < bindings.length) {
split = regEvent.exec(bindings[i]);
if (split[2] === undefined) {
fn = functions[split[1]];
} else {
fn = functions[split[2]];
}
$(el).bind(split[1], fn);
i++;
}
return el;
};
parseAttributes = function(ZenBlock, data) {
var attrStrs, attrs, i, parts;
if (ZenBlock.search(regAttrDfn) === -1) {
return undefined;
}
attrStrs = ZenBlock.match(regAttrDfn);
attrs = {};
i = 0;
while (i < attrStrs.length) {
parts = regAttr.exec(attrStrs[i]);
attrs[parts[1]] = "";
if (parts[3] !== undefined) {
attrs[parts[1]] = parseContents(parts[3], data);
}
i++;
}
return attrs;
};
parseClasses = function($, ZenBlock) {
var classes, clsString, i;
ZenBlock = ZenBlock.match(regTagNotContent)[0];
if (ZenBlock.search(regClasses) === -1) {
return undefined;
}
classes = ZenBlock.match(regClasses);
clsString = "";
i = 0;
while (i < classes.length) {
clsString += " " + regClass.exec(classes[i])[1];
i++;
}
return $.trim(clsString);
};
parseContents = function(ZenBlock, data, indexes) {
var html;
if (indexes === undefined) {
indexes = {};
}
html = ZenBlock;
if (data === undefined) {
return html;
}
while (regExclamation.test(html)) {
html = html.replace(regExclamation, function(str, str2) {
var begChar, fn, val;
begChar = "";
if (str.indexOf("!for:") > 0 || str.indexOf("!if:") > 0) {
return str;
}
if (str.charAt(0) !== "!") {
begChar = str.charAt(0);
str = str.substring(2, str.length - 1);
}
fn = new Function("data", "indexes", "var r=undefined;" + "with(data){try{r=" + str + ";}catch(e){}}" + "with(indexes){try{if(r===undefined)r=" + str + ";}catch(e){}}" + "return r;");
val = unescape(fn(data, indexes));
return begChar + val;
});
}
html = html.replace(/\\./g, function(str) {
return str.charAt(1);
});
return unescape(html);
};
parseEnclosure = function(ZenCode, open, close, count) {
var index, ret;
if (close === undefined) {
close = open;
}
index = 1;
if (count === undefined) {
count = (ZenCode.charAt(0) === open ? 1 : 0);
}
if (count === 0) {
return;
}
while (count > 0 && index < ZenCode.length) {
if (ZenCode.charAt(index) === close && ZenCode.charAt(index - 1) !== "\\") {
count--;
} else {
if (ZenCode.charAt(index) === open && ZenCode.charAt(index - 1) !== "\\") {
count++;
}
}
index++;
}
ret = ZenCode.substring(0, index);
return ret;
};
parseReferences = function(ZenCode, ZenObject) {
ZenCode = ZenCode.replace(regReference, function(str) {
var fn;
str = str.substr(1);
fn = new Function("objs", "var r=\"\";" + "with(objs){try{" + "r=" + str + ";" + "}catch(e){}}" + "return r;");
return fn(ZenObject, parseReferences);
});
return ZenCode;
};
parseVariableScope = function(ZenCode) {
var forCode, rest, tag;
if (ZenCode.substring(0, 5) !== "!for:" && ZenCode.substring(0, 4) !== "!if:") {
return undefined;
}
forCode = parseEnclosure(ZenCode, "!");
ZenCode = ZenCode.substr(forCode.length);
if (ZenCode.charAt(0) === "(") {
return parseEnclosure(ZenCode, "(", ")");
}
tag = ZenCode.match(regZenTagDfn)[0];
ZenCode = ZenCode.substr(tag.length);
if (ZenCode.length === 0 || ZenCode.charAt(0) === "+") {
return tag;
} else if (ZenCode.charAt(0) === ">") {
rest = "";
rest = parseEnclosure(ZenCode.substr(1), "(", ")", 1);
return tag + ">" + rest;
}
return undefined;
};
regZenTagDfn = /([#\.\@]?[\w-]+|\[([\w-!?=:"']+(="([^"]|\\")+")? {0,})+\]|\~[\w$]+=[\w$]+|&[\w$]+(=[\w$]+)?|[#\.\@]?!([^!]|\\!)+!){0,}(\{([^\}]|\\\})+\})?/i;
regTag = /(\w+)/i;
regId = /(?:^|\b)#([\w-!]+)/i;
regTagNotContent = /((([#\.]?[\w-]+)?(\[([\w!]+(="([^"]|\\")+")? {0,})+\])?)+)/i;
/*
See lookahead syntax (?!) at https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp
*/
regClasses = /(\.[\w-]+)(?!["\w])/g;
regClass = /\.([\w-]+)/i;
regReference = /(@[\w$_][\w$_\d]+)/i;
regAttrDfn = /(\[([\w-!]+(="?([^"]|\\")+"?)? {0,})+\])/ig;
regAttrs = /([\w-!]+(="([^"]|\\")+")?)/g;
regAttr = /([\w-!]+)(="?((([\w]+(\[.*?\])+)|[^"\]]|\\")+)"?)?/i;
regCBrace = /\{(([^\}]|\\\})+)\}/i;
regExclamation = /(?:([^\\]|^))!([^!]|\\!)+!/g;
regEvents = /\~[\w$]+(=[\w$]+)?/g;
regEvent = /\~([\w$]+)=([\w$]+)/i;
regDatas = /&[\w$]+(=[\w$]+)?/g;
regData = /&([\w$]+)(=([\w$]+))?/i;
return createHTMLBlock;
})();
}).call(this);

View File

@@ -1,373 +0,0 @@
/* jasmine-given - 2.6.3
* Adds a Given-When-Then DSL to jasmine as an alternative style for specs
* https://github.com/searls/jasmine-given
*/
/* jasmine-matcher-wrapper - 0.0.3
* Wraps Jasmine 1.x matchers for use with Jasmine 2
* https://github.com/testdouble/jasmine-matcher-wrapper
*/
(function() {
var __hasProp = {}.hasOwnProperty,
__slice = [].slice;
(function(jasmine) {
var comparatorFor, createMatcher;
if (jasmine == null) {
return typeof console !== "undefined" && console !== null ? console.warn("jasmine was not found. Skipping jasmine-matcher-wrapper. Verify your script load order.") : void 0;
}
if (jasmine.matcherWrapper != null) {
return;
}
jasmine.matcherWrapper = {
wrap: function(matchers) {
var matcher, name, wrappedMatchers;
if (jasmine.addMatchers == null) {
return matchers;
}
wrappedMatchers = {};
for (name in matchers) {
if (!__hasProp.call(matchers, name)) continue;
matcher = matchers[name];
wrappedMatchers[name] = createMatcher(name, matcher);
}
return wrappedMatchers;
}
};
createMatcher = function(name, matcher) {
return function() {
return {
compare: comparatorFor(matcher, false),
negativeCompare: comparatorFor(matcher, true)
};
};
};
return comparatorFor = function(matcher, isNot) {
return function() {
var actual, context, message, params, pass, _ref;
actual = arguments[0], params = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
context = {
actual: actual,
isNot: isNot
};
pass = matcher.apply(context, params);
if (isNot) {
pass = !pass;
}
if (!pass) {
message = (_ref = context.message) != null ? _ref.apply(context, params) : void 0;
}
return {
pass: pass,
message: message
};
};
};
})(jasmine || getJasmineRequireObj());
}).call(this);
(function() {
var __slice = [].slice;
(function(jasmine) {
var Waterfall, additionalInsightsForErrorMessage, apparentReferenceError, attemptedEquality, cloneArray, comparisonInsight, currentSpec, declareJasmineSpec, deepEqualsNotice, doneWrapperFor, errorWithRemovedLines, evalInContextOfSpec, finalStatementFrom, getBlock, invariantList, mostRecentExpectations, mostRecentStacks, mostRecentlyUsed, o, root, stringifyExpectation, wasComparison, whenList, wrapAsExpectations;
mostRecentlyUsed = null;
root = (1, eval)('this');
currentSpec = null;
beforeEach(function() {
return currentSpec = this;
});
root.Given = function() {
mostRecentlyUsed = root.Given;
return beforeEach(getBlock(arguments));
};
whenList = [];
root.When = function() {
var b;
mostRecentlyUsed = root.When;
b = getBlock(arguments);
beforeEach(function() {
return whenList.push(b);
});
return afterEach(function() {
return whenList.pop();
});
};
invariantList = [];
root.Invariant = function() {
var invariantBehavior;
mostRecentlyUsed = root.Invariant;
invariantBehavior = getBlock(arguments);
beforeEach(function() {
return invariantList.push(invariantBehavior);
});
return afterEach(function() {
return invariantList.pop();
});
};
getBlock = function(thing) {
var assignResultTo, setupFunction;
setupFunction = o(thing).firstThat(function(arg) {
return o(arg).isFunction();
});
assignResultTo = o(thing).firstThat(function(arg) {
return o(arg).isString();
});
return doneWrapperFor(setupFunction, function(done) {
var context, result;
context = currentSpec;
result = setupFunction.call(context, done);
if (assignResultTo) {
if (!context[assignResultTo]) {
return context[assignResultTo] = result;
} else {
throw new Error("Unfortunately, the variable '" + assignResultTo + "' is already assigned to: " + context[assignResultTo]);
}
}
});
};
mostRecentExpectations = null;
mostRecentStacks = null;
declareJasmineSpec = function(specArgs, itFunction) {
var expectationFunction, expectations, label, stacks;
if (itFunction == null) {
itFunction = it;
}
label = o(specArgs).firstThat(function(arg) {
return o(arg).isString();
});
expectationFunction = o(specArgs).firstThat(function(arg) {
return o(arg).isFunction();
});
mostRecentlyUsed = root.subsequentThen;
mostRecentExpectations = expectations = [expectationFunction];
mostRecentStacks = stacks = [errorWithRemovedLines("failed expectation", 3)];
itFunction("then " + (label != null ? label : stringifyExpectation(expectations)), doneWrapperFor(expectationFunction, function(jasmineDone) {
var userCommands;
userCommands = [].concat(whenList, invariantList, wrapAsExpectations(expectations, stacks));
return new Waterfall(userCommands, jasmineDone).flow();
}));
return {
Then: subsequentThen,
And: subsequentThen
};
};
wrapAsExpectations = function(expectations, stacks) {
var expectation, i, _i, _len, _results;
_results = [];
for (i = _i = 0, _len = expectations.length; _i < _len; i = ++_i) {
expectation = expectations[i];
_results.push((function(expectation, i) {
return doneWrapperFor(expectation, function(maybeDone) {
return expect(expectation).not.toHaveReturnedFalseFromThen(currentSpec, i + 1, stacks[i], maybeDone);
});
})(expectation, i));
}
return _results;
};
doneWrapperFor = function(func, toWrap) {
if (func.length === 0) {
return function() {
return toWrap();
};
} else {
return function(done) {
return toWrap(done);
};
}
};
root.Then = function() {
return declareJasmineSpec(arguments);
};
root.Then.only = function() {
return declareJasmineSpec(arguments, it.only);
};
root.subsequentThen = function(additionalExpectation) {
mostRecentExpectations.push(additionalExpectation);
mostRecentStacks.push(errorWithRemovedLines("failed expectation", 3));
return this;
};
errorWithRemovedLines = function(msg, n) {
var error, lines, stack, _ref;
if (stack = new Error(msg).stack) {
_ref = stack.split("\n"), error = _ref[0], lines = 2 <= _ref.length ? __slice.call(_ref, 1) : [];
return "" + error + "\n" + (lines.slice(n).join("\n"));
}
};
mostRecentlyUsed = root.Given;
root.And = function() {
return mostRecentlyUsed.apply(this, jasmine.util.argsToArray(arguments));
};
o = function(thing) {
return {
isFunction: function() {
return Object.prototype.toString.call(thing) === "[object Function]";
},
isString: function() {
return Object.prototype.toString.call(thing) === "[object String]";
},
firstThat: function(test) {
var i;
i = 0;
while (i < thing.length) {
if (test(thing[i]) === true) {
return thing[i];
}
i++;
}
return void 0;
}
};
};
Waterfall = (function() {
function Waterfall(functions, finalCallback) {
if (functions == null) {
functions = [];
}
this.finalCallback = finalCallback != null ? finalCallback : function() {};
this.functions = cloneArray(functions);
}
Waterfall.prototype.flow = function() {
var func,
_this = this;
if (this.functions.length === 0) {
return this.finalCallback();
}
func = this.functions.shift();
if (func.length > 0) {
return func(function() {
return _this.flow();
});
} else {
func();
return this.flow();
}
};
return Waterfall;
})();
cloneArray = function(a) {
return a.slice(0);
};
jasmine._given = {
matchers: {
toHaveReturnedFalseFromThen: function(context, n, stackTrace, done) {
var e, exception, result;
result = false;
exception = void 0;
try {
result = this.actual.call(context, done);
} catch (_error) {
e = _error;
exception = e;
}
this.message = function() {
var msg, stringyExpectation;
stringyExpectation = stringifyExpectation(this.actual);
msg = "Then clause" + (n > 1 ? " #" + n : "") + " `" + stringyExpectation + "` failed by ";
if (exception) {
msg += "throwing: " + exception.toString();
} else {
msg += "returning false";
}
msg += additionalInsightsForErrorMessage(stringyExpectation);
if (stackTrace != null) {
msg += "\n\n" + stackTrace;
}
return msg;
};
return result === false;
}
},
__Waterfall__: Waterfall
};
stringifyExpectation = function(expectation) {
var matches;
matches = expectation.toString().replace(/\n/g, '').match(/function\s?\(.*\)\s?{\s*(return\s+)?(.*?)(;)?\s*}/i);
if (matches && matches.length >= 3) {
return matches[2].replace(/\s+/g, ' ');
} else {
return "";
}
};
additionalInsightsForErrorMessage = function(expectationString) {
var comparison, expectation;
expectation = finalStatementFrom(expectationString);
if (comparison = wasComparison(expectation)) {
return comparisonInsight(expectation, comparison);
} else {
return "";
}
};
finalStatementFrom = function(expectationString) {
var multiStatement;
if (multiStatement = expectationString.match(/.*return (.*)/)) {
return multiStatement[multiStatement.length - 1];
} else {
return expectationString;
}
};
wasComparison = function(expectation) {
var comparator, comparison, left, right, s;
if (comparison = expectation.match(/(.*) (===|!==|==|!=|>|>=|<|<=) (.*)/)) {
s = comparison[0], left = comparison[1], comparator = comparison[2], right = comparison[3];
return {
left: left,
comparator: comparator,
right: right
};
}
};
comparisonInsight = function(expectation, comparison) {
var left, msg, right;
left = evalInContextOfSpec(comparison.left);
right = evalInContextOfSpec(comparison.right);
if (apparentReferenceError(left) && apparentReferenceError(right)) {
return "";
}
msg = "\n\nThis comparison was detected:\n " + expectation + "\n " + left + " " + comparison.comparator + " " + right;
if (attemptedEquality(left, right, comparison.comparator)) {
msg += "\n\n" + (deepEqualsNotice(comparison.left, comparison.right));
}
return msg;
};
apparentReferenceError = function(result) {
return /^<Error: "ReferenceError/.test(result);
};
evalInContextOfSpec = function(operand) {
var e;
try {
return (function() {
return eval(operand);
}).call(currentSpec);
} catch (_error) {
e = _error;
return "<Error: \"" + ((e != null ? typeof e.message === "function" ? e.message() : void 0 : void 0) || e) + "\">";
}
};
attemptedEquality = function(left, right, comparator) {
var _ref;
if (!(comparator === "==" || comparator === "===")) {
return false;
}
if (((_ref = jasmine.matchersUtil) != null ? _ref.equals : void 0) != null) {
return jasmine.matchersUtil.equals(left, right);
} else {
return jasmine.getEnv().equals_(left, right);
}
};
deepEqualsNotice = function(left, right) {
return "However, these items are deeply equal! Try an expectation like this instead:\n expect(" + left + ").toEqual(" + right + ")";
};
return beforeEach(function() {
if (jasmine.addMatchers != null) {
return jasmine.addMatchers(jasmine.matcherWrapper.wrap(jasmine._given.matchers));
} else {
return this.addMatchers(jasmine._given.matchers);
}
});
})(jasmine);
}).call(this);

View File

@@ -1,98 +0,0 @@
/* jasmine-only - 0.1.1
* Exclusivity spec helpers for jasmine: `describe.only` and `it.only`
* https://github.com/davemo/jasmine-only
*/
(function() {
var __hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
(function(jasmine) {
var describeOnly, env, itOnly, root;
root = (1, eval)('this');
env = jasmine.getEnv();
describeOnly = function(description, specDefinitions) {
var suite;
suite = new jasmine.Suite(this, description, null, this.currentSuite);
suite.exclusive_ = 1;
this.exclusive_ = Math.max(this.exclusive_, 1);
return this.describe_(suite, specDefinitions);
};
itOnly = function(description, func) {
var spec;
spec = this.it(description, func);
spec.exclusive_ = 2;
this.exclusive_ = 2;
return spec;
};
env.exclusive_ = 0;
env.describe = function(description, specDefinitions) {
var suite;
suite = new jasmine.Suite(this, description, null, this.currentSuite);
return this.describe_(suite, specDefinitions);
};
env.describe_ = function(suite, specDefinitions) {
var declarationError, e, parentSuite;
parentSuite = this.currentSuite;
if (parentSuite) {
parentSuite.add(suite);
} else {
this.currentRunner_.add(suite);
}
this.currentSuite = suite;
declarationError = null;
try {
specDefinitions.call(suite);
} catch (_error) {
e = _error;
declarationError = e;
}
if (declarationError) {
this.it("encountered a declaration exception", function() {
throw declarationError;
});
}
this.currentSuite = parentSuite;
return suite;
};
env.specFilter = function(spec) {
return this.exclusive_ <= spec.exclusive_;
};
env.describe.only = function() {
return describeOnly.apply(env, arguments);
};
env.it.only = function() {
return itOnly.apply(env, arguments);
};
root.describe.only = function(description, specDefinitions) {
return env.describe.only(description, specDefinitions);
};
root.it.only = function(description, func) {
return env.it.only(description, func);
};
root.iit = root.it.only;
root.ddescribe = root.describe.only;
jasmine.Spec = (function(_super) {
__extends(Spec, _super);
function Spec(env, suite, description) {
this.exclusive_ = suite.exclusive_;
Spec.__super__.constructor.call(this, env, suite, description);
}
return Spec;
})(jasmine.Spec);
return jasmine.Suite = (function(_super) {
__extends(Suite, _super);
function Suite(env, suite, specDefinitions, parentSuite) {
this.exclusive_ = parentSuite && parentSuite.exclusive_ || 0;
Suite.__super__.constructor.call(this, env, suite, specDefinitions, parentSuite);
}
return Suite;
})(jasmine.Suite);
})(jasmine);
}).call(this);

View File

@@ -1,214 +0,0 @@
/* jasmine-stealth - 0.0.17
* Makes Jasmine spies a bit more robust
* https://github.com/searls/jasmine-stealth
*/
(function() {
var __hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
(function() {
var Captor, fake, root, stubChainer, unfakes, whatToDoWhenTheSpyGetsCalled, _;
root = (1, eval)('this');
_ = function(obj) {
return {
each: function(iterator) {
var item, _i, _len, _results;
_results = [];
for (_i = 0, _len = obj.length; _i < _len; _i++) {
item = obj[_i];
_results.push(iterator(item));
}
return _results;
},
isFunction: function() {
return Object.prototype.toString.call(obj) === "[object Function]";
},
isString: function() {
return Object.prototype.toString.call(obj) === "[object String]";
}
};
};
root.spyOnConstructor = function(owner, classToFake, methodsToSpy) {
var fakeClass, spies;
if (methodsToSpy == null) {
methodsToSpy = [];
}
if (_(methodsToSpy).isString()) {
methodsToSpy = [methodsToSpy];
}
spies = {
constructor: jasmine.createSpy("" + classToFake + "'s constructor")
};
fakeClass = (function() {
function _Class() {
spies.constructor.apply(this, arguments);
}
return _Class;
})();
_(methodsToSpy).each(function(methodName) {
spies[methodName] = jasmine.createSpy("" + classToFake + "#" + methodName);
return fakeClass.prototype[methodName] = function() {
return spies[methodName].apply(this, arguments);
};
});
fake(owner, classToFake, fakeClass);
return spies;
};
unfakes = [];
afterEach(function() {
_(unfakes).each(function(u) {
return u();
});
return unfakes = [];
});
fake = function(owner, thingToFake, newThing) {
var originalThing;
originalThing = owner[thingToFake];
owner[thingToFake] = newThing;
return unfakes.push(function() {
return owner[thingToFake] = originalThing;
});
};
root.stubFor = root.spyOn;
jasmine.createStub = jasmine.createSpy;
jasmine.createStubObj = function(baseName, stubbings) {
var name, obj, stubbing;
if (stubbings.constructor === Array) {
return jasmine.createSpyObj(baseName, stubbings);
} else {
obj = {};
for (name in stubbings) {
stubbing = stubbings[name];
obj[name] = jasmine.createSpy(baseName + "." + name);
if (_(stubbing).isFunction()) {
obj[name].andCallFake(stubbing);
} else {
obj[name].andReturn(stubbing);
}
}
return obj;
}
};
whatToDoWhenTheSpyGetsCalled = function(spy) {
var matchesStub, priorPlan;
matchesStub = function(stubbing, args, context) {
switch (stubbing.type) {
case "args":
return jasmine.getEnv().equals_(stubbing.ifThis, jasmine.util.argsToArray(args));
case "context":
return jasmine.getEnv().equals_(stubbing.ifThis, context);
}
};
priorPlan = spy.plan;
return spy.andCallFake(function() {
var i, stubbing;
i = 0;
while (i < spy._stealth_stubbings.length) {
stubbing = spy._stealth_stubbings[i];
if (matchesStub(stubbing, arguments, this)) {
if (stubbing.satisfaction === "callFake") {
return stubbing.thenThat.apply(stubbing, arguments);
} else {
return stubbing.thenThat;
}
}
i++;
}
return priorPlan.apply(spy, arguments);
});
};
jasmine.Spy.prototype.whenContext = function(context) {
var spy;
spy = this;
spy._stealth_stubbings || (spy._stealth_stubbings = []);
whatToDoWhenTheSpyGetsCalled(spy);
return stubChainer(spy, "context", context);
};
jasmine.Spy.prototype.when = function() {
var ifThis, spy;
spy = this;
ifThis = jasmine.util.argsToArray(arguments);
spy._stealth_stubbings || (spy._stealth_stubbings = []);
whatToDoWhenTheSpyGetsCalled(spy);
return stubChainer(spy, "args", ifThis);
};
stubChainer = function(spy, type, ifThis) {
var addStubbing;
addStubbing = function(satisfaction) {
return function(thenThat) {
spy._stealth_stubbings.unshift({
type: type,
ifThis: ifThis,
satisfaction: satisfaction,
thenThat: thenThat
});
return spy;
};
};
return {
thenReturn: addStubbing("return"),
thenCallFake: addStubbing("callFake")
};
};
jasmine.Spy.prototype.mostRecentCallThat = function(callThat, context) {
var i;
i = this.calls.length - 1;
while (i >= 0) {
if (callThat.call(context || this, this.calls[i]) === true) {
return this.calls[i];
}
i--;
}
};
jasmine.Matchers.ArgThat = (function(_super) {
__extends(ArgThat, _super);
function ArgThat(matcher) {
this.matcher = matcher;
}
ArgThat.prototype.jasmineMatches = function(actual) {
return this.matcher(actual);
};
return ArgThat;
})(jasmine.Matchers.Any);
jasmine.Matchers.ArgThat.prototype.matches = jasmine.Matchers.ArgThat.prototype.jasmineMatches;
jasmine.argThat = function(expected) {
return new jasmine.Matchers.ArgThat(expected);
};
jasmine.Matchers.Capture = (function(_super) {
__extends(Capture, _super);
function Capture(captor) {
this.captor = captor;
}
Capture.prototype.jasmineMatches = function(actual) {
this.captor.value = actual;
return true;
};
return Capture;
})(jasmine.Matchers.Any);
jasmine.Matchers.Capture.prototype.matches = jasmine.Matchers.Capture.prototype.jasmineMatches;
Captor = (function() {
function Captor() {}
Captor.prototype.capture = function() {
return new jasmine.Matchers.Capture(this);
};
return Captor;
})();
return jasmine.captor = function() {
return new Captor();
};
})();
}).call(this);

View File

View File

View File

View File

@@ -1,10 +0,0 @@
// AngularDevise
// -------------------
// v1.2.1
//
// Copyright (c)2016 Justin Ridgewell
// Distributed under MIT license
//
// https://github.com/cloudspace/angular_devise
!function(a){"use strict";var b=a.module("Devise",[]);b.provider("AuthIntercept",function(){var a=!1;this.interceptAuth=function(b){return a=!!b||void 0===b,this},this.$get=["$rootScope","$q",function(b,c){return{responseError:function(d){var e=d.config.interceptAuth;if(e=!!e||a&&void 0===e,e&&401===d.status){var f=c.defer();return b.$broadcast("devise:unauthorized",d,f),f.reject(d),f.promise}return c.reject(d)}}}]}).config(["$httpProvider",function(a){a.interceptors.push("AuthIntercept")}]),b.provider("Auth",function(){function b(b,c,d){var h={method:f[b].toLowerCase(),url:e[b]};return c&&(g?(h.data={},h.data[g]=c):h.data=c),a.extend(h,d),h}function c(b,c){a.forEach(b,function(a,d){this[d+c]=function(a){return void 0===a?b[d]:(b[d]=a,this)}},this)}function d(a){return function(){return a}}var e={login:"/users/sign_in.json",logout:"/users/sign_out.json",register:"/users.json",sendResetPasswordInstructions:"/users/password.json",resetPassword:"/users/password.json"},f={login:"POST",logout:"DELETE",register:"POST",sendResetPasswordInstructions:"POST",resetPassword:"PUT"},g="user",h=function(a){return a.data};c.call(this,f,"Method"),c.call(this,e,"Path"),this.resourceName=function(a){return void 0===a?g:(g=a,this)},this.parse=function(a){return"function"!=typeof a?h:(h=a,this)},this.$get=["$q","$http","$rootScope",function(a,c,e){function f(a){return j._currentUser=a,a}function g(){f(null),j._promise=null}function i(a){return function(b){return e.$broadcast("devise:"+a,b),b}}var j={_currentUser:null,parse:h,_promise:null,reset:function(){g(),j.currentUser()},login:function(a,d){var e=arguments.length>0,g=j.isAuthenticated();return a=a||{},c(b("login",a,d)).then(j.parse).then(f).then(function(a){return e&&!g?i("new-session")(a):a}).then(i("login"))},logout:function(a){var e=d(j._currentUser);return c(b("logout",void 0,a)).then(g).then(e).then(i("logout"))},register:function(a,d){return a=a||{},c(b("register",a,d)).then(j.parse).then(f).then(i("new-registration"))},sendResetPasswordInstructions:function(a){return a=a||{},c(b("sendResetPasswordInstructions",a)).then(j.parse).then(i("send-reset-password-instructions-successfully"))},resetPassword:function(a){return a=a||{},c(b("resetPassword",a)).then(j.parse).then(f).then(i("reset-password-successfully"))},currentUser:function(){return j.isAuthenticated()?a.when(j._currentUser):(null===j._promise&&(j._promise=j.login()),j._promise)},isAuthenticated:function(){return!!j._currentUser}};return j}]})}(angular);

File diff suppressed because it is too large Load Diff

View File

View File

@@ -1,10 +0,0 @@
<VirtualHost *:80>
DocumentRoot /var/www/public
RailsEnv production
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory "/var/www/">
Options FollowSymLinks
Require all granted
</Directory>
</VirtualHost>

View File

@@ -1,21 +0,0 @@
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
DocumentRoot /var/www/public
RailsEnv production
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>

View File

@@ -3,7 +3,7 @@ FROM ruby:2.3.0
RUN apt-get update RUN apt-get update
RUN apt-get install -y build-essential RUN apt-get install -y build-essential
RUN apt-get install -y nodejs-legacy nodejs sqlite3 npm RUN apt-get install -y sqlite3
ENV WRESTLINGDEV_SECRET_KEY_BASE 077cdbef5c2ccf22543fb17a67339f234306b7fa2e1e4463d851c444c10a5611829a2290b253da78339427f131571fac9a42c83d960b2d25ecc10a4a0a7ce1a2 ENV WRESTLINGDEV_SECRET_KEY_BASE 077cdbef5c2ccf22543fb17a67339f234306b7fa2e1e4463d851c444c10a5611829a2290b253da78339427f131571fac9a42c83d960b2d25ecc10a4a0a7ce1a2
ENV WRESTLINGDEV_DEVISE_SECRET_KEY 2f29d49db6704377ba263f7cb9db085b386bcb301c0cd501126a674686ab1a109754071165b08cd72af03cec4642a4dd04361c994462254dd5d85e9594e8b9aa ENV WRESTLINGDEV_DEVISE_SECRET_KEY 2f29d49db6704377ba263f7cb9db085b386bcb301c0cd501126a674686ab1a109754071165b08cd72af03cec4642a4dd04361c994462254dd5d85e9594e8b9aa
@@ -13,8 +13,6 @@ ADD Gemfile* /tmp/
WORKDIR /tmp WORKDIR /tmp
RUN bundle install --without production RUN bundle install --without production
RUN npm install -g lineman
RUN mkdir /rails RUN mkdir /rails
WORKDIR /rails WORKDIR /rails

View File

@@ -1,10 +1,9 @@
FROM ruby:2.3.0 FROM ruby:2.3.0
RUN apt-get clean && apt-get update RUN apt-get clean && apt-get update
RUN apt-get -y upgrade RUN apt-get -y upgrade
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install build-essential libssl-dev libyaml-dev libreadline-dev openssl curl git-core zlib1g-dev bison libxml2-dev libxslt1-dev libcurl4-openssl-dev libsqlite3-dev sqlite3 wget apache2 apt-transport-https nodejs nodejs-legacy npm mysql-client postfix RUN DEBIAN_FRONTEND=noninteractive apt-get -y install build-essential libssl-dev libyaml-dev libreadline-dev openssl curl git-core zlib1g-dev bison libxml2-dev libxslt1-dev libcurl4-openssl-dev libsqlite3-dev sqlite3 wget apt-transport-https mysql-client postfix
#New Relic #New Relic
#RUN echo deb http://apt.newrelic.com/debian/ newrelic non-free >> /etc/apt/sources.list.d/newrelic.list #RUN echo deb http://apt.newrelic.com/debian/ newrelic non-free >> /etc/apt/sources.list.d/newrelic.list
@@ -13,77 +12,28 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get -y install build-essential libssl-dev
#RUN apt-get install newrelic-sysmond -y #RUN apt-get install newrelic-sysmond -y
#RUN nrsysmond-config --set license_key=$NEW_RELIC_LICENSE_KEY #RUN nrsysmond-config --set license_key=$NEW_RELIC_LICENSE_KEY
#Passenger
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7
RUN echo deb https://oss-binaries.phusionpassenger.com/apt/passenger trusty main >> /etc/apt/sources.list.d/passenger.list
RUN chown root: /etc/apt/sources.list.d/passenger.list
RUN chmod 600 /etc/apt/sources.list.d/passenger.list
RUN apt-get update
RUN apt-get install -y libapache2-mod-passenger
# Enable apache mods.
RUN a2enmod rewrite
RUN a2enmod proxy
RUN a2enmod proxy_http
RUN a2enmod passenger
RUN a2enmod ssl
#SSL #SSL
RUN mkdir /etc/apache2/ssl RUN mkdir /ssl
RUN openssl req -sha256 -subj '/CN=home/O=home LTD./C=US' -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt RUN openssl req -sha256 -subj '/CN=home/O=home LTD./C=US' -x509 -nodes -days 365 -newkey rsa:2048 -keyout /ssl/server.key -out /ssl/server.crt
# Manually set up the apache environment variables
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid
EXPOSE 80 EXPOSE 80
EXPOSE 443 EXPOSE 443
#Cache gems so they don't install on every code change #Cache gems so they don't install on every code change
WORKDIR /tmp WORKDIR /tmp
COPY Gemfile Gemfile COPY Gemfile Gemfile
COPY Gemfile.lock Gemfile.lock COPY Gemfile.lock Gemfile.lock
RUN bundle install --without test RUN bundle install --without test
#Cache node_modules
WORKDIR /tmp
COPY frontend/package.json package.json
RUN npm install
RUN npm install lineman
RUN npm install -g lineman
# Copy site into place. # Copy site into place.
RUN rm -rf /var/www RUN mkdir /rails
ENV WRESTLINGDEV_SECRET_KEY_BASE 077cdbef5c2ccf22543fb17a67339f234306b7fa2e1e4463d851c444c10a5611829a2290b253da78339427f131571fac9a42c83d960b2d25ecc10a4a0a7ce1a2 ENV WRESTLINGDEV_SECRET_KEY_BASE 077cdbef5c2ccf22543fb17a67339f234306b7fa2e1e4463d851c444c10a5611829a2290b253da78339427f131571fac9a42c83d960b2d25ecc10a4a0a7ce1a2
ENV WRESTLINGDEV_DEVISE_SECRET_KEY 2f29d49db6704377ba263f7cb9db085b386bcb301c0cd501126a674686ab1a109754071165b08cd72af03cec4642a4dd04361c994462254dd5d85e9594e8b9aa ENV WRESTLINGDEV_DEVISE_SECRET_KEY 2f29d49db6704377ba263f7cb9db085b386bcb301c0cd501126a674686ab1a109754071165b08cd72af03cec4642a4dd04361c994462254dd5d85e9594e8b9aa
WORKDIR /var/www/ WORKDIR /rails
ADD . /var/www/ ADD . /rails
#Copy node_modules to /var/www
RUN mv /tmp/node_modules /var/www/frontend/node_modules
#RUN RAILS_ENV=production bundle exec rake db:migrate
RUN RAILS_ENV=production bundle exec rake assets:precompile RUN RAILS_ENV=production bundle exec rake assets:precompile
#RUN cp /var/www/frontend/dist/*.html /var/www/public/
# Update the default apache site with the config we created. # By default, simply start puma.
RUN rm /etc/apache2/sites-enabled/000-default.conf WORKDIR /rails
ADD ./rails-apache-ssl-config.conf /etc/apache2/sites-available/default-ssl.conf CMD bundle exec puma -t 5:5 -b 'ssl://0.0.0.0:443?key=/ssl/server.key&verify_mode=none&cert=/ssl/server.crt' -e production
ADD ./rails-apache-config.conf /etc/apache2/sites-enabled/000-default.conf
RUN a2ensite default-ssl.conf
# Add apache tuning stuff
RUN echo PassengerMaxPoolSize 3 >> /etc/apache2/apache2.conf
RUN echo PassengerMinInstances 3 >> /etc/apache2/apache2.conf
RUN echo PassengerPreStart *:443 >> /etc/apache2/apache2.conf
# By default, simply start apache.
CMD /usr/sbin/apache2ctl -D FOREGROUND

View File

@@ -13,4 +13,4 @@ docker ps | grep "Exit" | awk '{print $1}' | while read -r id ; do
docker kill $id docker kill $id
done done
docker run -h $HOSTNAME -d --restart=always --env-file $WRESTLINGDEV_ENV_FILE -v /var/log/apache2:/var/log/apache2 -v /etc/localtime:/etc/localtime -p 80:80 -p 443:443 $1 docker run -h $HOSTNAME -d --restart=always --env-file $WRESTLINGDEV_ENV_FILE -v /etc/localtime:/etc/localtime -p 80:80 -p 443:443 $1