forked from stephenplusplus/batmanjs.github.io
-
Notifications
You must be signed in to change notification settings - Fork 0
/
app_files.json
1 lines (1 loc) · 50.7 KB
/
app_files.json
1
[{"id":"/app","name":"app","isDirectory":true,"children":[{"id":"/app/assets","name":"assets","isDirectory":true,"children":[{"id":"/app/assets/batman","name":"batman","isDirectory":true,"children":[{"id":"/app/assets/batman/controllers","name":"controllers","isDirectory":true,"children":[{"id":"/app/assets/batman/controllers/application_controller.js.coffee","name":"application_controller.js.coffee","isDirectory":false,"content":"class Rdio.ApplicationController extends Batman.Controller\n"},{"id":"/app/assets/batman/controllers/main_controller.js.coffee","name":"main_controller.js.coffee","isDirectory":false,"content":"class Rdio.MainController extends Rdio.ApplicationController\n routingKey: 'main'\n\n index: (params) ->\n\n firstName: 'Bruce'\n lastName: 'Wayne'\n\n @accessor 'fullName', ->\n \"#{@get('firstName')} #{@get('lastName')}\"\n"},{"id":"/app/assets/batman/controllers/playlists_controller.js.coffee","name":"playlists_controller.js.coffee","isDirectory":false,"content":"class Rdio.PlaylistsController extends Rdio.ApplicationController\n routingKey: 'playlists'\n\n index: (params) ->\n\n show: (params) ->\n\n edit: (params) ->\n\n new: (params) ->\n\n create: ->\n\n update: ->\n\n destroy: (params) ->\n\n","expectations":[{"stepName":"fast_forward","regex":"@beforeAction\\s+[\"']fetchPlaylist[\"'],\\s+only:\\s+[[\"']show[\"'],\\s+[\"']edit[\"']]","action":"appear","completion":{"index":92,"value":"\n @beforeAction 'fetchPlaylist', only: ['show', 'edit']\n"}},{"stepName":"playlist_index","regex":"@set\\([\"']playlists[\"'],\\s+Rdio\\.Playlist\\.get\\([\"']all[\"']\\)\\)","action":"expect","completion":{"index":196,"value":"\n @set('playlists', Rdio.Playlist.get('all'))\n"}},{"stepName":"fast_forward","regex":"@set\\([\"']playlist[\"'],\\s+new\\s+Rdio\\.Playlist\\)","action":"appear","completion":{"index":334,"value":"\n @set('playlist', new Rdio.Playlist)\n"}},{"stepName":"fast_forward","regex":"@playlist\\.save\\s+=>\\s+@redirect\\(@playlist\\)","action":"appear","completion":{"index":414,"value":"\n @playlist.save =>\n @redirect(@playlist)\n"}},{"stepName":"fast_forward","regex":"@playlist\\.save\\s+=>\\s+@redirect\\(@playlist\\)","action":"appear","completion":{"index":414,"value":"\n @playlist.save =>\n @redirect(@playlist)\n"}},{"stepName":"fast_forward","regex":"fetchPlaylist:\\s+\\(params\\)\\s+->\\s+Rdio\\.Playlist\\.find\\s+params\\.id,\\s+@errorHandler\\s+\\(list\\)\\s+=>\\s+@set\\([\"']playlist[\"'],\\s+list\\)","action":"appear","completion":{"index":602,"value":"\n fetchPlaylist: (params) ->\n Rdio.Playlist.find params.id, @errorHandler (list) =>\n @set('playlist', list)\n"}}]}]},{"id":"/app/assets/batman/html","name":"html","isDirectory":true,"children":[{"id":"/app/assets/batman/html/main","name":"main","isDirectory":true,"children":[{"id":"/app/assets/batman/html/main/index.html","name":"index.html","isDirectory":false,"content":"<h1>Welcome to batman.js!</h1>\n\n<h2>What's your name?</h2>\n<input data-bind=\"firstName\" />\n<input data-bind=\"lastName\" />\n\n<div>Hi, <span data-bind=\"fullName\"></span>!</div>\n\n<!---->\n","expectations":[{"stepName":"playlist","regex":"-->\\s+<a\\s+data-route=[\"']routes\\.playlists[\"']>Playlists</a>\\s+<!--","action":"appear","completion":{"index":179,"value":"-->\n<a data-route=\"routes.playlists\">Playlists</a>\n<!--"}}]}]},{"id":"/app/assets/batman/html/player","name":"player","isDirectory":true,"children":[{"id":"/app/assets/batman/html/player/main.html","name":"main.html","isDirectory":false,"content":"<div class=\"player-controls\">\n\n <img data-bind-src=\"currentTrack.icon\" />\n <div class=\"playbar\"><div class=\"playhead\">x</div></div>\n\n <h3 data-bind=\"currentTrack.name | default 'Nothing Playing'\"></h3>\n <span data-bind=\"currentTrack.artist\"></span>\n <span data-bind=\"currentTrack.album.name\"></span>\n\n <div class=\"player-controls-area\">\n <a data-event-click=\"playPause\" data-addclass-playing=\"isPlaying\">Play</a>\n </div>\n\n\n <div id=\"player\"></div>\n</div>\n"}]},{"id":"/app/assets/batman/html/playlists","name":"playlists","isDirectory":true,"children":[{"id":"/app/assets/batman/html/playlists/edit.html","name":"edit.html","isDirectory":false,"content":"<div class=\"navigation\">\n <h1 data-bind=\"playlist.name\"></h1>\n <a data-event-click=\"update\" class=\"fl\">Save</a>\n <a data-route=\"playlist\" class=\"fr\">Cancel</a>\n <div class=\"clear\"></div>\n</div>\n\n<h3 class=\"nav-section-title\" data-hideif=\"playlist.tracks.length\">Empty Playlist</h3>\n\n<ul class=\"list\" id=\"playlist-items\">\n <li class=\"album-list-item clearfix\" data-foreach-track=\"playlist.tracks\">\n <div class=\"album-meta\" data-event-click=\"track.play\">\n <img data-bind-src=\"track.icon\" />\n <span data-bind=\"track.name\" class=\"album-name\"></span>\n </div>\n <a class=\"handle\">=</a>\n <a class=\"button\" data-event-click=\"removeTrack\"><span class=\"remove\">x</span></a>\n </li>\n</ul>\n\n<div class=\"navigation\">\n <h1>Add Tracks from Rdio</h1>\n <form data-event-submit=\"searchRdio\" class=\"search-rdio-form\">\n <input type=\"search\" data-bind=\"searchQuery\" placeholder=\"Search Rdio Albums...\" />\n <input type=\"submit\" value=\"Go\" />\n </form>\n</div>\n\n<div data-showif=\"isSearching\">\n <h3 class=\"nav-section-title\">\n Search Results\n <a class=\"button\" data-event-click=\"clearSearch\"><span class=\"remove\">x</span></a>\n </h3>\n <img class=\"loading\" src=\"/assets/loader.gif\" data-hideif=\"searchResults.length\">\n\n <ul class=\"list albums\">\n <li class=\"album-list-item clearfix\" data-foreach-album=\"searchResults\">\n <div class=\"album-meta\" data-event-click=\"showAlbumTracks\">\n <img data-bind-src=\"album.icon\" />\n <span class=\"album-name\" data-bind=\"album.name\"></span>\n </div>\n <a data-event-click=\"addAlbum\" class=\"button\"><span class=\"add\">+</span></a>\n\n <ul class=\"list\" data-showif=\"album.showTracks\">\n <li class=\"track-meta\" data-foreach-track=\"album.tracks\">\n <span data-bind=\"track.name\" class=\"track-name\"></span>\n <a data-event-click=\"addTrack\" class=\"button\"><span class=\"add\">+</span></a>\n </li>\n </ul>\n </li>\n </ul>\n</div>\n\n<div>\n <h3 class=\"nav-section-title\">Popular Albums</h3>\n <img class=\"loading\" src=\"/assets/loader.gif\" data-hideif=\"Album.popular.length\">\n\n <ul class=\"list albums\">\n <li class=\"album-list-item clearfix\" data-foreach-album=\"Album.popular\">\n <div class=\"album-meta\" data-event-click=\"showAlbumTracks\">\n <img data-bind-src=\"album.icon\" />\n <span class=\"album-name\" data-bind=\"album.name\"></span>\n </div>\n <a data-event-click=\"addAlbum\" class=\"button\"><span class=\"add\">+</span></a>\n\n <ul class=\"list\" data-showif=\"album.showTracks\">\n <li class=\"track-meta\" data-foreach-track=\"album.tracks\">\n <span data-bind=\"track.name\" class=\"track-name\"></span>\n <a data-event-click=\"addTrack\" class=\"button\"><span class=\"add\">+</span></a>\n </li>\n </ul>\n </li>\n </ul>\n</div>\n"},{"id":"/app/assets/batman/html/playlists/index.html","name":"index.html","isDirectory":false,"content":"<div class=\"navigation\">\n <h1>\n <span ></span> Playlists\n </h1>\n <a class=\"fl\">New Playlist</a>\n <div class=\"clear\"></div>\n</div>\n\n<h3 class=\"nav-section-title\" >No playlists :(</h3>\n\n<ul class=\"list\">\n <li class=\"playlist-item\" >\n <a class=\"playlist-link\" >\n <img />\n <span class=\"playlist-name\" >Loading...</span>\n </a>\n </li>\n</ul>\n","expectations":[{"stepName":"first_binding","regex":"data-bind=[\"']playlists\\.length[\"']","action":"expect","completion":{"index":42,"value":" data-bind=\"playlists.length\""}},{"stepName":"route_bindings","regex":"data-route=[\"']routes\\.playlists\\.new[\"']","action":"expect","completion":{"index":129,"value":" data-route=\"routes.playlists.new\""}},{"stepName":"showif_binding","regex":"data-showif=[\"']playlists\\.isEmpty[\"']","action":"expect","completion":{"index":285,"value":" data-showif=\"playlists.isEmpty\""}},{"stepName":"foreach_binding","regex":"data-foreach-list=[\"']playlists[\"']","action":"expect","completion":{"index":413,"value":" data-foreach-list=\"playlists\""}},{"stepName":"route_bindings","regex":"data-route=[\"']list[\"']","action":"expect","completion":{"index":502,"value":" data-route=\"list\""}},{"stepName":"attribute_binding","regex":"data-bind-src=[\"']list\\.icon[\"']","action":"expect","completion":{"index":560,"value":" data-bind-src=\"list.icon\""}},{"stepName":"foreach_binding","regex":"data-bind=[\"']list\\.name[\"']","action":"expect","completion":{"index":654,"value":" data-bind=\"list.name\""}}]},{"id":"/app/assets/batman/html/playlists/new.html","name":"new.html","isDirectory":false,"content":"<div class=\"navigation\">\n <h1>New Playlist</h1>\n <a data-event-click=\"create\" class=\"fl\">Save</a>\n <a data-route=\"routes.playlists\" class=\"fr\">Cancel</a>\n <div class=\"clear\"></div>\n</div>\n\n<form data-formfor-list=\"playlist\" data-event-submit=\"create\">\n <div>\n <label>Name:</label>\n <input data-bind=\"list.name\" />\n </div>\n</form>\n"},{"id":"/app/assets/batman/html/playlists/show.html","name":"show.html","isDirectory":false,"content":"<div class=\"navigation\">\n <h1 data-bind=\"playlist.name\"></h1>\n <a data-route=\"routes.playlists\" class=\"fl\">All Playlists</a>\n <a data-route=\"routes.playlists[playlist].edit\" class=\"fr\">Edit</a>\n <div class=\"clear\"></div>\n</div>\n\n<h3 class=\"nav-section-title\" data-hideif=\"playlist.tracks.length\">Empty Playlist</h3>\n\n<ul class=\"list\">\n <li class=\"album-list-item clearfix\" data-foreach-track=\"playlist.tracks\" data-event-click=\"track.play\">\n <div class=\"album-meta\">\n <img data-bind-src=\"track.icon\" />\n <span data-bind=\"track.name\"></span>\n </div>\n <a class=\"button\"><span class=\"remove\">></span></a>\n </li>\n</ul>\n"}]}]},{"id":"/app/assets/batman/lib","name":"lib","isDirectory":true,"children":[{"id":"/app/assets/batman/lib/rdio_storage.js.coffee","name":"rdio_storage.js.coffee","isDirectory":false,"content":"class Rdio.RdioStorage extends Batman.RestStorage\n request: (env, next) ->\n R?.ready ->\n R.request\n method: env.options.action\n content: env.options.data\n success: (response) -> env.data = response.result; window.RESULTS = env.data\n error: (response) -> env.error = response.message\n complete: (response) ->\n env.results = response.result\n next()\n"}]},{"id":"/app/assets/batman/models","name":"models","isDirectory":true,"children":[{"id":"/app/assets/batman/models/album.js.coffee","name":"album.js.coffee","isDirectory":false,"content":"class Rdio.Album extends Batman.Model\n @resourceName: 'albums'\n\n @persist Rdio.RdioStorage\n\n @primaryKey: 'key'\n @encode 'name', 'artist', 'icon'\n @encodeTimestamps()\n\n @hasMany 'tracks'\n\n @classAccessor 'popular', promise: (deliver) =>\n @request 'getTopCharts', data: {type: \"Album\", extras: \"tracks\"}, (error, response) ->\n popular = new Batman.Set\n popular.add(Rdio.Album.createFromJSON(album)) for album in response\n deliver(error, popular)\n\n @search: (query, callback) ->\n @request 'search', data: {query, types: \"Album\", extras: \"tracks\"}, (error, response) ->\n results = new Batman.Set\n results.add(Rdio.Album.createFromJSON(album)) for album in response?.results\n callback(error, results)\n"},{"id":"/app/assets/batman/models/playlist.js.coffee","name":"playlist.js.coffee","isDirectory":false,"content":"class Rdio.Playlist extends Batman.Model\n @resourceName: 'playlists'\n @storageKey: 'playlists'\n\n @persist Batman.RailsStorage\n\n # Use @encode to tell batman.js which properties Rails will send back with its JSON.\n # @encode 'name'\n\n # @encodeTimestamps will automatically add encoders for created_at and updated_at.\n # They'll be decoded to JavaScript Date objects so you can easily work with them.\n @encodeTimestamps()\n\n","expectations":[{"stepName":"encoders","regex":"@encode\\s+[\"']name[\"'],\\s+[\"']icon[\"']","action":"expect","completion":{"index":236,"value":"\n @encode 'name', 'icon'\n"}},{"stepName":"associations","regex":"@hasMany\\s+[\"']tracks[\"']","action":"expect","completion":{"index":475,"value":"\n @hasMany 'tracks'\n"}}]},{"id":"/app/assets/batman/models/track.js.coffee","name":"track.js.coffee","isDirectory":false,"content":"class Rdio.Track extends Batman.Model\n @resourceName: 'tracks'\n @storageKey: 'tracks'\n\n @persist Rdio.RdioStorage\n\n @primaryKey: 'key'\n @encode 'name', 'duration', 'icon', 'artist', 'key'\n\n @belongsTo 'album', foreignKey: 'album_key'\n\n play: ->\n Rdio.set 'currentTrack', this\n"}]},{"id":"/app/assets/batman/rdio.js.coffee","name":"rdio.js.coffee","isDirectory":false,"content":"#= require batman/es5-shim\n\n#= require batman/batman\n#= require batman/batman.rails\n\n#= require jquery\n\n#= require batman/batman.jquery\n\n#= require_self\n\n#= require_tree ./lib\n#= require_tree ./controllers\n#= require_tree ./models\n#= require_tree ./views\n\nBatman.config.pathToHTML = '/assets/html'\n\nclass Rdio extends Batman.App\n @resources 'playlists'\n\n # @resources 'products'\n # @resources 'discounts', except: ['edit']\n # @resources 'customers', only: ['new', 'show']\n\n # @resources 'blogs', ->\n # @resources 'articles'\n\n # @resources 'pages', ->\n # @collection 'count'\n # @member 'duplicate'\n\n # @route 'apps', 'apps#index'\n # @route 'apps/private', 'apps#private', as: 'privateApps'\n\n @root 'main#index' \n\n(global ? window).Rdio = Rdio\n","expectations":[{"stepName":"jquery_ui","regex":"#=\\s+require\\s+jquery\\.ui\\.sortable","action":"appear","completion":{"index":103,"value":"\n#= require jquery.ui.sortable\n"}},{"stepName":"tracks_scaffold","regex":"@resources\\s+[\"']tracks[\"']","action":"appear","completion":{"index":407,"value":"\n @resources 'tracks'\n"}},{"stepName":"routing","regex":"[\"']playlists#index[\"']","action":"expect","completion":{"index":832,"value":" 'playlists#index' "}}]},{"id":"/app/assets/batman/views","name":"views","isDirectory":true,"children":[{"id":"/app/assets/batman/views/player_view.js.coffee","name":"player_view.js.coffee","isDirectory":false,"content":"class Rdio.PlayerView extends Batman.View\n\n\n\n\n playPause: ->\n if @get('isPlaying')\n R.player.pause()\n else\n R.player.play()\n\n @accessor 'isPlaying', ->\n Rdio.get('currentTrack') && @get('playState') == R.player?.PLAYSTATE_PLAYING\n","expectations":[{"stepName":"view_source","regex":"source:\\s+[\"']player/main[\"']","action":"expect","completion":{"index":42,"value":"\n source: 'player/main'\n"}},{"stepName":"viewDidAppear","regex":"viewDidAppear:\\s+->\\s+R?\\.ready\\s+=>\\s+Rdio\\.observe\\s+[\"']currentTrack[\"'],\\s+\\(track\\)\\s+->\\s+if\\s+track\\s+R\\.player\\.play\\(\\{source:\\s+track\\.get\\([\"']key[\"']\\)\\}\\)\\s+else\\s+R\\.player\\.stop\\(\\)\\s+R\\.player\\.on\\s+[\"']change:playState[\"'],\\s+\\(state\\)\\s+=>\\s+@set\\([\"']playState[\"'],\\s+state\\)\\s+R\\.player\\.on\\s+[\"']change:position[\"'],\\s+\\(time\\)\\s+=>\\s+duration\\s+=\\s+Rdio\\.get\\([\"']currentTrack\\.duration[\"']\\)\\s+position\\s+=\\s+\\(time\\s+/\\s+duration\\)\\s+\\*\\s+100\\s+$\\([\"']\\.playhead[\"'],\\s+@node\\)\\.css\\([\"']left[\"'],\\s+position\\s+\\+\\s+[\"']%[\"']\\)","action":"appear","completion":{"index":93,"value":"\n viewDidAppear: ->\n R?.ready =>\n Rdio.observe 'currentTrack', (track) ->\n if track\n R.player.play({source: track.get('key')})\n else\n R.player.stop()\n\n R.player.on 'change:playState', (state) =>\n @set('playState', state)\n\n R.player.on 'change:position', (time) =>\n duration = Rdio.get('currentTrack.duration')\n position = (time / duration) * 100\n\n $('.playhead', @node).css('left', position + '%')\n"}}]},{"id":"/app/assets/batman/views/playlists","name":"playlists","isDirectory":true,"children":[{"id":"/app/assets/batman/views/playlists/playlist_edit_view.js.coffee","name":"playlist_edit_view.js.coffee","isDirectory":false,"content":"class Rdio.PlaylistsEditView extends Batman.View\n viewDidAppear: ->\n $('#playlist-items').sortable\n handle: '.handle'\n revert: true\n\n showAlbumTracks: (node, event, view) ->\n album = view.get('album')\n album.set('showTracks', !album.get('showTracks'))\n\n addAlbum: (node, event, view) ->\n album = view.get('album')\n playlist = view.lookupKeypath('playlist')\n\n album.get('tracks').forEach (track) ->\n playlist.get('tracks').add(track)\n\n addTrack: (node, event, view) ->\n track = view.get('track')\n playlist = view.lookupKeypath('playlist')\n\n playlist.get('tracks').add(track)\n\n removeTrack: (node, event, view) ->\n track = view.get('track')\n playlist = view.lookupKeypath('playlist')\n\n playlist.get('tracks').remove(track)\n\n searchQuery: ''\n searchResults: null\n searchRdio: ->\n @set('searchResults', null)\n @set('isSearching', true)\n\n Rdio.Album.search @get('searchQuery'), (error, results) =>\n @set('searchResults', results)\n\n clearSearch: ->\n @set('searchResults', null)\n @set('isSearching', false)\n @set('searchQuery', '')\n"}]}]}]},{"id":"/app/assets/images","name":"images","isDirectory":true,"children":[{"id":"/app/assets/images/loader.gif","name":"loader.gif","isDirectory":false},{"id":"/app/assets/images/pause-icon.png","name":"pause-icon.png","isDirectory":false},{"id":"/app/assets/images/play-icon.png","name":"play-icon.png","isDirectory":false}]},{"id":"/app/assets/javascripts","name":"javascripts","isDirectory":true,"children":[]},{"id":"/app/assets/stylesheets","name":"stylesheets","isDirectory":true,"children":[{"id":"/app/assets/stylesheets/application.css.scss","name":"application.css.scss","isDirectory":false,"content":"/*\n * This is a manifest file that'll be compiled into application.css, which will include all the files\n * listed below.\n *\n * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,\n * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.\n *\n * You're free to add application-wide styles to this file and they'll appear at the top of the\n * compiled file, but it's generally better to create a new file per style scope.\n *\n *= require_self\n *= require_tree .\n */\n\nbody {\n margin: 0px;\n font-family: \"Helvetica Neue\", Arial, Helvetica, sans-serif;\n background-color: #e5e5e5;\n color: #333;\n}\n\na {\n text-decoration: none;\n color: #777;\n}\n\nul {\n margin: 0px;\n padding: 0px;\n}\n\n// Text\n.nav-section-title {\n padding: 15px 15px;\n margin: 0;\n font-size: 0.8em;\n text-transform: uppercase;\n color: #ACACAC;\n text-shadow: 0 1px #fff;\n letter-spacing: 0.2em;\n font-weight: 300;\n border-bottom: 1px solid #dfdfdf;\n border-top: 1px solid #fff;\n box-shadow: 0 -1px 0 #e7e7e7;\n\n background: #f7f7f7;\n}\n\n// Layout\n.clearfix:before, .clearfix:after {\n content: \"\";\n display: table;\n}\n.clearfix:after { clear:both; }\n\n.wrapper {\n width: 100%;\n background-color: #e5e5e5;\n}\n\n.content {\n width: 400px;\n margin-right: auto;\n margin-left: auto;\n}\n\n.playbar { width: 100%; height: 24px; background-color: #222; position: relative; margin: -3px 0 0 0;\n\t.playhead { text-indent: -9999px; display: block; width: 2px; height: 24px; background: #FFF; position: absolute; top: 0; left: 0; }\n}\n\n#player {\n width: 0px;\n height: 0px;\n}\n\n.list {\n list-style: none;\n padding: 0;\n a {\n width: 100%;\n display: inline-block;\n }\n\timg { max-width: 64px;\n }\n\n a.button {\n float: right;\n top: 0;\n height: 100%;\n background-color: #FFF;\n color: #949494;\n text-align: center;\n font-weight: bold;\n }\n\n &.albums {\n border-bottom: 1px solid #ccc;\n }\n}\n\n.list a {\n padding: 6px 0px;\n}\n\n.list img {\n vertical-align: -140%;\n}\n\n.main {\n background-color: #FFF;\n margin: 24px 0;\n}\n\n.player-controls {\n background-color: #333;\n text-align: center;\n color: #FFF;\n img {\n width: 100%;\n }\n}\n\n.player-controls-area {\n background-color: #222;\n text-align: center;\n padding: 24px;\n a {\n height: 40px;\n width: 40px;\n color: white;\n display: inline-block;\n background: image-url('play-icon.png') no-repeat;\n text-indent: -30000px;\n }\n}\n\n.player-controls-area:hover {\n //background-color: #2dc578;\n}\n\n.playing {\n background: image-url('pause-icon.png') no-repeat !important;\n}\n\n.playing:hover {\n //background-color: red !important;\n}\n\n// Tracks\n\n.track-list {\n background-color: #FFF;\n h1 {\n padding: 0 24px 24px 24px;\n border-bottom: 1px #eee solid;\n }\n}\n\n.tracks {\n margin: 0px;\n padding: 0px;\n img {\n vertical-align: -140%;\n padding-right: 12px;\n }\n a {\n padding: 6px 12px;\n }\n}\n\n// Navigation\n\n.navigation {\n background-color: #f2f2f2;\n a {\n padding: 14px;\n margin-top: -30px;\n display: inline-block;\n }\n a:hover {\n background-color: #e6e6e6;\n }\n h1 {\n padding: 20px;\n text-align: center;\n font-size: 24px;\n color: #999;\n font-weight: 100;\n letter-spacing: 0.1em;\n }\n}\n\n.fl {\n float: left;\n}\n\n.fr {\n float: right;\n}\n\n.clear {\n clear: both;\n}\n\n.playlist-item {\n padding-top: 15px;\n\n &:hover {\n a { color: white }\n background-color: #3092d6;\n }\n\n .playlist-name {\n margin-left: 12px;\n padding-bottom: 0;\n }\n}\n\n\n.playlist-link {\n padding: 0;\n}\n\n.album-list-item {\n display: block;\n clear: both;\n cursor: pointer;\n\n .button, .handle {\n float: right;\n width: 10%;\n padding: 0;\n background-color: #aaa;\n .add, .remove { display: block; margin-top: 6px; }\n\n &:hover {\n color: white;\n background-color: #70b9f4;\n }\n }\n\n .album-meta + .button {\n .add, .remove { margin: 18px 0 27px }\n }\n\n &:hover > .button {\n color: white;\n background-color: #70b9f4;\n }\n\n &:hover > .album-meta {\n color: white;\n background-color: #3092d6;\n }\n\n .album-meta {\n float: left;\n width: 90%;\n height: 64px;\n .album-name {\n max-width: 285px;\n padding-left: 5px;\n display: inline-block;\n }\n }\n\n .track-meta {\n height: 36px;\n clear: both;\n\n .track-name {\n padding: 8px 0px;\n display: inline-block;\n margin-left: 10px;\n max-width: 330px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n &:hover {\n color: white;\n background-color: #3092d6;\n\n .button {\n color: white;\n background-color: #70b9f4;\n }\n }\n }\n}\n\n.loading {\n display: block;\n margin: 0 auto;\n padding: 20px 0;\n}\n"}]}]},{"id":"/app/controllers","name":"controllers","isDirectory":true,"children":[{"id":"/app/controllers/application_controller.rb","name":"application_controller.rb","isDirectory":false,"content":"class ApplicationController < ActionController::Base\n # Prevent CSRF attacks by raising an exception.\n # For APIs, you may want to use :null_session instead.\n protect_from_forgery with: :exception\nend\n"},{"id":"/app/controllers/batman_controller.rb","name":"batman_controller.rb","isDirectory":false,"content":"class BatmanController < ApplicationController\n\n def index\n @preview = params[:preview]\n render nothing: true, layout: 'batman'\n end\n\nend\n"},{"id":"/app/controllers/concerns","name":"concerns","isDirectory":true,"children":[]},{"id":"/app/controllers/playlists_controller.rb","name":"playlists_controller.rb","isDirectory":false,"content":"class PlaylistsController < ApplicationController\n respond_to :json\n\n def index\n respond_with Playlist.limit(50)\n end\n\n def show\n respond_with Playlist.find(params[:id]), include: :tracks\n end\n\n def create\n respond_with Playlist.create(playlist_params)\n end\n\n def update\n playlist = Playlist.find(params[:id])\n\n playlist.update(playlist_params)\n\n playlist.tracks.delete_all\n\n for track in params[:playlist][:tracks]\n playlist.tracks.create(track_params(track))\n end\n\n respond_with playlist\n end\n\n private\n\n def playlist_params\n params.require(:playlist).permit(:name)\n end\n\n def track_params(track)\n params = ActionController::Parameters.new(track)\n params.permit(:name, :icon, :artist, :key)\n end\nend\n"}]},{"id":"/app/helpers","name":"helpers","isDirectory":true,"children":[{"id":"/app/helpers/application_helper.rb","name":"application_helper.rb","isDirectory":false,"content":"module ApplicationHelper\nend\n"},{"id":"/app/helpers/playlists_helper.rb","name":"playlists_helper.rb","isDirectory":false,"content":"module PlaylistsHelper\nend\n"}]},{"id":"/app/mailers","name":"mailers","isDirectory":true,"children":[]},{"id":"/app/models","name":"models","isDirectory":true,"children":[{"id":"/app/models/concerns","name":"concerns","isDirectory":true,"children":[]},{"id":"/app/models/playlist.rb","name":"playlist.rb","isDirectory":false,"content":"class Playlist < ActiveRecord::Base\n has_many :tracks\n accepts_nested_attributes_for :tracks\nend\n"},{"id":"/app/models/track.rb","name":"track.rb","isDirectory":false,"content":"class Track < ActiveRecord::Base\n belongs_to :playlist\nend\n"}]},{"id":"/app/views","name":"views","isDirectory":true,"children":[{"id":"/app/views/layouts","name":"layouts","isDirectory":true,"children":[{"id":"/app/views/layouts/application.html.erb","name":"application.html.erb","isDirectory":false,"content":"<!DOCTYPE html>\n<html>\n<head>\n <title>BatmanRdio</title>\n <%= stylesheet_link_tag \"application\", media: \"all\", \"data-turbolinks-track\" => true %>\n <%= javascript_include_tag \"application\", \"data-turbolinks-track\" => true %>\n <%= csrf_meta_tags %>\n</head>\n<body>\n\n<%= yield %>\n\n</body>\n</html>\n"},{"id":"/app/views/layouts/batman.html.erb","name":"batman.html.erb","isDirectory":false,"content":"<!DOCTYPE html>\n<html>\n<head>\n <title>Batman Rdio</title>\n <%= stylesheet_link_tag \"application\", :media => \"all\" %>\n\n <script src=\"http://www.rdio.com/api/api.js?client_id=CGLDQweDHtrSZL-slIiYAQ&helper=/rdio_helper.html\"></script>\n\n\n <%= javascript_include_tag \"rdio\" %>\n <script type=\"text/javascript\">$(function() { Rdio.run(); });</script>\n\n\n\n <%= csrf_meta_tags %>\n</head>\n<body>\n\n<div class=\"wrapper\">\n <div class=\"content\">\n\n <div class=\"playerview\" ></div>\n\n <div class=\"main\" data-yield=\"main\"></div>\n\n </div>\n</div>\n\n</body>\n</html>\n","expectations":[{"stepName":"player_view","regex":"data-view=[\"']PlayerView[\"']","action":"expect","completion":{"index":908,"value":" data-view=\"PlayerView\""}}]}]},{"id":"/app/views/playlists","name":"playlists","isDirectory":true,"children":[]}]}]},{"id":"/config","name":"config","isDirectory":true,"children":[{"id":"/config/application.rb","name":"application.rb","isDirectory":false,"content":"require File.expand_path('../boot', __FILE__)\n\nrequire 'rails/all'\n\n# Require the gems listed in Gemfile, including any gems\n# you've limited to :test, :development, or :production.\nBundler.require(:default, Rails.env)\n\nmodule BatmanRdio\n class Application < Rails::Application\n # Settings in config/environments/* take precedence over those specified here.\n # Application configuration should go into files in config/initializers\n # -- all .rb files in that directory are automatically loaded.\n\n # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.\n # Run \"rake -D time\" for a list of tasks for finding time zone names. Default is UTC.\n # config.time_zone = 'Central Time (US & Canada)'\n\n # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.\n # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]\n # config.i18n.default_locale = :de\n\n config.assets.precompile += ['rdio.js']\n end\nend\n"},{"id":"/config/boot.rb","name":"boot.rb","isDirectory":false,"content":"# Set up gems listed in the Gemfile.\nENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)\n\nrequire 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])\n"},{"id":"/config/database.yml","name":"database.yml","isDirectory":false,"content":"# SQLite version 3.x\n# gem install sqlite3\n#\n# Ensure the SQLite 3 gem is defined in your Gemfile\n# gem 'sqlite3'\ndevelopment:\n adapter: sqlite3\n database: db/development.sqlite3\n pool: 5\n timeout: 5000\n\n# Warning: The database defined as \"test\" will be erased and\n# re-generated from your development database when you run \"rake\".\n# Do not set this db to the same as development or production.\ntest:\n adapter: sqlite3\n database: db/test.sqlite3\n pool: 5\n timeout: 5000\n\nproduction:\n adapter: sqlite3\n database: db/production.sqlite3\n pool: 5\n timeout: 5000\n"},{"id":"/config/environment.rb","name":"environment.rb","isDirectory":false,"content":"# Load the Rails application.\nrequire File.expand_path('../application', __FILE__)\n\n# Initialize the Rails application.\nBatmanRdio::Application.initialize!\n"},{"id":"/config/environments","name":"environments","isDirectory":true,"children":[{"id":"/config/environments/development.rb","name":"development.rb","isDirectory":false,"content":"BatmanRdio::Application.configure do\n # Settings specified here will take precedence over those in config/application.rb.\n\n # In the development environment your application's code is reloaded on\n # every request. This slows down response time but is perfect for development\n # since you don't have to restart the web server when you make code changes.\n config.cache_classes = false\n\n # Do not eager load code on boot.\n config.eager_load = false\n\n # Show full error reports and disable caching.\n config.consider_all_requests_local = true\n config.action_controller.perform_caching = false\n\n # Don't care if the mailer can't send.\n config.action_mailer.raise_delivery_errors = false\n\n # Print deprecation notices to the Rails logger.\n config.active_support.deprecation = :log\n\n # Raise an error on page load if there are pending migrations\n config.active_record.migration_error = :page_load\n\n # Debug mode disables concatenation and preprocessing of assets.\n # This option may cause significant delays in view rendering with a large\n # number of complex assets.\n config.assets.debug = true\n # config.assets.compile = false\n config.assets.digest = true\nend\n"},{"id":"/config/environments/production.rb","name":"production.rb","isDirectory":false,"content":"BatmanRdio::Application.configure do\n # Settings specified here will take precedence over those in config/application.rb.\n\n # Code is not reloaded between requests.\n config.cache_classes = true\n\n # Eager load code on boot. This eager loads most of Rails and\n # your application in memory, allowing both thread web servers\n # and those relying on copy on write to perform better.\n # Rake tasks automatically ignore this option for performance.\n config.eager_load = true\n\n # Full error reports are disabled and caching is turned on.\n config.consider_all_requests_local = false\n config.action_controller.perform_caching = true\n\n # Enable Rack::Cache to put a simple HTTP cache in front of your application\n # Add `rack-cache` to your Gemfile before enabling this.\n # For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid.\n # config.action_dispatch.rack_cache = true\n\n # Disable Rails's static asset server (Apache or nginx will already do this).\n config.serve_static_assets = false\n\n # Compress JavaScripts and CSS.\n config.assets.js_compressor = :uglifier\n # config.assets.css_compressor = :sass\n\n # Do not fallback to assets pipeline if a precompiled asset is missed.\n # config.assets.compile = false\n\n # Generate digests for assets URLs.\n config.assets.digest = true\n\n # Version of your assets, change this if you want to expire all your assets.\n config.assets.version = '1.0'\n\n # Specifies the header that your server uses for sending files.\n # config.action_dispatch.x_sendfile_header = \"X-Sendfile\" # for apache\n # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx\n\n # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.\n # config.force_ssl = true\n\n # Set to :debug to see everything in the log.\n config.log_level = :info\n\n # Prepend all log lines with the following tags.\n # config.log_tags = [ :subdomain, :uuid ]\n\n # Use a different logger for distributed setups.\n # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)\n\n # Use a different cache store in production.\n # config.cache_store = :mem_cache_store\n\n # Enable serving of images, stylesheets, and JavaScripts from an asset server.\n # config.action_controller.asset_host = \"http://assets.example.com\"\n\n # Precompile additional assets.\n # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.\n # config.assets.precompile += %w( search.js )\n\n # Ignore bad email addresses and do not raise email delivery errors.\n # Set this to true and configure the email server for immediate delivery to raise delivery errors.\n # config.action_mailer.raise_delivery_errors = false\n\n # Enable locale fallbacks for I18n (makes lookups for any locale fall back to\n # the I18n.default_locale when a translation can not be found).\n config.i18n.fallbacks = true\n\n # Send deprecation notices to registered listeners.\n config.active_support.deprecation = :notify\n\n # Disable automatic flushing of the log to improve performance.\n # config.autoflush_log = false\n\n # Use default logging formatter so that PID and timestamp are not suppressed.\n config.log_formatter = ::Logger::Formatter.new\nend\n"},{"id":"/config/environments/test.rb","name":"test.rb","isDirectory":false,"content":"BatmanRdio::Application.configure do\n # Settings specified here will take precedence over those in config/application.rb.\n\n # The test environment is used exclusively to run your application's\n # test suite. You never need to work with it otherwise. Remember that\n # your test database is \"scratch space\" for the test suite and is wiped\n # and recreated between test runs. Don't rely on the data there!\n config.cache_classes = true\n\n # Do not eager load code on boot. This avoids loading your whole application\n # just for the purpose of running a single test. If you are using a tool that\n # preloads Rails for running tests, you may have to set it to true.\n config.eager_load = false\n\n # Configure static asset server for tests with Cache-Control for performance.\n config.serve_static_assets = true\n config.static_cache_control = \"public, max-age=3600\"\n\n # Show full error reports and disable caching.\n config.consider_all_requests_local = true\n config.action_controller.perform_caching = false\n\n # Raise exceptions instead of rendering exception templates.\n config.action_dispatch.show_exceptions = false\n\n # Disable request forgery protection in test environment.\n config.action_controller.allow_forgery_protection = false\n\n # Tell Action Mailer not to deliver emails to the real world.\n # The :test delivery method accumulates sent emails in the\n # ActionMailer::Base.deliveries array.\n config.action_mailer.delivery_method = :test\n\n # Print deprecation notices to the stderr.\n config.active_support.deprecation = :stderr\nend\n"}]},{"id":"/config/initializers","name":"initializers","isDirectory":true,"children":[{"id":"/config/initializers/backtrace_silencers.rb","name":"backtrace_silencers.rb","isDirectory":false,"content":"# Be sure to restart your server when you modify this file.\n\n# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.\n# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }\n\n# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.\n# Rails.backtrace_cleaner.remove_silencers!\n"},{"id":"/config/initializers/filter_parameter_logging.rb","name":"filter_parameter_logging.rb","isDirectory":false,"content":"# Be sure to restart your server when you modify this file.\n\n# Configure sensitive parameters which will be filtered from the log file.\nRails.application.config.filter_parameters += [:password]\n"},{"id":"/config/initializers/inflections.rb","name":"inflections.rb","isDirectory":false,"content":"# Be sure to restart your server when you modify this file.\n\n# Add new inflection rules using the following format. Inflections\n# are locale specific, and you may define rules for as many different\n# locales as you wish. All of these examples are active by default:\n# ActiveSupport::Inflector.inflections(:en) do |inflect|\n# inflect.plural /^(ox)$/i, '\\1en'\n# inflect.singular /^(ox)en/i, '\\1'\n# inflect.irregular 'person', 'people'\n# inflect.uncountable %w( fish sheep )\n# end\n\n# These inflection rules are supported but not enabled by default:\n# ActiveSupport::Inflector.inflections(:en) do |inflect|\n# inflect.acronym 'RESTful'\n# end\n"},{"id":"/config/initializers/mime_types.rb","name":"mime_types.rb","isDirectory":false,"content":"# Be sure to restart your server when you modify this file.\n\n# Add new mime types for use in respond_to blocks:\n# Mime::Type.register \"text/richtext\", :rtf\n# Mime::Type.register_alias \"text/html\", :iphone\n"},{"id":"/config/initializers/secret_token.rb","name":"secret_token.rb","isDirectory":false,"content":"# Be sure to restart your server when you modify this file.\n\n# Your secret key is used for verifying the integrity of signed cookies.\n# If you change this key, all old signed cookies will become invalid!\n\n# Make sure the secret is at least 30 characters and all random,\n# no regular words or you'll be exposed to dictionary attacks.\n# You can use `rake secret` to generate a secure secret key.\n\n# Make sure your secret_key_base is kept private\n# if you're sharing your code publicly.\nBatmanRdio::Application.config.secret_key_base = 'a738d2802f197125df125ab1e98892bcc1cfcec4c53163bbb7baa3016d78275b56e2b7fbda65e54557c0e4ab18d1acbe4eaafdd84cfc6cecd0f08a41ad9ab8fc'\n"},{"id":"/config/initializers/session_store.rb","name":"session_store.rb","isDirectory":false,"content":"# Be sure to restart your server when you modify this file.\n\nBatmanRdio::Application.config.session_store :cookie_store, key: '_batman-rdio_session'\n"},{"id":"/config/initializers/wrap_parameters.rb","name":"wrap_parameters.rb","isDirectory":false,"content":"# Be sure to restart your server when you modify this file.\n\n# This file contains settings for ActionController::ParamsWrapper which\n# is enabled by default.\n\n# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.\nActiveSupport.on_load(:action_controller) do\n wrap_parameters format: [:json] if respond_to?(:wrap_parameters)\nend\n\n# To enable root element in JSON for ActiveRecord objects.\n# ActiveSupport.on_load(:active_record) do\n# self.include_root_in_json = true\n# end\n"}]},{"id":"/config/locales","name":"locales","isDirectory":true,"children":[{"id":"/config/locales/en.yml","name":"en.yml","isDirectory":false,"content":"# Files in the config/locales directory are used for internationalization\n# and are automatically loaded by Rails. If you want to use locales other\n# than English, add the necessary files in this directory.\n#\n# To use the locales, use `I18n.t`:\n#\n# I18n.t 'hello'\n#\n# In views, this is aliased to just `t`:\n#\n# <%= t('hello') %>\n#\n# To use a different locale, set it with `I18n.locale`:\n#\n# I18n.locale = :es\n#\n# This would use the information in config/locales/es.yml.\n#\n# To learn more, please read the Rails Internationalization guide\n# available at http://guides.rubyonrails.org/i18n.html.\n\nen:\n hello: \"Hello world\"\n"}]},{"id":"/config/routes.rb","name":"routes.rb","isDirectory":false,"content":"BatmanRdio::Application.routes.draw do\n\n resources :playlists\n # The priority is based upon order of creation: first created -> highest priority.\n # See how all your routes lay out with \"rake routes\".\n\n # You can have the root of your site routed with \"root\"\n # root 'welcome#index'\n\n # Example of regular route:\n # get 'products/:id' => 'catalog#view'\n\n # Example of named route that can be invoked with purchase_url(id: product.id)\n # get 'products/:id/purchase' => 'catalog#purchase', as: :purchase\n\n # Example resource route (maps HTTP verbs to controller actions automatically):\n # resources :products\n\n # Example resource route with options:\n # resources :products do\n # member do\n # get 'short'\n # post 'toggle'\n # end\n #\n # collection do\n # get 'sold'\n # end\n # end\n\n # Example resource route with sub-resources:\n # resources :products do\n # resources :comments, :sales\n # resource :seller\n # end\n\n # Example resource route with more complex sub-resources:\n # resources :products do\n # resources :comments\n # resources :sales do\n # get 'recent', on: :collection\n # end\n # end\n\n # Example resource route with concerns:\n # concern :toggleable do\n # post 'toggle'\n # end\n # resources :posts, concerns: :toggleable\n # resources :photos, concerns: :toggleable\n\n # Example resource route within a namespace:\n # namespace :admin do\n # # Directs /admin/products/* to Admin::ProductsController\n # # (app/controllers/admin/products_controller.rb)\n # resources :products\n # end\nend\n","expectations":[{"stepName":"appgen","regex":"get\\s+[\"']\\(\\*redirect_path\\)[\"'],\\s+to:\\s+[\"']batman#index[\"'],\\s+constraints:\\s+lambda\\s+\\{\\s+|request|\\s+request\\.format\\s+==\\s+[\"']text/html[\"']\\s+\\}","action":"appear","completion":{"index":39,"value":"\n get \"(*redirect_path)\", to: \"batman#index\", constraints: lambda { |request| request.format == \"text/html\" }\n"}}]}]},{"id":"/config.ru","name":"config.ru","isDirectory":false,"content":"# This file is used by Rack-based servers to start the application.\n\nrequire ::File.expand_path('../config/environment', __FILE__)\nrun Rails.application\n"},{"id":"/db","name":"db","isDirectory":true,"children":[{"id":"/db/migrate","name":"migrate","isDirectory":true,"children":[{"id":"/db/migrate/20130808165328_create_playlists.rb","name":"20130808165328_create_playlists.rb","isDirectory":false,"content":"class CreatePlaylists < ActiveRecord::Migration\n def change\n create_table :playlists do |t|\n t.string :name\n t.string :icon\n\n t.timestamps\n end\n end\nend\n"},{"id":"/db/migrate/20130829200521_create_tracks.rb","name":"20130829200521_create_tracks.rb","isDirectory":false,"content":"class CreateTracks < ActiveRecord::Migration\n def change\n create_table :tracks do |t|\n t.string :key\n t.string :artist\n t.string :name\n t.string :icon\n t.references :playlist, index: true\n\n t.timestamps\n end\n end\nend\n"},{"id":"/db/migrate/20130830184948_add_duration_to_tracks.rb","name":"20130830184948_add_duration_to_tracks.rb","isDirectory":false,"content":"class AddDurationToTracks < ActiveRecord::Migration\n def change\n add_column :tracks, :duration, :integer\n end\nend\n"}]},{"id":"/db/schema.rb","name":"schema.rb","isDirectory":false,"content":"# encoding: UTF-8\n# This file is auto-generated from the current state of the database. Instead\n# of editing this file, please use the migrations feature of Active Record to\n# incrementally modify your database, and then regenerate this schema definition.\n#\n# Note that this schema.rb definition is the authoritative source for your\n# database schema. If you need to create the application database on another\n# system, you should be using db:schema:load, not running all the migrations\n# from scratch. The latter is a flawed and unsustainable approach (the more migrations\n# you'll amass, the slower it'll run and the greater likelihood for issues).\n#\n# It's strongly recommended that you check this file into your version control system.\n\nActiveRecord::Schema.define(version: 20130830184948) do\n\n create_table \"playlists\", force: true do |t|\n t.string \"name\"\n t.string \"icon\"\n t.datetime \"created_at\"\n t.datetime \"updated_at\"\n end\n\n create_table \"tracks\", force: true do |t|\n t.string \"key\"\n t.string \"artist\"\n t.string \"name\"\n t.string \"icon\"\n t.integer \"playlist_id\"\n t.datetime \"created_at\"\n t.datetime \"updated_at\"\n t.integer \"duration\"\n end\n\n add_index \"tracks\", [\"playlist_id\"], name: \"index_tracks_on_playlist_id\"\n\nend\n"},{"id":"/db/seeds.rb","name":"seeds.rb","isDirectory":false,"content":"# This file should contain all the record creation needed to seed the database with its default values.\n# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).\n#\n# Examples:\n#\n# cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }])\n# Mayor.create(name: 'Emanuel', city: cities.first)\n"}]},{"id":"/Gemfile","name":"Gemfile","isDirectory":false,"content":"source 'https://rubygems.org'\nruby '2.0.0'\n\n# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'\ngem 'rails', '4.0.0'\n\n# Use sqlite3 as the database for Active Record\ngroup :development do\n gem 'sqlite3'\nend\n\ngroup :production do\n gem 'sprockets-redirect'\n gem 'pg'\n gem 'rails_12factor'\nend\n\n# Use SCSS for stylesheets\ngem 'sass-rails', '~> 4.0.0'\n\n# Use Uglifier as compressor for JavaScript assets\ngem 'uglifier', '>= 1.3.0'\n\n# Use CoffeeScript for .js.coffee assets and views\ngem 'coffee-rails', '~> 4.0.0'\n\n# See https://github.com/sstephenson/execjs#readme for more supported runtimes\n# gem 'therubyracer', platforms: :ruby\n\n# Use jquery as the JavaScript library\ngem 'jquery-rails'\ngem 'jquery-ui-rails'\n\n\n\n# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder\ngem 'jbuilder', '~> 1.2'\n\n\ngroup :doc do\n # bundle exec rake doc:rails generates the API under doc/api.\n gem 'sdoc', require: false\nend\n\n# Use ActiveModel has_secure_password\n# gem 'bcrypt-ruby', '~> 3.0.0'\n\n# Use unicorn as the app server\n# gem 'unicorn'\n\n# Use Capistrano for deployment\n# gem 'capistrano', group: :development\n\n# Use debugger\n# gem 'debugger', group: [:development, :test]\n","expectations":[{"stepName":"gemfile","regex":"gem\\s+[\"']batman-rails[\"']","action":"expect","completion":{"index":727,"value":"\ngem 'batman-rails'\n"}}]},{"id":"/lib","name":"lib","isDirectory":true,"children":[{"id":"/lib/assets","name":"assets","isDirectory":true,"children":[]},{"id":"/lib/tasks","name":"tasks","isDirectory":true,"children":[]}]},{"id":"/Rakefile","name":"Rakefile","isDirectory":false,"content":"# Add your own tasks in files placed in lib/tasks ending in .rake,\n# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.\n\nrequire File.expand_path('../config/application', __FILE__)\n\nBatmanRdio::Application.load_tasks\n"},{"id":"/README.rdoc","name":"README.rdoc","isDirectory":false,"content":"== README\n\nThis README would normally document whatever steps are necessary to get the\napplication up and running.\n\nThings you may want to cover:\n\n* Ruby version\n\n* System dependencies\n\n* Configuration\n\n* Database creation\n\n* Database initialization\n\n* How to run the test suite\n\n* Services (job queues, cache servers, search engines, etc.)\n\n* Deployment instructions\n\n* ...\n\n\nPlease feel free to use a different markup language if you do not plan to run\n<tt>rake doc:app</tt>.\n"},{"id":"/test","name":"test","isDirectory":true,"children":[{"id":"/test/controllers","name":"controllers","isDirectory":true,"children":[{"id":"/test/controllers/playlists_controller_test.rb","name":"playlists_controller_test.rb","isDirectory":false,"content":"require 'test_helper'\n\nclass PlaylistsControllerTest < ActionController::TestCase\n # test \"the truth\" do\n # assert true\n # end\nend\n"}]},{"id":"/test/fixtures","name":"fixtures","isDirectory":true,"children":[{"id":"/test/fixtures/playlists.yml","name":"playlists.yml","isDirectory":false,"content":"# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html\n\none:\n name: MyString\n\ntwo:\n name: MyString\n"},{"id":"/test/fixtures/tracks.yml","name":"tracks.yml","isDirectory":false,"content":"# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html\n\none:\n key: MyString\n artist: MyString\n name: MyString\n icon: MyString\n playlist_id: \n\ntwo:\n key: MyString\n artist: MyString\n name: MyString\n icon: MyString\n playlist_id: \n"}]},{"id":"/test/helpers","name":"helpers","isDirectory":true,"children":[{"id":"/test/helpers/playlists_helper_test.rb","name":"playlists_helper_test.rb","isDirectory":false,"content":"require 'test_helper'\n\nclass PlaylistsHelperTest < ActionView::TestCase\nend\n"}]},{"id":"/test/integration","name":"integration","isDirectory":true,"children":[]},{"id":"/test/mailers","name":"mailers","isDirectory":true,"children":[]},{"id":"/test/models","name":"models","isDirectory":true,"children":[{"id":"/test/models/playlist_test.rb","name":"playlist_test.rb","isDirectory":false,"content":"require 'test_helper'\n\nclass PlaylistTest < ActiveSupport::TestCase\n # test \"the truth\" do\n # assert true\n # end\nend\n"},{"id":"/test/models/track_test.rb","name":"track_test.rb","isDirectory":false,"content":"require 'test_helper'\n\nclass TrackTest < ActiveSupport::TestCase\n # test \"the truth\" do\n # assert true\n # end\nend\n"}]},{"id":"/test/test_helper.rb","name":"test_helper.rb","isDirectory":false,"content":"ENV[\"RAILS_ENV\"] ||= \"test\"\nrequire File.expand_path('../../config/environment', __FILE__)\nrequire 'rails/test_help'\n\nclass ActiveSupport::TestCase\n ActiveRecord::Migration.check_pending!\n\n # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.\n #\n # Note: You'll currently still have to declare fixtures explicitly in integration tests\n # -- they do not yet inherit this setting\n fixtures :all\n\n # Add more helper methods to be used by all tests here...\nend\n"}]},{"id":"/vendor","name":"vendor","isDirectory":true,"children":[{"id":"/vendor/assets","name":"assets","isDirectory":true,"children":[{"id":"/vendor/assets/javascripts","name":"javascripts","isDirectory":true,"children":[]},{"id":"/vendor/assets/stylesheets","name":"stylesheets","isDirectory":true,"children":[]}]}]}]