qa_server 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bb899be9f195123d4e4b12780679afac70ea5322
4
- data.tar.gz: a12013b8d2434dae73f9d8ccf46ce0964fa95d9e
3
+ metadata.gz: 9ac54427130510f4f5dc59e1359ecc154dbc2b94
4
+ data.tar.gz: 07b349e08fa02aab38e5b6090e16dd0df16871e5
5
5
  SHA512:
6
- metadata.gz: 52e2544fe44d77e9db9e93402caf3d922bd68bbaf1cfd02c62bd26aa5615aa68ad22836797a9fd1a8bd18891592c3c3c2be5ef5d16d452823873c1bce38e91de
7
- data.tar.gz: 6eba1a6ffc47017d4ee5d8e5cc58e7c4bbadd84bb8bd2937483585fe520c49f0fd16a0699e6948b7e3c364620a4044a39fa30dd0823ea5bf727bcb614bb709b9
6
+ metadata.gz: b804da6a0a5234a44ec0405685b6b0a948f1e9027043a0d864b935cb46cdfeb02400611d6f4d8ca391a4f6e69ab98a146f3f01a8491c6f046a1fd1b2858ad074
7
+ data.tar.gz: ed2f9fd29a267b4a435ac11e4e3ca4a4c41c04b3c37bdb846243dafc71d14229a7b426ca37b7cd420eb2304b9226bb32443ef4328bab1dd4046231b2b9a4a628
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ### 1.1.0 (2018-10-31)
2
+
3
+ * allow historical data to be displayed as graph or datatable (configuration)
4
+ * drive main nav menu from navmenu_presenter (configuration)
5
+ * Add better install instructions in README
6
+
1
7
  ### 1.0.0 (2018-09-24)
2
8
 
3
9
  * drive URL base host path from qa engine mount location
data/Gemfile.lock CHANGED
@@ -1,6 +1,6 @@
1
1
  GIT
2
2
  remote: https://github.com/samvera/questioning_authority.git
3
- revision: e870fc07b991188053d2cd9eeb6a843b896911d8
3
+ revision: f44e597474cd55f64fb31a77bdb39ece81b97fa8
4
4
  branch: min_context
5
5
  specs:
6
6
  qa (2.1.1)
@@ -53,7 +53,7 @@ GEM
53
53
  activemodel (= 5.1.6)
54
54
  activesupport (= 5.1.6)
55
55
  arel (~> 8.0)
56
- activerecord-import (0.25.0)
56
+ activerecord-import (0.27.0)
57
57
  activerecord (>= 3.2)
58
58
  activesupport (5.1.6)
59
59
  concurrent-ruby (~> 1.0, >= 1.0.2)
@@ -329,9 +329,9 @@ GEM
329
329
  sprockets (>= 2.8, < 4.0)
330
330
  sprockets-rails (>= 2.0, < 4.0)
331
331
  tilt (>= 1.1, < 3)
332
- selenium-webdriver (3.14.0)
332
+ selenium-webdriver (3.14.1)
333
333
  childprocess (~> 0.5)
334
- rubyzip (~> 1.2)
334
+ rubyzip (~> 1.2, >= 1.2.2)
335
335
  shex (0.5.2)
336
336
  ebnf (~> 1.1)
337
337
  json-ld (>= 2.2, < 4.0)
@@ -381,7 +381,7 @@ GEM
381
381
  websocket-driver (0.6.5)
382
382
  websocket-extensions (>= 0.1.0)
383
383
  websocket-extensions (0.1.3)
384
- xpath (3.1.0)
384
+ xpath (3.2.0)
385
385
  nokogiri (~> 1.8)
386
386
 
387
387
  PLATFORMS
data/README.md CHANGED
@@ -6,6 +6,7 @@ This rails engine can be installed into your app to serve as a Questioning Autho
6
6
  * [Architecture for Authority Lookup](https://wiki.duraspace.org/x/84E2BQ) document describes the authority access and normalization layer that provides applications with a consistent output for processing.
7
7
  * [Authority aggregation and indexing](https://wiki.duraspace.org/display/ld4lLABS/Authority+aggregation+and+indexing) document describes the technology used for caching authority data.
8
8
  * [samvera/questioning_authority](https://github.com/samvera/questioning_authority) (QA) is the gem that provides access to external authorities and normalizes the results. See the [Linked Open Data (LOD) Authorities](https://github.com/samvera/questioning_authority#linked-open-data-lod-authorities) section for details on the primary part of QA that is used by this engine.
9
+ * [ruby-rdf/linkeddata](https://github.com/ruby-rdf/linkeddata) is a gem that processes linked data in a number of RDF formats.
9
10
  * [LD4P/linked_data_authorities](https://github.com/LD4P/linked_data_authorities) holds predefined Questioning Authority configurations that work with this qa_server engine.
10
11
 
11
12
 
@@ -20,7 +21,7 @@ Tested with...
20
21
 
21
22
  ### Prerequisites
22
23
 
23
- 1. [ImageMagick](http://www.imagemagick.org/)
24
+ 1. [ImageMagick](http://www.imagemagick.org/) - Used to generate status charts. Generated charts will be saved in `app/assets/images/qa_server/charts` directory.
24
25
 
25
26
  ### Installation Instructions
26
27
 
@@ -49,6 +50,8 @@ $ rails g qa_server:install
49
50
  $ rake db:migrate
50
51
  ```
51
52
 
53
+ If upgrading instead of installing, see the Release notes for steps you may need to take manually since you won't be running the installer.
54
+
52
55
  #### Test the install
53
56
 
54
57
  * Start rails server with `rails s`
@@ -67,6 +67,11 @@ td.position {
67
67
  background-color: #ffcccc;
68
68
  }
69
69
 
70
+ .status-neutral {
71
+ text-align: center;
72
+ background-color: #ffffff;
73
+ }
74
+
70
75
  label.horizontal-list {
71
76
  padding-right: 15px;
72
77
  }
@@ -6,6 +6,10 @@ require 'gruff'
6
6
  # This presenter class provides all data needed by the view that monitors status of authorities.
7
7
  module QaServer
8
8
  class MonitorStatusPresenter # rubocop:disable Metrics/ClassLength
9
+ HISTORICAL_AUTHORITY_NAME_IDX = 0
10
+ HISTORICAL_FAILURE_COUNT_IDX = 1
11
+ HISTORICAL_PASSING_COUNT_IDX = 2
12
+
9
13
  # @param current_summary [ScenarioRunSummary] summary status of the latest run of test scenarios
10
14
  # @param current_data [Array<Hash>] current set of failures for the latest test run, if any
11
15
  # @param historical_summary_data [Array<Hash>] summary of past failuring runs per authority to drive chart
@@ -124,6 +128,53 @@ module QaServer
124
128
  end
125
129
  end
126
130
 
131
+ def historical_data_authority_name(historical_entry)
132
+ historical_entry[QaServer::MonitorStatusPresenter::HISTORICAL_AUTHORITY_NAME_IDX]
133
+ end
134
+
135
+ def days_authority_passing(historical_entry)
136
+ historical_entry[QaServer::MonitorStatusPresenter::HISTORICAL_PASSING_COUNT_IDX]
137
+ end
138
+
139
+ def days_authority_failing(historical_entry)
140
+ historical_entry[QaServer::MonitorStatusPresenter::HISTORICAL_FAILURE_COUNT_IDX]
141
+ end
142
+
143
+ def days_authority_tested(historical_entry)
144
+ days_authority_passing(historical_entry) + days_authority_failing(historical_entry)
145
+ end
146
+
147
+ def percent_authority_failing(historical_entry)
148
+ days_authority_failing(historical_entry).to_f / days_authority_tested(historical_entry)
149
+ end
150
+
151
+ def percent_authority_failing_str(historical_entry)
152
+ "#{percent_authority_failing(historical_entry) * 100}%"
153
+ end
154
+
155
+ def failure_style_class(historical_entry)
156
+ return "status-neutral" if days_authority_failing(historical_entry) <= 0
157
+ return "status-unknown" if percent_authority_failing(historical_entry) < 0.1
158
+ "status-bad"
159
+ end
160
+
161
+ def passing_style_class(historical_entry)
162
+ return "status-bad" if days_authority_passing(historical_entry) <= 0
163
+ "status-good"
164
+ end
165
+
166
+ def display_history_details?
167
+ display_historical_graph? || display_historical_datatable?
168
+ end
169
+
170
+ def display_historical_graph?
171
+ QaServer.config.display_historical_graph?
172
+ end
173
+
174
+ def display_historical_datatable?
175
+ QaServer.config.display_historical_datatable?
176
+ end
177
+
127
178
  private
128
179
 
129
180
  def graph_theme(g)
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+ # This presenter class provides all data needed by the view that show the list of authorities.
3
+ module QaServer
4
+ class NavmenuPresenter
5
+ include QaServer::Engine.routes.url_helpers
6
+
7
+ # @return [Array<Hash>] label-url pairs for the navigation bar's menu items justified left
8
+ # @example
9
+ # [
10
+ # { label: 'Home', url: '/' },
11
+ # { label: 'Usage', url: '/usage' },
12
+ # { label: 'Authorities', url: '/authorities' },
13
+ # { label: 'Check Status', url: '/check_status' },
14
+ # { label: 'Monitor Status', url: '/monitor_status' }
15
+ # ]
16
+ attr_reader :leftmenu_items
17
+
18
+ # @return [Array<Hash>] label-url pairs for the navigation bar's menu items justified right
19
+ # @example
20
+ # [
21
+ # { label: 'LD4L Gateway', url: 'http://ld4l.org' }
22
+ # ]
23
+ attr_reader :rightmenu_items
24
+
25
+ def initialize
26
+ @leftmenu_items = []
27
+ @leftmenu_items << { label: I18n.t("qa_server.menu.home"), url: root_path }
28
+ @leftmenu_items << { label: I18n.t("qa_server.menu.usage"), url: usage_index_path }
29
+ @leftmenu_items << { label: I18n.t("qa_server.menu.authorities"), url: authority_list_index_path }
30
+ @leftmenu_items << { label: I18n.t("qa_server.menu.check_status"), url: check_status_index_path }
31
+ @leftmenu_items << { label: I18n.t("qa_server.menu.monitor_status"), url: monitor_status_index_path }
32
+
33
+ @rightmenu_items = []
34
+ @rightmenu_items << { label: "LD4L Gateway", url: "http://ld4l.org/" }
35
+ end
36
+
37
+ # Append additional left justified menu items to the main navigation menu
38
+ # @param [Array<Hash<String,String>>] array of menu items to append with hash key = menu item label to display and hash value = URL for the menu item link
39
+ # @example
40
+ # [
41
+ # { label: 'New Item Label', url: 'http://new.item/one' },
42
+ # { label: '2nd New Item Label', url: 'http://new.item/two' }
43
+ # ]
44
+ def append_leftmenu_items(additional_items = [])
45
+ return if additional_items.nil?
46
+ additional_items.each { |item| @leftmenu_items << item }
47
+ end
48
+ end
49
+ end
@@ -33,18 +33,17 @@
33
33
  <div class="container-fluid">
34
34
  <div class="navbar-header">
35
35
  <ul class="nav-menu">
36
- <li class="left-menu"><%= link_to t("qa_server.menu.home"), main_app.root_path %></li>
37
- <li class="left-menu"><%= link_to t("qa_server.menu.usage"), qa_server.usage_index_path %></li>
38
- <li class="left-menu"><%= link_to t("qa_server.menu.authorities"), qa_server.authority_list_index_path %></li>
39
- <li class="left-menu"><%= link_to t("qa_server.menu.check_status"), qa_server.check_status_index_path %></li>
40
- <li class="left-menu"><%= link_to t("qa_server.menu.monitor_status"), qa_server.monitor_status_index_path %></li>
41
- <li class="right-menu"><%= link_to "LD4L Gateway", "http://ld4l.org/" %></li>
36
+ <% QaServer.config.navmenu_presenter.leftmenu_items.each do |item| %>
37
+ <li class='left-menu'><%= link_to item[:label], item[:url] %></li>
38
+ <% end %>
39
+ <% QaServer.config.navmenu_presenter.rightmenu_items.each do |item| %>
40
+ <li class='right-menu'><%= link_to item[:label], item[:url] %></li>
41
+ <% end %>
42
42
  </ul>
43
43
  </div>
44
44
  </div>
45
45
  </nav>
46
46
  </div>
47
- </div>
48
47
 
49
48
  <div id="content-wrapper" class="container" role="main">
50
49
  <a name="skip_to_content"></a>
@@ -12,11 +12,11 @@
12
12
  <th><%= t('qa_server.monitor_status.summary.total_tests') %></th>
13
13
  </tr>
14
14
  <tr>
15
- <td><%= @presenter.authorities_count %></td>
15
+ <td class="status-neutral"><%= @presenter.authorities_count %></td>
16
16
  <td class="<%= @presenter.authorities_count_style %>"><%= @presenter.failing_authorities_count %></td>
17
- <td><%= @presenter.passing_tests_count%></td>
17
+ <td class="status-neutral"><%= @presenter.passing_tests_count%></td>
18
18
  <td class="<%= @presenter.failing_tests_style %>"><%= @presenter.failing_tests_count %></td>
19
- <td><%= @presenter.tests_count %></td>
19
+ <td class="status-neutral"><%= @presenter.tests_count %></td>
20
20
  </tr>
21
21
  </table>
22
22
  <p class="status-update-dtstamp"><%= t('qa_server.monitor_status.summary.last_updated', date: @presenter.last_updated) %></p>
@@ -51,33 +51,35 @@
51
51
  </div>
52
52
  <% end %>
53
53
 
54
- <% if @presenter.history? %>
54
+ <% if @presenter.history? && @presenter.display_history_details?%>
55
55
  <div id="status-section" class="status-section">
56
56
  <h2><%= t('qa_server.monitor_status.history.title') %></h2>
57
57
  <p class="status-update-dtstamp"><%= t('qa_server.monitor_status.history.since', date: @presenter.first_updated) %></p>
58
58
  <%#= column_chart @presenter.historical_summary, stacked: true, colors: ["green", "red"], xtitle: 'Authority', ytitle: 'Pass-Fail', legend: 'bottom' %>
59
- <%= image_tag(@presenter.historical_graph, alt: 'History Graph Unavailable') %>
59
+ <% if @presenter.display_historical_graph? %>
60
+ <%= image_tag(@presenter.historical_graph, alt: 'History Graph Unavailable') %>
61
+ <% end %>
60
62
 
61
- <!--
62
- <table class="status">
63
- <tr>
64
- <th><%= t('qa_server.monitor_status.history.days_failing') %></th>
65
- <th><%= t('qa_server.monitor_status.history.authority') %></th>
66
- <th><%= t('qa_server.monitor_status.history.subauthority') %></th>
67
- <th><%= t('qa_server.monitor_status.history.service') %></th>
68
- <th><%= t('qa_server.monitor_status.history.action') %></th>
69
- </tr>
70
- <%# @presenter.history.each do |entry| %>
71
- <tr>
72
- <td><%#= entry[:days_failing] %></td>
73
- <td><%#= entry[:authority_name] %></td>
74
- <td><%#= entry[:subauthority_name] %></td>
75
- <td><%#= entry[:service] %></td>
76
- <td><%#= entry[:action] %></td>
77
- </tr>
78
- <%# end %>
79
- </table>
80
- -->
63
+ <% if @presenter.display_historical_datatable? %>
64
+ <table class="status">
65
+ <tr>
66
+ <th><%= t('qa_server.monitor_status.history.authority') %></th>
67
+ <th><%= t('qa_server.monitor_status.history.days_tested') %></th>
68
+ <th><%= t('qa_server.monitor_status.history.days_passing') %></th>
69
+ <th><%= t('qa_server.monitor_status.history.days_failing') %></th>
70
+ <th><%= t('qa_server.monitor_status.history.percent_failing') %></th>
71
+ </tr>
72
+ <% @presenter.historical_summary.each do |entry| %>
73
+ <tr>
74
+ <td><%= @presenter.historical_data_authority_name(entry) %></td>
75
+ <td class="status-neutral"><%= @presenter.days_authority_tested(entry) %></td>
76
+ <td class="<%= @presenter.passing_style_class(entry) %>"><%= @presenter.days_authority_passing(entry) %></td>
77
+ <td class="<%= @presenter.failure_style_class(entry) %>"><%= @presenter.days_authority_failing(entry) %></td>
78
+ <td class="<%= @presenter.failure_style_class(entry) %>"><%= @presenter.percent_authority_failing_str(entry) %></td>
79
+ </tr>
80
+ <% end %>
81
+ </table>
82
+ <% end %>
81
83
  </div>
82
84
  <% end %>
83
85
  </div>
@@ -60,9 +60,8 @@ en:
60
60
  history:
61
61
  title: History
62
62
  since: 'Since %{date} ET'
63
- days_failing: Days Failing
64
63
  authority: Authority
65
- subauthority: Subauthority
66
- service: Service
67
- action: Action
68
- url: Sample URL
64
+ days_failing: Days Failing
65
+ days_passing: Days Passing
66
+ days_tested: Days Tested
67
+ percent_failing: Percent Failing
@@ -57,5 +57,10 @@ module QaServer
57
57
  " <script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js'></script>\n"
58
58
  end
59
59
  end
60
+
61
+ def create_location_for_charts
62
+ say_status('info', ' -- creating directory to hold dynamically generated charts', :blue)
63
+ copy_file 'app/assets/images/qa_server/charts/.keep'
64
+ end
60
65
  end
61
66
  end
@@ -1,4 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
  QaServer.config do |config|
3
- # no configurations at this time
3
+ # Displays a graph of historical test data when true
4
+ # @param [Boolean] display history graph when true
5
+ # config.display_historical_graph = false
6
+
7
+ # Displays a datatable of historical test data when true
8
+ # @param [Boolean] display history datatable when true
9
+ # config.display_historical_datatable = true
10
+
11
+ # Additional menu items to add to the main navigation menu's set of left justified menu items
12
+ # @param [Array<Hash<String,String>>] array of menu items to append with hash label: is menu item label to display and hash url: is URL for the menu item link
13
+ # config.navmenu_extra_leftitems = [
14
+ # { label: 'Your Menu Item Label', url: 'http://your.menu.item/url' }
15
+ # ]
4
16
  end
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  en:
3
3
  qa_server:
4
- application_version: "0.1.0"
4
+ application_version: "YOUR APPS VERSION"
5
5
  application_name: "My Institution Lookup Service"
6
6
  footer:
7
7
  copyright_html: "<strong>Copyright &copy; 2018 Cornell</strong> Licensed under the Apache License, Version 2.0"
@@ -1,6 +1,34 @@
1
1
  # frozen_string_literal: true
2
2
  module QaServer
3
3
  class Configuration
4
- # no configurations at this time
4
+ attr_writer :display_historical_graph
5
+ def display_historical_graph?
6
+ return @display_historical_graph unless @display_historical_graph.nil?
7
+ @display_historical_graph = false
8
+ end
9
+
10
+ attr_writer :display_historical_datatable
11
+ def display_historical_datatable?
12
+ return @display_historical_datatable unless @display_historical_datatable.nil?
13
+ @display_historical_datatable = true
14
+ end
15
+
16
+ # Additional menu items to add to the main navigation menu's set of left justified menu items
17
+ # @param [Array<Hash<String,String>>] array of menu items to append with hash key = menu item label to display and hash value = URL for the menu item link
18
+ # @example
19
+ # [
20
+ # { label: 'New Item Label', url: 'http://new.item/one' },
21
+ # { label: '2nd New Item Label', url: 'http://new.item/two' }
22
+ # ]
23
+ attr_accessor :navmenu_extra_leftitems
24
+
25
+ # Get the one and only instance of the navigation menu presenter used to construct the main navigation menu.
26
+ # To extend, set additional navigation menu items using #navmenu_extra_leftitems
27
+ def navmenu_presenter
28
+ return @navmenu_presenter if @navmenu_presenter.present?
29
+ @navmenu_presenter ||= QaServer::NavmenuPresenter.new
30
+ @navmenu_presenter.append_leftmenu_items(navmenu_extra_leftitems)
31
+ @navmenu_presenter
32
+ end
5
33
  end
6
34
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module QaServer
3
- VERSION = '1.0.0'
3
+ VERSION = '1.1.0'
4
4
  end
data/qa_server.gemspec CHANGED
@@ -31,7 +31,8 @@ Gem::Specification.new do |spec|
31
31
  # Produces dashboard charts on monitor status page
32
32
  spec.add_dependency 'gruff'
33
33
 
34
- spec.add_development_dependency 'binding_of_caller', '~> 1.0.0' # rubocop styleguide
34
+ spec.add_development_dependency 'better_errors' # provide debugging command line in
35
+ spec.add_development_dependency 'binding_of_caller' # provides deep stack info used by better_errors
35
36
  spec.add_development_dependency 'bixby', '~> 1.0.0' # rubocop styleguide
36
37
  # spec.add_development_dependency 'capybara', '~> 2.13'
37
38
  spec.add_development_dependency 'engine_cart', '~> 2.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qa_server
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - E. Lynette Rayle
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-09-24 00:00:00.000000000 Z
11
+ date: 2018-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -66,20 +66,34 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: better_errors
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: binding_of_caller
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - "~>"
87
+ - - ">="
74
88
  - !ruby/object:Gem::Version
75
- version: 1.0.0
89
+ version: '0'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - "~>"
94
+ - - ">="
81
95
  - !ruby/object:Gem::Version
82
- version: 1.0.0
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: bixby
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -202,6 +216,7 @@ files:
202
216
  - app/presenters/qa_server/authority_list_presenter.rb
203
217
  - app/presenters/qa_server/check_status_presenter.rb
204
218
  - app/presenters/qa_server/monitor_status_presenter.rb
219
+ - app/presenters/qa_server/navmenu_presenter.rb
205
220
  - app/services/qa_server/authority_lister_service.rb
206
221
  - app/services/qa_server/authority_loader_service.rb
207
222
  - app/services/qa_server/authority_validator_service.rb
@@ -223,6 +238,7 @@ files:
223
238
  - lib/generators/qa_server/config_generator.rb
224
239
  - lib/generators/qa_server/install_generator.rb
225
240
  - lib/generators/qa_server/models_generator.rb
241
+ - lib/generators/qa_server/templates/app/assets/images/qa_server/charts/.keep
226
242
  - lib/generators/qa_server/templates/config/authorities/linked_data/agrovoc_direct.json
227
243
  - lib/generators/qa_server/templates/config/authorities/linked_data/agrovoc_ld4l_cache.json
228
244
  - lib/generators/qa_server/templates/config/authorities/linked_data/dbpedia_direct.json