triannon 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +42 -0
- data/Rakefile +71 -0
- data/app/assets/javascripts/triannon/annotations.js +2 -0
- data/app/assets/javascripts/triannon/application.js +15 -0
- data/app/assets/stylesheets/triannon/annotations.css +4 -0
- data/app/assets/stylesheets/triannon/application.css.scss +18 -0
- data/app/controllers/triannon/annotations_controller.rb +62 -0
- data/app/controllers/triannon/application_controller.rb +4 -0
- data/app/helpers/triannon/annotations_helper.rb +4 -0
- data/app/helpers/triannon/application_helper.rb +4 -0
- data/app/models/triannon/annotation.rb +134 -0
- data/app/models/triannon/graph_validator.rb +33 -0
- data/app/views/layouts/triannon/application.html.erb +37 -0
- data/app/views/triannon/annotations/_form.html.erb +21 -0
- data/app/views/triannon/annotations/edit.html.erb +1 -0
- data/app/views/triannon/annotations/index.html.erb +8 -0
- data/app/views/triannon/annotations/new.html.erb +1 -0
- data/app/views/triannon/annotations/show.html.erb +32 -0
- data/config/routes.rb +5 -0
- data/db/migrate/20140912173046_create_triannon_annotations.rb +9 -0
- data/lib/generators/triannon/install_generator.rb +9 -0
- data/lib/tasks/triannon_tasks.rake +6 -0
- data/lib/triannon.rb +7 -0
- data/lib/triannon/engine.rb +5 -0
- data/lib/triannon/version.rb +3 -0
- metadata +225 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7c88a5ccc4b645bbb52d89183ed8fa42f49eda50
|
4
|
+
data.tar.gz: eb58660e72be33aa86bc66f0feb676d9cf2ed4ea
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 54bc08d30db5e0fd1a4e1a93d70ed2da19a3359586c3f1c995b7a5713a5c30635736443193f18ec327db3a21eca3b9b3ee65deb5e59034bd57417960e1ec6710
|
7
|
+
data.tar.gz: 5f9f0fa5b0384791e765719c989996782786bcfb019e90b62c31b84d0fe39cdb42d82198dc4fe750f36f8af4c5f0e5f10a0ce928ae4a85d06335c83bea1a96f5
|
data/README.md
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
[![Build Status](https://travis-ci.org/sul-dlss/triannon.svg?branch=master)](https://travis-ci.org/sul-dlss/triannon) [![Dependency Status](https://gemnasium.com/sul-dlss/triannon.svg)](https://gemnasium.com/sul-dlss/triannon) [![Gem Version](https://badge.fury.io/rb/triannon.svg)](http://badge.fury.io/rb/triannon)
|
2
|
+
|
3
|
+
# Triannon
|
4
|
+
|
5
|
+
Demonstration Open Annotation to support the Linked Data for Libraries use cases.
|
6
|
+
|
7
|
+
## Tests
|
8
|
+
|
9
|
+
Run tests:
|
10
|
+
|
11
|
+
```console
|
12
|
+
$ rake
|
13
|
+
```
|
14
|
+
|
15
|
+
## Installation
|
16
|
+
|
17
|
+
Add this line to your gemfile
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
gem 'triannon'
|
21
|
+
```
|
22
|
+
|
23
|
+
Then execute:
|
24
|
+
|
25
|
+
```console
|
26
|
+
$ bundle
|
27
|
+
```
|
28
|
+
|
29
|
+
Then run the triannon generator:
|
30
|
+
|
31
|
+
```console
|
32
|
+
$ rails g triannon:install
|
33
|
+
```
|
34
|
+
|
35
|
+
## Running the application in development
|
36
|
+
|
37
|
+
There is a bundled rake task for running the test app:
|
38
|
+
|
39
|
+
```console
|
40
|
+
$ rake engine_cart:generate # (first run only)
|
41
|
+
$ rake triannon:server
|
42
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
ZIP_URL = "https://github.com/projecthydra/hydra-jetty/archive/v8.0.0.rc2.zip"
|
8
|
+
|
9
|
+
require 'active_support/benchmarkable'
|
10
|
+
require 'jettywrapper'
|
11
|
+
|
12
|
+
require 'rdoc/task'
|
13
|
+
|
14
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
15
|
+
rdoc.rdoc_dir = 'rdoc'
|
16
|
+
rdoc.title = 'Triannon'
|
17
|
+
rdoc.options << '--line-numbers'
|
18
|
+
rdoc.rdoc_files.include('README.rdoc')
|
19
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
20
|
+
end
|
21
|
+
|
22
|
+
require 'engine_cart/rake_task'
|
23
|
+
desc 'run the triannon specs'
|
24
|
+
task :ci => ['engine_cart:generate', 'jetty:clean'] do
|
25
|
+
# run the tests
|
26
|
+
RAILS_ENV = 'test'
|
27
|
+
jetty_params = Jettywrapper.load_config.merge({:jetty_home => File.expand_path(File.dirname(__FILE__) + '/jetty')})
|
28
|
+
Jettywrapper.wrap(jetty_params) do
|
29
|
+
Rake::Task['spec'].invoke
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
namespace :triannon do
|
34
|
+
desc 'run the test rails app w triannon'
|
35
|
+
task :server do
|
36
|
+
jetty_params = Jettywrapper.load_config.merge({:jetty_home => File.expand_path(File.dirname(__FILE__) + '/jetty')})
|
37
|
+
Jettywrapper.wrap(jetty_params) do
|
38
|
+
within_test_app do
|
39
|
+
system "rails s"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
desc 'run the test rails console w triannon'
|
45
|
+
task :console do
|
46
|
+
jetty_params = Jettywrapper.load_config.merge({:jetty_home => File.expand_path(File.dirname(__FILE__) + '/jetty')})
|
47
|
+
Jettywrapper.wrap(jetty_params) do
|
48
|
+
within_test_app do
|
49
|
+
system "rails c"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
desc 'run the test rails console w triannon but no jetty'
|
55
|
+
task :console_no_jetty do
|
56
|
+
within_test_app do
|
57
|
+
system "rails c"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
load 'rails/tasks/statistics.rake'
|
64
|
+
|
65
|
+
require 'rspec/core/rake_task'
|
66
|
+
|
67
|
+
RSpec::Core::RakeTask.new(:spec)
|
68
|
+
|
69
|
+
task :default => :ci
|
70
|
+
|
71
|
+
Bundler::GemHelper.install_tasks
|
@@ -0,0 +1,15 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file.
|
9
|
+
//
|
10
|
+
// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
|
11
|
+
// about supported directives.
|
12
|
+
//
|
13
|
+
//= require jquery
|
14
|
+
//= require bootstrap-sprockets
|
15
|
+
//= require_tree .
|
@@ -0,0 +1,18 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any styles
|
10
|
+
* defined in the other CSS/SCSS files in this directory. It is generally better to create a new
|
11
|
+
* file per style scope.
|
12
|
+
*
|
13
|
+
*= require_tree .
|
14
|
+
*= require_self
|
15
|
+
*/
|
16
|
+
|
17
|
+
@import "bootstrap-sprockets";
|
18
|
+
@import "bootstrap";
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require_dependency "triannon/application_controller"
|
2
|
+
|
3
|
+
module Triannon
|
4
|
+
class AnnotationsController < ApplicationController
|
5
|
+
before_action :set_annotation, only: [:show, :edit, :update, :destroy]
|
6
|
+
|
7
|
+
# GET /annotations/annotations
|
8
|
+
def index
|
9
|
+
@annotations = Annotation.all
|
10
|
+
end
|
11
|
+
|
12
|
+
# GET /annotations/annotations/1
|
13
|
+
def show
|
14
|
+
end
|
15
|
+
|
16
|
+
# GET /annotations/annotations/new
|
17
|
+
def new
|
18
|
+
@annotation = Annotation.new
|
19
|
+
end
|
20
|
+
|
21
|
+
# GET /annotations/annotations/1/edit
|
22
|
+
def edit
|
23
|
+
end
|
24
|
+
|
25
|
+
# POST /annotations/annotations
|
26
|
+
def create
|
27
|
+
@annotation = Annotation.new(annotation_params)
|
28
|
+
|
29
|
+
if @annotation.save
|
30
|
+
redirect_to @annotation, notice: 'Annotation was successfully created.'
|
31
|
+
else
|
32
|
+
render :new
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# PATCH/PUT /annotations/annotations/1
|
37
|
+
def update
|
38
|
+
if @annotation.update(annotation_params)
|
39
|
+
redirect_to @annotation, notice: 'Annotation was successfully updated.'
|
40
|
+
else
|
41
|
+
render :edit
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# DELETE /annotations/annotations/1
|
46
|
+
def destroy
|
47
|
+
@annotation.destroy
|
48
|
+
redirect_to annotations_url, notice: 'Annotation was successfully destroyed.'
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
# Use callbacks to share common setup or constraints between actions.
|
53
|
+
def set_annotation
|
54
|
+
@annotation = Annotation.find(params[:id])
|
55
|
+
end
|
56
|
+
|
57
|
+
# Only allow a trusted parameter "white list" through.
|
58
|
+
def annotation_params
|
59
|
+
params.require(:annotation).permit(:data)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
module Triannon
|
2
|
+
class Annotation < ActiveRecord::Base
|
3
|
+
|
4
|
+
validates :data, presence: true,
|
5
|
+
length: {minimum: 30}
|
6
|
+
|
7
|
+
# full validation should be optional?
|
8
|
+
# minimal: a subject with the right type and a hasTarget? (see url)
|
9
|
+
# and perhaps modeled on this:
|
10
|
+
# https://github.com/uq-eresearch/lorestore/blob/3e9aa1c69aafd3692c69aa39c64bfdc32b757892/src/main/resources/OAConstraintsSPARQL.json
|
11
|
+
|
12
|
+
def url
|
13
|
+
if graph_exists?
|
14
|
+
solution = graph.query(self.class.basic_query)
|
15
|
+
if solution && solution.size == 1
|
16
|
+
solution.first.s.to_s
|
17
|
+
# TODO: raise exception if no URL?
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# FIXME: this should be part of validation: RDF.type should be RDF::OpenAnnotation.Annotation
|
23
|
+
def type
|
24
|
+
if graph_exists?
|
25
|
+
query = RDF::Query.new
|
26
|
+
query << [:s, RDF::OpenAnnotation.hasTarget, nil]
|
27
|
+
query << [:s, RDF.type, :type]
|
28
|
+
solution = graph.query(query)
|
29
|
+
if solution && solution.size == 1
|
30
|
+
solution.first.type.to_s
|
31
|
+
# TODO: raise exception if no type?
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def has_target
|
37
|
+
# FIXME: can have multiple targets per spec (example 8)
|
38
|
+
# FIXME: target might be more than a string (examples 14-17)
|
39
|
+
stmt = rdf.find_all { |s|
|
40
|
+
s.predicate.to_s == RDF::OpenAnnotation.hasTarget
|
41
|
+
}.first
|
42
|
+
stmt.object.to_str if stmt
|
43
|
+
end
|
44
|
+
|
45
|
+
def has_body
|
46
|
+
# FIXME: can have multiple bodies per spec
|
47
|
+
stmt = rdf.find_all { |s|
|
48
|
+
s.predicate.to_s == RDF::OpenAnnotation.hasBody
|
49
|
+
}.first
|
50
|
+
|
51
|
+
# FIXME: body can be other things
|
52
|
+
# if body is blank node and has character content, then return it
|
53
|
+
body = stmt.object if stmt
|
54
|
+
if body && body.is_a?(RDF::Node)
|
55
|
+
body_stmts = rdf.find_all { |s| s.subject == body }
|
56
|
+
if body_stmts &&
|
57
|
+
body_stmts.detect { |s|
|
58
|
+
s.predicate.to_s == RDF.type &&
|
59
|
+
s.object.to_s == RDF::Content.ContentAsText
|
60
|
+
}
|
61
|
+
chars_stmt = body_stmts.detect { |s| s.predicate.to_s == RDF::Content.chars}
|
62
|
+
return chars_stmt.object.to_s if chars_stmt
|
63
|
+
end
|
64
|
+
end
|
65
|
+
nil
|
66
|
+
end
|
67
|
+
|
68
|
+
def motivated_by
|
69
|
+
if graph_exists?
|
70
|
+
q = self.class.basic_query.clone
|
71
|
+
q << [:s, RDF::OpenAnnotation.motivatedBy, :motivated_by]
|
72
|
+
solution = graph.query(q)
|
73
|
+
if solution && solution.size > 0
|
74
|
+
motivations = []
|
75
|
+
solution.each {|res|
|
76
|
+
motivations << res.motivated_by.to_s
|
77
|
+
}
|
78
|
+
motivations
|
79
|
+
# TODO: raise exception if none?
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def rdf
|
85
|
+
@rdf ||= JSON::LD::API.toRdf(json_ld) if json_ld
|
86
|
+
end
|
87
|
+
|
88
|
+
def graph
|
89
|
+
g = data_to_graph
|
90
|
+
@graph ||= g if g
|
91
|
+
end
|
92
|
+
|
93
|
+
# query for a subject with
|
94
|
+
# predicate RDF::OpenAnnotation.hasTarget
|
95
|
+
# type of RDF::OpenAnnotation.Annotation
|
96
|
+
def self.basic_query
|
97
|
+
@basic_query ||= begin
|
98
|
+
basic_query = RDF::Query.new
|
99
|
+
basic_query << [:s, RDF.type, RDF::URI("http://www.w3.org/ns/oa#Annotation")]
|
100
|
+
basic_query << [:s, RDF::OpenAnnotation.hasTarget, nil]
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
private
|
105
|
+
|
106
|
+
# loads RDF::Graph from data attribute. If data is in json-ld, converts it to turtle.
|
107
|
+
def data_to_graph
|
108
|
+
if data
|
109
|
+
case data
|
110
|
+
when /\{\s*\"@\w+\"/
|
111
|
+
json ||= JSON.parse(data)
|
112
|
+
g ||= RDF::Graph.new << JSON::LD::API.toRdf(json_ld) if json
|
113
|
+
self.data = g.dump(:ttl) if g
|
114
|
+
#when /http/
|
115
|
+
# g ||= RDF::Graph.load(data, :format => :ttl)
|
116
|
+
else # assume turtle
|
117
|
+
g = RDF::Graph.new
|
118
|
+
g.from_ttl(data)
|
119
|
+
g = nil if g.size == 0
|
120
|
+
end
|
121
|
+
end
|
122
|
+
g
|
123
|
+
end
|
124
|
+
|
125
|
+
def json_ld
|
126
|
+
@json_ld ||= JSON.parse(data) rescue nil
|
127
|
+
end
|
128
|
+
|
129
|
+
def graph_exists?
|
130
|
+
graph && graph.size > 0
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Triannon
|
2
|
+
class GraphValidator < ActiveModel::Validator
|
3
|
+
|
4
|
+
def validate(anno)
|
5
|
+
graph_exists? anno
|
6
|
+
graph = anno.graph
|
7
|
+
basic_solution = graph.query(self.basic_query)
|
8
|
+
unless basic_solution && basic_solution.size == 1
|
9
|
+
anno.errors[:data] << 'The oa:Annotation class MUST be associated with each Annotation.'
|
10
|
+
anno.errors[:data] << 'each Annotation MUST have at least one target'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def graph_exists?(anno)
|
15
|
+
graph = anno.graph
|
16
|
+
unless graph && graph.size > 0
|
17
|
+
anno.errors[:data] << 'Unable to create non-null graph'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# query for a subject with
|
22
|
+
# predicate RDF::OpenAnnotation.hasTarget
|
23
|
+
# type of RDF::OpenAnnotation.Annotation
|
24
|
+
def self.basic_query
|
25
|
+
@@basic_query ||= begin
|
26
|
+
RDF::Query.new
|
27
|
+
basic_query << [:s, RDF.type, RDF::URI("http://www.w3.org/ns/oa#Annotation")]
|
28
|
+
basic_query << [:s, RDF::OpenAnnotation.hasTarget, nil]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
7
|
+
<title>Cerberus</title>
|
8
|
+
<%= stylesheet_link_tag "triannon/application", media: "all" %>
|
9
|
+
<%= javascript_include_tag "triannon/application" %>
|
10
|
+
<%= csrf_meta_tags %>
|
11
|
+
</head>
|
12
|
+
<body>
|
13
|
+
<div class="container">
|
14
|
+
<!-- Static navbar -->
|
15
|
+
<div class="navbar navbar-default" role="navigation">
|
16
|
+
<div class="container-fluid">
|
17
|
+
<div class="navbar-header">
|
18
|
+
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
|
19
|
+
<span class="sr-only">Toggle navigation</span>
|
20
|
+
<span class="icon-bar"></span>
|
21
|
+
<span class="icon-bar"></span>
|
22
|
+
<span class="icon-bar"></span>
|
23
|
+
</button>
|
24
|
+
<%= link_to "Cerberus", root_path, class: 'navbar-brand' %>
|
25
|
+
</div>
|
26
|
+
<div class="navbar-collapse collapse">
|
27
|
+
<ul class="nav navbar-nav">
|
28
|
+
</ul>
|
29
|
+
<ul class="nav navbar-nav navbar-right">
|
30
|
+
</ul>
|
31
|
+
</div><!--/.nav-collapse -->
|
32
|
+
</div><!--/.container-fluid -->
|
33
|
+
</div>
|
34
|
+
<%= yield %>
|
35
|
+
</div>
|
36
|
+
</body>
|
37
|
+
</html>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<%= form_for(@annotation) do |f| %>
|
2
|
+
<% if @annotation.errors.any? %>
|
3
|
+
<div id="error_explanation">
|
4
|
+
<h2><%= pluralize(@annotation.errors.count, "error") %> prohibited this annotation from being saved:</h2>
|
5
|
+
|
6
|
+
<ul>
|
7
|
+
<% @annotation.errors.full_messages.each do |message| %>
|
8
|
+
<li><%= message %></li>
|
9
|
+
<% end %>
|
10
|
+
</ul>
|
11
|
+
</div>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<div class="field">
|
15
|
+
<%= f.label 'data (as JSON-LD)' %><br>
|
16
|
+
<%= f.text_area :data %>
|
17
|
+
</div>
|
18
|
+
<div class="actions">
|
19
|
+
<%= f.submit %>
|
20
|
+
</div>
|
21
|
+
<% end %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render 'form' %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render 'form' %>
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<h1>Annotation</h1>
|
2
|
+
<p>
|
3
|
+
<strong>Url (@id):</strong>
|
4
|
+
<%= @annotation.url %>
|
5
|
+
</p>
|
6
|
+
<p>
|
7
|
+
<strong>Target:</strong>
|
8
|
+
<%= link_to @annotation.has_target, @annotation.has_target %>
|
9
|
+
</p>
|
10
|
+
<p>
|
11
|
+
<strong>Body (blank node with text):</strong>
|
12
|
+
<pre>
|
13
|
+
<%= @annotation.has_body %>
|
14
|
+
</pre>
|
15
|
+
</p>
|
16
|
+
<p>
|
17
|
+
<strong>Motivated By:</strong>
|
18
|
+
<% @annotation.motivated_by { |m|%>
|
19
|
+
<%= link_to @annotation.m, @annotation.m %>
|
20
|
+
<% } %>
|
21
|
+
</p>
|
22
|
+
<p>
|
23
|
+
<strong>Type:</strong>
|
24
|
+
<%= link_to @annotation.type, @annotation.type %>
|
25
|
+
</p>
|
26
|
+
|
27
|
+
<strong>Turtle:</strong>
|
28
|
+
<pre>
|
29
|
+
<%= @annotation.graph.dump(:ttl) %>
|
30
|
+
</pre>
|
31
|
+
|
32
|
+
<%= link_to "Back to List", annotations_path %>
|
data/config/routes.rb
ADDED
data/lib/triannon.rb
ADDED
metadata
ADDED
@@ -0,0 +1,225 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: triannon
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Chris Beer
|
8
|
+
- Naomi Dushay
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-09-23 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rails
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 4.2.0.beta1
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 4.2.0.beta1
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: linkeddata
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: rdf-open_annotation
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: bootstrap-sass
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: sass-rails
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 5.0.0.beta1
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 5.0.0.beta1
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: sqlite3
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: rspec
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - "~>"
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '3.0'
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - "~>"
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '3.0'
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: rspec-rails
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - "~>"
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '3.0'
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - "~>"
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '3.0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: engine_cart
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - "~>"
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0.4'
|
133
|
+
type: :development
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - "~>"
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0.4'
|
140
|
+
- !ruby/object:Gem::Dependency
|
141
|
+
name: jettywrapper
|
142
|
+
requirement: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - ">="
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '0'
|
147
|
+
type: :development
|
148
|
+
prerelease: false
|
149
|
+
version_requirements: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - ">="
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '0'
|
154
|
+
- !ruby/object:Gem::Dependency
|
155
|
+
name: capybara
|
156
|
+
requirement: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - ">="
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
type: :development
|
162
|
+
prerelease: false
|
163
|
+
version_requirements: !ruby/object:Gem::Requirement
|
164
|
+
requirements:
|
165
|
+
- - ">="
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: '0'
|
168
|
+
description:
|
169
|
+
email:
|
170
|
+
- cabeer@stanford.edu
|
171
|
+
- ndushay@stanford.edu
|
172
|
+
executables: []
|
173
|
+
extensions: []
|
174
|
+
extra_rdoc_files: []
|
175
|
+
files:
|
176
|
+
- README.md
|
177
|
+
- Rakefile
|
178
|
+
- app/assets/javascripts/triannon/annotations.js
|
179
|
+
- app/assets/javascripts/triannon/application.js
|
180
|
+
- app/assets/stylesheets/triannon/annotations.css
|
181
|
+
- app/assets/stylesheets/triannon/application.css.scss
|
182
|
+
- app/controllers/triannon/annotations_controller.rb
|
183
|
+
- app/controllers/triannon/application_controller.rb
|
184
|
+
- app/helpers/triannon/annotations_helper.rb
|
185
|
+
- app/helpers/triannon/application_helper.rb
|
186
|
+
- app/models/triannon/annotation.rb
|
187
|
+
- app/models/triannon/graph_validator.rb
|
188
|
+
- app/views/layouts/triannon/application.html.erb
|
189
|
+
- app/views/triannon/annotations/_form.html.erb
|
190
|
+
- app/views/triannon/annotations/edit.html.erb
|
191
|
+
- app/views/triannon/annotations/index.html.erb
|
192
|
+
- app/views/triannon/annotations/new.html.erb
|
193
|
+
- app/views/triannon/annotations/show.html.erb
|
194
|
+
- config/routes.rb
|
195
|
+
- db/migrate/20140912173046_create_triannon_annotations.rb
|
196
|
+
- lib/generators/triannon/install_generator.rb
|
197
|
+
- lib/tasks/triannon_tasks.rake
|
198
|
+
- lib/triannon.rb
|
199
|
+
- lib/triannon/engine.rb
|
200
|
+
- lib/triannon/version.rb
|
201
|
+
homepage:
|
202
|
+
licenses:
|
203
|
+
- Apache 2
|
204
|
+
metadata: {}
|
205
|
+
post_install_message:
|
206
|
+
rdoc_options: []
|
207
|
+
require_paths:
|
208
|
+
- lib
|
209
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
210
|
+
requirements:
|
211
|
+
- - ">="
|
212
|
+
- !ruby/object:Gem::Version
|
213
|
+
version: '0'
|
214
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
215
|
+
requirements:
|
216
|
+
- - ">="
|
217
|
+
- !ruby/object:Gem::Version
|
218
|
+
version: '0'
|
219
|
+
requirements: []
|
220
|
+
rubyforge_project:
|
221
|
+
rubygems_version: 2.2.0
|
222
|
+
signing_key:
|
223
|
+
specification_version: 4
|
224
|
+
summary: Rails engine for working with storage of OpenAnnotations stored in Fedora4
|
225
|
+
test_files: []
|