1
0
Fork 0

Merge branch 'master' of github.com:magnolia-fan/BeatHaven

Conflicts:
	rails/app/views/artist/view.rhtml
	rails/config/routes.rb
	rails/public/stylesheets/beathaven.css
This commit is contained in:
Hipster Hitman 2011-04-09 17:31:13 +04:00
commit 092ef8f389
36 changed files with 743 additions and 18891 deletions

View File

@ -6,6 +6,9 @@ gem 'rails', '3.0.5'
# gem 'rails', :git => 'git://github.com/rails/rails.git'
gem 'pg'
gem 'mongo', '1.3.0'
gem 'bson_ext', '1.3.0'
gem 'mongoid', '~> 2.0'
# Use unicorn as the web server
# gem 'unicorn'

View File

@ -29,6 +29,8 @@ GEM
activesupport (= 3.0.5)
activesupport (3.0.5)
arel (2.0.9)
bson (1.3.0)
bson_ext (1.3.0)
builder (2.1.2)
erubis (2.6.6)
abstract (>= 1.0.0)
@ -39,6 +41,13 @@ GEM
mime-types (~> 1.16)
treetop (~> 1.4.8)
mime-types (1.16)
mongo (1.3.0)
bson (>= 1.3.0)
mongoid (2.0.1)
activemodel (~> 3.0)
mongo (~> 1.3)
tzinfo (~> 0.3.22)
will_paginate (~> 3.0.pre)
pg (0.10.1)
polyglot (0.3.1)
rack (1.2.2)
@ -64,10 +73,14 @@ GEM
treetop (1.4.9)
polyglot (>= 0.3.1)
tzinfo (0.3.26)
will_paginate (3.0.pre2)
PLATFORMS
ruby
DEPENDENCIES
bson_ext (= 1.3.0)
mongo (= 1.3.0)
mongoid (~> 2.0)
pg
rails (= 3.0.5)

View File

@ -2,7 +2,12 @@
class ArtistController < ApplicationController
require 'open-uri'
def view
@artist = Artist.getByName(params[:name].gsub('+', ' ').gsub('%20', ' '))
if params[:name].nil?
name = ''
else
name = params[:name].gsub('+', ' ').gsub('%20', ' ')
end
@artist = Artist.getByName(name)
end
end

View File

@ -0,0 +1,13 @@
class TrackController < ApplicationController
require 'net/http'
require 'uri'
def listen
render :json => YAML.load_file("#{RAILS_ROOT}/config/vk_accounts.yml")
end
private
def fetchSearch q
end
end

View File

@ -0,0 +1,2 @@
module TrackHelper
end

View File

@ -0,0 +1,19 @@
module Vkontakte
@@accounts = YAML.load_file("#{RAILS_ROOT}/config/vk_accounts.yml")
def get artist, track, length
end
def getHtml q
end
def parseHtml html
end
def calcWeight files
end
end

View File

@ -1,5 +1,35 @@
# encoding: UTF-8
class Album < ActiveRecord::Base
set_table_name 'musicbrainz.bh_release_group'
belongs_to :artist
has_many :releases, :conditions => "release_type = 1", :order => 'date ASC, id ASC'
require 'iconv'
def cover artist
covers = AlbumPic.where(album_id: id)
unless covers.empty?
covers.first.extralarge
else
q_artist = CGI::escape(artist)
q_album = CGI::escape(name)
path = open(
'http://ws.audioscrobbler.com/2.0/' <<
'?method=album.getinfo' <<
'&api_key=04fda005dbf61a50af5abc3e90f111f2' <<
'&artist=' << q_artist <<
'&album=' << q_album
).read
m = path.scan(/<image\ssize=\"(.*)\">(.*)<\/image>/i)
AlbumPic.new(
album_id: id,
small: m[0][1],
medium: m[1][1],
large: m[2][1],
extralarge: m[3][1],
mega: m[4][1]
)
m[3][1]
end
end
end

View File

@ -0,0 +1,11 @@
class AlbumPic
include Mongoid::Document
store_in :album_pics
key :album_id, Integer
key :small, String
key :medium, String
key :large, String
key :extralarge, String
key :mega, String
end

View File

@ -2,11 +2,7 @@ class Track < ActiveRecord::Base
set_table_name 'musicbrainz.bh_track'
belongs_to :release
def convertLength
(length /= 1000).round!
end
def clearName
name.gsub('&', 'and').gsub(/[^a-z0-9]/, '').downcase
def inDb
! TrackData.where(id: id.to_s).empty?
end
end

View File

@ -0,0 +1,10 @@
class TrackData
include Mongoid::Document
store_in :track_data
key :id, Integer
key :artist, String
key :title, String
key :length, Integer
key :files, Array
end

View File

@ -8,7 +8,7 @@
<% @artist.albums.each do |album| %>
<% unless album.releases.empty? %>
<div class="album">
<div class="pic"></div>
<div class="pic"><img src="<%= album.cover(@artist.name) %>" width="250" height="250" alt=""/></div>
<h3 class="name"><%= album.name %> <%= (album.year ? album.year : '') %></h3>
<%
releases = album.releases
@ -16,8 +16,8 @@
%>
<ul class="tracks">
<% first_release.tracks.each do |track| %>
<li>
<span class="play"></span>
<li id="<%= track.id %>">
<span class="play<%= (track.inDb ? '' : ' disabled') %>"></span>
<span class="track-name"><%= track.name %></span>
<span class="duration"><%= track.length.toTime %></span>
</li>

View File

@ -3,12 +3,18 @@
<head>
<title>BeatHaven</title>
<%= stylesheet_link_tag :all %>
<%= javascript_include_tag :defaults %>
<%= javascript_include_tag :all %>
<%= csrf_meta_tag %>
</head>
<body>
<div id="contents">
<div class="inner-1">
<div id="player">
<span id="artist"></span>
<span id="dash"> - </span>
<span id="title"></span>
<audio controls preload style="width:1000px;"></audio>
</div>
<%= yield %>
</div>
</div>

23
rails/config/mongoid.yml Normal file
View File

@ -0,0 +1,23 @@
defaults: &defaults
host: localhost
# slaves:
# - host: slave1.local
# port: 27018
# - host: slave2.local
# port: 27019
development:
<<: *defaults
database: beathaven
test:
<<: *defaults
database: beathaven_test
# set these environment variables on your prod server
production:
host: <%= ENV['MONGOID_HOST'] %>
port: <%= ENV['MONGOID_PORT'] %>
username: <%= ENV['MONGOID_USERNAME'] %>
password: <%= ENV['MONGOID_PASSWORD'] %>
database: <%= ENV['MONGOID_DATABASE'] %>

View File

@ -58,7 +58,7 @@ Beathaven::Application.routes.draw do
# This is a legacy wild controller route that's not recommended for RESTful applications.
# Note: This route will make all actions in every controller accessible via GET requests.
# match ':controller(/:action(/:id(.:format)))'
match 'artist(/:name)' => 'artist#view'
match 'listen/:id' => 'track#listen'
end

View File

@ -0,0 +1,45 @@
# Vkontake accounts config
Bach: # Bach himself
user_id: 5728795
email: chezzzy@yandex.ru
password: yabach!
remixsid: 47c2f5501b22a3e3aa6947e5e74d1a72381267df2502570eb75c94481ade
remixchk: 5
user_agent: "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13"
Mozart: # Hedg
user_id: 69139853
email: alexgreen1978@gmail.com
password: fbcn136
remixsid: bc5386a4f49f8bf7df20e11bdd311a7120818d83c23d93cd08177d5d3674
remixchk: 5
user_agent: "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.307.9 Safari/532.9"
Schubert: # Chez
user_id: 1217744
email: phpdev.ru@gmail.com
password: yanebach!
remixsid: fc27c3a7874bc0b84477015e187e5e0bd3a71bdca02d98327595ef255773
remixchk: 5
user_agent: "Mozilla/5.0 (Macintosh; U; PPC Max OS X Mach-O; en-US; rv:1.8.0.7) Gecko/200609211 Camino/1.0.3"
Vivaldi: # Flint
user_id: 382067
remixsid: 9afa6f2e6d352b01d1a3742b2c0f6c09dbefe2158f3dcb61d30fe438dbc2
remixchk: 5
user_agent: "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16"
Prokofiev: # Daddy
user_id:24538630
remixsid: 832fae47c8dfc8df66551b8c72927ca26f6ee49f5754b24e9a9a317805c5
remixchk: 5
user_agent: "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; WebMoney Advisor; GTB6.3; InfoPath.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; OfficeLiveConnector.1.3; OfficeLivePatch.0.0; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"
Paganini: # Tom_Orrow
user_id: 1554168
email: agent_smith@gmail.ru
password: GoTo17db14DB
remixsid: cf89c2e8ef6ab2337c3b4ef22bdd38be70c880da7f9ef73ff7d02ff9608e
remixchk: 5
user_agent: "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16"

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 KiB

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,12 @@
$(function(){
$('.play').click(function(){
$.get('/listen/'+ $(this).parent().attr('id') +'/', function(res){
if (res.status == 'ok') {
$('#player audio').attr('src', res.data.url);
$('#player #artist').html(res.data.artist);
$('#player #title').html(res.data.track);
$('#player audio').play();
}
})
})
})

View File

@ -21,7 +21,7 @@ body {
display: block;
width: 100%;
text-align: center;
margin: 0 0 0.5em 0;
margin: 4em 0 0.5em 0;
font-size: 3em;
}
@ -41,7 +41,7 @@ body {
.album .name {
display: block;
float: left;
width: 400px;
width: 450px;
font-size: 1.5em;
margin: 0 0 0.5em 0;
/* background-color: yellowgreen;*/
@ -50,7 +50,7 @@ body {
.album .tracks {
display: block;
float: left;
width: 400px;
width: 450px;
margin-bottom: 1em;
/* background-color: lightblue;*/
}
@ -75,6 +75,32 @@ body {
width: 31px;
height: 30px;
margin: 0 0.3em 0 0;
cursor: pointer;
}
.album .tracks li .play.disabled {
background-image: none;
}
#player {
position: fixed;
top: 0;
left: 50%;
margin-left: -500px;
width: 1000px;
height: 111px;
background-color: #333;
border: #222 1px solid;
}
#artist, #dash, #title {
line-height: 87px;
font-size: 2em;
color: #AAA;
}
#dash {
color: #666;
}
.search {

View File

@ -0,0 +1,448 @@
/*
* Skin for jPlayer Plugin (jQuery JavaScript Library)
* http://www.happyworm.com/jquery/jplayer
*
* Skin Name: Blue Monday
*
* Copyright (c) 2010 Happyworm Ltd
* Dual licensed under the MIT and GPL licenses.
* - http://www.opensource.org/licenses/mit-license.php
* - http://www.gnu.org/copyleft/gpl.html
*
* Author: Silvia Benvenuti
* Skin Version: 3.0 (jPlayer 2.0.0)
* Date: 20th December 2010
*/
div.jp-audio,
div.jp-video {
/* Edit the font-size to counteract inherited font sizing.
* Eg. 1.25em = 1 / 0.8em
*/
font-size:1.25em;
font-family:Verdana, Arial, sans-serif;
line-height:1.6;
color: #666;
}
div.jp-audio {
width:1000px;
}
div.jp-video-270p {
width:480px;
}
div.jp-video-360p {
width:640px;
}
div.jp-interface {
position: relative;
background-color:#eee;
/* width:418px; */
width:100%;
/* border:1px solid #009be3;*/
}
div.jp-audio div.jp-type-single div.jp-interface {
height:80px;
border-bottom:none;
}
div.jp-audio div.jp-type-playlist div.jp-interface {
height:80px;
}
div.jp-video div.jp-type-single div.jp-interface {
height:60px;
border-bottom:none;
}
div.jp-video div.jp-type-playlist div.jp-interface {
height:60px;
}
div.jp-interface ul.jp-controls {
list-style-type:none;
padding:0;
margin: 0;
}
div.jp-interface ul.jp-controls li {
/* position: absolute; */
display:inline;
}
div.jp-interface ul.jp-controls a {
position: absolute;
overflow:hidden;
text-indent:-9999px;
}
a.jp-play,
a.jp-pause {
width:40px;
height:40px;
z-index:1;
}
div.jp-audio div.jp-type-single a.jp-play,
div.jp-audio div.jp-type-single a.jp-pause {
top:20px;
left:40px;
}
div.jp-audio div.jp-type-playlist a.jp-play,
div.jp-audio div.jp-type-playlist a.jp-pause {
top:20px;
left:48px;
}
div.jp-video a.jp-play,
div.jp-video a.jp-pause {
top:15px;
}
div.jp-video-270p div.jp-type-single a.jp-play,
div.jp-video-270p div.jp-type-single a.jp-pause {
left:195px;
}
div.jp-video-270p div.jp-type-playlist a.jp-play,
div.jp-video-270p div.jp-type-playlist a.jp-pause {
left:220px;
}
div.jp-video-360p div.jp-type-single a.jp-play,
div.jp-video-360p div.jp-type-single a.jp-pause {
left:275px;
}
div.jp-video-360p div.jp-type-playlist a.jp-play,
div.jp-video-360p div.jp-type-playlist a.jp-pause {
left:300px;
}
a.jp-play {
background: url("../images/jplayer/jplayer.blue.monday.jpg") 0 0 no-repeat;
}
a.jp-play:hover {
background: url("../images/jplayer/jplayer.blue.monday.jpg") -41px 0 no-repeat;
}
a.jp-pause {
background: url("../images/jplayer/jplayer.blue.monday.jpg") 0 -42px no-repeat;
display: none;
}
a.jp-pause:hover {
background: url("../images/jplayer/jplayer.blue.monday.jpg") -41px -42px no-repeat;
}
div.jp-audio div.jp-type-single a.jp-stop {
top:26px;
left:90px;
}
div.jp-audio div.jp-type-playlist a.jp-stop {
top:26px;
left:126px;
}
div.jp-video a.jp-stop {
top:21px;
}
div.jp-video-270p div.jp-type-single a.jp-stop {
left:245px;
}
div.jp-video-270p div.jp-type-playlist a.jp-stop {
left:298px;
}
div.jp-video-360p div.jp-type-single a.jp-stop {
left:325px;
}
div.jp-video-360p div.jp-type-playlist a.jp-stop {
left:378px;
}
a.jp-stop {
background: url("../images/jplayer/jplayer.blue.monday.jpg") 0 -83px no-repeat;
width:28px;
height:28px;
z-index:1;
}
a.jp-stop:hover {
background: url("../images/jplayer/jplayer.blue.monday.jpg") -29px -83px no-repeat;
}
div.jp-audio div.jp-type-playlist a.jp-previous {
left:20px;
top:26px;
}
div.jp-video div.jp-type-playlist a.jp-previous {
top:21px;
}
div.jp-video-270p div.jp-type-playlist a.jp-previous {
left:192px;
}
div.jp-video-360p div.jp-type-playlist a.jp-previous {
left:272px;
}
a.jp-previous {
background: url("../images/jplayer/jplayer.blue.monday.jpg") 0 -112px no-repeat;
width:28px;
height:28px;
}
a.jp-previous:hover {
background: url("../images/jplayer/jplayer.blue.monday.jpg") -29px -112px no-repeat;
}
div.jp-audio div.jp-type-playlist a.jp-next {
left:88px;
top:26px;
}
div.jp-video div.jp-type-playlist a.jp-next {
top:21px;
}
div.jp-video-270p div.jp-type-playlist a.jp-next {
left:260px;
}
div.jp-video-360p div.jp-type-playlist a.jp-next {
left:340px;
}
a.jp-next {
background: url("../images/jplayer/jplayer.blue.monday.jpg") 0 -141px no-repeat;
width:28px;
height:28px;
}
a.jp-next:hover {
background: url("../images/jplayer/jplayer.blue.monday.jpg") -29px -141px no-repeat;
}
div.jp-progress {
position: absolute;
overflow:hidden;
background-color: #ddd;
}
div.jp-audio div.jp-type-single div.jp-progress {
top:32px;
left:130px;
width:122px;
height:15px;
}
div.jp-audio div.jp-type-playlist div.jp-progress {
top:32px;
left:164px;
width:122px;
height:15px;
}
div.jp-video div.jp-progress {
top:0px;
left:0px;
width:100%;
height:10px;
}
div.jp-seek-bar {
background: url("../images/jplayer/jplayer.blue.monday.jpg") 0 -202px repeat-x;
width:0px;
/* height:15px; */
height:100%;
cursor: pointer;
}
div.jp-play-bar {
background: url("../images/jplayer/jplayer.blue.monday.jpg") 0 -218px repeat-x ;
width:0px;
/* height:15px; */
height:100%;
}
/* The seeking class is added/removed inside jPlayer */
div.jp-seeking-bg {
background: url("pbar-ani.gif");
}
a.jp-mute,
a.jp-unmute {
width:18px;
height:15px;
}
div.jp-audio div.jp-type-single a.jp-mute,
div.jp-audio div.jp-type-single a.jp-unmute {
top:32px;
left:274px;
}
div.jp-audio div.jp-type-playlist a.jp-mute,
div.jp-audio div.jp-type-playlist a.jp-unmute {
top:32px;
left:296px;
}
div.jp-video a.jp-mute,
div.jp-video a.jp-unmute {
top:27px;
}
div.jp-video-270p div.jp-type-single a.jp-mute,
div.jp-video-270p div.jp-type-single a.jp-unmute {
left:304px;
}
div.jp-video-270p div.jp-type-playlist a.jp-unmute,
div.jp-video-270p div.jp-type-playlist a.jp-mute {
left:363px;
}
div.jp-video-360p div.jp-type-single a.jp-mute,
div.jp-video-360p div.jp-type-single a.jp-unmute {
left:384px;
}
div.jp-video-360p div.jp-type-playlist a.jp-mute,
div.jp-video-360p div.jp-type-playlist a.jp-unmute {
left:443px;
}
a.jp-mute {
background: url("../images/jplayer/jplayer.blue.monday.jpg") 0 -186px no-repeat;
}
a.jp-mute:hover {
background: url("../images/jplayer/jplayer.blue.monday.jpg") -19px -170px no-repeat;
}
a.jp-unmute {
background: url("../images/jplayer/jplayer.blue.monday.jpg") 0 -170px no-repeat;
display: none;
}
a.jp-unmute:hover {
background: url("../images/jplayer/jplayer.blue.monday.jpg") -19px -186px no-repeat;
}
div.jp-volume-bar {
position: absolute;
overflow:hidden;
background: url("../images/jplayer/jplayer.blue.monday.jpg") 0 -250px repeat-x;
width:46px;
height:5px;
cursor: pointer;
}
div.jp-audio div.jp-type-single div.jp-volume-bar {
top:37px;
left:302px;
}
div.jp-audio div.jp-type-playlist div.jp-volume-bar {
top:37px;
left:324px;
}
div.jp-video div.jp-volume-bar {
top:32px;
}
div.jp-video-270p div.jp-type-single div.jp-volume-bar {
left:332px;
}
div.jp-video-270p div.jp-type-playlist div.jp-volume-bar {
left:391px;
}
div.jp-video-360p div.jp-type-single div.jp-volume-bar {
left:412px;
}
div.jp-video-360p div.jp-type-playlist div.jp-volume-bar {
left:471px;
}
div.jp-volume-bar-value {
background: url("../images/jplayer/jplayer.blue.monday.jpg") 0 -256px repeat-x;
width:0px;
height:5px;
}
div.jp-current-time,
div.jp-duration {
position: absolute;
font-size:.64em;
font-style:oblique;
}
div.jp-duration {
text-align: right;
}
div.jp-audio div.jp-type-single div.jp-current-time,
div.jp-audio div.jp-type-single div.jp-duration {
top:49px;
left:130px;
width:122px;
}
div.jp-audio div.jp-type-playlist div.jp-current-time,
div.jp-audio div.jp-type-playlist div.jp-duration {
top:49px;
left:164px;
width:122px;
}
div.jp-video div.jp-current-time,
div.jp-video div.jp-duration {
top:10px;
left:0px;
width:98%;
padding:0 1%;
}
div.jp-playlist {
/* width:418px; */
width:100%;
background-color:#ccc;
/* border:1px solid #009be3;*/
border-top:none;
}
div.jp-playlist ul {
list-style-type:none;
margin:0;
padding:0 20px;
/* background-color:#ccc; */
/* border:1px solid #009be3; */
/* border-top:none; */
/* width:378px; */
font-size:.72em;
}
div.jp-type-single div.jp-playlist li {
padding:5px 0 5px 20px;
font-weight:bold;
}
div.jp-type-playlist div.jp-playlist li {
padding:5px 0 4px 20px;
border-bottom:1px solid #eee;
}
/*
div.jp-video div.jp-playlist li {
padding:5px 0 5px 20px;
font-weight:bold;
}
*/
div.jp-type-playlist div.jp-playlist li.jp-playlist-last {
padding:5px 0 5px 20px;
border-bottom:none;
}
div.jp-type-playlist div.jp-playlist li.jp-playlist-current {
list-style-type:square;
list-style-position:inside;
padding-left:8px;
}
div.jp-type-playlist div.jp-playlist a {
color: #666;
text-decoration: none;
}
div.jp-type-playlist div.jp-playlist a:hover {
color:#0d88c1;
}
div.jp-type-playlist div.jp-playlist a.jp-playlist-current {
color:#0d88c1;
}
div.jp-type-playlist div.jp-playlist div.jp-free-media {
display:inline;
margin-left:20px;
}
div.jp-video div.jp-video-play {
background: transparent url("../images/jplayer/jplayer.blue.monday.video.play.png") no-repeat center;
/* position: relative; */
position: absolute;
cursor:pointer;
z-index:2;
}
div.jp-video div.jp-video-play:hover {
background: transparent url("../images/jplayer/jplayer.blue.monday.video.play.hover.png") no-repeat center;
}
div.jp-video-270p div.jp-video-play {
top:-270px;
width:480px;
height:270px;
}
div.jp-video-360p div.jp-video-play {
top:-360px;
width:640px;
height:360px;
}
div.jp-jplayer {
width:0px;
height:0px;
}
div.jp-video div.jp-jplayer {
/* border:1px solid #009be3;*/
border-bottom:none;
z-index:1;
}
div.jp-video-270p div.jp-jplayer {
width:480px;
height:270px;
}
div.jp-video-360p div.jp-jplayer {
width:640px;
height:360px;
}
div.jp-jplayer {
background-color: #000000;
}

11
rails/test/fixtures/album_pics.yml vendored Normal file
View File

@ -0,0 +1,11 @@
# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
# This model initially had no columns defined. If you add columns to the
# model remove the '{}' from the fixture names and add the columns immediately
# below each fixture, per the syntax in the comments below
#
one: {}
# column: value
#
two: {}
# column: value

11
rails/test/fixtures/track_data.yml vendored Normal file
View File

@ -0,0 +1,11 @@
# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
# This model initially had no columns defined. If you add columns to the
# model remove the '{}' from the fixture names and add the columns immediately
# below each fixture, per the syntax in the comments below
#
one: {}
# column: value
#
two: {}
# column: value

View File

@ -0,0 +1,8 @@
require 'test_helper'
class TrackControllerTest < ActionController::TestCase
# Replace this with your real tests.
test "the truth" do
assert true
end
end

View File

@ -0,0 +1,8 @@
require 'test_helper'
class AlbumPicTest < ActiveSupport::TestCase
# Replace this with your real tests.
test "the truth" do
assert true
end
end

View File

@ -0,0 +1,4 @@
require 'test_helper'
class TrackHelperTest < ActionView::TestCase
end

View File

@ -0,0 +1,8 @@
require 'test_helper'
class TrackDataTest < ActiveSupport::TestCase
# Replace this with your real tests.
test "the truth" do
assert true
end
end

View File

@ -1 +0,0 @@
2408