iqvoc 4.0.6 → 4.0.7
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.
- data/CHANGELOG.md +6 -0
- data/Gemfile.lock +1 -1
- data/app/assets/javascripts/iqvoc/manifest.js +0 -1
- data/app/assets/javascripts/iqvoc/onebox.js.erb +81 -0
- data/app/assets/javascripts/iqvoc/quicksearch.js +19 -1
- data/app/assets/stylesheets/iqvoc/components.css.scss +26 -3
- data/app/controllers/concepts/alphabetical_controller.rb +5 -1
- data/app/controllers/triplestore_sync_controller.rb +8 -2
- data/app/views/concepts/alphabetical/_pref_labeling.html.erb +17 -4
- data/app/views/concepts/alphabetical/index.html.erb +2 -2
- data/app/views/frontpage/index.html.erb +7 -8
- data/config/boot.rb +3 -10
- data/config/engine.rb +5 -0
- data/db/migrate/20110510162719_use_mono_hierarchy_instead_of_poly_hierarchy.rb +2 -2
- data/db/migrate/20110525103100_separate_note_annotation_predicates.rb +10 -23
- data/db/migrate/20110615134040_change_umt_note_annotations_to_dct.rb +2 -2
- data/lib/engine_tasks/db.rake +0 -21
- data/lib/iqvoc/rdf_sync.rb +22 -14
- data/lib/iqvoc/version.rb +1 -1
- data/public/assets/ajax-loader-dada1fbb71d7fb80d8dde7a031ae6cd0.gif +0 -0
- data/public/assets/ajax-loader.gif +0 -0
- data/public/assets/arrow_down-07c5dea12928d65fcc31c08279366170.gif +0 -0
- data/public/assets/arrow_down.gif +0 -0
- data/public/assets/arrow_up-51ede92c113b9a870e7a306907360ba8.gif +0 -0
- data/public/assets/arrow_up.gif +0 -0
- data/public/assets/bootstrap/bootstrap-2012a68e8267282c0a2c177d7005ae6d.css +9 -0
- data/public/assets/bootstrap/bootstrap-2012a68e8267282c0a2c177d7005ae6d.css.gz +0 -0
- data/public/assets/bootstrap/bootstrap-35fd77cdf54a8cb63a39d8d0cea7a746.js +19 -0
- data/public/assets/bootstrap/bootstrap-35fd77cdf54a8cb63a39d8d0cea7a746.js.gz +0 -0
- data/public/assets/bootstrap/bootstrap-responsive-609b376f4bb032588c054b563d4bca1f.css +9 -0
- data/public/assets/bootstrap/bootstrap-responsive-609b376f4bb032588c054b563d4bca1f.css.gz +0 -0
- data/public/assets/bootstrap/bootstrap-responsive.css +9 -0
- data/public/assets/bootstrap/bootstrap-responsive.css.gz +0 -0
- data/public/assets/bootstrap/bootstrap.css +9 -0
- data/public/assets/bootstrap/bootstrap.css.gz +0 -0
- data/public/assets/bootstrap/bootstrap.js +19 -0
- data/public/assets/bootstrap/bootstrap.js.gz +0 -0
- data/public/assets/bootstrap/glyphicons-halflings-0e7ff93d8f48fe1f5f762e4312e78da7.png +0 -0
- data/public/assets/bootstrap/glyphicons-halflings-white-ef3d5b8d6a297804352b4a46fdb5466d.png +0 -0
- data/public/assets/bootstrap/glyphicons-halflings-white.png +0 -0
- data/public/assets/bootstrap/glyphicons-halflings.png +0 -0
- data/public/assets/file-58ce0b58f19dfe871b25270e98cff66c.gif +0 -0
- data/public/assets/file.gif +0 -0
- data/public/assets/folder-5c5b1fd2f1ece710f9159f05cc2aaaa8.gif +0 -0
- data/public/assets/folder-closed-8b61fc55011d534f0216c1150994f229.gif +0 -0
- data/public/assets/folder-closed.gif +0 -0
- data/public/assets/folder.gif +0 -0
- data/public/assets/html5-05e1be9157c8366db72fb7a1bcc8daff.js +3 -0
- data/public/assets/html5-05e1be9157c8366db72fb7a1bcc8daff.js.gz +0 -0
- data/public/assets/html5.js +3 -0
- data/public/assets/html5.js.gz +0 -0
- data/public/assets/iqvoc/ie_fixes-6a106c21d979ccdd1f6bf1cb129a0e69.css +1 -0
- data/public/assets/iqvoc/ie_fixes-6a106c21d979ccdd1f6bf1cb129a0e69.css.gz +0 -0
- data/public/assets/iqvoc/ie_fixes.css +1 -0
- data/public/assets/iqvoc/ie_fixes.css.gz +0 -0
- data/public/assets/iqvoc_logo-316859a511c646918fe75e92fa0bf6ac.png +0 -0
- data/public/assets/iqvoc_logo.png +0 -0
- data/public/assets/jquery-ui/ui-bg_flat_0_aaaaaa_40x100-a1eb3e0764573ed4b261ca742ed96ac3.png +0 -0
- data/public/assets/jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/public/assets/jquery-ui/ui-bg_flat_55_fbec88_40x100-439ee8e6c8ce855f43ed4d7b90684720.png +0 -0
- data/public/assets/jquery-ui/ui-bg_flat_55_fbec88_40x100.png +0 -0
- data/public/assets/jquery-ui/ui-bg_glass_75_d0e5f5_1x400-9357836db77954d0d8c5feb259635223.png +0 -0
- data/public/assets/jquery-ui/ui-bg_glass_75_d0e5f5_1x400.png +0 -0
- data/public/assets/jquery-ui/ui-bg_glass_85_dfeffc_1x400-7beb11d1590fb2fb1ef5c754100a078a.png +0 -0
- data/public/assets/jquery-ui/ui-bg_glass_85_dfeffc_1x400.png +0 -0
- data/public/assets/jquery-ui/ui-bg_glass_95_fef1ec_1x400-c723e9a2b50006c6054836a10b76bb84.png +0 -0
- data/public/assets/jquery-ui/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/public/assets/jquery-ui/ui-bg_gloss-wave_55_5c9ccc_500x100-cb26f48ac4912c23ce301c69c474d306.png +0 -0
- data/public/assets/jquery-ui/ui-bg_gloss-wave_55_5c9ccc_500x100.png +0 -0
- data/public/assets/jquery-ui/ui-bg_inset-hard_100_f5f8f9_1x100-519299e2aa31bffdd4fed34b4fac603d.png +0 -0
- data/public/assets/jquery-ui/ui-bg_inset-hard_100_f5f8f9_1x100.png +0 -0
- data/public/assets/jquery-ui/ui-bg_inset-hard_100_fcfdfd_1x100-27e08524d3d56bb59e354435b663c3ac.png +0 -0
- data/public/assets/jquery-ui/ui-bg_inset-hard_100_fcfdfd_1x100.png +0 -0
- data/public/assets/jquery-ui/ui-icons_217bc0_256x240-ed26778199d8722ae064038a1e841bc8.png +0 -0
- data/public/assets/jquery-ui/ui-icons_217bc0_256x240.png +0 -0
- data/public/assets/jquery-ui/ui-icons_2e83ff_256x240-94086d0ce953eb0887ab1b8140903af9.png +0 -0
- data/public/assets/jquery-ui/ui-icons_2e83ff_256x240.png +0 -0
- data/public/assets/jquery-ui/ui-icons_469bdd_256x240-1c055f2d65517ef8faf1d1999c8ac2fa.png +0 -0
- data/public/assets/jquery-ui/ui-icons_469bdd_256x240.png +0 -0
- data/public/assets/jquery-ui/ui-icons_6da8d5_256x240-8f5b417c5604f1b7b5965c98754c33b9.png +0 -0
- data/public/assets/jquery-ui/ui-icons_6da8d5_256x240.png +0 -0
- data/public/assets/jquery-ui/ui-icons_cd0a0a_256x240-8b44e266bdc1f57f1393579591f89222.png +0 -0
- data/public/assets/jquery-ui/ui-icons_cd0a0a_256x240.png +0 -0
- data/public/assets/jquery-ui/ui-icons_d8e7f3_256x240-1b415e411069df902e6f417cc014172c.png +0 -0
- data/public/assets/jquery-ui/ui-icons_d8e7f3_256x240.png +0 -0
- data/public/assets/jquery-ui/ui-icons_f9bd01_256x240-4553d0576c0498ca4c776aa77aa80833.png +0 -0
- data/public/assets/jquery-ui/ui-icons_f9bd01_256x240.png +0 -0
- data/public/assets/json2-b08b7b9af3e715f42c088ac728f62a2b.js +157 -0
- data/public/assets/json2-b08b7b9af3e715f42c088ac728f62a2b.js.gz +0 -0
- data/public/assets/json2.js +157 -0
- data/public/assets/json2.js.gz +0 -0
- data/public/assets/manifest-3ce8edde69d5d291841ef7c49daaa9cb.js +21 -0
- data/public/assets/manifest-3ce8edde69d5d291841ef7c49daaa9cb.js.gz +0 -0
- data/public/assets/manifest-c0eca563fd9f16907d302af9a2dcae6b.css +51 -0
- data/public/assets/manifest-c0eca563fd9f16907d302af9a2dcae6b.css.gz +0 -0
- data/public/assets/manifest.css +51 -0
- data/public/assets/manifest.css.gz +0 -0
- data/public/assets/manifest.js +21 -0
- data/public/assets/manifest.js.gz +0 -0
- data/public/assets/manifest.yml +47 -0
- data/public/assets/minus-1d0fae0720bab52bd98598218e8345c0.gif +0 -0
- data/public/assets/minus.gif +0 -0
- data/public/assets/plus-1a29e46532f839ed9c977ef4613d079f.gif +0 -0
- data/public/assets/plus.gif +0 -0
- data/public/assets/spinner_16x16-17dcf941457ae4e702f4600e714b21c1.gif +0 -0
- data/public/assets/spinner_16x16.gif +0 -0
- data/public/assets/spinner_24x24-78c707c1921b93962ea5edd7f4a74134.gif +0 -0
- data/public/assets/spinner_24x24.gif +0 -0
- data/public/assets/treeview-black-c46d96020e5d79c652af0fb0c6656384.gif +0 -0
- data/public/assets/treeview-black-line-0903c58efd34c3203d132e6f873049f6.gif +0 -0
- data/public/assets/treeview-black-line.gif +0 -0
- data/public/assets/treeview-black.gif +0 -0
- data/public/assets/treeview-default-ee6298d311205d21dc57c01c0696df70.gif +0 -0
- data/public/assets/treeview-default-line-2c4106cfd4d322c6e6565f80702c27cb.gif +0 -0
- data/public/assets/treeview-default-line.gif +0 -0
- data/public/assets/treeview-default.gif +0 -0
- data/public/assets/treeview-famfamfam-20dfef13cd5fd1e08fb61ee68eb9d3fa.gif +0 -0
- data/public/assets/treeview-famfamfam-line-a02cce2b80977e066df83137aae71fa8.gif +0 -0
- data/public/assets/treeview-famfamfam-line.gif +0 -0
- data/public/assets/treeview-famfamfam.gif +0 -0
- data/public/assets/treeview-gray-01bfdcd116e081e23daf13024fd3e4e0.gif +0 -0
- data/public/assets/treeview-gray-line-029b3a7b92ed10ea6c4b6289cb9fa0e3.gif +0 -0
- data/public/assets/treeview-gray-line.gif +0 -0
- data/public/assets/treeview-gray.gif +0 -0
- data/public/assets/treeview-red-2a5abbce598d05c864d845998381eef6.gif +0 -0
- data/public/assets/treeview-red-line-f51e6c30aa3b0ff856900ba85d769f1c.gif +0 -0
- data/public/assets/treeview-red-line.gif +0 -0
- data/public/assets/treeview-red.gif +0 -0
- data/test/integration/alphabetical_test.rb +5 -7
- data/test/unit/hygiene_test.rb +0 -4
- data/test/unit/rdf_sync_test.rb +9 -12
- metadata +112 -4
- data/app/assets/javascripts/iqvoc/extract_concepts.js +0 -19
- data/app/assets/javascripts/iqvoc/onebox.js +0 -44
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/*jslint vars: true, browser: true, white: true */
|
|
2
|
+
/*global jQuery, IQVOC */
|
|
3
|
+
|
|
4
|
+
IQVOC.onebox = (function($) {
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
function OneBox(form) {
|
|
9
|
+
this.form = form.jquery ? form : $(form);
|
|
10
|
+
this.input = $(".onebox-input", this.form); // TODO: document
|
|
11
|
+
this.container = this.form.removeClass("onebox").
|
|
12
|
+
wrap('<div class="onebox" />').parent(); // TODO: document
|
|
13
|
+
this.results = $('<ol class="results concepts unstyled" />');
|
|
14
|
+
this.spinner = $("<img />").
|
|
15
|
+
attr("src", "<%= asset_path('spinner_24x24.gif') %>").
|
|
16
|
+
appendTo(this.container).hide();
|
|
17
|
+
|
|
18
|
+
this.form.on("submit", $.proxy(this, "onSubmit"));
|
|
19
|
+
this.input.on("keyup", debounce($.proxy(this, "onInput"), 300));
|
|
20
|
+
}
|
|
21
|
+
OneBox.prototype.reset = function() {
|
|
22
|
+
this.container.children().not(this.form).not(this.spinner).remove();
|
|
23
|
+
};
|
|
24
|
+
OneBox.prototype.renderResults = function(html) {
|
|
25
|
+
var doc = $("<div />").append(html);
|
|
26
|
+
var items = $(".concepts > li", doc);
|
|
27
|
+
var pagination = $(".pagination", doc);
|
|
28
|
+
|
|
29
|
+
this.reset();
|
|
30
|
+
this.results.empty().append(items).appendTo(this.container);
|
|
31
|
+
pagination.appendTo(this.container);
|
|
32
|
+
};
|
|
33
|
+
OneBox.prototype.onSubmit = function(ev) {
|
|
34
|
+
ev.preventDefault(); // handled by #onInput
|
|
35
|
+
};
|
|
36
|
+
OneBox.prototype.onInput = function(ev) {
|
|
37
|
+
var val = this.input.val();
|
|
38
|
+
this.reset();
|
|
39
|
+
if(val.length > 0 && val !== this.initialValue) {
|
|
40
|
+
this.getConcepts();
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
OneBox.prototype.getConcepts = function() {
|
|
44
|
+
this.spinner.show();
|
|
45
|
+
$.ajax({
|
|
46
|
+
type: this.form.attr("method"),
|
|
47
|
+
url: this.form.attr("action"),
|
|
48
|
+
data: this.form.serialize(),
|
|
49
|
+
success: $.proxy(this, "onResults")
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
OneBox.prototype.onResults = function(html, status, xhr) {
|
|
53
|
+
// disable scripts (adapted from jQuery#load)
|
|
54
|
+
var rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi;
|
|
55
|
+
html = html.replace(rscript, "");
|
|
56
|
+
|
|
57
|
+
this.spinner.hide();
|
|
58
|
+
this.renderResults(html);
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
return function(selector) {
|
|
62
|
+
return new OneBox(selector); // XXX: returning an instance of a private class seems weird
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
function debounce(fn, delay) { // TODO: move elsewhere
|
|
66
|
+
var timer;
|
|
67
|
+
return function() {
|
|
68
|
+
var self = this;
|
|
69
|
+
var args = arguments;
|
|
70
|
+
if(timer) {
|
|
71
|
+
clearTimeout(timer);
|
|
72
|
+
timer = null;
|
|
73
|
+
}
|
|
74
|
+
timer = setTimeout(function() {
|
|
75
|
+
fn.apply(self, args);
|
|
76
|
+
timer = null;
|
|
77
|
+
}, delay);
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
}(jQuery));
|
|
@@ -28,11 +28,29 @@ function getConcepts(req, callback) {
|
|
|
28
28
|
url: form.attr("action"),
|
|
29
29
|
data: form.serialize(),
|
|
30
30
|
success: function(data, status, xhr) {
|
|
31
|
-
callback(
|
|
31
|
+
callback(extractConcepts(data));
|
|
32
32
|
}
|
|
33
33
|
});
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
function extractConcepts(html) {
|
|
37
|
+
// disable scripts (adapted from jQuery's `load`)
|
|
38
|
+
var rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi;
|
|
39
|
+
var html = html.replace(rscript, "");
|
|
40
|
+
|
|
41
|
+
var concepts = $("<div />").append(html).find("ol.concepts li");
|
|
42
|
+
concepts = concepts.map(function(i, node) {
|
|
43
|
+
var el = $("a", node);
|
|
44
|
+
return {
|
|
45
|
+
value: el.attr("href"),
|
|
46
|
+
label: $.trim(el.parent().text()).replace(/\s+/, " ")
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
return concepts.length ? Array.prototype.slice.call(concepts, 0) :
|
|
51
|
+
[{ value: null, label: "no matches" }]; // TODO: i18n
|
|
52
|
+
}
|
|
53
|
+
|
|
36
54
|
return function(selector, options) {
|
|
37
55
|
options = options ? $.extend(defaults, options) : defaults;
|
|
38
56
|
$(selector).autocomplete(options);
|
|
@@ -18,11 +18,15 @@
|
|
|
18
18
|
min-width: 60%;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
ol {
|
|
22
22
|
margin-left: 0;
|
|
23
23
|
list-style: none;
|
|
24
24
|
text-align: left;
|
|
25
25
|
}
|
|
26
|
+
|
|
27
|
+
.pagination {
|
|
28
|
+
text-align: left;
|
|
29
|
+
}
|
|
26
30
|
}
|
|
27
31
|
|
|
28
32
|
tr.highlightable {
|
|
@@ -61,8 +65,10 @@ img.spinner {
|
|
|
61
65
|
margin-top: 2px;
|
|
62
66
|
}
|
|
63
67
|
|
|
64
|
-
|
|
65
|
-
|
|
68
|
+
dl {
|
|
69
|
+
dt {
|
|
70
|
+
margin-top: 10px;
|
|
71
|
+
}
|
|
66
72
|
}
|
|
67
73
|
|
|
68
74
|
.letter-selector {
|
|
@@ -106,3 +112,20 @@ dt {
|
|
|
106
112
|
}
|
|
107
113
|
}
|
|
108
114
|
}
|
|
115
|
+
|
|
116
|
+
ol.concepts {
|
|
117
|
+
li {
|
|
118
|
+
margin-bottom: 15px;
|
|
119
|
+
p {
|
|
120
|
+
margin: 0;
|
|
121
|
+
}
|
|
122
|
+
p.term {
|
|
123
|
+
a {
|
|
124
|
+
font-weight: bold;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
p.uri {
|
|
128
|
+
color: green;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -35,7 +35,11 @@ class Concepts::AlphabeticalController < ConceptsController
|
|
|
35
35
|
|
|
36
36
|
# When in single query mode, AR handles ALL includes to be loaded by that
|
|
37
37
|
# one query. We don't want that! So let's do it manually :-)
|
|
38
|
-
|
|
38
|
+
includes = Iqvoc::Concept.base_class.default_includes
|
|
39
|
+
if Iqvoc::Concept.note_classes.include?(Note::SKOS::Definition)
|
|
40
|
+
includes << Note::SKOS::Definition.name.to_relation_name
|
|
41
|
+
end
|
|
42
|
+
ActiveRecord::Associations::Preloader.new(@pref_labelings, :owner => includes).run
|
|
39
43
|
end
|
|
40
44
|
|
|
41
45
|
end
|
|
@@ -50,12 +50,18 @@ class TriplestoreSyncController < ApplicationController
|
|
|
50
50
|
def sync
|
|
51
51
|
authorize! :use, :dashboard
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
flash[:error] = []
|
|
54
|
+
begin
|
|
55
|
+
success = triplestore_syncer.all # XXX: long-running
|
|
56
|
+
rescue => exc
|
|
57
|
+
success = false
|
|
58
|
+
flash[:error] << exc.message
|
|
59
|
+
end
|
|
54
60
|
|
|
55
61
|
if success
|
|
56
62
|
flash[:success] = I18n.t("txt.controllers.triplestore_sync.success")
|
|
57
63
|
else
|
|
58
|
-
flash[:error]
|
|
64
|
+
flash[:error] << I18n.t("txt.controllers.triplestore_sync.error")
|
|
59
65
|
end
|
|
60
66
|
|
|
61
67
|
redirect_to :action => "index"
|
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
<li>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
<p class="term">
|
|
3
|
+
<%= link_to pref_labeling.target.to_s, concept_path(:id => pref_labeling.owner), :alt => pref_labeling.owner.origin %>
|
|
4
|
+
<% if pref_labeling.owner.additional_info.present? %>
|
|
5
|
+
(<%= pref_labeling.owner.additional_info %>)
|
|
6
|
+
<% end %>
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
<p class="uri"><%= rdf_url(:id => pref_labeling.owner.origin, :lang => nil, :format => nil) %></p>
|
|
10
|
+
<% if pref_labeling.owner.respond_to?(Note::SKOS::Definition.name.to_relation_name) &&
|
|
11
|
+
pref_labeling.owner.send(Note::SKOS::Definition.name.to_relation_name).any? %>
|
|
12
|
+
<% pref_labeling.owner.send(Note::SKOS::Definition.name.to_relation_name).each do |definition| %>
|
|
13
|
+
<p class="definition" lang="<%= definition.language %>">
|
|
14
|
+
<%= pref_labeling.owner.send(Note::SKOS::Definition.name.to_relation_name).first.value %>
|
|
15
|
+
</p>
|
|
16
|
+
<% end %>
|
|
17
|
+
<% end %>
|
|
18
|
+
|
|
6
19
|
</li>
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
<% alphabetical_concepts_path(:prefix => letter.to_s.downcase) %>
|
|
9
9
|
<% end %>
|
|
10
10
|
</div>
|
|
11
|
-
<
|
|
11
|
+
<ol class="concepts unstyled">
|
|
12
12
|
<%= render :partial => 'pref_labeling', :collection => @pref_labelings %>
|
|
13
|
-
</
|
|
13
|
+
</dl>
|
|
14
14
|
</div>
|
|
15
15
|
|
|
16
16
|
<%= paginate @pref_labelings %>
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
</div>
|
|
1
|
+
<%= form_tag alphabetical_concepts_path(:prefix => nil), :method => :get,
|
|
2
|
+
:class => "onebox" do %>
|
|
3
|
+
<%= search_field_tag "prefix", nil, :id => nil,
|
|
4
|
+
:class => "onebox-input",
|
|
5
|
+
:autofocus => true,
|
|
6
|
+
:placeholder => t("txt.views.frontpage.type_to_browse") %>
|
|
7
|
+
<% end %>
|
data/config/boot.rb
CHANGED
|
@@ -17,13 +17,6 @@
|
|
|
17
17
|
require 'rubygems'
|
|
18
18
|
|
|
19
19
|
# Set up gems listed in the Gemfile.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
require 'bundler'
|
|
24
|
-
Bundler.setup
|
|
25
|
-
rescue Bundler::GemNotFound => e
|
|
26
|
-
STDERR.puts e.message
|
|
27
|
-
STDERR.puts "Try running `bundle install`."
|
|
28
|
-
exit!
|
|
29
|
-
end if File.exist?(gemfile)
|
|
20
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
|
|
21
|
+
|
|
22
|
+
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
|
data/config/engine.rb
CHANGED
|
@@ -29,6 +29,11 @@ module Iqvoc
|
|
|
29
29
|
initializer "iqvoc.add_assets_to_precompilation" do |app|
|
|
30
30
|
app.config.assets.precompile += Iqvoc.core_assets
|
|
31
31
|
end
|
|
32
|
+
|
|
33
|
+
initializer "iqvoc.load_migrations" do |app|
|
|
34
|
+
# Pull in all the migrations to the application embedding iqvoc
|
|
35
|
+
app.config.paths['db/migrate'] += Iqvoc::Engine.paths['db/migrate'].existent
|
|
36
|
+
end
|
|
32
37
|
end
|
|
33
38
|
|
|
34
39
|
end
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
class UseMonoHierarchyInsteadOfPolyHierarchy < ActiveRecord::Migration
|
|
2
2
|
def self.up
|
|
3
3
|
ActiveRecord::Base.transaction do
|
|
4
|
-
|
|
4
|
+
execute "UPDATE concept_relations SET type = 'Concept::Relation::SKOS::Broader::Mono' WHERE type = 'Concept::Relation::SKOS::Broader::Poly'"
|
|
5
5
|
end
|
|
6
6
|
end
|
|
7
7
|
|
|
8
8
|
def self.down
|
|
9
9
|
ActiveRecord::Base.transaction do
|
|
10
|
-
|
|
10
|
+
execute "UPDATE concept_relations SET type = 'Concept::Relation::SKOS::Broader::Poly' WHERE type = 'Concept::Relation::SKOS::Broader::Mono'"
|
|
11
11
|
end
|
|
12
12
|
end
|
|
13
13
|
end
|
|
@@ -3,35 +3,22 @@ class SeparateNoteAnnotationPredicates < ActiveRecord::Migration
|
|
|
3
3
|
rename_column :note_annotations, :identifier, :predicate
|
|
4
4
|
add_column :note_annotations, :namespace, :string, :limit => 50
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
i = 0
|
|
6
|
+
annotations = select_rows("SELECT id, predicate FROM note_annotations")
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
Note::Annotated::Base.find_each do |annotation|
|
|
13
|
-
print "#{reset}#{i += 1} / #{total}"
|
|
14
|
-
|
|
15
|
-
old_identifier = annotation.predicate
|
|
16
|
-
namespace, predicate = old_identifier.split(":", 2)
|
|
17
|
-
annotation.predicate = predicate
|
|
18
|
-
annotation.namespace = namespace
|
|
19
|
-
annotation.save!
|
|
20
|
-
|
|
21
|
-
$stdout.flush
|
|
8
|
+
annotations.each do |annotation|
|
|
9
|
+
namespace, predicate = annotation[1].split(":", 2)
|
|
10
|
+
execute "UPDATE note_annotations SET namespace = '#{namespace}', predicate = '#{predicate}' WHERE id = #{annotation[0]}"
|
|
22
11
|
end
|
|
23
|
-
|
|
24
|
-
print "#{reset}"
|
|
25
|
-
$stdout.flush
|
|
26
|
-
puts "note annotation conversion complete"
|
|
27
12
|
end
|
|
28
13
|
|
|
29
14
|
def self.down
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
annotation.
|
|
15
|
+
annotations = select_rows("SELECT id, predicate, namespace FROM note_annotations")
|
|
16
|
+
|
|
17
|
+
annotations.each do |annotation|
|
|
18
|
+
identifier = [annotation[2], annotation[1]].join(":")
|
|
19
|
+
execute "UPDATE note_annotations SET predicate = '#{identifier}' WHERE id = #{annotation[0]}"
|
|
34
20
|
end
|
|
21
|
+
|
|
35
22
|
rename_column :note_annotations, :predicate, :identifier
|
|
36
23
|
remove_column :note_annotations, :namespace
|
|
37
24
|
end
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
class ChangeUmtNoteAnnotationsToDct < ActiveRecord::Migration
|
|
2
2
|
def self.up
|
|
3
|
-
|
|
3
|
+
execute "UPDATE note_annotations SET namespace = 'dct', predicate = 'creator' WHERE namespace = 'umt' AND predicate = 'editor'"
|
|
4
4
|
end
|
|
5
5
|
|
|
6
6
|
def self.down
|
|
7
|
-
|
|
7
|
+
execute "UPDATE note_annotations SET namespace = 'umt', predicate = 'editor' WHERE namespace = 'dct' AND predicate = 'creator'"
|
|
8
8
|
end
|
|
9
9
|
end
|
data/lib/engine_tasks/db.rake
CHANGED
|
@@ -1,27 +1,6 @@
|
|
|
1
1
|
namespace :iqvoc do
|
|
2
2
|
namespace :db do
|
|
3
3
|
|
|
4
|
-
desc "Migrate the database through scripts in db/migrate and update db/schema.rb by invoking db:schema:dump. Target specific version with VERSION=x. Turn off output with VERBOSE=false."
|
|
5
|
-
task :migrate => :environment do
|
|
6
|
-
ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
|
|
7
|
-
ActiveRecord::Migrator.migrate(Iqvoc::Engine.find_root_with_flag("db").join("db/migrate"), ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
|
|
8
|
-
Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
desc "Migrate the database through all scripts in db/migrate of every engine and update db/schema.rb by invoking db:schema:dump. Target specific version with VERSION=x. Turn off output with VERBOSE=false."
|
|
13
|
-
task :migrate_all => :environment do
|
|
14
|
-
ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
|
|
15
|
-
paths = Rails.application.config.paths["db/migrate"].existent +
|
|
16
|
-
Rails.application.railties.engines.
|
|
17
|
-
map { |e| e.config.paths["db/migrate"] && e.config.paths["db/migrate"].existent }.
|
|
18
|
-
flatten.compact
|
|
19
|
-
|
|
20
|
-
puts "Migrating from: " + paths.join(", ")
|
|
21
|
-
ActiveRecord::Migrator.migrate(paths, ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
|
|
22
|
-
Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
|
|
23
|
-
end
|
|
24
|
-
|
|
25
4
|
desc "Load seeds (task is idempotent)"
|
|
26
5
|
task :seed => :environment do
|
|
27
6
|
Iqvoc::Engine.load_seed
|
data/lib/iqvoc/rdf_sync.rb
CHANGED
|
@@ -1,15 +1,27 @@
|
|
|
1
1
|
# encoding: UTF-8
|
|
2
2
|
|
|
3
|
-
require 'iq_triplestorage/virtuoso_adaptor'
|
|
4
|
-
|
|
5
3
|
class Iqvoc::RDFSync
|
|
6
4
|
delegate :url_helpers, :to => "Rails.application.routes"
|
|
7
5
|
|
|
8
|
-
|
|
6
|
+
ADAPTORS = { # XXX: inappropriate?
|
|
7
|
+
"virtuoso" => lambda do |host_url, options|
|
|
8
|
+
require 'iq_triplestorage/virtuoso_adaptor'
|
|
9
|
+
return IqTriplestorage::VirtuosoAdaptor.new(host_url, options)
|
|
10
|
+
end,
|
|
11
|
+
"sesame" => lambda do |host_url, options|
|
|
12
|
+
require 'iq_triplestorage/sesame_adaptor'
|
|
13
|
+
host_url, _, repo = host_url.rpartition("/repositories/")
|
|
14
|
+
if host_url.blank? || repo.blank?
|
|
15
|
+
raise ArgumentError, "missing repository in Sesame URL"
|
|
16
|
+
end
|
|
17
|
+
options[:repository] = repo
|
|
18
|
+
return IqTriplestorage::SesameAdaptor.new(host_url, options)
|
|
19
|
+
end
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
def initialize(base_url, target_url, options)
|
|
9
23
|
@base_url = base_url
|
|
10
|
-
@
|
|
11
|
-
options = args.extract_options!
|
|
12
|
-
@target_port = options[:port]
|
|
24
|
+
@target_url = target_url
|
|
13
25
|
@username = options[:username]
|
|
14
26
|
@password = options[:password]
|
|
15
27
|
@batch_size = options[:batch_size] || 100
|
|
@@ -50,8 +62,9 @@ class Iqvoc::RDFSync
|
|
|
50
62
|
memo
|
|
51
63
|
end
|
|
52
64
|
|
|
53
|
-
|
|
54
|
-
|
|
65
|
+
adaptor_type = "sesame" # XXX: hard-coded
|
|
66
|
+
adaptor = ADAPTORS[adaptor_type].call(@target_url, :username => @username,
|
|
67
|
+
:password => @password)
|
|
55
68
|
return adaptor.batch_update(data)
|
|
56
69
|
end
|
|
57
70
|
|
|
@@ -97,12 +110,7 @@ module Iqvoc::RDFSync::Helper # TODO: rename -- XXX: does not belong here!?
|
|
|
97
110
|
def triplestore_syncer
|
|
98
111
|
base_url = root_url(:lang => nil) # XXX: brittle in the face of future changes?
|
|
99
112
|
|
|
100
|
-
|
|
101
|
-
port = host.port
|
|
102
|
-
host.port = 80 # XXX: hack to remove port from serialization
|
|
103
|
-
host = host.to_s
|
|
104
|
-
|
|
105
|
-
return Iqvoc::RDFSync.new(base_url, host, :port => port,
|
|
113
|
+
return Iqvoc::RDFSync.new(base_url, Iqvoc.config["triplestore.url"],
|
|
106
114
|
:username => Iqvoc.config["triplestore.username"].presence,
|
|
107
115
|
:password => Iqvoc.config["triplestore.password"].presence,
|
|
108
116
|
:view_context => view_context) # fugly, but necessary; cf. RDFSync#serialize
|
data/lib/iqvoc/version.rb
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|