supplejack_api 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.
Files changed (291) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +80 -0
  3. data/Rakefile +42 -0
  4. data/app/assets/javascripts/supplejack_api/application.js +26 -0
  5. data/app/assets/stylesheets/supplejack_api/application.css +30 -0
  6. data/app/controllers/supplejack_api/admin/base_controller.rb +24 -0
  7. data/app/controllers/supplejack_api/admin/sessions_controller.rb +25 -0
  8. data/app/controllers/supplejack_api/admin/site_activities_controller.rb +21 -0
  9. data/app/controllers/supplejack_api/admin/users_controller.rb +55 -0
  10. data/app/controllers/supplejack_api/application_controller.rb +70 -0
  11. data/app/controllers/supplejack_api/concepts_controller.rb +52 -0
  12. data/app/controllers/supplejack_api/concerns/ignore_metrics.rb +14 -0
  13. data/app/controllers/supplejack_api/concerns/records_controller_metrics.rb +26 -0
  14. data/app/controllers/supplejack_api/concerns/set_items_controller_metrics.rb +20 -0
  15. data/app/controllers/supplejack_api/concerns/user_sets_controller_metrics.rb +26 -0
  16. data/app/controllers/supplejack_api/harvester/concepts_controller.rb +41 -0
  17. data/app/controllers/supplejack_api/harvester/fragments_controller.rb +30 -0
  18. data/app/controllers/supplejack_api/harvester/records_controller.rb +68 -0
  19. data/app/controllers/supplejack_api/metrics_api_controller.rb +44 -0
  20. data/app/controllers/supplejack_api/partners_controller.rb +39 -0
  21. data/app/controllers/supplejack_api/records_controller.rb +71 -0
  22. data/app/controllers/supplejack_api/schema_controller.rb +19 -0
  23. data/app/controllers/supplejack_api/set_items_controller.rb +38 -0
  24. data/app/controllers/supplejack_api/sources_controller.rb +67 -0
  25. data/app/controllers/supplejack_api/status_controller.rb +67 -0
  26. data/app/controllers/supplejack_api/user_sets_controller.rb +97 -0
  27. data/app/controllers/supplejack_api/users_controller.rb +49 -0
  28. data/app/helpers/supplejack_api/application_helper.rb +39 -0
  29. data/app/helpers/supplejack_api/facets_helper.rb +30 -0
  30. data/app/mailers/supplejack_api/request_limit_mailer.rb +43 -0
  31. data/app/models/supplejack_api/api_concept/concept_fragment.rb +31 -0
  32. data/app/models/supplejack_api/api_record/record_fragment.rb +15 -0
  33. data/app/models/supplejack_api/concept.rb +46 -0
  34. data/app/models/supplejack_api/concept_search.rb +86 -0
  35. data/app/models/supplejack_api/concerns/queryable_by_date.rb +31 -0
  36. data/app/models/supplejack_api/concerns/record.rb +108 -0
  37. data/app/models/supplejack_api/concerns/record_fragmentable.rb +24 -0
  38. data/app/models/supplejack_api/concerns/searchable.rb +430 -0
  39. data/app/models/supplejack_api/concerns/user_set.rb +219 -0
  40. data/app/models/supplejack_api/daily_metrics.rb +20 -0
  41. data/app/models/supplejack_api/faceted_metrics.rb +55 -0
  42. data/app/models/supplejack_api/fragment.rb +82 -0
  43. data/app/models/supplejack_api/interaction_models/record.rb +60 -0
  44. data/app/models/supplejack_api/interaction_models/set.rb +13 -0
  45. data/app/models/supplejack_api/interaction_updaters/all_usage_metric.rb +41 -0
  46. data/app/models/supplejack_api/interaction_updaters/set_metrics.rb +32 -0
  47. data/app/models/supplejack_api/interaction_updaters/usage_metrics.rb +73 -0
  48. data/app/models/supplejack_api/partner.rb +24 -0
  49. data/app/models/supplejack_api/preview_record.rb +30 -0
  50. data/app/models/supplejack_api/record.rb +18 -0
  51. data/app/models/supplejack_api/record_search.rb +12 -0
  52. data/app/models/supplejack_api/schema_definition.rb +147 -0
  53. data/app/models/supplejack_api/search.rb +14 -0
  54. data/app/models/supplejack_api/set_item.rb +57 -0
  55. data/app/models/supplejack_api/site_activity.rb +59 -0
  56. data/app/models/supplejack_api/source.rb +28 -0
  57. data/app/models/supplejack_api/source_activity.rb +36 -0
  58. data/app/models/supplejack_api/source_authority.rb +42 -0
  59. data/app/models/supplejack_api/supplejack_schema.rb +37 -0
  60. data/app/models/supplejack_api/support/concept/searchable.rb +79 -0
  61. data/app/models/supplejack_api/support/concept/storable.rb +59 -0
  62. data/app/models/supplejack_api/support/fragment_helpers.rb +96 -0
  63. data/app/models/supplejack_api/support/harvestable.rb +105 -0
  64. data/app/models/supplejack_api/support/searchable.rb +115 -0
  65. data/app/models/supplejack_api/support/status_logger.rb +23 -0
  66. data/app/models/supplejack_api/support/storable.rb +49 -0
  67. data/app/models/supplejack_api/support/validation_logger.rb +23 -0
  68. data/app/models/supplejack_api/usage_metrics.rb +25 -0
  69. data/app/models/supplejack_api/user.rb +211 -0
  70. data/app/models/supplejack_api/user_activity.rb +65 -0
  71. data/app/models/supplejack_api/user_set.rb +17 -0
  72. data/app/serializers/supplejack_api/application_serializer.rb +12 -0
  73. data/app/serializers/supplejack_api/concept_record_serializer.rb +23 -0
  74. data/app/serializers/supplejack_api/concept_search_serializer.rb +12 -0
  75. data/app/serializers/supplejack_api/concept_serializer.rb +100 -0
  76. data/app/serializers/supplejack_api/concerns/record_serializable.rb +119 -0
  77. data/app/serializers/supplejack_api/concerns/search_serializable.rb +24 -0
  78. data/app/serializers/supplejack_api/record_search_serializer.rb +64 -0
  79. data/app/serializers/supplejack_api/record_serializer.rb +13 -0
  80. data/app/serializers/supplejack_api/search_serializer.rb +13 -0
  81. data/app/serializers/supplejack_api/source_authority_serializer.rb +23 -0
  82. data/app/serializers/supplejack_api/user_serializer.rb +13 -0
  83. data/app/serializers/supplejack_api/user_set_record_serializer.rb +14 -0
  84. data/app/serializers/supplejack_api/user_set_serializer.rb +77 -0
  85. data/app/services/metrics_api/v3/api.rb +30 -0
  86. data/app/services/metrics_api/v3/endpoints/facets.rb +23 -0
  87. data/app/services/metrics_api/v3/endpoints/global.rb +26 -0
  88. data/app/services/metrics_api/v3/endpoints/helpers.rb +14 -0
  89. data/app/services/metrics_api/v3/endpoints/root.rb +97 -0
  90. data/app/services/metrics_api/v3/presenters/daily_metric.rb +23 -0
  91. data/app/services/metrics_api/v3/presenters/extended_metadata.rb +41 -0
  92. data/app/services/metrics_api/v3/presenters/record.rb +26 -0
  93. data/app/services/metrics_api/v3/presenters/view.rb +28 -0
  94. data/app/views/layouts/supplejack_api/_head.html.erb +17 -0
  95. data/app/views/layouts/supplejack_api/_top_nav.html.erb +33 -0
  96. data/app/views/layouts/supplejack_api/application.html.erb +33 -0
  97. data/app/views/supplejack_api/admin/sessions/new.html.erb +25 -0
  98. data/app/views/supplejack_api/admin/shared/_links.erb +34 -0
  99. data/app/views/supplejack_api/admin/site_activities/index.csv.erb +22 -0
  100. data/app/views/supplejack_api/admin/site_activities/index.html.erb +54 -0
  101. data/app/views/supplejack_api/admin/users/edit.html.erb +16 -0
  102. data/app/views/supplejack_api/admin/users/index.csv.erb +22 -0
  103. data/app/views/supplejack_api/admin/users/index.html.erb +57 -0
  104. data/app/views/supplejack_api/admin/users/show.html.erb +33 -0
  105. data/app/views/supplejack_api/request_limit_mailer/at100percent.text.erb +13 -0
  106. data/app/views/supplejack_api/request_limit_mailer/at100percent_admin.text.erb +1 -0
  107. data/app/views/supplejack_api/request_limit_mailer/at90percent.text.erb +13 -0
  108. data/app/views/supplejack_api/request_limit_mailer/at90percent_admin.text.erb +1 -0
  109. data/app/workers/supplejack_api/daily_metrics_worker.rb +112 -0
  110. data/app/workers/supplejack_api/interaction_metrics_worker.rb +45 -0
  111. data/config/cucumber.yml +16 -0
  112. data/config/initializers/force_eagerload.rb +11 -0
  113. data/config/initializers/interaction_updaters.rb +7 -0
  114. data/config/routes.rb +81 -0
  115. data/db/binding_records.development.json +7 -0
  116. data/db/binding_records.staging.json +7 -0
  117. data/db/concepts.json +33 -0
  118. data/db/concepts_data.json +569745 -0
  119. data/db/source_authorities.json +119 -0
  120. data/lib/generators/supplejack_api/install_generator.rb +124 -0
  121. data/lib/mongoid/paperclip.rb +53 -0
  122. data/lib/mongoid/string.rb +20 -0
  123. data/lib/sunspot/mongoid.rb +51 -0
  124. data/lib/sunspot/resque_session_proxy.rb +72 -0
  125. data/lib/sunspot/sunspot_spellcheck.rb +98 -0
  126. data/lib/supplejack_api.rb +13 -0
  127. data/lib/supplejack_api/admin/sortable.rb +40 -0
  128. data/lib/supplejack_api/engine.rb +46 -0
  129. data/lib/supplejack_api/harvester_constraint.rb +28 -0
  130. data/lib/supplejack_api/stylesheets.rb +36 -0
  131. data/lib/supplejack_api/utils.rb +75 -0
  132. data/lib/supplejack_api/version.rb +11 -0
  133. data/lib/tasks/resque.rake +22 -0
  134. data/lib/url_validator.rb +38 -0
  135. data/spec/controllers/supplejack_api/admin/base_controller_spec.rb +55 -0
  136. data/spec/controllers/supplejack_api/admin/site_activities_controller_spec.rb +43 -0
  137. data/spec/controllers/supplejack_api/admin/users_controller_spec.rb +79 -0
  138. data/spec/controllers/supplejack_api/application_controller_spec.rb +133 -0
  139. data/spec/controllers/supplejack_api/concepts_controller_spec.rb +83 -0
  140. data/spec/controllers/supplejack_api/concerns/records_controller_metrics_spec.rb +60 -0
  141. data/spec/controllers/supplejack_api/harvester/concepts_controller_spec.rb +57 -0
  142. data/spec/controllers/supplejack_api/harvester/records_controller_spec.rb +138 -0
  143. data/spec/controllers/supplejack_api/metrics_api_controller_spec.rb +71 -0
  144. data/spec/controllers/supplejack_api/partners_controller_spec.rb +77 -0
  145. data/spec/controllers/supplejack_api/records_controller_spec.rb +143 -0
  146. data/spec/controllers/supplejack_api/set_items_controller_spec.rb +78 -0
  147. data/spec/controllers/supplejack_api/sources_controller_spec.rb +161 -0
  148. data/spec/controllers/supplejack_api/status_controller_spec.rb +120 -0
  149. data/spec/controllers/supplejack_api/user_sets_controller_spec.rb +233 -0
  150. data/spec/controllers/supplejack_api/users_controller_spec.rb +61 -0
  151. data/spec/dummy/README.rdoc +268 -0
  152. data/spec/dummy/Rakefile +7 -0
  153. data/spec/dummy/app/assets/javascripts/application.js +23 -0
  154. data/spec/dummy/app/assets/stylesheets/application.css +22 -0
  155. data/spec/dummy/app/controllers/application_controller.rb +10 -0
  156. data/spec/dummy/app/helpers/application_helper.rb +9 -0
  157. data/spec/dummy/app/supplejack_api/concept_schema.rb +83 -0
  158. data/spec/dummy/app/supplejack_api/record_schema.rb +64 -0
  159. data/spec/dummy/app/supplejack_api/record_schema.txt +66 -0
  160. data/spec/dummy/app/views/layouts/application.html.erb +23 -0
  161. data/spec/dummy/app/workers/supplejack_api/clear_index_buffer.rb +32 -0
  162. data/spec/dummy/app/workers/supplejack_api/flush_old_records_worker.rb +17 -0
  163. data/spec/dummy/app/workers/supplejack_api/index_buffer.rb +49 -0
  164. data/spec/dummy/app/workers/supplejack_api/index_source_worker.rb +39 -0
  165. data/spec/dummy/app/workers/supplejack_api/index_worker.rb +82 -0
  166. data/spec/dummy/app/workers/supplejack_api/store_user_activity_worker.rb +24 -0
  167. data/spec/dummy/config.ru +11 -0
  168. data/spec/dummy/config/application.rb +76 -0
  169. data/spec/dummy/config/application.yml +31 -0
  170. data/spec/dummy/config/application.yml.example +36 -0
  171. data/spec/dummy/config/boot.rb +17 -0
  172. data/spec/dummy/config/environment.rb +12 -0
  173. data/spec/dummy/config/environments/development.rb +42 -0
  174. data/spec/dummy/config/environments/production.rb +76 -0
  175. data/spec/dummy/config/environments/test.rb +46 -0
  176. data/spec/dummy/config/initializers/backtrace_silencers.rb +14 -0
  177. data/spec/dummy/config/initializers/devise.rb +214 -0
  178. data/spec/dummy/config/initializers/inflections.rb +22 -0
  179. data/spec/dummy/config/initializers/kaminari_config.rb +17 -0
  180. data/spec/dummy/config/initializers/mime_types.rb +12 -0
  181. data/spec/dummy/config/initializers/mongoid.rb +9 -0
  182. data/spec/dummy/config/initializers/quiet_logger.rb +23 -0
  183. data/spec/dummy/config/initializers/resque.rb +18 -0
  184. data/spec/dummy/config/initializers/secret_token.rb +14 -0
  185. data/spec/dummy/config/initializers/session_store.rb +15 -0
  186. data/spec/dummy/config/initializers/simple_form.rb +149 -0
  187. data/spec/dummy/config/initializers/simple_form_foundation.rb +33 -0
  188. data/spec/dummy/config/initializers/state_machine.rb +8 -0
  189. data/spec/dummy/config/initializers/sunspot.rb +32 -0
  190. data/spec/dummy/config/initializers/wrap_parameters.rb +17 -0
  191. data/spec/dummy/config/locales/devise.en.yml +63 -0
  192. data/spec/dummy/config/locales/en.yml +66 -0
  193. data/spec/dummy/config/locales/simple_form.en.yml +33 -0
  194. data/spec/dummy/config/mongoid.travis.yml +34 -0
  195. data/spec/dummy/config/mongoid.yml +36 -0
  196. data/spec/dummy/config/resque-pool.yml +18 -0
  197. data/spec/dummy/config/resque_schedule.yml +12 -0
  198. data/spec/dummy/config/routes.rb +11 -0
  199. data/spec/dummy/config/secrets.yml +8 -0
  200. data/spec/dummy/config/sunspot.yml +38 -0
  201. data/spec/dummy/db/concepts.json +37 -0
  202. data/spec/dummy/db/source_authorities.json +116 -0
  203. data/spec/dummy/public/404.html +35 -0
  204. data/spec/dummy/public/422.html +35 -0
  205. data/spec/dummy/public/500.html +34 -0
  206. data/spec/dummy/public/favicon.ico +8 -0
  207. data/spec/dummy/script/rails +6 -0
  208. data/spec/dummy/solr/collection1/conf/elevate.xml +36 -0
  209. data/spec/dummy/solr/collection1/conf/mapping-FoldToASCII.txt +3813 -0
  210. data/spec/dummy/solr/collection1/conf/schema.xml +292 -0
  211. data/spec/dummy/solr/collection1/conf/solrconfig.xml +1780 -0
  212. data/spec/dummy/solr/collection1/conf/spellings.txt +2 -0
  213. data/spec/dummy/solr/collection1/conf/stopwords.txt +58 -0
  214. data/spec/dummy/solr/collection1/conf/synonyms.txt +31 -0
  215. data/spec/factories/concepts.rb +16 -0
  216. data/spec/factories/daily_metrics.rb +10 -0
  217. data/spec/factories/faceted_metrics.rb +25 -0
  218. data/spec/factories/fragment.rb +14 -0
  219. data/spec/factories/partners.rb +14 -0
  220. data/spec/factories/record_interaction.rb +17 -0
  221. data/spec/factories/records.rb +47 -0
  222. data/spec/factories/set_interaction.rb +15 -0
  223. data/spec/factories/source_authorities.rb +19 -0
  224. data/spec/factories/sources.rb +16 -0
  225. data/spec/factories/usage_metrics.rb +20 -0
  226. data/spec/factories/user_activities.rb +14 -0
  227. data/spec/factories/user_sets.rb +27 -0
  228. data/spec/factories/users.rb +23 -0
  229. data/spec/helpers/application_helper_spec.rb +35 -0
  230. data/spec/models/concept_spec.rb +163 -0
  231. data/spec/models/fragment_spec.rb +15 -0
  232. data/spec/models/site_activity_spec.rb +103 -0
  233. data/spec/models/source_activity_spec.rb +56 -0
  234. data/spec/models/source_authority_spec.rb +42 -0
  235. data/spec/models/supplejack_api/api_concept/concept_fragment_spec.rb +189 -0
  236. data/spec/models/supplejack_api/api_record/record_fragment_spec.rb +189 -0
  237. data/spec/models/supplejack_api/concept_spec.rb +0 -0
  238. data/spec/models/supplejack_api/interaction_updaters/all_usage_metric_spec.rb +41 -0
  239. data/spec/models/supplejack_api/interaction_updaters/set_metrics_spec.rb +32 -0
  240. data/spec/models/supplejack_api/interaction_updaters/usage_metrics_spec.rb +44 -0
  241. data/spec/models/supplejack_api/partner_spec.rb +20 -0
  242. data/spec/models/supplejack_api/record_search_spec.rb +429 -0
  243. data/spec/models/supplejack_api/record_spec.rb +280 -0
  244. data/spec/models/supplejack_api/schema_definition_spec.rb +272 -0
  245. data/spec/models/supplejack_api/search_spec.rb +243 -0
  246. data/spec/models/supplejack_api/set_item_spec.rb +123 -0
  247. data/spec/models/supplejack_api/source_spec.rb +22 -0
  248. data/spec/models/supplejack_api/support/fragment_helpers_spec.rb +216 -0
  249. data/spec/models/supplejack_api/support/harvestable_spec.rb +177 -0
  250. data/spec/models/supplejack_api/support/searchable_spec.rb +85 -0
  251. data/spec/models/supplejack_api/support/storable_spec.rb +18 -0
  252. data/spec/models/supplejack_api/user_activity_spec.rb +88 -0
  253. data/spec/models/supplejack_api/user_set_spec.rb +559 -0
  254. data/spec/models/supplejack_api/user_spec.rb +348 -0
  255. data/spec/routing/concepts_routing_spec.rb +22 -0
  256. data/spec/routing/harvester_constraint_spec.rb +66 -0
  257. data/spec/routing/harvester_routing_spec.rb +51 -0
  258. data/spec/routing/partner_routing_spec.rb +34 -0
  259. data/spec/routing/records_routing_spec.rb +26 -0
  260. data/spec/routing/sets_routing_spec.rb +44 -0
  261. data/spec/routing/source_routing_spec.rb +38 -0
  262. data/spec/routing/users_routing_spec.rb +18 -0
  263. data/spec/serializers/concept_record_serializer_spec.rb +30 -0
  264. data/spec/serializers/supplejack_api/application_serializer_spec.rb +14 -0
  265. data/spec/serializers/supplejack_api/concept_search_serializer_spec.rb +34 -0
  266. data/spec/serializers/supplejack_api/concept_serializer_spec.rb +92 -0
  267. data/spec/serializers/supplejack_api/record_search_serializer_spec.rb +34 -0
  268. data/spec/serializers/supplejack_api/record_serializer_spec.rb +271 -0
  269. data/spec/serializers/supplejack_api/search_serializer_spec.rb +90 -0
  270. data/spec/serializers/supplejack_api/user_serializer_spec.rb +22 -0
  271. data/spec/serializers/supplejack_api/user_set_serializer_spec.rb +96 -0
  272. data/spec/services/metrics_api/v3/api_spec.rb +23 -0
  273. data/spec/services/metrics_api/v3/endpoints/facets_spec.rb +25 -0
  274. data/spec/services/metrics_api/v3/endpoints/global_spec.rb +22 -0
  275. data/spec/services/metrics_api/v3/endpoints/root_spec.rb +49 -0
  276. data/spec/services/metrics_api/v3/presenters/extended_metadata_spec.rb +49 -0
  277. data/spec/spec_helper.rb +70 -0
  278. data/spec/support/api/schemas/metrics/daily_metrics_metadata.json +24 -0
  279. data/spec/support/api/schemas/metrics/extended_metrics.json +26 -0
  280. data/spec/support/api/schemas/metrics/extended_response.json +6 -0
  281. data/spec/support/api/schemas/metrics/facets_response.json +6 -0
  282. data/spec/support/api/schemas/metrics/record_metadata.json +33 -0
  283. data/spec/support/api/schemas/metrics/top_level_response.json +6 -0
  284. data/spec/support/api/schemas/metrics/view_metadata.json +33 -0
  285. data/spec/support/api_schema_matcher.rb +14 -0
  286. data/spec/support/devise.rb +10 -0
  287. data/spec/workers/supplejack_api/daily_metrics_worker_spec.rb +140 -0
  288. data/spec/workers/supplejack_api/flush_old_records_worker_spec.rb +20 -0
  289. data/spec/workers/supplejack_api/index_worker_spec.rb +52 -0
  290. data/spec/workers/supplejack_api/source_index_worker_spec.rb +61 -0
  291. metadata +1231 -0
@@ -0,0 +1,24 @@
1
+ {
2
+ "description": "Contains metrics about a day, metrics that do not fall into a specific subcategory",
3
+ "type": "object",
4
+ "required": [
5
+ "day",
6
+ "total_active_records",
7
+ "total_new_records"
8
+ ],
9
+ "properties": {
10
+ "day": {
11
+ "description": "Day this metadata refers to",
12
+ "type": "string",
13
+ "format": "date"
14
+ },
15
+ "total_active_records": {
16
+ "description": "Number of active records in the system on this date",
17
+ "type": "number"
18
+ },
19
+ "total_new_records": {
20
+ "description": "Number of records harvested on this date",
21
+ "type": "number"
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "description": "container object for all extended metrics objects",
3
+ "type": "object",
4
+ "required": ["date"],
5
+ "properties": {
6
+ "date": {
7
+ "description": "dayDate this metric represents",
8
+ "type": "string",
9
+ "format": "date"
10
+ },
11
+ "record": {
12
+ "description": "Record metadata metric",
13
+ "type": "array",
14
+ "items": {
15
+ "$ref": "record_metadata.json"
16
+ }
17
+ },
18
+ "view": {
19
+ "description": "Record view metadata metric",
20
+ "type": "array",
21
+ "items": {
22
+ "$ref": "view_metadata.json"
23
+ }
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "type": "array",
3
+ "items": {
4
+ "$ref": "extended_metrics.json"
5
+ }
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "type": "array",
3
+ "items": {
4
+ "type": "string"
5
+ }
6
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "description": "Contains metadata about the records grouped by a facet on a specific day",
3
+ "type": "object",
4
+ "required": [
5
+ "id",
6
+ "total_active_records",
7
+ "total_new_records",
8
+ "category_counts",
9
+ "copyright_counts"
10
+ ],
11
+ "properties": {
12
+ "id": {
13
+ "description": "Facet name",
14
+ "type": "string"
15
+ },
16
+ "total_active_records": {
17
+ "description": "Number of active records for this facet",
18
+ "type": "number"
19
+ },
20
+ "total_new_records": {
21
+ "description": "Number of new records for this facet",
22
+ "type": "number"
23
+ },
24
+ "category_counts": {
25
+ "description": "Mapping of categories to counts, object shape is dynamic so it has no schema",
26
+ "type": "object"
27
+ },
28
+ "copyright_counts": {
29
+ "description": "Mapping of copyrights to counts, object shape is dynamic so it has no schema",
30
+ "type": "object"
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "type": "array",
3
+ "items": {
4
+ "$ref": "daily_metrics_metadata.json"
5
+ }
6
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "description": "Contains metadata about how records in a display_collection were viewed on a specific day",
3
+ "type": "object",
4
+ "required": [
5
+ "id",
6
+ "searches",
7
+ "record_page_views",
8
+ "user_set_views",
9
+ "total_views"
10
+ ],
11
+ "properties": {
12
+ "id": {
13
+ "description": "Facet name",
14
+ "type": "string"
15
+ },
16
+ "searches": {
17
+ "description": "Number of times a record from this collection was part of a search result",
18
+ "type": "number"
19
+ },
20
+ "record_page_views": {
21
+ "description": "Number of times a record page for a record from this collection was viewed",
22
+ "type": "number"
23
+ },
24
+ "user_set_views": {
25
+ "description": "Number of times a record from this collection was viewed in a user set",
26
+ "type": "number"
27
+ },
28
+ "total_views": {
29
+ "description": "Cumulative count of all record views for this collection",
30
+ "type": "number"
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,14 @@
1
+ require 'json-schema'
2
+
3
+ RSpec::Matchers.define :match_response_schema do |schema|
4
+ match do |json|
5
+ schema_directory = "#{Dir.pwd}/spec/support/api/schemas"
6
+ schema_path = "#{schema_directory}/#{schema}.json"
7
+
8
+ errors = JSON::Validator.fully_validate(schema_path, json)
9
+
10
+ fail Exception.new(errors.join(' ----- ')) unless errors.empty?
11
+
12
+ true
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ # The majority of the Supplejack API code is Crown copyright (C) 2014, New Zealand Government,
2
+ # and is licensed under the GNU General Public License, version 3.
3
+ # One component is a third party component. See https://github.com/DigitalNZ/supplejack_api for details.
4
+ #
5
+ # Supplejack was created by DigitalNZ at the National Library of NZ and
6
+ # the Department of Internal Affairs. http://digitalnz.org/supplejack
7
+
8
+ RSpec.configure do |config|
9
+ config.include Devise::TestHelpers, type: :controller
10
+ end
@@ -0,0 +1,140 @@
1
+ # The majority of the Supplejack API code is Crown copyright (C) 2014, New Zealand Government,
2
+ # and is licensed under the GNU General Public License, version 3.
3
+ # One component is a third party component. See https://github.com/DigitalNZ/supplejack_api for details.
4
+ #
5
+ # Supplejack was created by DigitalNZ at the National Library of NZ and
6
+ # the Department of Internal Affairs. http://digitalnz.org/supplejack
7
+
8
+ require "spec_helper"
9
+
10
+ module SupplejackApi
11
+ describe DailyMetricsWorker, search: true, slow: true do
12
+
13
+ before :each do
14
+ Sunspot.session = Sunspot.session.original_session
15
+ end
16
+
17
+ after :each do
18
+ Sunspot.remove_all
19
+ end
20
+
21
+ describe "#call" do
22
+ def build_records
23
+ 10.times do
24
+ create(:record_with_fragment, display_collection: 'pc1', copyright: ['0'], category: ['0'], created_at: Date.current.midday)
25
+ create(:record_with_fragment, display_collection: 'pc2', copyright: ['1'], category: ['1'], created_at: Date.current.midday)
26
+ create(:record_with_fragment, display_collection: 'pc1', copyright: ['0', '1'], category: ['0', '1'], created_at: Date.yesterday.midday)
27
+ end
28
+
29
+ Sunspot.commit
30
+ end
31
+
32
+ def facet_metrics_query(result, expected_results, &accessor_block)
33
+ result.each_with_index do |facet, index|
34
+ expect(accessor_block.call(facet, index)).to eq(expected_results[index])
35
+ end
36
+ end
37
+
38
+ it "handles records with missing categories/copyrights" do
39
+ 10.times do |n|
40
+ c = n % 2 == 0 ? nil : ['0']
41
+ create(:record_with_fragment, created_at: Date.current.midday, copyright: c)
42
+ end
43
+ Sunspot.commit
44
+
45
+ DailyMetricsWorker.new.call
46
+ facet = SupplejackApi::FacetedMetrics.where(name: 'all').first
47
+
48
+ expect(facet.total_active_records).to eq(10)
49
+ end
50
+
51
+ it "handles copyrights with periods in the name" do
52
+ create(:record_with_fragment, copyright: ['1.0'], display_collection: 'test')
53
+ Sunspot.commit
54
+
55
+ DailyMetricsWorker.new.call
56
+ expect(FacetedMetrics.created_on(Date.current).first.copyright_counts.first.first).to eq("1.0")
57
+ end
58
+
59
+ it "correctly paginates the facet list when there are more than 150 facets" do
60
+ 200.times do |n|
61
+ create(:record_with_fragment, display_collection: n.to_s)
62
+ end
63
+ Sunspot.commit
64
+
65
+ DailyMetricsWorker.new.call
66
+
67
+ expect(FacetedMetrics.count).to eq(201)
68
+ end
69
+
70
+ context "faceted metrics" do
71
+ before do
72
+ create(:record_with_fragment, status: "deleted") # inactive, should never show in counts
73
+ build_records
74
+
75
+ DailyMetricsWorker.new.call
76
+ end
77
+ let(:faceted_metrics) {SupplejackApi::FacetedMetrics.all.where(:name.ne => 'all').to_a}
78
+
79
+ it "has metrics for each facet" do
80
+ expect(faceted_metrics.length).to eq(2)
81
+ end
82
+
83
+ it "has active record counts for each facet" do
84
+ facet_metrics_query(faceted_metrics, [20, 10]) {|facet| facet.total_active_records}
85
+ end
86
+
87
+ it "has new record counts for each display_collection" do
88
+ facet_metrics_query(faceted_metrics, [10, 10]) {|facet| facet.total_new_records}
89
+ end
90
+
91
+ it "has a count of records per category in each display_collection" do
92
+ facet_metrics_query(faceted_metrics, [20, 10]) {|facet, index| facet.category_counts[index.to_s]}
93
+ end
94
+
95
+ it "has a count of records per usage type in each display_collection" do
96
+ facet_metrics_query(faceted_metrics, [20, 10]) {|facet, index| facet.copyright_counts[index.to_s]}
97
+ end
98
+
99
+ it "creates an All facet that contains the summed metrics of for all the individual facets" do
100
+ all_metric = SupplejackApi::FacetedMetrics.where(name: 'all').first
101
+
102
+ expect(all_metric.total_active_records).to eq(30)
103
+ expect(all_metric.total_new_records).to eq(20)
104
+ expect(all_metric.copyright_counts['0']).to eq(20)
105
+ end
106
+ end
107
+
108
+ context "daily metrics" do
109
+ let(:metric) do
110
+ # Lazy generate metrics
111
+ DailyMetricsWorker.new.call
112
+
113
+ SupplejackApi::DailyMetrics.first
114
+ end
115
+
116
+ it 'creates a DailyMetrics model' do
117
+ expect(metric).to be_present
118
+ end
119
+
120
+ it 'sets the date field to the current day' do
121
+ expect(metric.date).to eq(Date.current)
122
+ end
123
+
124
+ context "set metrics" do
125
+ it 'counts the number of sets in the system' do
126
+ create(:user_set)
127
+
128
+ expect(metric.total_public_sets).to eq(1)
129
+ end
130
+
131
+ it 'does not count non-public sets' do
132
+ create(:user_set, privacy: 'private')
133
+
134
+ expect(metric.total_public_sets).to eq(0)
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,20 @@
1
+ # The majority of the Supplejack API code is Crown copyright (C) 2014, New Zealand Government,
2
+ # and is licensed under the GNU General Public License, version 3.
3
+ # One component is a third party component. See https://github.com/DigitalNZ/supplejack_api for details.
4
+ #
5
+ # Supplejack was created by DigitalNZ at the National Library of NZ and
6
+ # the Department of Internal Affairs. http://digitalnz.org/supplejack
7
+
8
+ require "spec_helper"
9
+
10
+ module SupplejackApi
11
+ describe FlushOldRecordsWorker do
12
+
13
+ describe "perform" do
14
+ it "should call 'flush_old_records' on Record with the given source_id & job_id" do
15
+ expect(Record).to receive(:flush_old_records).with("abc-123", "abc123")
16
+ FlushOldRecordsWorker.perform("abc-123", "abc123")
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,52 @@
1
+ # The majority of the Supplejack API code is Crown copyright (C) 2014, New Zealand Government,
2
+ # and is licensed under the GNU General Public License, version 3.
3
+ # One component is a third party component. See https://github.com/DigitalNZ/supplejack_api for details.
4
+ #
5
+ # Supplejack was created by DigitalNZ at the National Library of NZ and
6
+ # the Department of Internal Affairs. http://digitalnz.org/supplejack
7
+
8
+ require "spec_helper"
9
+
10
+ module SupplejackApi
11
+ describe IndexWorker do
12
+
13
+ describe "#find_all" do
14
+ let(:record1) { FactoryGirl.create(:record, record_id: 12345) }
15
+ let(:record2) { FactoryGirl.create(:record, record_id: 67890) }
16
+
17
+ it "finds all records by id" do
18
+ expect(IndexWorker.find_all("Record", [record1.id, record2.id])).to eq [record1, record2]
19
+ end
20
+
21
+ it "returns records even when some where not found" do
22
+ expect(IndexWorker.find_all("Record", ["504d333aa9b6ad1860000056", record1.id])).to eq [record1]
23
+ end
24
+
25
+ it "handles individual records" do
26
+ expect(IndexWorker.find_all("Record", record1.id)).to eq [record1]
27
+ end
28
+ end
29
+
30
+ describe "perform" do
31
+ let(:record) { double(:record).as_null_object }
32
+
33
+ it "indexes all given record id's" do
34
+ expect(IndexWorker).to receive(:find_all).with("Record", ["123"]) { [record] }
35
+ expect(IndexWorker).to receive(:index).with([record])
36
+ IndexWorker.perform(:index, {class: "Record", id: ["123"]})
37
+ end
38
+
39
+ it "removes all given record id's" do
40
+ expect(IndexWorker).to receive(:find_all).with("Record", ["123"]) { [record] }
41
+ expect(IndexWorker).to receive(:remove).with([record])
42
+ IndexWorker.perform(:remove, {class: "Record", id: ["123"]})
43
+ end
44
+
45
+ it "rescues from a RSolr::Error::Http errors when commiting SOLR" do
46
+ allow(Sunspot).to receive(:commit).and_raise(RSolr::Error::Http.new({}, {}))
47
+ IndexWorker.perform(:commit)
48
+ end
49
+ end
50
+ end
51
+
52
+ end
@@ -0,0 +1,61 @@
1
+ # The majority of the Supplejack API code is Crown copyright (C) 2014, New Zealand Government,
2
+ # and is licensed under the GNU General Public License, version 3.
3
+ # One component is a third party component. See https://github.com/DigitalNZ/supplejack_api for details.
4
+ #
5
+ # Supplejack was created by DigitalNZ at the National Library of NZ and
6
+ # the Department of Internal Affairs. http://digitalnz.org/supplejack
7
+
8
+ require "spec_helper"
9
+
10
+ module SupplejackApi
11
+ describe IndexSourceWorker do
12
+ describe ".perform" do
13
+ let(:records) { [FactoryGirl.create(:record_with_fragment), FactoryGirl.create(:record_with_fragment)] }
14
+
15
+ before do
16
+ records.each do |r|
17
+ r.primary_fragment.source_id = 'tapuhi'
18
+ r.save
19
+ end
20
+
21
+ allow(Record).to receive(:where).with(hash_including(:'fragments.source_id' => 'tapuhi')).and_call_original
22
+ end
23
+
24
+ it "finds all active records and indexes them" do
25
+ expect(Record).to receive(:where).with(:'fragments.source_id' => 'tapuhi').and_call_original
26
+ expect(Sunspot).to receive(:index).with(records)
27
+ IndexSourceWorker.perform('tapuhi')
28
+ end
29
+
30
+
31
+ it "finds all deleted records and removes them from solr" do
32
+ records.each { |r| r.update_attribute(:status, 'deleted') }
33
+
34
+ expect(Record).to receive(:where).with(:'fragments.source_id' => 'tapuhi').and_call_original
35
+ expect(Sunspot).to receive(:remove).with(records)
36
+ IndexSourceWorker.perform('tapuhi')
37
+ end
38
+
39
+ it "finds records updated more recently than the date given" do
40
+ date = Time.now
41
+ allow(Time).to receive(:parse) { date }
42
+ expect(Record).to receive(:where).with(:'fragments.source_id' => 'tapuhi', :updated_at.gt => date)
43
+ IndexSourceWorker.perform('tapuhi', date.to_s)
44
+ end
45
+ end
46
+
47
+ describe ".in_chunks" do
48
+ let(:records) { [double(:record), double(:record)] }
49
+
50
+ it "gets a chunk of records and yields to block" do
51
+ mock_cursor = double(:cursor)
52
+ mock_cursor_2 = double(:cursor)
53
+ expect(mock_cursor).to receive(:limit).with(10000) {mock_cursor_2}
54
+ expect(mock_cursor).to receive(:count) {2}
55
+ expect(mock_cursor_2).to receive(:skip).with(0) { records }
56
+
57
+ expect{|b| IndexSourceWorker.in_chunks(mock_cursor, &b) }.to yield_with_args(records)
58
+ end
59
+ end
60
+ end
61
+ end