togostanza 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.travis.yml +15 -0
- data/Appraisals +7 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +9 -0
- data/bin/togostanza +5 -0
- data/gemfiles/activesupport_3.x.gemfile +7 -0
- data/gemfiles/activesupport_3.x.gemfile.lock +99 -0
- data/gemfiles/activesupport_4.x.gemfile +7 -0
- data/gemfiles/activesupport_4.x.gemfile.lock +107 -0
- data/lib/togostanza/application.rb +43 -0
- data/lib/togostanza/cli.rb +81 -0
- data/lib/togostanza/markdown.rb +39 -0
- data/lib/togostanza/stanza/base.rb +71 -0
- data/lib/togostanza/stanza/expression_map.rb +44 -0
- data/lib/togostanza/stanza/markdown.rb +37 -0
- data/lib/togostanza/stanza/querying.rb +43 -0
- data/lib/togostanza/stanza.rb +15 -0
- data/lib/togostanza/version.rb +3 -0
- data/lib/togostanza.rb +8 -0
- data/public/assets/stanza.css +113 -0
- data/public/assets/stanza.js +36 -0
- data/spec/dummy/app.rb +8 -0
- data/spec/dummy/bar_stanza/help.md +1 -0
- data/spec/dummy/bar_stanza/lib/bar_stanza.rb +3 -0
- data/spec/dummy/bar_stanza/stanza.rb +5 -0
- data/spec/dummy/bar_stanza/template.hbs +1 -0
- data/spec/dummy/foo_stanza/help.md +1 -0
- data/spec/dummy/foo_stanza/lib/foo_stanza.rb +3 -0
- data/spec/dummy/foo_stanza/stanza.rb +9 -0
- data/spec/dummy/foo_stanza/template.hbs +1 -0
- data/spec/features/help_spec.rb +13 -0
- data/spec/features/listing_spec.rb +17 -0
- data/spec/features/rendering_spec.rb +13 -0
- data/spec/features/resource_spec.rb +11 -0
- data/spec/lib/togostanza/stanza/base_spec.rb +79 -0
- data/spec/spec_helper.rb +17 -0
- data/templates/provider/Gemfile.erb +3 -0
- data/templates/provider/config.ru.erb +6 -0
- data/templates/stanza/Gemfile.erb +3 -0
- data/templates/stanza/gemspec.erb +20 -0
- data/templates/stanza/help.md.erb +22 -0
- data/templates/stanza/lib.rb.erb +4 -0
- data/templates/stanza/stanza.rb.erb +5 -0
- data/templates/stanza/template.hbs.erb +17 -0
- data/togostanza.gemspec +37 -0
- data/views/index.haml +9 -0
- data/views/layout.haml +13 -0
- metadata +321 -0
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'sparql/client'
|
2
|
+
|
3
|
+
module TogoStanza::Stanza
|
4
|
+
module Querying
|
5
|
+
MAPPINGS = {
|
6
|
+
togogenome: 'http://ep.dbcls.jp/sparql7',
|
7
|
+
uniprot: 'http://ep.dbcls.jp/sparql7',
|
8
|
+
go: 'http://ep.dbcls.jp/sparql7'
|
9
|
+
}
|
10
|
+
|
11
|
+
def query(endpoint, sparql)
|
12
|
+
client = SPARQL::Client.new(MAPPINGS[endpoint] || endpoint)
|
13
|
+
|
14
|
+
#Rails.logger.debug "SPARQL QUERY: \n#{sparql}"
|
15
|
+
|
16
|
+
client.query(sparql).map {|binding|
|
17
|
+
binding.each_with_object({}) {|(name, term), hash|
|
18
|
+
hash[name] = term.to_s
|
19
|
+
}
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def uniprot_url_from_togogenome(gene_id)
|
24
|
+
# refseq の UniProt
|
25
|
+
# slr1311 の時 "http://purl.uniprot.org/refseq/NP_439906.1"
|
26
|
+
query(:togogenome, <<-SPARQL).first[:up]
|
27
|
+
PREFIX insdc: <http://insdc.org/owl/>
|
28
|
+
PREFIX idorg: <http://rdf.identifiers.org/database/>
|
29
|
+
|
30
|
+
SELECT DISTINCT ?up
|
31
|
+
FROM <http://togogenome.org/graph/refseq/>
|
32
|
+
WHERE {
|
33
|
+
?s insdc:feature_locus_tag "#{gene_id}" .
|
34
|
+
?s rdfs:seeAlso ?np .
|
35
|
+
?s rdfs:seeAlso ?xref .
|
36
|
+
?np rdf:type idorg:Protein .
|
37
|
+
BIND (STRAFTER(STR(?np), "ncbiprotein/") AS ?npid)
|
38
|
+
BIND (IRI(CONCAT("http://purl.uniprot.org/refseq/", ?npid)) AS ?up)
|
39
|
+
}
|
40
|
+
SPARQL
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/togostanza.rb
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
@charset "UTF-8";
|
2
|
+
|
3
|
+
body {
|
4
|
+
background-color: transparent;
|
5
|
+
padding: 1px 2px 3px;
|
6
|
+
font-family: "Myriad Pro","Helvetica Neue",san-serif;
|
7
|
+
font-size: 16px;
|
8
|
+
line-height: 20px;
|
9
|
+
}
|
10
|
+
a {
|
11
|
+
color:#45b8cc;
|
12
|
+
}
|
13
|
+
|
14
|
+
ul, ol {
|
15
|
+
padding:0;
|
16
|
+
margin:0 0 0 16px;
|
17
|
+
}
|
18
|
+
dl {
|
19
|
+
margin: 0;
|
20
|
+
padding: 0;
|
21
|
+
}
|
22
|
+
dd {
|
23
|
+
margin: 0;
|
24
|
+
}
|
25
|
+
dt + dt, dd + dt,
|
26
|
+
dt + dd, dd + dd {
|
27
|
+
margin-top: 8px;
|
28
|
+
}
|
29
|
+
|
30
|
+
|
31
|
+
body > .table, body > div {
|
32
|
+
-webkit-border-radius: 4px;
|
33
|
+
-moz-border-radius: 4px;
|
34
|
+
border-radius: 4px;
|
35
|
+
-webkit-box-shadow: 0 2px 2px rgba(0,0,0,.2);
|
36
|
+
-moz-box-shadow: 0 2px 2px rgba(0,0,0,.2);
|
37
|
+
box-shadow: 0 2px 2px rgba(0,0,0,.2);
|
38
|
+
background-color: #fff;
|
39
|
+
}
|
40
|
+
body > .table + .table, body > .table + div,
|
41
|
+
body > div + .table, body > div + div {
|
42
|
+
margin-top: 5px;
|
43
|
+
}
|
44
|
+
|
45
|
+
body > div {
|
46
|
+
padding: 10px 20px;
|
47
|
+
}
|
48
|
+
|
49
|
+
body > .table {
|
50
|
+
border-style: solid;
|
51
|
+
border-color: rgba(0,0,0,0);
|
52
|
+
border-top-width: 5px;
|
53
|
+
border-bottom-width: 5px;
|
54
|
+
border-left-width: 0;
|
55
|
+
border-right-width: 0;
|
56
|
+
}
|
57
|
+
.table {
|
58
|
+
margin-bottom: 0;
|
59
|
+
word-break:break-all;
|
60
|
+
}
|
61
|
+
.table caption {
|
62
|
+
background-color: #8ac8d1;
|
63
|
+
text-align: left;
|
64
|
+
color: white;
|
65
|
+
font-size: 18px;
|
66
|
+
line-height: 22px;
|
67
|
+
height: 22px;
|
68
|
+
font-weight: bold;
|
69
|
+
padding: 10px 24px 4px;
|
70
|
+
margin: 0;
|
71
|
+
border-top-left-radius: 4px;
|
72
|
+
border-top-right-radius: 4px;
|
73
|
+
}
|
74
|
+
.table tr:before, .table tr:after {
|
75
|
+
content: "";
|
76
|
+
display: table-cell;
|
77
|
+
width: 20px;
|
78
|
+
}
|
79
|
+
.table thead th, .table thead td {
|
80
|
+
border-bottom: 1px solid #555;
|
81
|
+
}
|
82
|
+
.table th, .table td,
|
83
|
+
.table > tbody > th, .table > tbody > td {
|
84
|
+
padding: 10px 4px;
|
85
|
+
line-height: 20px;
|
86
|
+
text-align: left;
|
87
|
+
vertical-align: top;
|
88
|
+
border-top: 1px solid #9fadad;
|
89
|
+
}
|
90
|
+
.table > tr:first-child > th, .table > tr:first-child > td,
|
91
|
+
.table > tbody > tr:first-child > th, .table > tbody > tr:first-child > td {
|
92
|
+
border-top: none;
|
93
|
+
}
|
94
|
+
th > .table, td > .table {
|
95
|
+
margin: -10px -4px;
|
96
|
+
width: 100%;
|
97
|
+
}
|
98
|
+
th > .table > tbody > tr:before,
|
99
|
+
td > .table > tbody > tr:before,
|
100
|
+
th > .table > tbody > tr:after,
|
101
|
+
td > .table > tbody > tr:after {
|
102
|
+
content: none;
|
103
|
+
}
|
104
|
+
.table li + li {
|
105
|
+
margin-top: 4px;
|
106
|
+
}
|
107
|
+
|
108
|
+
pre {
|
109
|
+
background-color:#daf1f5;
|
110
|
+
border:1px solid #ccc;
|
111
|
+
border:1px solid rgba(0,0,0,0.15);
|
112
|
+
padding: 8px 16px;
|
113
|
+
}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
jQuery(function($) {
|
2
|
+
var RE = /^data-stanza-(.+)/
|
3
|
+
|
4
|
+
$('[data-stanza]').each(function(index) {
|
5
|
+
var $this = $(this),
|
6
|
+
data = $this.data(),
|
7
|
+
params = {};
|
8
|
+
|
9
|
+
$.each(this.attributes, function(i, attr) {
|
10
|
+
var key = (RE.exec(attr.name) || [])[1]
|
11
|
+
|
12
|
+
if (key) {
|
13
|
+
params[key.replace('-', '_')] = attr.value;
|
14
|
+
}
|
15
|
+
});
|
16
|
+
|
17
|
+
var src = data.stanza + '?' + $.param(params);
|
18
|
+
|
19
|
+
$('<iframe></iframe>')
|
20
|
+
.attr({src: src, frameborder: 0})
|
21
|
+
.attr({id: 'stanza-frame-' + index})
|
22
|
+
.attr({name: 'stanza-frame-' + index})
|
23
|
+
.width(data.stanzaWidth || '100%')
|
24
|
+
.height(data.stanzaHeight)
|
25
|
+
.appendTo($this);
|
26
|
+
});
|
27
|
+
|
28
|
+
window.onmessage = function(e) {
|
29
|
+
var message = JSON.parse(e.data),
|
30
|
+
iframe = $('#' + message.id);
|
31
|
+
|
32
|
+
if (iframe.attr('style').search(/height/) === -1) {
|
33
|
+
iframe.height(message.height);
|
34
|
+
}
|
35
|
+
};
|
36
|
+
});
|
data/spec/dummy/app.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Bar
|
@@ -0,0 +1 @@
|
|
1
|
+
<p>hello from {{name}}</p>
|
@@ -0,0 +1 @@
|
|
1
|
+
# Foo
|
@@ -0,0 +1 @@
|
|
1
|
+
<p>hello from {{name}}</p>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Help' do
|
4
|
+
it 'should display FooStanza help' do
|
5
|
+
visit '/foo/help'
|
6
|
+
page.should have_css('h1', text: 'Foo')
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should display BarStanza help' do
|
10
|
+
visit '/bar/help'
|
11
|
+
page.should have_css('h1', text: 'Bar')
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Listing' do
|
4
|
+
before do
|
5
|
+
visit '/'
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'show all stanzas' do
|
9
|
+
page.should have_text('foo')
|
10
|
+
page.should have_text('bar')
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'show link to help page' do
|
14
|
+
page.should have_link('help', href: '/foo/help')
|
15
|
+
page.should have_link('help', href: '/bar/help')
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Rendering' do
|
4
|
+
it 'should render FooStanza correctly' do
|
5
|
+
visit '/foo'
|
6
|
+
page.should have_content('hello from foo')
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should render BarStanza correctly' do
|
10
|
+
visit '/bar'
|
11
|
+
page.should have_content('hello from bar')
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe TogoStanza::Stanza::Base do
|
4
|
+
describe '.property' do
|
5
|
+
let(:klass) { Class.new(TogoStanza::Stanza::Base) }
|
6
|
+
|
7
|
+
specify 'raise error when specify a value and block' do
|
8
|
+
expect {
|
9
|
+
klass.property :foo, 'bar' do
|
10
|
+
'baz'
|
11
|
+
end
|
12
|
+
}.to raise_error(ArgumentError)
|
13
|
+
end
|
14
|
+
|
15
|
+
specify 'raise error when neither specify a value nor block' do
|
16
|
+
expect {
|
17
|
+
klass.property :foo
|
18
|
+
}.to raise_error(ArgumentError)
|
19
|
+
end
|
20
|
+
|
21
|
+
specify 'allow specify a falsy value' do
|
22
|
+
klass.property :foo, false
|
23
|
+
|
24
|
+
klass.properties[:foo].should == false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#context' do
|
29
|
+
let :klass do
|
30
|
+
Class.new(TogoStanza::Stanza::Base) {
|
31
|
+
property :foo do
|
32
|
+
'foo'
|
33
|
+
end
|
34
|
+
|
35
|
+
property :bar do |bar|
|
36
|
+
bar * 3
|
37
|
+
end
|
38
|
+
|
39
|
+
property :baz do
|
40
|
+
{
|
41
|
+
qux: 'quux'
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
property :foobar, 'foobar'
|
46
|
+
|
47
|
+
resource :do_not_evaluate do
|
48
|
+
raise
|
49
|
+
end
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
subject { klass.new(bar: 'bar').context }
|
54
|
+
|
55
|
+
its(:foo) { should == 'foo' }
|
56
|
+
its(:bar) { should == 'barbarbar' }
|
57
|
+
its(:baz) { should == {'qux' => 'quux'} }
|
58
|
+
its(:foobar) { should == 'foobar' }
|
59
|
+
end
|
60
|
+
|
61
|
+
describe '#resource' do
|
62
|
+
let :klass do
|
63
|
+
Class.new(TogoStanza::Stanza::Base) {
|
64
|
+
resource :foo do
|
65
|
+
'foo'
|
66
|
+
end
|
67
|
+
|
68
|
+
resource :bar do |bar|
|
69
|
+
bar * 3
|
70
|
+
end
|
71
|
+
}
|
72
|
+
end
|
73
|
+
|
74
|
+
let(:stanza) { klass.new(bar: 'bar') }
|
75
|
+
|
76
|
+
specify { stanza.resource(:foo).should == 'foo' }
|
77
|
+
specify { stanza.resource(:bar).should == 'barbarbar' }
|
78
|
+
end
|
79
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
ENV['RACK_ENV'] ||= 'test'
|
2
|
+
|
3
|
+
require_relative 'dummy/app'
|
4
|
+
|
5
|
+
require 'capybara'
|
6
|
+
|
7
|
+
RSpec.configure do |config|
|
8
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
9
|
+
config.run_all_when_everything_filtered = true
|
10
|
+
config.filter_run :focus
|
11
|
+
|
12
|
+
config.order = 'random'
|
13
|
+
|
14
|
+
config.include Capybara::DSL
|
15
|
+
end
|
16
|
+
|
17
|
+
Capybara.app = DummyApp
|
@@ -0,0 +1,20 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
4
|
+
Gem::Specification.new do |spec|
|
5
|
+
spec.name = '<%= file_name %>'
|
6
|
+
spec.version = '0.0.1'
|
7
|
+
spec.authors = ['TODO: Write your name']
|
8
|
+
spec.email = ['TODO: Write your email address']
|
9
|
+
spec.summary = %q{TODO: Write a short summary. Required.}
|
10
|
+
spec.description = %q{TODO: Write a longer description. Optional.}
|
11
|
+
spec.homepage = ''
|
12
|
+
spec.license = 'MIT'
|
13
|
+
|
14
|
+
spec.files = `git ls-files`.split($/)
|
15
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
16
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
17
|
+
spec.require_paths = ['lib']
|
18
|
+
|
19
|
+
spec.add_runtime_dependency 'togostanza'
|
20
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<%= title %>
|
2
|
+
<%= '=' * title.size %>
|
3
|
+
|
4
|
+
TODO: Write a stanza description
|
5
|
+
|
6
|
+
## Parameters:
|
7
|
+
|
8
|
+
(* = required)
|
9
|
+
|
10
|
+
| Name | Description |
|
11
|
+
|------------------|-------------------------------------|
|
12
|
+
| *data-stanza-foo | TODO: Write a parameter description |
|
13
|
+
|
14
|
+
## Sample:
|
15
|
+
|
16
|
+
```html
|
17
|
+
<div data-stanza="<stanza url>"></div>
|
18
|
+
```
|
19
|
+
|
20
|
+
The above `<div>` will automatically embed the following Stanza in your HTML page.
|
21
|
+
|
22
|
+
<div data-stanza="/stanza/<%= stanza_id %>"></div>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
|
3
|
+
<html>
|
4
|
+
<head>
|
5
|
+
<title><%= title %></title>
|
6
|
+
{{#each css_uri}}
|
7
|
+
<link rel="stylesheet" href="{{this}}" />
|
8
|
+
{{/each}}
|
9
|
+
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
|
10
|
+
<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.2.2/bootstrap.min.js"></script>
|
11
|
+
{{adjust_iframe_height_script}}
|
12
|
+
</head>
|
13
|
+
|
14
|
+
<body>
|
15
|
+
<h1>{{greeting}}</h1>
|
16
|
+
</body>
|
17
|
+
</html>
|
data/togostanza.gemspec
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'togostanza/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'togostanza'
|
7
|
+
spec.version = TogoStanza::VERSION
|
8
|
+
spec.authors = ['Keita Urashima']
|
9
|
+
spec.email = ['ursm@esm.co.jp']
|
10
|
+
spec.summary = %q{Development tools of TogoStanza}
|
11
|
+
spec.homepage = ''
|
12
|
+
spec.license = 'MIT'
|
13
|
+
|
14
|
+
spec.files = `git ls-files`.split($/)
|
15
|
+
spec.executables = spec.files.grep(%r{^bin/}) {|f| File.basename(f) }
|
16
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
17
|
+
spec.require_paths = ['lib']
|
18
|
+
|
19
|
+
spec.add_runtime_dependency 'activesupport'
|
20
|
+
spec.add_runtime_dependency 'flavour_saver'
|
21
|
+
spec.add_runtime_dependency 'haml'
|
22
|
+
spec.add_runtime_dependency 'hashie'
|
23
|
+
spec.add_runtime_dependency 'parallel'
|
24
|
+
spec.add_runtime_dependency 'redcarpet'
|
25
|
+
spec.add_runtime_dependency 'sinatra'
|
26
|
+
spec.add_runtime_dependency 'sinatra-contrib'
|
27
|
+
spec.add_runtime_dependency 'sparql-client'
|
28
|
+
spec.add_runtime_dependency 'thor'
|
29
|
+
|
30
|
+
spec.add_development_dependency 'appraisal'
|
31
|
+
spec.add_development_dependency 'bundler'
|
32
|
+
spec.add_development_dependency 'capybara'
|
33
|
+
spec.add_development_dependency 'rake'
|
34
|
+
spec.add_development_dependency 'rspec'
|
35
|
+
|
36
|
+
spec.required_ruby_version = '>= 1.9.3'
|
37
|
+
end
|
data/views/index.haml
ADDED
data/views/layout.haml
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
!!!
|
2
|
+
|
3
|
+
%html
|
4
|
+
%head
|
5
|
+
%meta(charset='utf-8')
|
6
|
+
%title= @page_title || 'Stanza'
|
7
|
+
%link(rel='stylesheet' href='//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.2.2/css/bootstrap.min.css')
|
8
|
+
%link(rel='stylesheet' href='/stanza/assets/stanza.css')
|
9
|
+
%script(src='//cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.js')
|
10
|
+
%script(src='/stanza/assets/stanza.js')
|
11
|
+
|
12
|
+
%body
|
13
|
+
.container!~ yield
|