Merge develop into this branch.

This commit is contained in:
Steven Miers 2014-10-06 16:17:36 -05:00
parent 66feb39de8
commit dffdb78f71
29 changed files with 89 additions and 44 deletions

View File

@ -215,5 +215,7 @@ fix_find_session_sorting_2216b.sql
fix_find_session_sorting_2216c.sql fix_find_session_sorting_2216c.sql
entabulate_current_network_scores.sql entabulate_current_network_scores.sql
discard_scores_changed.sql discard_scores_changed.sql
emails_from_update.sql
add_active_feed.sql
video_sources.sql video_sources.sql
recorded_videos.sql recorded_videos.sql

View File

@ -0,0 +1 @@
alter table feeds add column active BOOLEAN DEFAULT FALSE;

View File

@ -0,0 +1,2 @@
ALTER TABLE email_batches ALTER from_email SET DEFAULT 'JamKazam <support@jamkazam.com>';

View File

@ -31,7 +31,7 @@ gem 'sendgrid', '1.2.0'
gem 'aws-sdk' #, '1.29.1' gem 'aws-sdk' #, '1.29.1'
gem 'carrierwave', '0.9.0' gem 'carrierwave', '0.9.0'
gem 'aasm', '3.0.16' gem 'aasm', '3.0.16'
gem 'devise', '>= 1.1.2' gem 'devise', '3.3.0' # 3.4.0 causes: uninitialized constant ActionController::Metal (NameError)
gem 'postgres-copy' gem 'postgres-copy'
gem 'geokit' gem 'geokit'
gem 'geokit-rails' gem 'geokit-rails'

View File

@ -11,7 +11,7 @@ module JamRuby
layout "user_mailer" layout "user_mailer"
DEFAULT_SENDER = "noreply@jamkazam.com" DEFAULT_SENDER = "JamKazam <noreply@jamkazam.com>"
default :from => DEFAULT_SENDER default :from => DEFAULT_SENDER

View File

@ -9,7 +9,7 @@ module JamRuby
class InvitedUserMailer < ActionMailer::Base class InvitedUserMailer < ActionMailer::Base
include SendGrid include SendGrid
DEFAULT_SENDER = "noreply@jamkazam.com" DEFAULT_SENDER = "JamKazam <noreply@jamkazam.com>"
default :from => DEFAULT_SENDER default :from => DEFAULT_SENDER

View File

@ -11,7 +11,7 @@
layout "user_mailer" layout "user_mailer"
DEFAULT_SENDER = "noreply@jamkazam.com" DEFAULT_SENDER = "JamKazam <noreply@jamkazam.com>"
default :from => DEFAULT_SENDER default :from => DEFAULT_SENDER

View File

@ -10,7 +10,7 @@
Its still very early in our companys development, so we dont have zillions of users online on our service yet. If you click Find Session, you will often not find a good session to join, both due to the number of musicians online at any given time, and also because you wont see private sessions where groups of musicians dont want to be interrupted in their sessions. Its still very early in our companys development, so we dont have zillions of users online on our service yet. If you click Find Session, you will often not find a good session to join, both due to the number of musicians online at any given time, and also because you wont see private sessions where groups of musicians dont want to be interrupted in their sessions.
</p> </p>
<p>If you are having trouble getting into sessions, wed suggest you click the Musicians tile on the home screen of the app or the website: <a href="http://www.jamkazam.com/client#/musicians">Go To Musicians Page</a> <p>If you are having trouble getting into sessions, wed suggest you click the Musicians tile on the home screen of the app or the website: <a style="color: #588C98;" href="http://www.jamkazam.com/client#/musicians">Go To Musicians Page</a>
</p> </p>
<p>This will display the JamKazam musicians sorted by latency to you - in other words, you can see which musicians have good network connections to you. Any musicians with green and yellow latency scores have good enough connections to support a play session with you. We recommend that read the profiles of these musicians to find others with shared musical interests and good network connections to you, and then use the Message button to say hi and see if they are interested in playing with you. If they are, use the Connect button to “friend” them on JamKazam, and use the Message button to set up a time to meet online for a session. <p>This will display the JamKazam musicians sorted by latency to you - in other words, you can see which musicians have good network connections to you. Any musicians with green and yellow latency scores have good enough connections to support a play session with you. We recommend that read the profiles of these musicians to find others with shared musical interests and good network connections to you, and then use the Message button to say hi and see if they are interested in playing with you. If they are, use the Connect button to “friend” them on JamKazam, and use the Message button to set up a time to meet online for a session.

View File

@ -7,7 +7,7 @@
</p> </p>
<p>Find Other Musicians on JamKazam<br /> <p>Find Other Musicians on JamKazam<br />
To find and connect with other musicians who are already on JamKazam, wed suggest you click the Musicians tile on the home screen of the app or the website: <a href="http://www.jamkazam.com/client#/musicians">Go To Musicians Page</a> To find and connect with other musicians who are already on JamKazam, wed suggest you click the Musicians tile on the home screen of the app or the website: <a style="color: #588C98;" href="http://www.jamkazam.com/client#/musicians">Go To Musicians Page</a>
</p> </p>
<p>This will display the JamKazam musicians sorted by latency to you - in other words, you can see which musicians have good network connections to you. Any musicians with green and yellow latency scores have good enough connections to support a play session with you. We recommend that you read the profiles of these musicians to find others with shared musical interests and good network connections to you, and then use the Message button to say hi and see if they are interested in playing with you. If they are, use the Connect button to “friend” them on JamKazam, and use the Message button to set up a time to meet online for a session. <p>This will display the JamKazam musicians sorted by latency to you - in other words, you can see which musicians have good network connections to you. Any musicians with green and yellow latency scores have good enough connections to support a play session with you. We recommend that you read the profiles of these musicians to find others with shared musical interests and good network connections to you, and then use the Message button to say hi and see if they are interested in playing with you. If they are, use the Connect button to “friend” them on JamKazam, and use the Message button to set up a time to meet online for a session.

View File

@ -2,4 +2,4 @@
<p><%= @body %></p> <p><%= @body %></p>
<p>To accept this friend request, <a href="<%= @url %>">click here</a>.</p> <p>To accept this friend request, <a style="color: #588C98;" href="<%= @url %>">click here</a>.</p>

View File

@ -24,7 +24,7 @@ Hi <%= @user.first_name %>,
<% end %> <% end %>
</table> </table>
</p> </p>
<p>There are currently <%= @new_musicians.size%> musicians on JamKazam with low enough latency Internet connections to you to support a good online session. To see ALL the JamKazam musicians with whom you may want to connect and play, view our Musicians page at: <a href="http://www.jamkazam.com/client#/musicians">http://www.jamkazam.com/client#/musicians</a>. <p>There are currently <%= @new_musicians.size%> musicians on JamKazam with low enough latency Internet connections to you to support a good online session. To see ALL the JamKazam musicians with whom you may want to connect and play, view our Musicians page at: <a style="color: #588C98;" href="http://www.jamkazam.com/client#/musicians">http://www.jamkazam.com/client#/musicians</a>.
</p> </p>
<p>Best Regards,</p> <p>Best Regards,</p>

View File

@ -1 +1 @@
Visit this link so that you can change your JamKazam password: <a href="<%= @password_reset_url %>">Reset Password</a>. Visit this link so that you can change your JamKazam password: <%= @password_reset_url %>..

View File

@ -68,7 +68,7 @@
<td><%= sess.genre.description %></td> <td><%= sess.genre.description %></td>
<td> <td>
<%= sess.name %><br/> <%= sess.name %><br/>
<a href="<%= "http://www.jamkazam.com/sessions/#{sess.id}/details" %>">Details</a> <a style="color: #588C98;" href="<%= "http://www.jamkazam.com/sessions/#{sess.id}/details" %>">Details</a>
</td> </td>
<td><%= sess.description %></td> <td><%= sess.description %></td>
<td style="text-align:center"> <td style="text-align:center">
@ -86,7 +86,7 @@
</tbody> </tbody>
</table> </table>
<p>To see ALL the scheduled sessions that you might be interested in joining, view our <a href="http://www.jamkazam.com/client#/findSession">Find Session page</a>.</p> <p>To see ALL the scheduled sessions that you might be interested in joining, view our <a style="color: #588C98;" href="http://www.jamkazam.com/client#/findSession">Find Session page</a>.</p>
<p>Best Regards,</p> <p>Best Regards,</p>

View File

@ -4,5 +4,5 @@
<% content_for :note do %> <% content_for :note do %>
<%= @note %> <%= @note %>
<p>To reply to this message, <a href="<%= @url %>">click here</a>.</p> <p>To reply to this message, <a style="color: #588C98;" href="<%= @url %>">click here</a>.</p>
<% end %> <% end %>

View File

@ -12,7 +12,7 @@ module JamRuby
VAR_FIRST_NAME = '@FIRSTNAME' VAR_FIRST_NAME = '@FIRSTNAME'
VAR_LAST_NAME = '@LASTNAME' VAR_LAST_NAME = '@LASTNAME'
DEFAULT_SENDER = "noreply@jamkazam.com" DEFAULT_SENDER = "JamKazam <noreply@jamkazam.com>"
BATCH_SIZE = 500 BATCH_SIZE = 500
BODY_TEMPLATE =<<FOO BODY_TEMPLATE =<<FOO

View File

@ -47,13 +47,13 @@ module JamRuby
# handle sort # handle sort
if sort == 'date' if sort == 'date'
query = query.where("feeds.id < #{start}") query = query.where("feeds.id < #{start}")
query = query.order('feeds.id DESC') query = query.order('feeds.active DESC, feeds.id DESC')
elsif sort == 'plays' elsif sort == 'plays'
query = query.offset(start) query = query.offset(start)
query = query.order("COALESCE(recordings.play_count, music_sessions.play_count) DESC ") query = query.order("feeds.active DESC, COALESCE(recordings.play_count, music_sessions.play_count) DESC")
elsif sort == 'likes' elsif sort == 'likes'
query = query.offset(start) query = query.offset(start)
query = query.order("COALESCE(recordings.like_count, music_sessions.like_count) DESC ") query = query.order("feeds.active DESC, COALESCE(recordings.like_count, music_sessions.like_count) DESC")
else else
raise "sort not implemented: #{sort}" raise "sort not implemented: #{sort}"
end end

View File

@ -182,7 +182,7 @@ module JamRuby
end end
if rsvp_slot.chosen && r[:accept] if rsvp_slot.chosen && r[:accept]
raise StateError, "The #{rsvp_slot.instrument_id} slot has already been approved for another user." raise StateError, "All RSVP slots for the #{rsvp_slot.instrument_id} have been already approved."
end end
if r[:accept] if r[:accept]

View File

@ -54,16 +54,16 @@ describe Feed do
end end
describe "sorting" do describe "sorting" do
it "sorts by index (date) DESC" do it "sorts by active flag / index (date) DESC" do
claimed_recording = FactoryGirl.create(:claimed_recording) claimed_recording = FactoryGirl.create(:claimed_recording)
feeds, start = Feed.index(user1) feeds, start = Feed.index(user1)
feeds.length.should == 2 feeds.length.should == 2
feeds[0].recording.should == claimed_recording.recording feeds[1].recording.should == claimed_recording.recording
feeds[1].music_session.should == claimed_recording.recording.music_session.music_session feeds[0].music_session.should == claimed_recording.recording.music_session.music_session
end end
it "sort by plays DESC" do it "sort by active flag / plays DESC" do
claimed_recording1 = FactoryGirl.create(:claimed_recording) claimed_recording1 = FactoryGirl.create(:claimed_recording)
claimed_recording2 = FactoryGirl.create(:claimed_recording) claimed_recording2 = FactoryGirl.create(:claimed_recording)
@ -77,8 +77,8 @@ describe Feed do
feeds, start = Feed.index(user1, :sort => 'plays') feeds, start = Feed.index(user1, :sort => 'plays')
feeds.length.should == 4 feeds.length.should == 4
feeds[0].recording.should == claimed_recording2.recording feeds[2].recording.should == claimed_recording2.recording
feeds[1].recording.should == claimed_recording1.recording feeds[3].recording.should == claimed_recording1.recording
FactoryGirl.create(:playable_play, playable: claimed_recording1.recording.music_session.music_session, user: user1) FactoryGirl.create(:playable_play, playable: claimed_recording1.recording.music_session.music_session, user: user1)
FactoryGirl.create(:playable_play, playable: claimed_recording1.recording.music_session.music_session, user: user2) FactoryGirl.create(:playable_play, playable: claimed_recording1.recording.music_session.music_session, user: user2)
@ -88,11 +88,11 @@ describe Feed do
feeds, start = Feed.index(user1, :sort => 'plays') feeds, start = Feed.index(user1, :sort => 'plays')
feeds.length.should == 4 feeds.length.should == 4
feeds[0].music_session.should == claimed_recording1.recording.music_session.music_session feeds[0].music_session.should == claimed_recording1.recording.music_session.music_session
feeds[1].recording.should == claimed_recording2.recording feeds[2].recording.should == claimed_recording2.recording
feeds[2].recording.should == claimed_recording1.recording feeds[3].recording.should == claimed_recording1.recording
end end
it "sort by likes DESC" do it "sort by active flag / likes DESC" do
claimed_recording1 = FactoryGirl.create(:claimed_recording) claimed_recording1 = FactoryGirl.create(:claimed_recording)
claimed_recording2 = FactoryGirl.create(:claimed_recording) claimed_recording2 = FactoryGirl.create(:claimed_recording)
@ -106,6 +106,7 @@ describe Feed do
feeds, start = Feed.index(user1, :sort => 'likes') feeds, start = Feed.index(user1, :sort => 'likes')
feeds.length.should == 4 feeds.length.should == 4
feeds = feeds.where("feeds.music_session_id is null")
feeds[0].recording.should == claimed_recording2.recording feeds[0].recording.should == claimed_recording2.recording
feeds[1].recording.should == claimed_recording1.recording feeds[1].recording.should == claimed_recording1.recording
@ -116,8 +117,8 @@ describe Feed do
feeds, start = Feed.index(user1, :sort => 'likes') feeds, start = Feed.index(user1, :sort => 'likes')
feeds.length.should == 4 feeds.length.should == 4
feeds[0].music_session.should == claimed_recording1.recording.music_session.music_session feeds[0].music_session.should == claimed_recording1.recording.music_session.music_session
feeds[1].recording.should == claimed_recording2.recording feeds[2].recording.should == claimed_recording2.recording
feeds[2].recording.should == claimed_recording1.recording feeds[3].recording.should == claimed_recording1.recording
end end
end end
@ -195,6 +196,8 @@ describe Feed do
it "supports date pagination" do it "supports date pagination" do
claimed_recording = FactoryGirl.create(:claimed_recording) claimed_recording = FactoryGirl.create(:claimed_recording)
MusicSession.removed_music_session(claimed_recording.recording.music_session.music_session.id)
options = {limit: 1} options = {limit: 1}
feeds, start = Feed.index(user1, options) feeds, start = Feed.index(user1, options)
feeds.length.should == 1 feeds.length.should == 1

View File

@ -18,7 +18,7 @@ else
gem 'jam_websockets', "0.1.#{ENV["BUILD_NUMBER"]}" gem 'jam_websockets', "0.1.#{ENV["BUILD_NUMBER"]}"
ENV['NOKOGIRI_USE_SYSTEM_LIBRARIES'] ||= "true" ENV['NOKOGIRI_USE_SYSTEM_LIBRARIES'] ||= "true"
end end
gem 'oj' gem 'oj', '2.10.2'
gem 'builder' gem 'builder'
gem 'rails', '~>3.2.11' gem 'rails', '~>3.2.11'
gem 'railties', '~>3.2.11' gem 'railties', '~>3.2.11'
@ -55,7 +55,7 @@ gem 'carrierwave_direct'
gem 'fog' gem 'fog'
gem 'haml-rails' gem 'haml-rails'
gem 'unf' #optional fog dependency gem 'unf' #optional fog dependency
gem 'devise', '>= 1.1.2' gem 'devise', '3.3.0' #3.4.0 causes uninitialized constant ActionController::Metal (NameError)
gem 'postgres-copy' gem 'postgres-copy'
#group :libv8 do #group :libv8 do
# gem 'libv8', "~> 3.11.8" # gem 'libv8', "~> 3.11.8"

View File

@ -101,7 +101,18 @@
rest.updateRsvpRequest(rsvpId, params) rest.updateRsvpRequest(rsvpId, params)
.done(refreshSessionDetail) .done(refreshSessionDetail)
.fail(app.ajaxError); .fail(function(jqXHR, textStatus, errorMessage) {
if (jqXHR.status === 400) {
app.notify(
{
title: "Unable to Approve RSVP",
text: jqXHR.responseJSON.message
});
}
else {
app.ajaxError(jqXHR, textStatus, errorMessage);
}
});
} }
function declineRsvpRequest(e) { function declineRsvpRequest(e) {
@ -130,6 +141,11 @@
rsvpCancelDlg.initialize(); rsvpCancelDlg.initialize();
context.JK.app.layout.showDialog('rsvp-cancel-dialog'); context.JK.app.layout.showDialog('rsvp-cancel-dialog');
}); });
context.JK.bindHoverEvents();
// context.JK.bindInstrumentHover($('#pendingRSVPs'));
// context.JK.bindInstrumentHover($('#session-rsvps'));
// context.JK.bindInstrumentHover($('#still-needed'));
} }
function loadSessionData() { function loadSessionData() {
@ -241,7 +257,7 @@
$.each(pending_rsvp_request.instrument_list, function (index, instrument) { $.each(pending_rsvp_request.instrument_list, function (index, instrument) {
var instrumentId = instrument == null ? null : instrument.id; var instrumentId = instrument == null ? null : instrument.id;
var inst = context.JK.getInstrumentIcon24(instrumentId); var inst = context.JK.getInstrumentIcon24(instrumentId);
instrumentLogoHtml += '<img data-instrument-id="' + instrumentId + '" src="' + inst + '" width="24" height="24" />&nbsp;'; instrumentLogoHtml += '<img title="' + instrumentId + '" hoveraction="instrument" data-instrument-id="' + instrumentId + '" src="' + inst + '" width="24" height="24" />&nbsp;';
}) })
} }
@ -279,7 +295,7 @@
$.each(approved_rsvp.instrument_list, function(index, instrument) { $.each(approved_rsvp.instrument_list, function(index, instrument) {
var instrumentId = instrument == null ? null : instrument.id; var instrumentId = instrument == null ? null : instrument.id;
var inst = context.JK.getInstrumentIcon24(instrumentId); var inst = context.JK.getInstrumentIcon24(instrumentId);
instrumentLogoHtml += '<img src="' + inst + '" width="24" height="24" />&nbsp;'; instrumentLogoHtml += '<img title="' + instrumentId + '" hoveraction="instrument" data-instrument-id="' + instrumentId + '" src="' + inst + '" width="24" height="24" />&nbsp;';
}); });
} }
@ -344,7 +360,7 @@
resultHtml += context._.template( resultHtml += context._.template(
$("#template-account-invited").html(), $("#template-account-invited").html(),
{avatar_url: avatar_url, user_id: invitation.reciever_id}, {avatar_url: avatar_url, user_id: invitation.receiver_id},
{variable: 'data'} {variable: 'data'}
); );
}); });

View File

@ -85,6 +85,9 @@
context.JK.bindHoverEvents(); context.JK.bindHoverEvents();
$ssSpinner.hide(); $ssSpinner.hide();
}); });
// context.JK.bindInstrumentHover($(CATEGORY.ACTIVE.id));
// context.JK.bindInstrumentHover($(CATEGORY.SCHEDULED.id));
} }
/***************** ACTIVE SESSIONS *****************/ /***************** ACTIVE SESSIONS *****************/

View File

@ -123,11 +123,11 @@
*/ */
function ajaxError(jqXHR, textStatus, errorMessage) { function ajaxError(jqXHR, textStatus, errorMessage) {
if (jqXHR.status == 404) { if (jqXHR.status === 404) {
logger.error("Unexpected ajax error: " + textStatus + ", msg:" + errorMessage); logger.error("Unexpected ajax error: " + textStatus + ", msg:" + errorMessage);
app.notify({title: "Oops!", text: "What you were looking for is gone now."}); app.notify({title: "Oops!", text: "What you were looking for is gone now."});
} }
else if (jqXHR.status = 422) { else if (jqXHR.status === 422) {
logger.error("Unexpected ajax error: " + textStatus + ", msg: " + errorMessage + ", response: " + jqXHR.responseText); logger.error("Unexpected ajax error: " + textStatus + ", msg: " + errorMessage + ", response: " + jqXHR.responseText);
// present a nicer message // present a nicer message
try { try {

View File

@ -369,7 +369,7 @@
var track = participant.tracks[j]; var track = participant.tracks[j];
logger.debug("Find:Finding instruments. Participant tracks:", participant.tracks); logger.debug("Find:Finding instruments. Participant tracks:", participant.tracks);
var inst = context.JK.getInstrumentIcon24(track.instrument_id); var inst = context.JK.getInstrumentIcon24(track.instrument_id);
instrumentLogoHtml += '<img src="' + inst + '" width="24" height="24" />&nbsp;'; instrumentLogoHtml += '<img title="' + track.instrument_id + '" hoveraction="instrument" data-instrument-id="' + track.instrument_id + '" src="' + inst + '" width="24" height="24" />&nbsp;';
} }
var id = participant.user.id; var id = participant.user.id;
@ -400,7 +400,7 @@
for (j=0; j < user.instrument_list.length; j++) { for (j=0; j < user.instrument_list.length; j++) {
var instrument = user.instrument_list[j]; var instrument = user.instrument_list[j];
var inst = context.JK.getInstrumentIcon24(instrument.id); var inst = context.JK.getInstrumentIcon24(instrument.id);
instrumentLogoHtml += '<img src="' + inst + '" width="24" height="24" />&nbsp;'; instrumentLogoHtml += '<img title="' + instrument.id + '" hoveraction="instrument" data-instrument-id="' + instrument.id + '" src="' + inst + '" width="24" height="24" />&nbsp;';
} }
} }

View File

@ -232,6 +232,24 @@
}); });
} }
context.JK.bindInstrumentHover = function($parent, options) {
context._.each($parent.find("[hoveraction='instrument']"), function(element) {
var $element = $(element);
var instrumentId = $element.attr('data-instrument-id');
if(instrumentId) {
if (instrumentId === "null") {
instrumentId = "not specified";
}
context.JK.hoverBubble($element, instrumentId, options);
}
else {
logger.warn("no instrument-id on hoveraction=instrument element")
}
});
}
context.JK.bindHoverEvents = function ($parent) { context.JK.bindHoverEvents = function ($parent) {
var timeout = 300; var timeout = 300;
var fadeoutValue = 100; var fadeoutValue = 100;

View File

@ -325,7 +325,6 @@
} }
td.rsvp-buttons { td.rsvp-buttons {
float:right; float:right;
width:242px;
text-align:right; text-align:right;
} }

View File

@ -6,7 +6,6 @@
border: 1px solid $ColorScreenPrimary; border: 1px solid $ColorScreenPrimary;
color: #fff; color: #fff;
min-width: 400px; min-width: 400px;
min-height: 375px;
z-index: 100; z-index: 100;
h2 { h2 {

View File

@ -85,7 +85,7 @@
%script{type: 'text/template', id: 'template-account-pending-rsvp'} %script{type: 'text/template', id: 'template-account-pending-rsvp'}
%tr %tr
%td.avatar-cell %td.avatar-cell
%a{href: "#", 'user-id' => "{{data.user_id}}", 'hoveraction' => "musician", class: 'avatar-tiny'} %a{href: "/client#/profile/{{data.user_id}}", 'user-id' => "{{data.user_id}}", 'hoveraction' => "musician", class: 'avatar-tiny'}
%img{src: "{{data.avatar_url}}"} %img{src: "{{data.avatar_url}}"}
%td %td
{{data.user_name}} {{data.user_name}}
@ -103,7 +103,7 @@
%script{type: 'text/template', id: 'template-account-session-rsvp'} %script{type: 'text/template', id: 'template-account-session-rsvp'}
%tr %tr
%td.avatar-cell %td.avatar-cell
%a{href: "#", 'user-id' => "{{data.user_id}}", 'hoveraction' => "musician", class: 'avatar-tiny'} %a{href: "/client#/profile/{{data.id}}", 'user-id' => "{{data.id}}", 'hoveraction' => "musician", class: 'avatar-tiny'}
%img{src: "{{data.avatar_url}}"} %img{src: "{{data.avatar_url}}"}
%td %td
{{data.user_name}} {{data.user_name}}

View File

@ -94,6 +94,8 @@ describe ApiFeedsController do
claimed_recording.recording.created_at = 3.days.ago claimed_recording.recording.created_at = 3.days.ago
claimed_recording.recording.save! claimed_recording.recording.save!
MusicSession.removed_music_session(claimed_recording.recording.music_session.music_session.id)
get :index, { limit: 1 } get :index, { limit: 1 }
json = JSON.parse(response.body, :symbolize_names => true) json = JSON.parse(response.body, :symbolize_names => true)
json[:entries].length.should == 1 json[:entries].length.should == 1

View File

@ -34,7 +34,7 @@ gem 'rb-readline'
gem 'aasm', '3.0.16' gem 'aasm', '3.0.16'
gem 'carrierwave' gem 'carrierwave'
gem 'fog' gem 'fog'
gem 'devise' gem 'devise', '3.3.0' # 3.4.0 causes uninitialized constant ActionController::Metal (NameError)
gem 'postgres-copy' gem 'postgres-copy'
gem 'aws-sdk' #, '1.29.1' gem 'aws-sdk' #, '1.29.1'
gem 'bugsnag' gem 'bugsnag'