merge develop
This commit is contained in:
commit
c6fea78054
45 changed files with 727 additions and 839 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -19,6 +19,8 @@ vendor/
|
|||
log/*.log
|
||||
tmp
|
||||
|
||||
coverage
|
||||
|
||||
.DS_Store
|
||||
*/.DS_Store
|
||||
.DS_Store?
|
||||
|
|
3
.simplecov
Normal file
3
.simplecov
Normal file
|
@ -0,0 +1,3 @@
|
|||
if ENV['COVERAGE'] == 'on'
|
||||
SimpleCov.start 'rails'
|
||||
end
|
2
Gemfile
2
Gemfile
|
@ -42,6 +42,8 @@ group :test do
|
|||
gem 'rspec-rails'
|
||||
gem 'factory_girl_rails'
|
||||
gem 'shoulda-matchers'
|
||||
gem 'simplecov', require: false
|
||||
gem 'json-schema'
|
||||
end
|
||||
|
||||
group :production do #this is used on heroku
|
||||
|
|
14
Gemfile.lock
14
Gemfile.lock
|
@ -36,6 +36,7 @@ GEM
|
|||
minitest (~> 5.1)
|
||||
thread_safe (~> 0.3, >= 0.3.4)
|
||||
tzinfo (~> 1.1)
|
||||
addressable (2.3.8)
|
||||
arel (6.0.3)
|
||||
aws-sdk (1.66.0)
|
||||
aws-sdk-v1 (= 1.66.0)
|
||||
|
@ -78,6 +79,7 @@ GEM
|
|||
thread_safe (~> 0.1)
|
||||
warden (~> 1.2.3)
|
||||
diff-lcs (1.2.5)
|
||||
docile (1.1.5)
|
||||
dotenv (2.0.2)
|
||||
erubis (2.7.0)
|
||||
execjs (2.6.0)
|
||||
|
@ -104,6 +106,8 @@ GEM
|
|||
jquery-ui-rails (5.0.5)
|
||||
railties (>= 3.2.16)
|
||||
json (1.8.3)
|
||||
json-schema (2.6.0)
|
||||
addressable (~> 2.3.8)
|
||||
kaminari (0.16.3)
|
||||
actionpack (>= 3.0.0)
|
||||
activesupport (>= 3.0.0)
|
||||
|
@ -203,6 +207,11 @@ GEM
|
|||
tilt (>= 1.1, < 3)
|
||||
shoulda-matchers (3.0.1)
|
||||
activesupport (>= 4.0.0)
|
||||
simplecov (0.11.1)
|
||||
docile (~> 1.1.0)
|
||||
json (~> 1.8)
|
||||
simplecov-html (~> 0.10.0)
|
||||
simplecov-html (0.10.0)
|
||||
slop (3.6.0)
|
||||
sprockets (3.4.0)
|
||||
rack (> 1, < 3)
|
||||
|
@ -245,6 +254,7 @@ DEPENDENCIES
|
|||
jquery-rails
|
||||
jquery-ui-rails
|
||||
json
|
||||
json-schema
|
||||
kaminari
|
||||
paperclip
|
||||
pg
|
||||
|
@ -258,9 +268,7 @@ DEPENDENCIES
|
|||
rspec-rails
|
||||
sass-rails
|
||||
shoulda-matchers
|
||||
simplecov
|
||||
tunemygc
|
||||
uglifier
|
||||
uservoice-ruby
|
||||
|
||||
BUNDLED WITH
|
||||
1.11.2
|
||||
|
|
|
@ -2,7 +2,7 @@ Metamaps
|
|||
=======
|
||||
|
||||
[![Join the chat at https://gitter.im/metamaps/metamaps_gen002](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/metamaps/metamaps_gen002?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
![Build Status](https://jenkins.devinhoward.ca/job/metamaps_gen002.develop/badge/icon)
|
||||
[![Build Status](https://jenkins.devinhoward.ca/job/metamaps_gen002.develop/badge/icon)](https://jenkins.devinhoward.ca/job/metamaps_gen002.develop/)
|
||||
|
||||
Welcome to the Metamaps GitHub repo.
|
||||
|
||||
|
|
|
@ -869,9 +869,9 @@ Metamaps.JIT = {
|
|||
}
|
||||
// if it's a right click or holding down alt, start synapse creation ->third option is for firefox
|
||||
else if ((e.button == 2 || (e.button == 0 && e.altKey) || e.buttons == 2) && authorized) {
|
||||
if (tempInit == false) {
|
||||
tempNode = node;
|
||||
tempInit = true;
|
||||
if (Metamaps.tempInit == false) {
|
||||
Metamaps.tempNode = node;
|
||||
Metamaps.tempInit = true;
|
||||
|
||||
Metamaps.Create.newTopic.hide();
|
||||
Metamaps.Create.newSynapse.hide();
|
||||
|
@ -887,8 +887,8 @@ Metamaps.JIT = {
|
|||
}
|
||||
} else {
|
||||
Metamaps.Mouse.synapseStartCoordinates = [{
|
||||
x: tempNode.pos.getc().x,
|
||||
y: tempNode.pos.getc().y
|
||||
x: Metamaps.tempNode.pos.getc().x,
|
||||
y: Metamaps.tempNode.pos.getc().y
|
||||
}];
|
||||
}
|
||||
Metamaps.Mouse.synapseEndCoordinates = {
|
||||
|
@ -899,11 +899,11 @@ Metamaps.JIT = {
|
|||
//
|
||||
temp = eventInfo.getNode();
|
||||
if (temp != false && temp.id != node.id && Metamaps.Selected.Nodes.indexOf(temp) == -1) { // this means a Node has been returned
|
||||
tempNode2 = temp;
|
||||
Metamaps.tempNode2 = temp;
|
||||
|
||||
Metamaps.Mouse.synapseEndCoordinates = {
|
||||
x: tempNode2.pos.getc().x,
|
||||
y: tempNode2.pos.getc().y
|
||||
x: Metamaps.tempNode2.pos.getc().x,
|
||||
y: Metamaps.tempNode2.pos.getc().y
|
||||
};
|
||||
|
||||
// before making the highlighted one bigger, make sure all the others are regular size
|
||||
|
@ -913,7 +913,7 @@ Metamaps.JIT = {
|
|||
temp.setData('dim', 35, 'current');
|
||||
Metamaps.Visualize.mGraph.plot();
|
||||
} else if (!temp) {
|
||||
tempNode2 = null;
|
||||
Metamaps.tempNode2 = null;
|
||||
Metamaps.Visualize.mGraph.graph.eachNode(function (n) {
|
||||
n.setData('dim', 25, 'current');
|
||||
});
|
||||
|
@ -941,10 +941,10 @@ Metamaps.JIT = {
|
|||
}
|
||||
}, // onDragMoveTopicHandler
|
||||
onDragCancelHandler: function (node, eventInfo, e) {
|
||||
tempNode = null;
|
||||
if (tempNode2) tempNode2.setData('dim', 25, 'current');
|
||||
tempNode2 = null;
|
||||
tempInit = false;
|
||||
Metamaps.tempNode = null;
|
||||
if (Metamaps.tempNode2) Metamaps.tempNode2.setData('dim', 25, 'current');
|
||||
Metamaps.tempNode2 = null;
|
||||
Metamaps.tempInit = false;
|
||||
// reset the draw synapse positions to false
|
||||
Metamaps.Mouse.synapseStartCoordinates = [];
|
||||
Metamaps.Mouse.synapseEndCoordinates = null;
|
||||
|
@ -953,27 +953,27 @@ Metamaps.JIT = {
|
|||
onDragEndTopicHandler: function (node, eventInfo, e) {
|
||||
var midpoint = {}, pixelPos, mapping;
|
||||
|
||||
if (tempInit && tempNode2 == null) {
|
||||
if (Metamaps.tempInit && Metamaps.tempNode2 == null) {
|
||||
// this means you want to add a new topic, and then a synapse
|
||||
Metamaps.Create.newTopic.addSynapse = true;
|
||||
Metamaps.Create.newTopic.open();
|
||||
} else if (tempInit && tempNode2 != null) {
|
||||
} else if (Metamaps.tempInit && Metamaps.tempNode2 != null) {
|
||||
// this means you want to create a synapse between two existing topics
|
||||
Metamaps.Create.newTopic.addSynapse = false;
|
||||
Metamaps.Create.newSynapse.topic1id = tempNode.getData('topic').id;
|
||||
Metamaps.Create.newSynapse.topic2id = tempNode2.getData('topic').id;
|
||||
tempNode2.setData('dim', 25, 'current');
|
||||
Metamaps.Create.newSynapse.topic1id = Metamaps.tempNode.getData('topic').id;
|
||||
Metamaps.Create.newSynapse.topic2id = Metamaps.tempNode2.getData('topic').id;
|
||||
Metamaps.tempNode2.setData('dim', 25, 'current');
|
||||
Metamaps.Visualize.mGraph.plot();
|
||||
midpoint.x = tempNode.pos.getc().x + (tempNode2.pos.getc().x - tempNode.pos.getc().x) / 2;
|
||||
midpoint.y = tempNode.pos.getc().y + (tempNode2.pos.getc().y - tempNode.pos.getc().y) / 2;
|
||||
midpoint.x = Metamaps.tempNode.pos.getc().x + (Metamaps.tempNode2.pos.getc().x - Metamaps.tempNode.pos.getc().x) / 2;
|
||||
midpoint.y = Metamaps.tempNode.pos.getc().y + (Metamaps.tempNode2.pos.getc().y - Metamaps.tempNode.pos.getc().y) / 2;
|
||||
pixelPos = Metamaps.Util.coordsToPixels(midpoint);
|
||||
$('#new_synapse').css('left', pixelPos.x + "px");
|
||||
$('#new_synapse').css('top', pixelPos.y + "px");
|
||||
Metamaps.Create.newSynapse.open();
|
||||
tempNode = null;
|
||||
tempNode2 = null;
|
||||
tempInit = false;
|
||||
} else if (!tempInit && node && !node.nodeFrom) {
|
||||
Metamaps.tempNode = null;
|
||||
Metamaps.tempNode2 = null;
|
||||
Metamaps.tempInit = false;
|
||||
} else if (!Metamaps.tempInit && node && !node.nodeFrom) {
|
||||
// this means you dragged an existing node, autosave that to the database
|
||||
|
||||
// check whether to save mappings
|
||||
|
@ -1047,18 +1047,13 @@ Metamaps.JIT = {
|
|||
Metamaps.TopicCard.hideCard();
|
||||
Metamaps.SynapseCard.hideCard();
|
||||
Metamaps.Create.newTopic.hide();
|
||||
if ($('#new_synapse').is(":visible")) {
|
||||
// Hide the new_synapse form and create the synapse!
|
||||
Metamaps.Synapse.createSynapseLocally();
|
||||
}//if
|
||||
|
||||
$('.rightclickmenu').remove();
|
||||
// reset the draw synapse positions to false
|
||||
Metamaps.Mouse.synapseStartCoordinates = [];
|
||||
Metamaps.Mouse.synapseEndCoordinates = null;
|
||||
tempInit = false;
|
||||
tempNode = null;
|
||||
tempNode2 = null;
|
||||
Metamaps.tempInit = false;
|
||||
Metamaps.tempNode = null;
|
||||
Metamaps.tempNode2 = null;
|
||||
if (!e.ctrlKey && !e.shiftKey) {
|
||||
Metamaps.Control.deselectAllEdges();
|
||||
Metamaps.Control.deselectAllNodes();
|
||||
|
@ -1697,8 +1692,8 @@ Metamaps.JIT = {
|
|||
easing = 1; // frictional value
|
||||
|
||||
easing = 1;
|
||||
window.clearInterval(panningInt)
|
||||
panningInt = setInterval(function () {
|
||||
window.clearInterval(Metamaps.panningInt)
|
||||
Metamaps.panningInt = setInterval(function () {
|
||||
myTimer()
|
||||
}, 1);
|
||||
|
||||
|
@ -1707,7 +1702,7 @@ Metamaps.JIT = {
|
|||
$(document).trigger(Metamaps.JIT.events.pan);
|
||||
easing = easing * 0.75;
|
||||
|
||||
if (easing < 0.1) window.clearInterval(panningInt);
|
||||
if (easing < 0.1) window.clearInterval(Metamaps.panningInt);
|
||||
}
|
||||
}, // SmoothPanning
|
||||
renderMidArrow: function (from, to, dim, swap, canvas, placement, newSynapse) {
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// TODO document this user agent function
|
||||
|
||||
var labelType, useGradients, nativeTextSupport, animate;
|
||||
|
||||
(function () {
|
||||
|
@ -14,11 +16,13 @@ var labelType, useGradients, nativeTextSupport, animate;
|
|||
animate = !(iStuff || !nativeCanvasSupport);
|
||||
})();
|
||||
|
||||
// TODO eliminate these 4 global variables
|
||||
var panningInt; // this variable is used to store a 'setInterval' for the Metamaps.JIT.SmoothPanning() function, so that it can be cleared with window.clearInterval
|
||||
var tempNode = null,
|
||||
tempInit = false,
|
||||
tempNode2 = null;
|
||||
// TODO eliminate these 4 top-level variables
|
||||
Metamaps = {
|
||||
panningInt: null,
|
||||
tempNode: null,
|
||||
tempInit: false,
|
||||
tempNode2: null
|
||||
}
|
||||
|
||||
Metamaps.Settings = {
|
||||
embed: false, // indicates that the app is on a page that is optimized for embedding in iFrames on other web pages
|
||||
|
@ -736,10 +740,6 @@ Metamaps.Create = {
|
|||
init: function () {
|
||||
var self = Metamaps.Create.newSynapse;
|
||||
|
||||
$('#synapse_desc').keyup(function () {
|
||||
Metamaps.Create.newSynapse.description = $(this).val();
|
||||
});
|
||||
|
||||
var synapseBloodhound = new Bloodhound({
|
||||
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
|
||||
queryTokenizer: Bloodhound.tokenizers.whitespace,
|
||||
|
@ -795,6 +795,22 @@ Metamaps.Create = {
|
|||
}]
|
||||
);
|
||||
|
||||
$('#synapse_desc').keyup(function (e) {
|
||||
var ESC = 27, BACKSPACE = 8, DELETE = 46;
|
||||
if (e.keyCode === BACKSPACE && $(this).val() === "" ||
|
||||
e.keyCode === DELETE && $(this).val() === "" ||
|
||||
e.keyCode === ESC) {
|
||||
Metamaps.Create.newSynapse.hide();
|
||||
}//if
|
||||
Metamaps.Create.newSynapse.description = $(this).val();
|
||||
});
|
||||
|
||||
$('#synapse_desc').focusout(function() {
|
||||
if (Metamaps.Create.newSynapse.beingCreated) {
|
||||
Metamaps.Synapse.createSynapseLocally();
|
||||
}
|
||||
});
|
||||
|
||||
$('#synapse_desc').bind('typeahead:select', function (event, datum, dataset) {
|
||||
if (datum.id) { // if they clicked on an existing synapse get it
|
||||
Metamaps.Synapse.getSynapseFromAutocomplete(datum.id);
|
||||
|
@ -811,7 +827,7 @@ Metamaps.Create = {
|
|||
topic2id: null,
|
||||
newSynapseId: null,
|
||||
open: function () {
|
||||
$('#new_synapse').fadeIn('fast', function () {
|
||||
$('#new_synapse').fadeIn(100, function () {
|
||||
$('#synapse_desc').focus();
|
||||
});
|
||||
Metamaps.Create.newSynapse.beingCreated = true;
|
||||
|
|
|
@ -1,63 +0,0 @@
|
|||
|
||||
|
||||
.allMetacodes {
|
||||
float:left;
|
||||
}
|
||||
|
||||
.allMetacodes span {
|
||||
margin:4px 8px;
|
||||
color:#67AF9F;
|
||||
}
|
||||
|
||||
.editMetacodes {
|
||||
z-index:12;
|
||||
width:auto;
|
||||
color: #67AF9F;
|
||||
padding:10px;
|
||||
float:left;
|
||||
}
|
||||
|
||||
.editMetacodes ul {
|
||||
display:block;
|
||||
}
|
||||
|
||||
.editMetacodes ul li {
|
||||
clear:both;
|
||||
list-style-type:none;
|
||||
display:block;
|
||||
padding:3px;
|
||||
}
|
||||
|
||||
.editMetacodes ul img {
|
||||
width:40px;
|
||||
height:40px;
|
||||
float:left;
|
||||
}
|
||||
|
||||
.editMetacodes ul p {
|
||||
float:left;
|
||||
display: block;
|
||||
margin: 0;
|
||||
background: none;
|
||||
padding: 10px 4px 2px 4px;
|
||||
}
|
||||
|
||||
.editMetacodes #filters-one {
|
||||
float:left;
|
||||
}
|
||||
|
||||
.editMetacodes #filters-two {
|
||||
float:left;
|
||||
}
|
||||
|
||||
.editMetacodes #filters-three {
|
||||
float:left;
|
||||
}
|
||||
|
||||
.editMetacodes #filters-four {
|
||||
float:left;
|
||||
}
|
||||
|
||||
.editMetacodes li.toggledOff {
|
||||
opacity: 0.4;
|
||||
}
|
188
app/assets/stylesheets/admin.scss.erb
Normal file
188
app/assets/stylesheets/admin.scss.erb
Normal file
|
@ -0,0 +1,188 @@
|
|||
.allMetacodes {
|
||||
float:left;
|
||||
|
||||
span {
|
||||
margin:4px 8px;
|
||||
color:#67AF9F;
|
||||
}
|
||||
}
|
||||
|
||||
.editMetacodes {
|
||||
z-index:12;
|
||||
width:auto;
|
||||
color: #67AF9F;
|
||||
padding:10px;
|
||||
float:left;
|
||||
|
||||
ul {
|
||||
display:block;
|
||||
}
|
||||
|
||||
ul li {
|
||||
clear:both;
|
||||
list-style-type:none;
|
||||
display:block;
|
||||
padding:3px;
|
||||
}
|
||||
|
||||
ul img {
|
||||
width:40px;
|
||||
height:40px;
|
||||
float:left;
|
||||
}
|
||||
|
||||
ul p {
|
||||
float:left;
|
||||
display: block;
|
||||
margin: 0;
|
||||
background: none;
|
||||
padding: 10px 4px 2px 4px;
|
||||
}
|
||||
|
||||
#filters-one {
|
||||
float:left;
|
||||
}
|
||||
|
||||
#filters-two {
|
||||
float:left;
|
||||
}
|
||||
|
||||
#filters-three {
|
||||
float:left;
|
||||
}
|
||||
|
||||
#filters-four {
|
||||
float:left;
|
||||
}
|
||||
|
||||
li.toggledOff {
|
||||
opacity: 0.4;
|
||||
}
|
||||
}
|
||||
|
||||
.blackBox {
|
||||
width: 760px;
|
||||
margin: 0 auto;
|
||||
padding: 20px 0 60px 20px;
|
||||
background: rgba(0, 0, 0, 0.4);
|
||||
color: white;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
|
||||
.metacodeSetsDescription {
|
||||
width: 314px;
|
||||
}
|
||||
td.metacodeSetDesc {
|
||||
width: 314px;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
.metacodeSetImage {
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
float: left;
|
||||
}
|
||||
tr {
|
||||
display: table-row;
|
||||
}
|
||||
tr:nth-child(odd) {
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
tr:nth-child(even) {
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
th,
|
||||
td {
|
||||
padding: 10px;
|
||||
}
|
||||
td.iconURL {
|
||||
max-width: 415px;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
.field {
|
||||
margin: 15px 0 5px;
|
||||
}
|
||||
label {
|
||||
float: left;
|
||||
width: 100px;
|
||||
margin-right: 15px;
|
||||
margin-top: 0px;
|
||||
}
|
||||
input[type="text"] {
|
||||
width: 336px;
|
||||
height: 32px;
|
||||
font-size: 15px;
|
||||
direction: ltr;
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
display: inline-block;
|
||||
margin: 0;
|
||||
padding: 0 8px;
|
||||
background: #fff;
|
||||
border: 1px solid #d9d9d9;
|
||||
border-top: 1px solid #c0c0c0;
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
-webkit-border-radius: 1px;
|
||||
-moz-border-radius: 1px;
|
||||
border-radius: 1px;
|
||||
font: -webkit-small-control;
|
||||
color: initial;
|
||||
letter-spacing: normal;
|
||||
word-spacing: normal;
|
||||
text-transform: none;
|
||||
text-indent: 0px;
|
||||
text-shadow: none;
|
||||
display: inline-block;
|
||||
text-align: start;
|
||||
font-family: arial;
|
||||
}
|
||||
textarea:hover,
|
||||
input[type="text"]:hover {
|
||||
border: 1px solid #b9b9b9;
|
||||
border-top: 1px solid #a0a0a0;
|
||||
-webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
|
||||
-moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
|
||||
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
textarea {
|
||||
padding: 8px;
|
||||
border: 1px solid #d9d9d9;
|
||||
border-top: 1px solid #c0c0c0;
|
||||
resize: none;
|
||||
font: -webkit-small-control;
|
||||
letter-spacing: normal;
|
||||
word-spacing: normal;
|
||||
text-transform: none;
|
||||
text-indent: 0px;
|
||||
text-shadow: none;
|
||||
text-align: start;
|
||||
font-family: arial;
|
||||
font-size: 15px;
|
||||
line-height: 17px;
|
||||
width: 318px;
|
||||
}
|
||||
.allMetacodes {
|
||||
padding: 5px 0;
|
||||
}
|
||||
a.button {
|
||||
margin-right: 20px;
|
||||
line-height: 40px;
|
||||
}
|
||||
a.button,
|
||||
input.add {
|
||||
float: left;
|
||||
margin-top: 5px;
|
||||
height: 40px;
|
||||
font-size: 17px;
|
||||
width: auto;
|
||||
padding: 0 30px;
|
||||
cursor: pointer;
|
||||
font-weight: normal;
|
||||
}
|
||||
a.button:hover,
|
||||
input.add:hover {
|
||||
-webkit-box-shadow: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
|
@ -2,7 +2,8 @@ class ApplicationController < ActionController::Base
|
|||
protect_from_forgery
|
||||
|
||||
before_filter :get_invite_link
|
||||
|
||||
after_action :allow_embedding
|
||||
|
||||
# this is for global login
|
||||
include ContentHelper
|
||||
|
||||
|
@ -64,9 +65,13 @@ private
|
|||
end
|
||||
|
||||
def get_invite_link
|
||||
unsafe_uri = request.env["REQUEST_URI"] || 'https://metamaps.cc'
|
||||
valid_url = /^https?:\/\/([\w\.-]+)(:\d{1,5})?\/?$/
|
||||
safe_uri = (unsafe_uri.match(valid_url)) ? unsafe_uri : '//metamaps.cc/'
|
||||
@invite_link = "#{safe_uri}join" + (current_user ? "?code=#{current_user.code}" : "")
|
||||
@invite_link = "#{request.base_url}/join" + (current_user ? "?code=#{current_user.code}" : "")
|
||||
end
|
||||
|
||||
def allow_embedding
|
||||
#allow all
|
||||
response.headers.except! 'X-Frame-Options'
|
||||
# or allow a whitelist
|
||||
# response.headers['X-Frame-Options'] = 'ALLOW-FROM http://blog.metamaps.cc'
|
||||
end
|
||||
end
|
||||
|
|
|
@ -15,8 +15,6 @@ class MappingsController < ApplicationController
|
|||
def create
|
||||
@mapping = Mapping.new(mapping_params)
|
||||
|
||||
@mapping.map.touch(:updated_at)
|
||||
|
||||
if @mapping.save
|
||||
render json: @mapping, status: :created
|
||||
else
|
||||
|
@ -28,8 +26,6 @@ class MappingsController < ApplicationController
|
|||
def update
|
||||
@mapping = Mapping.find(params[:id])
|
||||
|
||||
@mapping.map.touch(:updated_at)
|
||||
|
||||
if @mapping.update_attributes(mapping_params)
|
||||
head :no_content
|
||||
else
|
||||
|
@ -44,8 +40,6 @@ class MappingsController < ApplicationController
|
|||
|
||||
@mapping.destroy
|
||||
|
||||
@map.touch(:updated_at)
|
||||
|
||||
head :no_content
|
||||
end
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
class MapsController < ApplicationController
|
||||
|
||||
before_filter :require_user, only: [:create, :update, :screenshot, :destroy]
|
||||
|
||||
respond_to :html, :json, :csv
|
||||
|
@ -10,38 +9,24 @@ class MapsController < ApplicationController
|
|||
# GET /explore/featured
|
||||
# GET /explore/mapper/:id
|
||||
def index
|
||||
|
||||
if request.path == "/explore"
|
||||
redirect_to activemaps_url and return
|
||||
end
|
||||
return redirect_to activemaps_url if request.path == "/explore"
|
||||
|
||||
@current = current_user
|
||||
@user = nil
|
||||
@maps = []
|
||||
@mapperId = nil
|
||||
|
||||
if !params[:page]
|
||||
page = 1
|
||||
else
|
||||
page = params[:page]
|
||||
end
|
||||
page = params[:page].present? ? params[:page] : 1
|
||||
|
||||
if request.path.index("/explore/active") != nil
|
||||
@maps = Map.where("maps.permission != ?", "private").order("updated_at DESC").page(page).per(20)
|
||||
@request = "active"
|
||||
|
||||
elsif request.path.index("/explore/featured") != nil
|
||||
@maps = Map.where("maps.featured = ? AND maps.permission != ?", true, "private").order("updated_at DESC").page(page).per(20)
|
||||
@request = "featured"
|
||||
|
||||
elsif request.path.index('/explore/mine') != nil # looking for maps by me
|
||||
if !authenticated?
|
||||
redirect_to activemaps_url and return
|
||||
end
|
||||
return redirect_to activemaps_url if !authenticated?
|
||||
|
||||
# don't need to exclude private maps because they all belong to you
|
||||
@maps = Map.where("maps.user_id = ?", @current.id).order("updated_at DESC").page(page).per(20)
|
||||
@request = "you"
|
||||
|
||||
elsif request.path.index('/explore/mapper/') != nil # looking for maps by a mapper
|
||||
@user = User.find(params[:id])
|
||||
@maps = Map.where("maps.user_id = ? AND maps.permission != ?", @user.id, "private").order("updated_at DESC").page(page).per(20)
|
||||
|
@ -121,7 +106,6 @@ class MapsController < ApplicationController
|
|||
|
||||
# POST maps
|
||||
def create
|
||||
|
||||
@user = current_user
|
||||
@map = Map.new()
|
||||
@map.name = params[:name]
|
||||
|
@ -129,40 +113,45 @@ class MapsController < ApplicationController
|
|||
@map.permission = params[:permission]
|
||||
@map.user = @user
|
||||
@map.arranged = false
|
||||
@map.save
|
||||
|
||||
if params[:topicsToMap]
|
||||
@all = params[:topicsToMap]
|
||||
@all = @all.split(',')
|
||||
@all.each do |topic|
|
||||
topic = topic.split('/')
|
||||
@mapping = Mapping.new()
|
||||
@mapping.user = @user
|
||||
@mapping.map = @map
|
||||
@mapping.mappable = Topic.find(topic[0])
|
||||
@mapping.xloc = topic[1]
|
||||
@mapping.yloc = topic[2]
|
||||
@mapping.save
|
||||
mapping = Mapping.new()
|
||||
mapping.user = @user
|
||||
mapping.mappable = Topic.find(topic[0])
|
||||
mapping.xloc = topic[1]
|
||||
mapping.yloc = topic[2]
|
||||
@map.topicmappings << mapping
|
||||
mapping.save
|
||||
end
|
||||
|
||||
if params[:synapsesToMap]
|
||||
@synAll = params[:synapsesToMap]
|
||||
@synAll = @synAll.split(',')
|
||||
@synAll.each do |synapse_id|
|
||||
@mapping = Mapping.new()
|
||||
@mapping.user = @user
|
||||
@mapping.map = @map
|
||||
@mapping.mappable = Synapse.find(synapse_id)
|
||||
@mapping.save
|
||||
mapping = Mapping.new()
|
||||
mapping.user = @user
|
||||
mapping.map = @map
|
||||
mapping.mappable = Synapse.find(synapse_id)
|
||||
@map.synapsemappings << mapping
|
||||
mapping.save
|
||||
end
|
||||
end
|
||||
|
||||
@map.arranged = true
|
||||
@map.save
|
||||
end
|
||||
|
||||
respond_to do |format|
|
||||
if @map.save
|
||||
respond_to do |format|
|
||||
format.json { render :json => @map }
|
||||
end
|
||||
else
|
||||
respond_to do |format|
|
||||
format.json { render :json => "invalid params" }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -5,9 +5,6 @@ class MetacodesController < ApplicationController
|
|||
# GET /metacodes.json
|
||||
def index
|
||||
@metacodes = Metacode.order("name").all
|
||||
@metacodes.map do |metacode|
|
||||
metacode.icon = ActionController::Base.helpers.asset_path(metacode.icon)
|
||||
end
|
||||
|
||||
respond_to do |format|
|
||||
format.html {
|
||||
|
@ -15,24 +12,12 @@ class MetacodesController < ApplicationController
|
|||
redirect_to root_url, notice: "You need to be an admin for that."
|
||||
return false
|
||||
end
|
||||
render action: "index"
|
||||
render :index
|
||||
}
|
||||
format.json { render json: @metacodes }
|
||||
end
|
||||
end
|
||||
|
||||
### SHOW IS CURRENTLY DISABLED
|
||||
# GET /metacodes/1
|
||||
# GET /metacodes/1.json
|
||||
# def show
|
||||
# @metacode = Metacode.find(params[:id])
|
||||
#
|
||||
# respond_to do |format|
|
||||
# format.html # show.html.erb
|
||||
# format.json { render json: @metacode }
|
||||
# end
|
||||
# end
|
||||
|
||||
# GET /metacodes/new
|
||||
# GET /metacodes/new.json
|
||||
def new
|
||||
|
@ -59,7 +44,7 @@ class MetacodesController < ApplicationController
|
|||
format.html { redirect_to metacodes_url, notice: 'Metacode was successfully created.' }
|
||||
format.json { render json: @metacode, status: :created, location: metacodes_url }
|
||||
else
|
||||
format.html { render action: "new" }
|
||||
format.html { render :new }
|
||||
format.json { render json: @metacode.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
|
@ -71,34 +56,20 @@ class MetacodesController < ApplicationController
|
|||
@metacode = Metacode.find(params[:id])
|
||||
|
||||
respond_to do |format|
|
||||
if @metacode.update_attributes(metacode_params)
|
||||
if @metacode.update(metacode_params)
|
||||
format.html { redirect_to metacodes_url, notice: 'Metacode was successfully updated.' }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
format.html { render action: "edit" }
|
||||
format.html { render :edit }
|
||||
format.json { render json: @metacode.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
### DESTROY IS CURRENTLY DISABLED
|
||||
# DELETE /metacodes/1
|
||||
# DELETE /metacodes/1.json
|
||||
# def destroy
|
||||
# @metacode = Metacode.find(params[:id])
|
||||
# @metacode.destroy
|
||||
#
|
||||
# respond_to do |format|
|
||||
# format.html { redirect_to metacodes_url }
|
||||
# format.json { head :no_content }
|
||||
# end
|
||||
# end
|
||||
|
||||
private
|
||||
|
||||
# Never trust parameters from the scary internet, only allow the white list through.
|
||||
def metacode_params
|
||||
params.require(:metacode).permit(:id, :name, :icon, :color)
|
||||
end
|
||||
# Never trust parameters from the scary internet, only allow the white list through.
|
||||
def metacode_params
|
||||
params.require(:metacode).permit(:id, :name, :aws_icon, :manual_icon, :color)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -22,7 +22,7 @@ class SynapsesController < ApplicationController
|
|||
# POST /synapses.json
|
||||
def create
|
||||
@synapse = Synapse.new(synapse_params)
|
||||
@synapse.update_attribute :desc, "" if @synapse.desc.nil?
|
||||
@synapse.desc = "" if @synapse.desc.nil?
|
||||
|
||||
respond_to do |format|
|
||||
if @synapse.save
|
||||
|
@ -37,7 +37,7 @@ class SynapsesController < ApplicationController
|
|||
# PUT /synapses/1.json
|
||||
def update
|
||||
@synapse = Synapse.find(params[:id])
|
||||
@synapse.update_attribute :desc, "" if @synapse.desc.nil?
|
||||
@synapse.desc = "" if @synapse.desc.nil?
|
||||
|
||||
respond_to do |format|
|
||||
if @synapse.update_attributes(synapse_params)
|
||||
|
|
|
@ -43,41 +43,41 @@ class Map < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def topic_count
|
||||
self.topics.length
|
||||
topics.length
|
||||
end
|
||||
|
||||
def synapse_count
|
||||
self.synapses.length
|
||||
synapses.length
|
||||
end
|
||||
|
||||
def user_name
|
||||
self.user.name
|
||||
user.name
|
||||
end
|
||||
|
||||
def user_image
|
||||
self.user.image.url
|
||||
user.image.url
|
||||
end
|
||||
|
||||
def contributor_count
|
||||
self.contributors.length
|
||||
def contributor_count
|
||||
contributors.length
|
||||
end
|
||||
|
||||
def screenshot_url
|
||||
self.screenshot.url(:thumb)
|
||||
screenshot.url(:thumb)
|
||||
end
|
||||
|
||||
def created_at_str
|
||||
self.created_at.strftime("%m/%d/%Y")
|
||||
created_at.strftime("%m/%d/%Y")
|
||||
end
|
||||
|
||||
def updated_at_str
|
||||
self.updated_at.strftime("%m/%d/%Y")
|
||||
updated_at.strftime("%m/%d/%Y")
|
||||
end
|
||||
|
||||
def as_json(options={})
|
||||
json = super(:methods =>[:user_name, :user_image, :topic_count, :synapse_count, :contributor_count, :screenshot_url], :except => [:screenshot_content_type, :screenshot_file_size, :screenshot_file_name, :screenshot_updated_at])
|
||||
json[:created_at_clean] = self.created_at_str
|
||||
json[:updated_at_clean] = self.updated_at_str
|
||||
json[:created_at_clean] = created_at_str
|
||||
json[:updated_at_clean] = updated_at_str
|
||||
json
|
||||
end
|
||||
|
||||
|
|
|
@ -4,10 +4,15 @@ class Mapping < ActiveRecord::Base
|
|||
scope :synapsemapping, -> { where(mappable_type: :Synapse) }
|
||||
|
||||
belongs_to :mappable, polymorphic: true
|
||||
|
||||
belongs_to :map, :class_name => "Map", :foreign_key => "map_id"
|
||||
|
||||
belongs_to :map, :class_name => "Map", :foreign_key => "map_id", touch: true
|
||||
belongs_to :user
|
||||
|
||||
validates :xloc, presence: true,
|
||||
unless: Proc.new { |m| m.mappable_type == 'Synapse' }
|
||||
validates :yloc, presence: true,
|
||||
unless: Proc.new { |m| m.mappable_type == 'Synapse' }
|
||||
validates :map, presence: true
|
||||
validates :mappable, presence: true
|
||||
|
||||
def user_name
|
||||
self.user.name
|
||||
|
|
|
@ -1,9 +1,37 @@
|
|||
class Metacode < ActiveRecord::Base
|
||||
|
||||
has_many :in_metacode_sets
|
||||
has_many :metacode_sets, :through => :in_metacode_sets
|
||||
has_many :topics
|
||||
|
||||
# This method associates the attribute ":aws_icon" with a file attachment
|
||||
has_attached_file :aws_icon, :styles => {
|
||||
:ninetysix => ['96x96#', :png],
|
||||
},
|
||||
:default_url => 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_wildcard.png'
|
||||
|
||||
# Validate the attached icon is image/jpg, image/png, etc
|
||||
validates_attachment_content_type :aws_icon, :content_type => /\Aimage\/.*\Z/
|
||||
|
||||
validate :aws_xor_manual_icon
|
||||
validate :manual_icon_https
|
||||
before_create do
|
||||
self.manual_icon = nil if self.manual_icon == ""
|
||||
end
|
||||
|
||||
def icon(*args)
|
||||
if manual_icon.present?
|
||||
manual_icon
|
||||
else
|
||||
aws_icon(*args)
|
||||
end
|
||||
end
|
||||
|
||||
def as_json(options={})
|
||||
default = super(options)
|
||||
default[:icon] = icon
|
||||
default.except('aws_icon_file_name', 'aws_icon_content_type', 'aws_icon_file_size', 'aws_icon_updated_at', 'manual_icon')
|
||||
end
|
||||
|
||||
def hasSelected(user)
|
||||
return true if user.settings.metacodes.include? self.id.to_s
|
||||
return false
|
||||
|
@ -13,4 +41,23 @@ class Metacode < ActiveRecord::Base
|
|||
return true if self.metacode_sets.include? metacode_set
|
||||
return false
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def aws_xor_manual_icon
|
||||
if aws_icon.blank? && manual_icon.blank?
|
||||
errors.add(:base, "Either aws_icon or manual_icon is required")
|
||||
end
|
||||
if aws_icon.present? && manual_icon.present?
|
||||
errors.add(:base, "Specify aws_icon or manual_icon, not both")
|
||||
end
|
||||
end
|
||||
|
||||
def manual_icon_https
|
||||
if manual_icon.present?
|
||||
unless manual_icon.starts_with? 'https'
|
||||
errors.add(:base, "Manual icon must begin with https")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
class Synapse < ActiveRecord::Base
|
||||
|
||||
belongs_to :user
|
||||
|
||||
belongs_to :topic1, :class_name => "Topic", :foreign_key => "node1_id"
|
||||
|
@ -13,17 +12,25 @@ class Synapse < ActiveRecord::Base
|
|||
validates :permission, presence: true
|
||||
validates :permission, inclusion: { in: Perm::ISSIONS.map(&:to_s) }
|
||||
|
||||
validates :category, inclusion: { in: ['from-to', 'both'], allow_nil: true }
|
||||
|
||||
# :nocov:
|
||||
def user_name
|
||||
self.user.name
|
||||
user.name
|
||||
end
|
||||
# :nocov:
|
||||
|
||||
# :nocov:
|
||||
def user_image
|
||||
self.user.image.url
|
||||
user.image.url
|
||||
end
|
||||
# :nocov:
|
||||
|
||||
# :nocov:
|
||||
def as_json(options={})
|
||||
super(:methods =>[:user_name, :user_image])
|
||||
end
|
||||
# :nocov:
|
||||
|
||||
##### PERMISSIONS ######
|
||||
|
||||
|
|
|
@ -46,7 +46,6 @@
|
|||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<% # TODO enable ssl on blog.metamaps.cc %>
|
||||
<a id="lightbox_blog" href="http://blog.metamaps.cc" target="_blank">
|
||||
<div class="lightboxAboutIcon"></div>
|
||||
blog
|
||||
|
@ -59,8 +58,7 @@
|
|||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<% # TODO switch to https:// once we're confident %>
|
||||
<a id="lightbox_term" data-bypass="true" href="//metamaps.cc/maps/331" target="_blank">
|
||||
<a id="lightbox_term" data-bypass="true" href="https://metamaps.cc/maps/331" target="_blank">
|
||||
<div class="lightboxAboutIcon"></div>
|
||||
terms
|
||||
</a>
|
||||
|
@ -154,7 +152,6 @@
|
|||
<a id="chromeIcon" href="https://www.google.com/chrome/browser/" target="_blank">Chrome</a>
|
||||
<a id="fireFoxIcon" href="https://www.mozilla.org/en-US/firefox/new/" target="_blank">Firefox</a>
|
||||
<a id="safariIcon" href="http://support.apple.com/downloads/#safari" target="_blank">Safari</a>
|
||||
<% # TODO https for blog.metamaps.cc %>
|
||||
<p id="noIEbody">While it's downloading, explore our <a href="http://blog.metamaps.cc/">blog</a>,<br> watch the <a href="http://vimeo.com/88334167">tutorials</a>, or visit our <a href="http://metamapscc.uservoice.com/">knowledge base</a>!
|
||||
|
||||
</div>
|
||||
|
@ -171,7 +168,7 @@
|
|||
|
||||
<p>If you'd like to know what your money is going towards, we publish our financials transparently - everything is recorded through our <a href="https://docs.google.com/spreadsheets/d/1n6aI77zlf1F9biH6wIbFkaOARK_QfvzqVC0vBsBKY2o">value accounting system</a>.</p>
|
||||
<div class="leaveSpace"></div>
|
||||
<script data-gratipay-username="Metamaps.cc" src="//gttp.co/v1.js"></script>
|
||||
<script data-gratipay-username="Metamaps.cc" src="https://gttp.co/v1.js"></script>
|
||||
<div style="font-size:16px;margin:0 auto;width:300px" class="blockchain-btn"
|
||||
data-address="15z24wj6E9tTsJgEBjnK81CtJ7kZZmxJYN"
|
||||
data-shared="false">
|
||||
|
@ -203,8 +200,7 @@
|
|||
|
||||
<p>Want to help with design, code, community building, or communications for Metamaps? We're an open value network, which for us means we want to invite and empower peers to participate in creating value together.
|
||||
|
||||
<% # TODO change this link to https once it works %>
|
||||
<p>To be a <b>USER</b>, request an invite! We'll expect you to abide by our <a href="http://metamaps.cc/maps/331" target="_blank">terms of service</a>.</p>
|
||||
<p>To be a <b>USER</b>, request an invite! We'll expect you to abide by our <a href="https://metamaps.cc/maps/331" target="_blank">terms of service</a>.</p>
|
||||
|
||||
<p>To be a <b>CONTRIBUTOR</b>, simply <a href="https://docs.google.com/document/d/1z8FsSmYkHbLRLOsXc8i8M5ubKky8_WB2E9bLBoXJapU" target="_blank">enter our spaces</a> and join the conversation! We'll expect you to follow some guidelines.</p>
|
||||
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
<%#
|
||||
# @file
|
||||
# Shows a list of all maps, or just a user's maps.
|
||||
# TODO: What url is this accessible at?
|
||||
#%>
|
||||
|
||||
|
||||
<% #
|
||||
# @file
|
||||
# Shows a list of all maps, or just a user's maps.
|
||||
# GET /explore/active(.:format)
|
||||
# GET /explore/featured(.:format)
|
||||
# GET /explore/mine(.:format)
|
||||
# GET /explore/mapper/:id(.:format)
|
||||
# GET /maps(.:format)
|
||||
# %>
|
||||
|
||||
<script>
|
||||
<% if @request == "you" %>
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
<% if @metacode.errors.any? %>
|
||||
<div id="error_explanation">
|
||||
<h2><%= pluralize(@metacode.errors.count, "error") %> prohibited this metacode from being saved:</h2>
|
||||
|
||||
<ul>
|
||||
<% @metacode.errors.full_messages.each do |msg| %>
|
||||
<li><%= msg %></li>
|
||||
|
@ -16,9 +15,20 @@
|
|||
<%= f.text_field :name %>
|
||||
<div class="clearfloat"></div>
|
||||
</div>
|
||||
<% unless @metacode.new_record? %>
|
||||
<div class="field">
|
||||
<%= f.label 'Current Icon' %>
|
||||
<%= image_tag @metacode.icon, width: 96 %>
|
||||
</div>
|
||||
<% end %>
|
||||
<div class="field">
|
||||
<%= f.label :icon %>
|
||||
<%= f.text_field :icon %>
|
||||
<% if @metacode.new_record? %>
|
||||
<%= f.label 'Icon' %>
|
||||
<% else %>
|
||||
<%= f.label 'Replace Icon: ' %>
|
||||
<% end %>
|
||||
<%= f.hidden_field :manual_icon, value: nil %>
|
||||
<%= f.file_field :aws_icon %>
|
||||
<div class="clearfloat"></div>
|
||||
</div>
|
||||
<div class="field">
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
<% @metacodes.each do |metacode| %>
|
||||
<tr>
|
||||
<td><%= metacode.name %></td>
|
||||
<td class="iconURL"><%= asset_path metacode.icon %></td>
|
||||
<td class="iconURL"><%= metacode.icon %></td>
|
||||
<% if metacode.color %>
|
||||
<td class="iconColor" style="background-color: <%= metacode.color %>">
|
||||
<%= metacode.color %>
|
||||
|
@ -22,7 +22,7 @@
|
|||
<% else %>
|
||||
<td></td>
|
||||
<% end %>
|
||||
<td><img width='40' src='<%= asset_path metacode.icon %>' /></td>
|
||||
<td><%= image_tag metacode.icon, width: 40 %></td>
|
||||
<td><%= link_to 'Edit', edit_metacode_path(metacode), :data => { :bypass => 'true'} %></td>
|
||||
</tr>
|
||||
<% end %>
|
||||
|
|
|
@ -76,7 +76,8 @@
|
|||
|
||||
<div id="csCreatingSynapses">
|
||||
<div class="csItem"><span class="csTitle">Open 'Create Synapse' prompt:</span> Right-click & drag from one topic to another</div>
|
||||
<div class="csItem indented"><span class="csTitle">Enter:</span> Create synapse</div>
|
||||
<div class="csItem indented"><span class="csTitle">Enter or Tab:</span> Create synapse</div>
|
||||
<div class="csItem indented"><span class="csTitle">Esc or Delete:</span> Cancel synapse creation</div>
|
||||
<div class="csItem indented">*You do not have to add a description</div>
|
||||
<div class="csItem"><span class="csTitle">Create new Topic with Synapse:</span> Right-click + drag from topic to open canvas</div>
|
||||
<div class="csItem indented"><span class="csTitle">Enter:</span> Create topic</div>
|
||||
|
|
|
@ -1,10 +0,0 @@
|
|||
<%#
|
||||
# @file
|
||||
# Partial for rendered a new synapse form
|
||||
# TODO: Is this used? Where?
|
||||
#%>
|
||||
<div class="anypage">
|
||||
<%= form_for Synapse.new, url: synapses_url, remote: true do |form| %>
|
||||
<%= form.text_field :desc, :placeholder => "describe the connection..." %>
|
||||
<% end %>
|
||||
</div>
|
|
@ -1,7 +1,8 @@
|
|||
#!/bin/bash -l
|
||||
|
||||
#prerequisites
|
||||
#sudo aptitude -q -y install libpq-dev
|
||||
# jenkins machine prerequisites
|
||||
# sudo aptitude -q -y install libpq-dev
|
||||
# install rvm with user gemsets
|
||||
|
||||
source "$HOME/.rvm/scripts/rvm"
|
||||
rvm use $(cat .ruby-version) || \
|
||||
|
@ -20,5 +21,8 @@ sed -i -e "s/DB_USERNAME='.*'/DB_USERNAME='jenkins'/" .env
|
|||
|
||||
#test
|
||||
bundle install
|
||||
rake db:create db:test:prepare
|
||||
bundle exec rspec
|
||||
rake db:drop
|
||||
rake db:create
|
||||
rake db:schema:load
|
||||
rake db:migrate
|
||||
COVERAGE=on bundle exec rspec
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
class AddAttachmentIconToMetacodes < ActiveRecord::Migration
|
||||
def change
|
||||
change_table :metacodes do |t|
|
||||
t.rename :icon, :manual_icon
|
||||
t.attachment :aws_icon
|
||||
end
|
||||
end
|
||||
end
|
12
db/schema.rb
12
db/schema.rb
|
@ -11,7 +11,7 @@
|
|||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(version: 20160120061513) do
|
||||
ActiveRecord::Schema.define(version: 20160223061711) do
|
||||
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "plpgsql"
|
||||
|
@ -89,10 +89,14 @@ ActiveRecord::Schema.define(version: 20160120061513) do
|
|||
|
||||
create_table "metacodes", force: :cascade do |t|
|
||||
t.text "name"
|
||||
t.string "icon"
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.string "manual_icon"
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.string "color"
|
||||
t.string "aws_icon_file_name"
|
||||
t.string "aws_icon_content_type"
|
||||
t.integer "aws_icon_file_size"
|
||||
t.datetime "aws_icon_updated_at"
|
||||
end
|
||||
|
||||
create_table "synapses", force: :cascade do |t|
|
||||
|
|
94
db/seeds.rb
94
db/seeds.rb
|
@ -24,283 +24,283 @@ User.new({
|
|||
## METACODES
|
||||
Metacode.create({
|
||||
name: 'Action',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_action.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_action.png',
|
||||
color: '#BD6C85'
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Activity',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_activity.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_activity.png',
|
||||
color: '#6EBF65'
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Catalyst',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_catalyst.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_catalyst.png',
|
||||
color: '#EF8964',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Closed',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_closedissue.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_closedissue.png',
|
||||
color: '#ABB49F',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Process',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_process.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_process.png',
|
||||
color: '#BDB25E',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Future',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_futuredev.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_futuredev.png',
|
||||
color: '#25A17F',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Group',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_group.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_group.png',
|
||||
color: '#7076BC',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Implication',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_implication.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_implication.png',
|
||||
color: '#83DECA',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Insight',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_insight.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_insight.png',
|
||||
color: '#B074AD',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Intention',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_intention.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_intention.png',
|
||||
color: '#BAEAFF',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Knowledge',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_knowledge.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_knowledge.png',
|
||||
color: '#60ACF7',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Location',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_location.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_location.png',
|
||||
color: '#ABD9A7',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Need',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_need.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_need.png',
|
||||
color: '#D2A7D4',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Open',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_openissue.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_openissue.png',
|
||||
color: '#9BBF71',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Opportunity',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_opportunity.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_opportunity.png',
|
||||
color: '#889F64',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Person',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_person.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_person.png',
|
||||
color: '#DE925F',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Platform',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_platform.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_platform.png',
|
||||
color: '#21C8FE',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Problem',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_problem.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_problem.png',
|
||||
color: '#99CFC4',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Resource',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_resource.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_resource.png',
|
||||
color: '#C98C63',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Role',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_role.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_role.png',
|
||||
color: '#A8595D',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Task',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_task.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_task.png',
|
||||
color: '#3397C4',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Trajectory',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_trajectory.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/blueprint/96px/bp_trajectory.png',
|
||||
color: '#D3AA4C',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Argument',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_argument.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_argument.png',
|
||||
color: '#7FAEFD',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Con',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_con.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_con.png',
|
||||
color: '#CF7C74',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Subject',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_subject.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_subject.png',
|
||||
color: '#8293D8',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Decision',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_decision.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_decision.png',
|
||||
color: '#CCA866',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Event',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_event.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_event.png',
|
||||
color: '#F5854B',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Example',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_example.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_example.png',
|
||||
color: '#618C61',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Experience',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_experience.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_experience.png',
|
||||
color: '#BE995F',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Feedback',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_feedback.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_feedback.png',
|
||||
color: '#54A19D',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Aim',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_aim.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_aim.png',
|
||||
color: '#B0B0B0',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Good',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_goodpractice.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_goodpractice.png',
|
||||
color: '#BD9E86',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Idea',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_idea.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_idea.png',
|
||||
color: '#C4BC5E',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'List',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_list.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_list.png',
|
||||
color: '#B7A499',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Media',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_media.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_media.png',
|
||||
color: '#6D94CC',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Metamap',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_metamap.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_metamap.png',
|
||||
color: '#AEA9FD',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Model',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_model.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_model.png',
|
||||
color: '#B385BA',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Note',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_note.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_note.png',
|
||||
color: '#A389A1',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Perspective',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_perspective.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_perspective.png',
|
||||
color: '#2EB6CC',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Pro',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_pro.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_pro.png',
|
||||
color: '#89B879',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Project',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_project.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_project.png',
|
||||
color: '#85A050',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Question',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_question.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_question.png',
|
||||
color: '#5CB3B3',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Reference',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_reference.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_reference.png',
|
||||
color: '#A7A7A7',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Research',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_research.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_research.png',
|
||||
color: '#CD8E89',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Status',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_status.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_status.png',
|
||||
color: '#EFA7C0',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Tool',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_tool.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_tool.png',
|
||||
color: '#828282',
|
||||
})
|
||||
|
||||
Metacode.create({
|
||||
name: 'Wildcard',
|
||||
icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_wildcard.png',
|
||||
manual_icon: 'https://s3.amazonaws.com/metamaps-assets/metacodes/generics/96px/gen_wildcard.png',
|
||||
color: '#73C7DE',
|
||||
})
|
||||
## END METACODES
|
||||
|
|
|
@ -1,57 +0,0 @@
|
|||
//parse arguments passed from command line (or more likely, from rails)
|
||||
var system = require('system');
|
||||
var args = system.args;
|
||||
if (args.length <= 1) {
|
||||
phantom.exit();
|
||||
throw new Error("no arguments supplied on command line");
|
||||
}//if
|
||||
|
||||
//configurable variables - CHANGE ME
|
||||
var mapID = args[1];
|
||||
var environment = args[2];
|
||||
var address = environment === 'development' ? 'http://localhost:3000' : 'http://metamaps.herokuapp.com';
|
||||
var url = address + '/maps/' + mapID;
|
||||
var width = 940;
|
||||
var height = 630;
|
||||
|
||||
//set up page and the area we'll render as a PNG
|
||||
var page = require('webpage').create();
|
||||
page.viewportSize = {
|
||||
width: width,
|
||||
height: height
|
||||
};
|
||||
|
||||
page.open(url, function (status) {
|
||||
if (status === 'success') {
|
||||
//since this isn't evaluateAsync, it should also ensure the asynchronous
|
||||
//js stuff is loaded too, hopefully?
|
||||
|
||||
page.onCallback = function(data){
|
||||
|
||||
//pass to ruby
|
||||
console.log(page.renderBase64('PNG'));
|
||||
|
||||
//render to the metamaps_gen002 directory for debug
|
||||
//page.render('map1.png', 'PNG');
|
||||
|
||||
phantom.exit();
|
||||
};
|
||||
|
||||
page.evaluate(function() {
|
||||
|
||||
$(document).ready(function () {
|
||||
//$(document).on(Metamaps.JIT.events.animationDone, function() {
|
||||
setTimeout(function(){
|
||||
$('.upperLeftUI, .upperRightUI, .mapControls, .infoAndHelp, .uv-icon, .footer').hide();
|
||||
Metamaps.JIT.zoomExtents();
|
||||
window.callPhantom();
|
||||
}, 5000);
|
||||
});
|
||||
|
||||
});//page.evaluate
|
||||
|
||||
} else {
|
||||
//failed to load
|
||||
phantom.exit();
|
||||
}//if
|
||||
});
|
|
@ -1,60 +1,16 @@
|
|||
require 'rails_helper'
|
||||
|
||||
# This spec was generated by rspec-rails when you ran the scaffold generator.
|
||||
# It demonstrates how one might use RSpec to specify the controller code that
|
||||
# was generated by Rails when you ran the scaffold generator.
|
||||
#
|
||||
# It assumes that the implementation code is generated by the rails scaffold
|
||||
# generator. If you are using any extension libraries to generate different
|
||||
# controller code, this generated spec may or may not pass.
|
||||
#
|
||||
# It only uses APIs available in rails and/or rspec-rails. There are a number
|
||||
# of tools you can use to make these specs even more expressive, but we're
|
||||
# sticking to rails and rspec-rails APIs to keep things simple and stable.
|
||||
#
|
||||
# Compared to earlier versions of this generator, there is very limited use of
|
||||
# stubs and message expectations in this spec. Stubs are only used when there
|
||||
# is no simpler way to get a handle on the object needed for the example.
|
||||
# Message expectations are only used when there is no simpler way to specify
|
||||
# that an instance is receiving a specific message.
|
||||
|
||||
RSpec.describe MappingsController, type: :controller do
|
||||
# This should return the minimal set of attributes required to create a valid
|
||||
# Mapping. As you add validations to Mapping, be sure to
|
||||
# adjust the attributes here as well.
|
||||
let(:valid_attributes) do
|
||||
skip('Add a hash of attributes valid for your model')
|
||||
end
|
||||
|
||||
let(:invalid_attributes) do
|
||||
skip('Add a hash of attributes invalid for your model')
|
||||
end
|
||||
|
||||
# This should return the minimal set of values that should be in the session
|
||||
# in order to pass any filters (e.g. authentication) defined in
|
||||
# MappingsController. Be sure to keep this updated too.
|
||||
let(:valid_session) { {} }
|
||||
|
||||
describe 'GET #index' do
|
||||
it 'assigns all mappings as @mappings' do
|
||||
mapping = Mapping.create! valid_attributes
|
||||
get :index, {}, valid_session
|
||||
expect(assigns(:mappings)).to eq([mapping])
|
||||
end
|
||||
let!(:mapping) { create(:mapping) }
|
||||
let(:valid_attributes) { mapping.attributes.except('id') }
|
||||
let(:invalid_attributes) { { xloc: 0 } }
|
||||
before :each do
|
||||
sign_in
|
||||
end
|
||||
|
||||
describe 'GET #show' do
|
||||
it 'assigns the requested mapping as @mapping' do
|
||||
mapping = Mapping.create! valid_attributes
|
||||
get :show, { id: mapping.to_param }, valid_session
|
||||
expect(assigns(:mapping)).to eq(mapping)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'GET #edit' do
|
||||
it 'assigns the requested mapping as @mapping' do
|
||||
mapping = Mapping.create! valid_attributes
|
||||
get :edit, { id: mapping.to_param }, valid_session
|
||||
get :show, { id: mapping.to_param }
|
||||
expect(assigns(:mapping)).to eq(mapping)
|
||||
end
|
||||
end
|
||||
|
@ -63,98 +19,56 @@ RSpec.describe MappingsController, type: :controller do
|
|||
context 'with valid params' do
|
||||
it 'creates a new Mapping' do
|
||||
expect do
|
||||
post :create, { mapping: valid_attributes }, valid_session
|
||||
post :create, { mapping: valid_attributes }
|
||||
end.to change(Mapping, :count).by(1)
|
||||
end
|
||||
|
||||
it 'assigns a newly created mapping as @mapping' do
|
||||
post :create, { mapping: valid_attributes }, valid_session
|
||||
post :create, { mapping: valid_attributes }
|
||||
expect(assigns(:mapping)).to be_a(Mapping)
|
||||
expect(assigns(:mapping)).to be_persisted
|
||||
end
|
||||
|
||||
it 'redirects to the created mapping' do
|
||||
post :create, { mapping: valid_attributes }, valid_session
|
||||
expect(response).to redirect_to(Mapping.last)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with invalid params' do
|
||||
it 'assigns a newly created but unsaved mapping as @mapping' do
|
||||
post :create, { mapping: invalid_attributes }, valid_session
|
||||
post :create, { mapping: invalid_attributes }
|
||||
expect(assigns(:mapping)).to be_a_new(Mapping)
|
||||
end
|
||||
|
||||
it "re-renders the 'new' template" do
|
||||
post :create, { mapping: invalid_attributes }, valid_session
|
||||
expect(response).to render_template('new')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'PUT #update' do
|
||||
context 'with valid params' do
|
||||
let(:new_attributes) do
|
||||
skip('Add a hash of attributes valid for your model')
|
||||
end
|
||||
let(:new_attributes) { build(:mapping_random_location).attributes.except('id') }
|
||||
|
||||
it 'updates the requested mapping' do
|
||||
mapping = Mapping.create! valid_attributes
|
||||
put :update,
|
||||
{ id: mapping.to_param, mapping: new_attributes },
|
||||
valid_session
|
||||
{ id: mapping.to_param, mapping: new_attributes }
|
||||
mapping.reload
|
||||
skip('Add assertions for updated state')
|
||||
end
|
||||
|
||||
it 'assigns the requested mapping as @mapping' do
|
||||
mapping = Mapping.create! valid_attributes
|
||||
put :update,
|
||||
{ id: mapping.to_param, mapping: valid_attributes },
|
||||
valid_session
|
||||
{ id: mapping.to_param, mapping: valid_attributes }
|
||||
expect(assigns(:mapping)).to eq(mapping)
|
||||
end
|
||||
|
||||
it 'redirects to the mapping' do
|
||||
mapping = Mapping.create! valid_attributes
|
||||
put :update,
|
||||
{ id: mapping.to_param, mapping: valid_attributes },
|
||||
valid_session
|
||||
expect(response).to redirect_to(mapping)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with invalid params' do
|
||||
it 'assigns the mapping as @mapping' do
|
||||
mapping = Mapping.create! valid_attributes
|
||||
put :update,
|
||||
{ id: mapping.to_param, mapping: invalid_attributes },
|
||||
valid_session
|
||||
{ id: mapping.to_param, mapping: invalid_attributes }
|
||||
expect(assigns(:mapping)).to eq(mapping)
|
||||
end
|
||||
|
||||
it "re-renders the 'edit' template" do
|
||||
mapping = Mapping.create! valid_attributes
|
||||
put :update,
|
||||
{ id: mapping.to_param, mapping: invalid_attributes },
|
||||
valid_session
|
||||
expect(response).to render_template('edit')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'DELETE #destroy' do
|
||||
it 'destroys the requested mapping' do
|
||||
mapping = Mapping.create! valid_attributes
|
||||
expect do
|
||||
delete :destroy, { id: mapping.to_param }, valid_session
|
||||
delete :destroy, { id: mapping.to_param }
|
||||
end.to change(Mapping, :count).by(-1)
|
||||
end
|
||||
|
||||
it 'redirects to the mappings list' do
|
||||
mapping = Mapping.create! valid_attributes
|
||||
delete :destroy, { id: mapping.to_param }, valid_session
|
||||
expect(response).to redirect_to(mappings_url)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,60 +1,30 @@
|
|||
require 'rails_helper'
|
||||
|
||||
# This spec was generated by rspec-rails when you ran the scaffold generator.
|
||||
# It demonstrates how one might use RSpec to specify the controller code that
|
||||
# was generated by Rails when you ran the scaffold generator.
|
||||
#
|
||||
# It assumes that the implementation code is generated by the rails scaffold
|
||||
# generator. If you are using any extension libraries to generate different
|
||||
# controller code, this generated spec may or may not pass.
|
||||
#
|
||||
# It only uses APIs available in rails and/or rspec-rails. There are a number
|
||||
# of tools you can use to make these specs even more expressive, but we're
|
||||
# sticking to rails and rspec-rails APIs to keep things simple and stable.
|
||||
#
|
||||
# Compared to earlier versions of this generator, there is very limited use of
|
||||
# stubs and message expectations in this spec. Stubs are only used when there
|
||||
# is no simpler way to get a handle on the object needed for the example.
|
||||
# Message expectations are only used when there is no simpler way to specify
|
||||
# that an instance is receiving a specific message.
|
||||
|
||||
RSpec.describe MapsController, type: :controller do
|
||||
# This should return the minimal set of attributes required to create a valid
|
||||
# Map. As you add validations to Map, be sure to
|
||||
# adjust the attributes here as well.
|
||||
let(:valid_attributes) do
|
||||
skip('Add a hash of attributes valid for your model')
|
||||
let(:map) { create(:map) }
|
||||
let(:valid_attributes) { map.attributes.except(:id) }
|
||||
let(:invalid_attributes) { { permission: :commons } }
|
||||
before :each do
|
||||
sign_in
|
||||
end
|
||||
|
||||
let(:invalid_attributes) do
|
||||
skip('Add a hash of attributes invalid for your model')
|
||||
end
|
||||
|
||||
# This should return the minimal set of values that should be in the session
|
||||
# in order to pass any filters (e.g. authentication) defined in
|
||||
# MapsController. Be sure to keep this updated too.
|
||||
let(:valid_session) { {} }
|
||||
|
||||
describe 'GET #index' do
|
||||
it 'assigns all maps as @maps' do
|
||||
map = Map.create! valid_attributes
|
||||
get :index, {}, valid_session
|
||||
it 'viewable maps as @maps' do
|
||||
get :index, {}
|
||||
expect(assigns(:maps)).to eq([map])
|
||||
end
|
||||
end
|
||||
|
||||
describe 'GET #contains' do
|
||||
it 'returns json matching schema' do
|
||||
get :contains, { id: map.to_param, format: :json }
|
||||
expect(response.body).to match_json_schema(:map_contains)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'GET #show' do
|
||||
it 'assigns the requested map as @map' do
|
||||
map = Map.create! valid_attributes
|
||||
get :show, { id: map.to_param }, valid_session
|
||||
expect(assigns(:map)).to eq(map)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'GET #edit' do
|
||||
it 'assigns the requested map as @map' do
|
||||
map = Map.create! valid_attributes
|
||||
get :edit, { id: map.to_param }, valid_session
|
||||
get :show, { id: map.to_param }
|
||||
expect(assigns(:map)).to eq(map)
|
||||
end
|
||||
end
|
||||
|
@ -62,99 +32,72 @@ RSpec.describe MapsController, type: :controller do
|
|||
describe 'POST #create' do
|
||||
context 'with valid params' do
|
||||
it 'creates a new Map' do
|
||||
map.reload
|
||||
expect do
|
||||
post :create, { map: valid_attributes }, valid_session
|
||||
post :create, valid_attributes.merge(format: :json)
|
||||
end.to change(Map, :count).by(1)
|
||||
end
|
||||
|
||||
it 'assigns a newly created map as @map' do
|
||||
post :create, { map: valid_attributes }, valid_session
|
||||
post :create, valid_attributes.merge(format: :json)
|
||||
expect(assigns(:map)).to be_a(Map)
|
||||
expect(assigns(:map)).to be_persisted
|
||||
end
|
||||
|
||||
it 'redirects to the created map' do
|
||||
post :create, { map: valid_attributes }, valid_session
|
||||
expect(response).to redirect_to(Map.last)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with invalid params' do
|
||||
it 'assigns a newly created but unsaved map as @map' do
|
||||
post :create, { map: invalid_attributes }, valid_session
|
||||
post :create, invalid_attributes.merge(format: :json)
|
||||
expect(assigns(:map)).to be_a_new(Map)
|
||||
end
|
||||
|
||||
it "re-renders the 'new' template" do
|
||||
post :create, { map: invalid_attributes }, valid_session
|
||||
expect(response).to render_template('new')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'PUT #update' do
|
||||
context 'with valid params' do
|
||||
let(:new_attributes) do
|
||||
skip('Add a hash of attributes valid for your model')
|
||||
end
|
||||
let(:new_attributes) { { name: "Uncool map", permission: :private } }
|
||||
|
||||
it 'updates the requested map' do
|
||||
map = Map.create! valid_attributes
|
||||
put :update,
|
||||
{ id: map.to_param, map: new_attributes },
|
||||
valid_session
|
||||
map.reload
|
||||
skip('Add assertions for updated state')
|
||||
{ id: map.to_param, map: new_attributes, format: :json }
|
||||
expect(assigns(:map).name).to eq "Uncool map"
|
||||
expect(assigns(:map).permission).to eq 'private'
|
||||
end
|
||||
|
||||
it 'assigns the requested map as @map' do
|
||||
map = Map.create! valid_attributes
|
||||
put :update,
|
||||
{ id: map.to_param, map: valid_attributes },
|
||||
valid_session
|
||||
{ id: map.to_param, map: valid_attributes, format: :json }
|
||||
expect(assigns(:map)).to eq(map)
|
||||
end
|
||||
|
||||
it 'redirects to the map' do
|
||||
map = Map.create! valid_attributes
|
||||
put :update,
|
||||
{ id: map.to_param, map: valid_attributes },
|
||||
valid_session
|
||||
expect(response).to redirect_to(map)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with invalid params' do
|
||||
it 'assigns the map as @map' do
|
||||
map = Map.create! valid_attributes
|
||||
put :update,
|
||||
{ id: map.to_param, map: invalid_attributes },
|
||||
valid_session
|
||||
{ id: map.to_param, map: invalid_attributes, format: :json }
|
||||
expect(assigns(:map)).to eq(map)
|
||||
end
|
||||
|
||||
it "re-renders the 'edit' template" do
|
||||
map = Map.create! valid_attributes
|
||||
put :update,
|
||||
{ id: map.to_param, map: invalid_attributes },
|
||||
valid_session
|
||||
expect(response).to render_template('edit')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'DELETE #destroy' do
|
||||
it 'destroys the requested map' do
|
||||
map = Map.create! valid_attributes
|
||||
let(:unowned_map) { create(:map) }
|
||||
let(:owned_map) { create(:map, user: controller.current_user) }
|
||||
|
||||
it 'prevents deletion by non-owners' do
|
||||
unowned_map.reload
|
||||
expect do
|
||||
delete :destroy, { id: map.to_param }, valid_session
|
||||
end.to change(Map, :count).by(-1)
|
||||
delete :destroy, { id: unowned_map.to_param, format: :json }
|
||||
end.to change(Map, :count).by(0)
|
||||
expect(response.body).to eq("unauthorized")
|
||||
end
|
||||
|
||||
it 'redirects to the maps list' do
|
||||
map = Map.create! valid_attributes
|
||||
delete :destroy, { id: map.to_param }, valid_session
|
||||
expect(response).to redirect_to(maps_url)
|
||||
it 'deletes owned map' do
|
||||
owned_map.reload # ensure it's in the database
|
||||
expect do
|
||||
delete :destroy, { id: owned_map.to_param, format: :json }
|
||||
end.to change(Map, :count).by(-1)
|
||||
expect(response.body).to eq("success")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,72 +1,30 @@
|
|||
require 'rails_helper'
|
||||
|
||||
# This spec was generated by rspec-rails when you ran the scaffold generator.
|
||||
# It demonstrates how one might use RSpec to specify the controller code that
|
||||
# was generated by Rails when you ran the scaffold generator.
|
||||
#
|
||||
# It assumes that the implementation code is generated by the rails scaffold
|
||||
# generator. If you are using any extension libraries to generate different
|
||||
# controller code, this generated spec may or may not pass.
|
||||
#
|
||||
# It only uses APIs available in rails and/or rspec-rails. There are a number
|
||||
# of tools you can use to make these specs even more expressive, but we're
|
||||
# sticking to rails and rspec-rails APIs to keep things simple and stable.
|
||||
#
|
||||
# Compared to earlier versions of this generator, there is very limited use of
|
||||
# stubs and message expectations in this spec. Stubs are only used when there
|
||||
# is no simpler way to get a handle on the object needed for the example.
|
||||
# Message expectations are only used when there is no simpler way to specify
|
||||
# that an instance is receiving a specific message.
|
||||
|
||||
RSpec.describe MetacodesController, type: :controller do
|
||||
let(:metacode) { create(:metacode) }
|
||||
let(:valid_attributes) { metacode.attributes.except('id') }
|
||||
before :each do
|
||||
@user = create(:user, admin: true)
|
||||
sign_in @user
|
||||
sign_in create(:user, admin: true)
|
||||
end
|
||||
|
||||
# This should return the minimal set of attributes required to create a valid
|
||||
# Metacode. As you add validations to Metacode, be sure to
|
||||
# adjust the attributes here as well.
|
||||
let(:valid_attributes) do
|
||||
skip('Add a hash of attributes valid for your model')
|
||||
end
|
||||
|
||||
let(:invalid_attributes) do
|
||||
skip('Add a hash of attributes invalid for your model')
|
||||
end
|
||||
|
||||
# This should return the minimal set of values that should be in the session
|
||||
# in order to pass any filters (e.g. authentication) defined in
|
||||
# MetacodesController. Be sure to keep this updated too.
|
||||
let(:valid_session) { {} }
|
||||
|
||||
describe 'GET #index' do
|
||||
it 'assigns all metacodes as @metacodes' do
|
||||
metacode = Metacode.create! valid_attributes
|
||||
get :index, {}, valid_session
|
||||
expect(assigns(:metacodes)).to eq([metacode])
|
||||
end
|
||||
end
|
||||
|
||||
describe 'GET #show' do
|
||||
it 'assigns the requested metacode as @metacode' do
|
||||
metacode = Metacode.create! valid_attributes
|
||||
get :show, { id: metacode.to_param }, valid_session
|
||||
expect(assigns(:metacode)).to eq(metacode)
|
||||
metacode.reload # ensure it's created
|
||||
get :index, {}
|
||||
expect(Metacode.all.to_a).to eq([metacode])
|
||||
end
|
||||
end
|
||||
|
||||
describe 'GET #new' do
|
||||
it 'assigns a new metacode as @metacode' do
|
||||
get :new, {}, valid_session
|
||||
get :new, { format: :json }
|
||||
expect(assigns(:metacode)).to be_a_new(Metacode)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'GET #edit' do
|
||||
it 'assigns the requested metacode as @metacode' do
|
||||
metacode = Metacode.create! valid_attributes
|
||||
get :edit, { id: metacode.to_param }, valid_session
|
||||
get :edit, { id: metacode.to_param }
|
||||
expect(assigns(:metacode)).to eq(metacode)
|
||||
end
|
||||
end
|
||||
|
@ -74,32 +32,22 @@ RSpec.describe MetacodesController, type: :controller do
|
|||
describe 'POST #create' do
|
||||
context 'with valid params' do
|
||||
it 'creates a new Metacode' do
|
||||
metacode.reload # ensure it's present to start
|
||||
expect do
|
||||
post :create, { metacode: valid_attributes }, valid_session
|
||||
post :create, { metacode: valid_attributes }
|
||||
end.to change(Metacode, :count).by(1)
|
||||
end
|
||||
|
||||
it 'assigns a newly created metacode as @metacode' do
|
||||
post :create, { metacode: valid_attributes }, valid_session
|
||||
it 'has the correct attributes' do
|
||||
post :create, { metacode: valid_attributes }
|
||||
# expect(Metacode.last.attributes.expect(:id)).to eq(metacode.attributes.except(:id))
|
||||
expect(assigns(:metacode)).to be_a(Metacode)
|
||||
expect(assigns(:metacode)).to be_persisted
|
||||
end
|
||||
|
||||
it 'redirects to the created metacode' do
|
||||
post :create, { metacode: valid_attributes }, valid_session
|
||||
expect(response).to redirect_to(Metacode.last)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with invalid params' do
|
||||
it 'assigns a newly created but unsaved metacode as @metacode' do
|
||||
post :create, { metacode: invalid_attributes }, valid_session
|
||||
expect(assigns(:metacode)).to be_a_new(Metacode)
|
||||
end
|
||||
|
||||
it "re-renders the 'new' template" do
|
||||
post :create, { metacode: invalid_attributes }, valid_session
|
||||
expect(response).to render_template('new')
|
||||
it 'redirects to the metacode index' do
|
||||
post :create, { metacode: valid_attributes }
|
||||
expect(response).to redirect_to(metacodes_url)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -107,66 +55,34 @@ RSpec.describe MetacodesController, type: :controller do
|
|||
describe 'PUT #update' do
|
||||
context 'with valid params' do
|
||||
let(:new_attributes) do
|
||||
skip('Add a hash of attributes valid for your model')
|
||||
{ manual_icon: 'https://newimages.ca/cool-image.jpg',
|
||||
aws_icon: nil,
|
||||
color: '#ffffff',
|
||||
name: 'Cognition' }
|
||||
end
|
||||
|
||||
it 'updates the requested metacode' do
|
||||
metacode = Metacode.create! valid_attributes
|
||||
put :update,
|
||||
{ id: metacode.to_param, metacode: new_attributes },
|
||||
valid_session
|
||||
{ id: metacode.to_param, metacode: new_attributes }
|
||||
metacode.reload
|
||||
skip('Add assertions for updated state')
|
||||
end
|
||||
|
||||
it 'assigns the requested metacode as @metacode' do
|
||||
metacode = Metacode.create! valid_attributes
|
||||
put :update,
|
||||
{ id: metacode.to_param, metacode: valid_attributes },
|
||||
valid_session
|
||||
expect(assigns(:metacode)).to eq(metacode)
|
||||
end
|
||||
|
||||
it 'redirects to the metacode' do
|
||||
metacode = Metacode.create! valid_attributes
|
||||
put :update,
|
||||
{ id: metacode.to_param, metacode: valid_attributes },
|
||||
valid_session
|
||||
expect(response).to redirect_to(metacode)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with invalid params' do
|
||||
it 'assigns the metacode as @metacode' do
|
||||
metacode = Metacode.create! valid_attributes
|
||||
put :update,
|
||||
{ id: metacode.to_param, metacode: invalid_attributes },
|
||||
valid_session
|
||||
expect(assigns(:metacode)).to eq(metacode)
|
||||
end
|
||||
|
||||
it "re-renders the 'edit' template" do
|
||||
metacode = Metacode.create! valid_attributes
|
||||
put :update,
|
||||
{ id: metacode.to_param, metacode: invalid_attributes },
|
||||
valid_session
|
||||
expect(response).to render_template('edit')
|
||||
expect(metacode.icon).to eq 'https://newimages.ca/cool-image.jpg'
|
||||
expect(metacode.color).to eq '#ffffff'
|
||||
expect(metacode.name).to eq 'Cognition'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'DELETE #destroy' do
|
||||
it 'destroys the requested metacode' do
|
||||
metacode = Metacode.create! valid_attributes
|
||||
expect do
|
||||
delete :destroy, { id: metacode.to_param }, valid_session
|
||||
end.to change(Metacode, :count).by(-1)
|
||||
context 'not admin' do
|
||||
it 'denies access to create' do
|
||||
sign_in create(:user, admin: false)
|
||||
post :create, { metacode: valid_attributes }
|
||||
expect(response).to redirect_to root_url
|
||||
end
|
||||
|
||||
it 'redirects to the metacodes list' do
|
||||
metacode = Metacode.create! valid_attributes
|
||||
delete :destroy, { id: metacode.to_param }, valid_session
|
||||
expect(response).to redirect_to(metacodes_url)
|
||||
it 'denies access to update' do
|
||||
sign_in create(:user, admin: false)
|
||||
post :update, { id: metacode.to_param, metacode: valid_attributes }
|
||||
expect(response).to redirect_to root_url
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,60 +1,16 @@
|
|||
require 'rails_helper'
|
||||
|
||||
# This spec was generated by rspec-rails when you ran the scaffold generator.
|
||||
# It demonstrates how one might use RSpec to specify the controller code that
|
||||
# was generated by Rails when you ran the scaffold generator.
|
||||
#
|
||||
# It assumes that the implementation code is generated by the rails scaffold
|
||||
# generator. If you are using any extension libraries to generate different
|
||||
# controller code, this generated spec may or may not pass.
|
||||
#
|
||||
# It only uses APIs available in rails and/or rspec-rails. There are a number
|
||||
# of tools you can use to make these specs even more expressive, but we're
|
||||
# sticking to rails and rspec-rails APIs to keep things simple and stable.
|
||||
#
|
||||
# Compared to earlier versions of this generator, there is very limited use of
|
||||
# stubs and message expectations in this spec. Stubs are only used when there
|
||||
# is no simpler way to get a handle on the object needed for the example.
|
||||
# Message expectations are only used when there is no simpler way to specify
|
||||
# that an instance is receiving a specific message.
|
||||
|
||||
RSpec.describe SynapsesController, type: :controller do
|
||||
# This should return the minimal set of attributes required to create a valid
|
||||
# Synapse. As you add validations to Synapse, be sure to
|
||||
# adjust the attributes here as well.
|
||||
let(:valid_attributes) do
|
||||
skip('Add a hash of attributes valid for your model')
|
||||
end
|
||||
|
||||
let(:invalid_attributes) do
|
||||
skip('Add a hash of attributes invalid for your model')
|
||||
end
|
||||
|
||||
# This should return the minimal set of values that should be in the session
|
||||
# in order to pass any filters (e.g. authentication) defined in
|
||||
# SynapsesController. Be sure to keep this updated too.
|
||||
let(:valid_session) { {} }
|
||||
|
||||
describe 'GET #index' do
|
||||
it 'assigns all synapses as @synapses' do
|
||||
synapse = Synapse.create! valid_attributes
|
||||
get :index, {}, valid_session
|
||||
expect(assigns(:synapses)).to eq([synapse])
|
||||
end
|
||||
let(:synapse) { create(:synapse) }
|
||||
let(:valid_attributes) { synapse.attributes.except('id') }
|
||||
let(:invalid_attributes) { { permission: :invalid_lol } }
|
||||
before :each do
|
||||
sign_in
|
||||
end
|
||||
|
||||
describe 'GET #show' do
|
||||
it 'assigns the requested synapse as @synapse' do
|
||||
synapse = Synapse.create! valid_attributes
|
||||
get :show, { id: synapse.to_param }, valid_session
|
||||
expect(assigns(:synapse)).to eq(synapse)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'GET #edit' do
|
||||
it 'assigns the requested synapse as @synapse' do
|
||||
synapse = Synapse.create! valid_attributes
|
||||
get :edit, { id: synapse.to_param }, valid_session
|
||||
get :show, { id: synapse.to_param, format: :json }
|
||||
expect(assigns(:synapse)).to eq(synapse)
|
||||
end
|
||||
end
|
||||
|
@ -62,32 +18,28 @@ RSpec.describe SynapsesController, type: :controller do
|
|||
describe 'POST #create' do
|
||||
context 'with valid params' do
|
||||
it 'creates a new Synapse' do
|
||||
synapse.reload # ensure it's present
|
||||
expect do
|
||||
post :create, { synapse: valid_attributes }, valid_session
|
||||
post :create, { synapse: valid_attributes, format: :json }
|
||||
end.to change(Synapse, :count).by(1)
|
||||
end
|
||||
|
||||
it 'assigns a newly created synapse as @synapse' do
|
||||
post :create, { synapse: valid_attributes }, valid_session
|
||||
post :create, { synapse: valid_attributes, format: :json }
|
||||
expect(assigns(:synapse)).to be_a(Synapse)
|
||||
expect(assigns(:synapse)).to be_persisted
|
||||
end
|
||||
|
||||
it 'redirects to the created synapse' do
|
||||
post :create, { synapse: valid_attributes }, valid_session
|
||||
expect(response).to redirect_to(Synapse.last)
|
||||
it 'returns 201 CREATED' do
|
||||
post :create, { synapse: valid_attributes, format: :json }
|
||||
expect(response.status).to eq 201
|
||||
end
|
||||
end
|
||||
|
||||
context 'with invalid params' do
|
||||
it 'assigns a newly created but unsaved synapse as @synapse' do
|
||||
post :create, { synapse: invalid_attributes }, valid_session
|
||||
expect(assigns(:synapse)).to be_a_new(Synapse)
|
||||
end
|
||||
|
||||
it "re-renders the 'new' template" do
|
||||
post :create, { synapse: invalid_attributes }, valid_session
|
||||
expect(response).to render_template('new')
|
||||
it 'returns 422 UNPROCESSABLE ENTITY' do
|
||||
post :create, { synapse: invalid_attributes, format: :json }
|
||||
expect(response.status).to eq 422
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -95,66 +47,49 @@ RSpec.describe SynapsesController, type: :controller do
|
|||
describe 'PUT #update' do
|
||||
context 'with valid params' do
|
||||
let(:new_attributes) do
|
||||
skip('Add a hash of attributes valid for your model')
|
||||
{ desc: 'My new description',
|
||||
category: 'both',
|
||||
permission: :public }
|
||||
end
|
||||
|
||||
it 'updates the requested synapse' do
|
||||
synapse = Synapse.create! valid_attributes
|
||||
put :update,
|
||||
{ id: synapse.to_param, synapse: new_attributes },
|
||||
valid_session
|
||||
{ id: synapse.to_param, synapse: new_attributes, format: :json }
|
||||
synapse.reload
|
||||
skip('Add assertions for updated state')
|
||||
expect(synapse.desc).to eq 'My new description'
|
||||
expect(synapse.category).to eq 'both'
|
||||
expect(synapse.permission).to eq 'public'
|
||||
end
|
||||
|
||||
it 'assigns the requested synapse as @synapse' do
|
||||
synapse = Synapse.create! valid_attributes
|
||||
it 'returns 204 NO CONTENT' do
|
||||
put :update,
|
||||
{ id: synapse.to_param, synapse: valid_attributes },
|
||||
valid_session
|
||||
expect(assigns(:synapse)).to eq(synapse)
|
||||
end
|
||||
|
||||
it 'redirects to the synapse' do
|
||||
synapse = Synapse.create! valid_attributes
|
||||
put :update,
|
||||
{ id: synapse.to_param, synapse: valid_attributes },
|
||||
valid_session
|
||||
expect(response).to redirect_to(synapse)
|
||||
{ id: synapse.to_param, synapse: valid_attributes, format: :json }
|
||||
expect(response.status).to eq 204
|
||||
end
|
||||
end
|
||||
|
||||
context 'with invalid params' do
|
||||
it 'assigns the synapse as @synapse' do
|
||||
synapse = Synapse.create! valid_attributes
|
||||
put :update,
|
||||
{ id: synapse.to_param, synapse: invalid_attributes },
|
||||
valid_session
|
||||
{ id: synapse.to_param, synapse: invalid_attributes, format: :json }
|
||||
expect(assigns(:synapse)).to eq(synapse)
|
||||
end
|
||||
|
||||
it "re-renders the 'edit' template" do
|
||||
synapse = Synapse.create! valid_attributes
|
||||
put :update,
|
||||
{ id: synapse.to_param, synapse: invalid_attributes },
|
||||
valid_session
|
||||
expect(response).to render_template('edit')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'DELETE #destroy' do
|
||||
let(:synapse) { create(:synapse, user: controller.current_user) }
|
||||
|
||||
it 'destroys the requested synapse' do
|
||||
synapse = Synapse.create! valid_attributes
|
||||
synapse.reload # ensure it's present
|
||||
expect do
|
||||
delete :destroy, { id: synapse.to_param }, valid_session
|
||||
delete :destroy, { id: synapse.to_param, format: :json }
|
||||
end.to change(Synapse, :count).by(-1)
|
||||
end
|
||||
|
||||
it 'redirects to the synapses list' do
|
||||
synapse = Synapse.create! valid_attributes
|
||||
delete :destroy, { id: synapse.to_param }, valid_session
|
||||
expect(response).to redirect_to(synapses_url)
|
||||
it 'returns 204 NO CONTENT' do
|
||||
delete :destroy, { id: synapse.to_param, format: :json }
|
||||
expect(response.status).to eq 204
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,36 +1,16 @@
|
|||
require 'rails_helper'
|
||||
|
||||
RSpec.describe TopicsController, type: :controller do
|
||||
let(:valid_attributes) do
|
||||
skip('Add a hash of attributes valid for your model')
|
||||
end
|
||||
|
||||
let(:invalid_attributes) do
|
||||
skip('Add a hash of attributes invalid for your model')
|
||||
end
|
||||
|
||||
let(:valid_session) { {} }
|
||||
|
||||
describe 'GET #index' do
|
||||
it 'assigns all topics as @topics' do
|
||||
topic = Topic.create! valid_attributes
|
||||
get :index, {}, valid_session
|
||||
expect(assigns(:topics)).to eq([topic])
|
||||
end
|
||||
let(:topic) { create(:topic) }
|
||||
let(:valid_attributes) { topic.attributes.except('id') }
|
||||
let(:invalid_attributes) { { permission: :invalid_lol } }
|
||||
before :each do
|
||||
sign_in
|
||||
end
|
||||
|
||||
describe 'GET #show' do
|
||||
it 'assigns the requested topic as @topic' do
|
||||
topic = Topic.create! valid_attributes
|
||||
get :show, { id: topic.to_param }, valid_session
|
||||
expect(assigns(:topic)).to eq(topic)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'GET #edit' do
|
||||
it 'assigns the requested topic as @topic' do
|
||||
topic = Topic.create! valid_attributes
|
||||
get :edit, { id: topic.to_param }, valid_session
|
||||
get :show, { id: topic.to_param, format: :json }
|
||||
expect(assigns(:topic)).to eq(topic)
|
||||
end
|
||||
end
|
||||
|
@ -38,99 +18,85 @@ RSpec.describe TopicsController, type: :controller do
|
|||
describe 'POST #create' do
|
||||
context 'with valid params' do
|
||||
it 'creates a new Topic' do
|
||||
topic.reload # ensure it's created
|
||||
expect do
|
||||
post :create, { topic: valid_attributes }, valid_session
|
||||
post :create, { topic: valid_attributes, format: :json }
|
||||
end.to change(Topic, :count).by(1)
|
||||
end
|
||||
|
||||
it 'assigns a newly created topic as @topic' do
|
||||
post :create, { topic: valid_attributes }, valid_session
|
||||
post :create, { topic: valid_attributes, format: :json }
|
||||
expect(assigns(:topic)).to be_a(Topic)
|
||||
expect(assigns(:topic)).to be_persisted
|
||||
end
|
||||
|
||||
it 'redirects to the created topic' do
|
||||
post :create, { topic: valid_attributes }, valid_session
|
||||
expect(response).to redirect_to(Topic.last)
|
||||
it 'returns 201 CREATED' do
|
||||
post :create, { topic: valid_attributes, format: :json }
|
||||
expect(response.status).to eq 201
|
||||
end
|
||||
end
|
||||
|
||||
context 'with invalid params' do
|
||||
it 'assigns a newly created but unsaved topic as @topic' do
|
||||
post :create, { topic: invalid_attributes }, valid_session
|
||||
post :create, { topic: invalid_attributes, format: :json }
|
||||
expect(assigns(:topic)).to be_a_new(Topic)
|
||||
end
|
||||
|
||||
it "re-renders the 'new' template" do
|
||||
post :create, { topic: invalid_attributes }, valid_session
|
||||
expect(response).to render_template('new')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'PUT #update' do
|
||||
context 'with valid params' do
|
||||
let(:new_attributes) do
|
||||
skip('Add a hash of attributes valid for your model')
|
||||
{ name: 'Cool Topic with no number',
|
||||
desc: 'This is a cool topic.',
|
||||
link: 'https://cool-topics.com/4',
|
||||
permission: :public }
|
||||
end
|
||||
|
||||
it 'updates the requested topic' do
|
||||
topic = Topic.create! valid_attributes
|
||||
put :update,
|
||||
{ id: topic.to_param, topic: new_attributes },
|
||||
valid_session
|
||||
{ id: topic.to_param, topic: new_attributes, format: :json }
|
||||
topic.reload
|
||||
skip('Add assertions for updated state')
|
||||
expect(topic.name).to eq 'Cool Topic with no number'
|
||||
expect(topic.desc).to eq 'This is a cool topic.'
|
||||
expect(topic.link).to eq 'https://cool-topics.com/4'
|
||||
expect(topic.permission).to eq 'public'
|
||||
end
|
||||
|
||||
it 'assigns the requested topic as @topic' do
|
||||
topic = Topic.create! valid_attributes
|
||||
put :update,
|
||||
{ id: topic.to_param, topic: valid_attributes },
|
||||
valid_session
|
||||
{ id: topic.to_param, topic: valid_attributes, format: :json }
|
||||
expect(assigns(:topic)).to eq(topic)
|
||||
end
|
||||
|
||||
it 'redirects to the topic' do
|
||||
topic = Topic.create! valid_attributes
|
||||
it 'returns status of no content' do
|
||||
put :update,
|
||||
{ id: topic.to_param, topic: valid_attributes },
|
||||
valid_session
|
||||
expect(response).to redirect_to(topic)
|
||||
{ id: topic.to_param, topic: valid_attributes, format: :json }
|
||||
expect(response.status).to eq 204
|
||||
end
|
||||
end
|
||||
|
||||
context 'with invalid params' do
|
||||
it 'assigns the topic as @topic' do
|
||||
topic = Topic.create! valid_attributes
|
||||
put :update,
|
||||
{ id: topic.to_param, topic: invalid_attributes },
|
||||
valid_session
|
||||
{ id: topic.to_param, topic: invalid_attributes, format: :json }
|
||||
expect(assigns(:topic)).to eq(topic)
|
||||
end
|
||||
|
||||
it "re-renders the 'edit' template" do
|
||||
topic = Topic.create! valid_attributes
|
||||
put :update,
|
||||
{ id: topic.to_param, topic: invalid_attributes },
|
||||
valid_session
|
||||
expect(response).to render_template('edit')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'DELETE #destroy' do
|
||||
let(:owned_topic) { create(:topic, user: controller.current_user) }
|
||||
it 'destroys the requested topic' do
|
||||
topic = Topic.create! valid_attributes
|
||||
owned_topic.reload # ensure it's there
|
||||
expect do
|
||||
delete :destroy, { id: topic.to_param }, valid_session
|
||||
delete :destroy, { id: owned_topic.to_param, format: :json }
|
||||
end.to change(Topic, :count).by(-1)
|
||||
end
|
||||
|
||||
it 'redirects to the topics list' do
|
||||
topic = Topic.create! valid_attributes
|
||||
delete :destroy, { id: topic.to_param }, valid_session
|
||||
expect(response).to redirect_to(topics_url)
|
||||
it 'return 204 NO CONTENT' do
|
||||
delete :destroy, { id: topic.to_param, format: :json }
|
||||
expect(response.status).to eq 204
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
14
spec/factories/mappings.rb
Normal file
14
spec/factories/mappings.rb
Normal file
|
@ -0,0 +1,14 @@
|
|||
FactoryGirl.define do
|
||||
factory :mapping do
|
||||
xloc 0
|
||||
yloc 0
|
||||
map
|
||||
user
|
||||
association :mappable, factory: :topic
|
||||
|
||||
factory :mapping_random_location do
|
||||
xloc { rand(-100...100) }
|
||||
yloc { rand(-100...100) }
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,4 +1,8 @@
|
|||
FactoryGirl.define do
|
||||
factory :metacode do
|
||||
sequence(:name) { |n| "Cool Metacode ##{n}" }
|
||||
manual_icon 'https://images.com/image.png'
|
||||
aws_icon nil
|
||||
color '#cccccc'
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
FactoryGirl.define do
|
||||
factory :synapse do
|
||||
sequence(:desc) { |n| "Cool synapse ##{n}" }
|
||||
category :to
|
||||
category :'from-to'
|
||||
permission :commons
|
||||
association :topic1, factory: :topic
|
||||
association :topic2, factory: :topic
|
||||
user
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,5 +1,11 @@
|
|||
require 'rails_helper'
|
||||
|
||||
RSpec.describe Mapping, type: :model do
|
||||
pending "add some examples to (or delete) #{__FILE__}"
|
||||
it { is_expected.to belong_to :user }
|
||||
it { is_expected.to belong_to :map }
|
||||
it { is_expected.to belong_to :mappable }
|
||||
it { is_expected.to validate_presence_of :xloc }
|
||||
it { is_expected.to validate_presence_of :yloc }
|
||||
it { is_expected.to validate_presence_of :map }
|
||||
it { is_expected.to validate_presence_of :mappable }
|
||||
end
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
require 'rails_helper'
|
||||
|
||||
RSpec.describe Metacode, type: :model do
|
||||
pending "add some examples to (or delete) #{__FILE__}"
|
||||
it { is_expected.to have_many(:topics) }
|
||||
it { is_expected.to have_many :topics }
|
||||
it { is_expected.to have_many :metacode_sets }
|
||||
end
|
||||
|
|
|
@ -8,6 +8,7 @@ RSpec.describe Synapse, type: :model do
|
|||
it { is_expected.to have_many :mappings }
|
||||
it { is_expected.to validate_presence_of :permission }
|
||||
it { is_expected.to validate_inclusion_of(:permission).in_array Perm::ISSIONS.map(&:to_s) }
|
||||
it { is_expected.to validate_inclusion_of(:category).in_array ['from-to', 'both'] }
|
||||
it { is_expected.to validate_length_of(:desc).is_at_least(0) } # TODO don't allow nil
|
||||
|
||||
context 'permissions' do
|
||||
|
|
0
spec/schemas/map.json
Normal file
0
spec/schemas/map.json
Normal file
42
spec/schemas/map_contains.json
Normal file
42
spec/schemas/map_contains.json
Normal file
|
@ -0,0 +1,42 @@
|
|||
{
|
||||
"name": "Map Contents",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"map": {
|
||||
"type": "object"
|
||||
},
|
||||
"topics": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object"
|
||||
}
|
||||
},
|
||||
"synapses": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object"
|
||||
}
|
||||
},
|
||||
"mappings": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object"
|
||||
}
|
||||
},
|
||||
"mappers": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"map",
|
||||
"topics",
|
||||
"synapses",
|
||||
"mappings",
|
||||
"mappers"
|
||||
]
|
||||
}
|
||||
|
||||
|
|
@ -1,3 +1,6 @@
|
|||
require 'simplecov'
|
||||
require 'support/controller_helpers'
|
||||
|
||||
RSpec.configure do |config|
|
||||
config.expect_with :rspec do |expectations|
|
||||
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
# https://github.com/plataformatec/devise/wiki/How-To:-Stub-authentication-in-controller-specs
|
||||
|
||||
require 'devise'
|
||||
|
||||
module ControllerHelpers
|
||||
# rubocop:disable Metrics/AbcSize
|
||||
def sign_in(user = create(:user))
|
||||
|
@ -7,6 +10,7 @@ module ControllerHelpers
|
|||
receive(:authenticate!).and_throw(:warden, scope: :user)
|
||||
)
|
||||
else # simulate authenticated
|
||||
allow_message_expectations_on_nil
|
||||
allow(request.env['warden']).to(
|
||||
receive(:authenticate!).and_return(user)
|
||||
)
|
||||
|
@ -15,3 +19,8 @@ module ControllerHelpers
|
|||
end
|
||||
# rubocop:enable Metrics/AbcSize
|
||||
end
|
||||
|
||||
RSpec.configure do |config|
|
||||
config.include Devise::TestHelpers, :type => :controller
|
||||
config.include ControllerHelpers, :type => :controller
|
||||
end
|
||||
|
|
7
spec/support/schema_matcher.rb
Normal file
7
spec/support/schema_matcher.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
RSpec::Matchers.define :match_json_schema do |schema|
|
||||
match do |json|
|
||||
schema_directory = Rails.root.join('spec', 'schemas').to_s
|
||||
schema_path = "#{schema_directory}/#{schema}.json"
|
||||
JSON::Validator.validate!(schema_path, json)
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue