iqvoc 4.0.6 → 4.0.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|