servus 0.3.0 → 0.5.0

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 (144) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/servus/event/event_generator.rb +54 -0
  3. data/lib/generators/servus/event/templates/event.rb.erb +44 -0
  4. data/lib/generators/servus/event/templates/event_spec.rb.erb +20 -0
  5. data/lib/generators/servus/guard/guard_generator.rb +1 -1
  6. data/lib/generators/servus/guard/templates/guard.rb.erb +5 -3
  7. data/lib/generators/servus/service/service_generator.rb +1 -1
  8. data/lib/servus/base.rb +46 -3
  9. data/lib/servus/config.rb +85 -12
  10. data/lib/servus/event.rb +235 -0
  11. data/lib/servus/events/bus.rb +111 -72
  12. data/lib/servus/events/class_router.rb +40 -0
  13. data/lib/servus/events/emitter.rb +21 -6
  14. data/lib/servus/events/invocation.rb +94 -0
  15. data/lib/servus/events/router.rb +44 -0
  16. data/lib/servus/guard.rb +7 -6
  17. data/lib/servus/guards/falsey_guard.rb +3 -3
  18. data/lib/servus/guards/presence_guard.rb +4 -4
  19. data/lib/servus/guards/state_guard.rb +4 -5
  20. data/lib/servus/guards/truthy_guard.rb +3 -3
  21. data/lib/servus/helpers/controller_helpers.rb +40 -0
  22. data/lib/servus/railtie.rb +10 -8
  23. data/lib/servus/support/errors.rb +16 -0
  24. data/lib/servus/support/lockdown.rb +94 -0
  25. data/lib/servus/support/logger.rb +18 -0
  26. data/lib/servus/support/validator.rb +70 -40
  27. data/lib/servus/testing/example_builders.rb +52 -0
  28. data/lib/servus/testing/matchers.rb +103 -4
  29. data/lib/servus/version.rb +1 -1
  30. data/lib/servus.rb +7 -2
  31. metadata +14 -116
  32. data/.claude/commands/check-docs.md +0 -1
  33. data/.claude/commands/consistency-check.md +0 -1
  34. data/.claude/commands/fine-tooth-comb.md +0 -1
  35. data/.claude/commands/red-green-refactor.md +0 -5
  36. data/.claude/settings.json +0 -24
  37. data/.rspec +0 -3
  38. data/.rubocop.yml +0 -27
  39. data/.yardopts +0 -6
  40. data/CHANGELOG.md +0 -169
  41. data/CLAUDE.md +0 -10
  42. data/IDEAS.md +0 -5
  43. data/LICENSE.txt +0 -21
  44. data/READme.md +0 -856
  45. data/Rakefile +0 -45
  46. data/docs/core/1_overview.md +0 -81
  47. data/docs/core/2_architecture.md +0 -120
  48. data/docs/core/3_service_objects.md +0 -154
  49. data/docs/features/1_schema_validation.md +0 -161
  50. data/docs/features/2_error_handling.md +0 -129
  51. data/docs/features/3_async_execution.md +0 -81
  52. data/docs/features/4_logging.md +0 -64
  53. data/docs/features/5_event_bus.md +0 -244
  54. data/docs/features/6_guards.md +0 -356
  55. data/docs/features/7_lazy_resolvers.md +0 -238
  56. data/docs/features/guards_naming_convention.md +0 -540
  57. data/docs/guides/1_common_patterns.md +0 -90
  58. data/docs/guides/2_migration_guide.md +0 -225
  59. data/docs/integration/1_configuration.md +0 -154
  60. data/docs/integration/2_testing.md +0 -304
  61. data/docs/integration/3_rails_integration.md +0 -99
  62. data/docs/yard/Servus/Base.html +0 -1645
  63. data/docs/yard/Servus/Config.html +0 -582
  64. data/docs/yard/Servus/Extensions/Async/Call.html +0 -400
  65. data/docs/yard/Servus/Extensions/Async/Errors/AsyncError.html +0 -140
  66. data/docs/yard/Servus/Extensions/Async/Errors/JobEnqueueError.html +0 -154
  67. data/docs/yard/Servus/Extensions/Async/Errors/ServiceNotFoundError.html +0 -154
  68. data/docs/yard/Servus/Extensions/Async/Errors.html +0 -128
  69. data/docs/yard/Servus/Extensions/Async/Ext.html +0 -119
  70. data/docs/yard/Servus/Extensions/Async/Job.html +0 -310
  71. data/docs/yard/Servus/Extensions/Async.html +0 -141
  72. data/docs/yard/Servus/Extensions.html +0 -117
  73. data/docs/yard/Servus/Generators/ServiceGenerator.html +0 -261
  74. data/docs/yard/Servus/Generators.html +0 -115
  75. data/docs/yard/Servus/Helpers/ControllerHelpers.html +0 -457
  76. data/docs/yard/Servus/Helpers.html +0 -115
  77. data/docs/yard/Servus/Railtie.html +0 -134
  78. data/docs/yard/Servus/Support/Errors/AuthenticationError.html +0 -287
  79. data/docs/yard/Servus/Support/Errors/BadRequestError.html +0 -283
  80. data/docs/yard/Servus/Support/Errors/ForbiddenError.html +0 -284
  81. data/docs/yard/Servus/Support/Errors/InternalServerError.html +0 -283
  82. data/docs/yard/Servus/Support/Errors/NotFoundError.html +0 -284
  83. data/docs/yard/Servus/Support/Errors/ServiceError.html +0 -489
  84. data/docs/yard/Servus/Support/Errors/ServiceUnavailableError.html +0 -290
  85. data/docs/yard/Servus/Support/Errors/UnauthorizedError.html +0 -200
  86. data/docs/yard/Servus/Support/Errors/UnprocessableEntityError.html +0 -288
  87. data/docs/yard/Servus/Support/Errors/ValidationError.html +0 -200
  88. data/docs/yard/Servus/Support/Errors.html +0 -140
  89. data/docs/yard/Servus/Support/Logger.html +0 -856
  90. data/docs/yard/Servus/Support/Rescuer/BlockContext.html +0 -585
  91. data/docs/yard/Servus/Support/Rescuer/CallOverride.html +0 -257
  92. data/docs/yard/Servus/Support/Rescuer/ClassMethods.html +0 -343
  93. data/docs/yard/Servus/Support/Rescuer.html +0 -267
  94. data/docs/yard/Servus/Support/Response.html +0 -574
  95. data/docs/yard/Servus/Support/Validator.html +0 -1150
  96. data/docs/yard/Servus/Support.html +0 -119
  97. data/docs/yard/Servus/Testing/ExampleBuilders.html +0 -523
  98. data/docs/yard/Servus/Testing/ExampleExtractor.html +0 -578
  99. data/docs/yard/Servus/Testing.html +0 -142
  100. data/docs/yard/Servus.html +0 -343
  101. data/docs/yard/_index.html +0 -535
  102. data/docs/yard/class_list.html +0 -54
  103. data/docs/yard/css/common.css +0 -1
  104. data/docs/yard/css/full_list.css +0 -58
  105. data/docs/yard/css/style.css +0 -503
  106. data/docs/yard/file.1_common_patterns.html +0 -154
  107. data/docs/yard/file.1_configuration.html +0 -115
  108. data/docs/yard/file.1_overview.html +0 -142
  109. data/docs/yard/file.1_schema_validation.html +0 -188
  110. data/docs/yard/file.2_architecture.html +0 -157
  111. data/docs/yard/file.2_error_handling.html +0 -190
  112. data/docs/yard/file.2_migration_guide.html +0 -242
  113. data/docs/yard/file.2_testing.html +0 -227
  114. data/docs/yard/file.3_async_execution.html +0 -145
  115. data/docs/yard/file.3_rails_integration.html +0 -160
  116. data/docs/yard/file.3_service_objects.html +0 -191
  117. data/docs/yard/file.4_logging.html +0 -135
  118. data/docs/yard/file.ErrorHandling.html +0 -190
  119. data/docs/yard/file.READme.html +0 -674
  120. data/docs/yard/file.architecture.html +0 -157
  121. data/docs/yard/file.async_execution.html +0 -145
  122. data/docs/yard/file.common_patterns.html +0 -154
  123. data/docs/yard/file.configuration.html +0 -115
  124. data/docs/yard/file.error_handling.html +0 -190
  125. data/docs/yard/file.logging.html +0 -135
  126. data/docs/yard/file.migration_guide.html +0 -242
  127. data/docs/yard/file.overview.html +0 -142
  128. data/docs/yard/file.rails_integration.html +0 -160
  129. data/docs/yard/file.schema_validation.html +0 -188
  130. data/docs/yard/file.service_objects.html +0 -191
  131. data/docs/yard/file.testing.html +0 -227
  132. data/docs/yard/file_list.html +0 -119
  133. data/docs/yard/frames.html +0 -22
  134. data/docs/yard/index.html +0 -674
  135. data/docs/yard/js/app.js +0 -344
  136. data/docs/yard/js/full_list.js +0 -242
  137. data/docs/yard/js/jquery.js +0 -4
  138. data/docs/yard/method_list.html +0 -542
  139. data/docs/yard/top-level-namespace.html +0 -110
  140. data/lib/generators/servus/event_handler/event_handler_generator.rb +0 -59
  141. data/lib/generators/servus/event_handler/templates/handler.rb.erb +0 -86
  142. data/lib/generators/servus/event_handler/templates/handler_spec.rb.erb +0 -48
  143. data/lib/servus/event_handler.rb +0 -290
  144. data/lib/servus/events/errors.rb +0 -10
data/docs/yard/js/app.js DELETED
@@ -1,344 +0,0 @@
1
- (function () {
2
- var localStorage = {},
3
- sessionStorage = {};
4
- try {
5
- localStorage = window.localStorage;
6
- } catch (e) {}
7
- try {
8
- sessionStorage = window.sessionStorage;
9
- } catch (e) {}
10
-
11
- function createSourceLinks() {
12
- $(".method_details_list .source_code").before(
13
- "<span class='showSource'>[<a href='#' class='toggleSource'>View source</a>]</span>"
14
- );
15
- $(".toggleSource").toggle(
16
- function () {
17
- $(this).parent().nextAll(".source_code").slideDown(100);
18
- $(this).text("Hide source");
19
- },
20
- function () {
21
- $(this).parent().nextAll(".source_code").slideUp(100);
22
- $(this).text("View source");
23
- }
24
- );
25
- }
26
-
27
- function createDefineLinks() {
28
- var tHeight = 0;
29
- $(".defines").after(" <a href='#' class='toggleDefines'>more...</a>");
30
- $(".toggleDefines").toggle(
31
- function () {
32
- tHeight = $(this).parent().prev().height();
33
- $(this).prev().css("display", "inline");
34
- $(this).parent().prev().height($(this).parent().height());
35
- $(this).text("(less)");
36
- },
37
- function () {
38
- $(this).prev().hide();
39
- $(this).parent().prev().height(tHeight);
40
- $(this).text("more...");
41
- }
42
- );
43
- }
44
-
45
- function createFullTreeLinks() {
46
- var tHeight = 0;
47
- $(".inheritanceTree").toggle(
48
- function () {
49
- tHeight = $(this).parent().prev().height();
50
- $(this).parent().toggleClass("showAll");
51
- $(this).text("(hide)");
52
- $(this).parent().prev().height($(this).parent().height());
53
- },
54
- function () {
55
- $(this).parent().toggleClass("showAll");
56
- $(this).parent().prev().height(tHeight);
57
- $(this).text("show all");
58
- }
59
- );
60
- }
61
-
62
- function searchFrameButtons() {
63
- $(".full_list_link").click(function () {
64
- toggleSearchFrame(this, $(this).attr("href"));
65
- return false;
66
- });
67
- window.addEventListener("message", function (e) {
68
- if (e.data === "navEscape") {
69
- $("#nav").slideUp(100);
70
- $("#search a").removeClass("active inactive");
71
- $(window).focus();
72
- }
73
- });
74
-
75
- $(window).resize(function () {
76
- if ($("#search:visible").length === 0) {
77
- $("#nav").removeAttr("style");
78
- $("#search a").removeClass("active inactive");
79
- $(window).focus();
80
- }
81
- });
82
- }
83
-
84
- function toggleSearchFrame(id, link) {
85
- var frame = $("#nav");
86
- $("#search a").removeClass("active").addClass("inactive");
87
- if (frame.attr("src") === link && frame.css("display") !== "none") {
88
- frame.slideUp(100);
89
- $("#search a").removeClass("active inactive");
90
- } else {
91
- $(id).addClass("active").removeClass("inactive");
92
- if (frame.attr("src") !== link) frame.attr("src", link);
93
- frame.slideDown(100);
94
- }
95
- }
96
-
97
- function linkSummaries() {
98
- $(".summary_signature").click(function () {
99
- document.location = $(this).find("a").attr("href");
100
- });
101
- }
102
-
103
- function summaryToggle() {
104
- $(".summary_toggle").click(function (e) {
105
- e.preventDefault();
106
- localStorage.summaryCollapsed = $(this).text();
107
- $(".summary_toggle").each(function () {
108
- $(this).text($(this).text() == "collapse" ? "expand" : "collapse");
109
- var next = $(this).parent().parent().nextAll("ul.summary").first();
110
- if (next.hasClass("compact")) {
111
- next.toggle();
112
- next.nextAll("ul.summary").first().toggle();
113
- } else if (next.hasClass("summary")) {
114
- var list = $('<ul class="summary compact" />');
115
- list.html(next.html());
116
- list.find(".summary_desc, .note").remove();
117
- list.find("a").each(function () {
118
- $(this).html($(this).find("strong").html());
119
- $(this).parent().html($(this)[0].outerHTML);
120
- });
121
- next.before(list);
122
- next.toggle();
123
- }
124
- });
125
- return false;
126
- });
127
- if (localStorage.summaryCollapsed == "collapse") {
128
- $(".summary_toggle").first().click();
129
- } else {
130
- localStorage.summaryCollapsed = "expand";
131
- }
132
- }
133
-
134
- function constantSummaryToggle() {
135
- $(".constants_summary_toggle").click(function (e) {
136
- e.preventDefault();
137
- localStorage.summaryCollapsed = $(this).text();
138
- $(".constants_summary_toggle").each(function () {
139
- $(this).text($(this).text() == "collapse" ? "expand" : "collapse");
140
- var next = $(this).parent().parent().nextAll("dl.constants").first();
141
- if (next.hasClass("compact")) {
142
- next.toggle();
143
- next.nextAll("dl.constants").first().toggle();
144
- } else if (next.hasClass("constants")) {
145
- var list = $('<dl class="constants compact" />');
146
- list.html(next.html());
147
- list.find("dt").each(function () {
148
- $(this).addClass("summary_signature");
149
- $(this).text($(this).text().split("=")[0]);
150
- if ($(this).has(".deprecated").length) {
151
- $(this).addClass("deprecated");
152
- }
153
- });
154
- // Add the value of the constant as "Tooltip" to the summary object
155
- list.find("pre.code").each(function () {
156
- console.log($(this).parent());
157
- var dt_element = $(this).parent().prev();
158
- var tooltip = $(this).text();
159
- if (dt_element.hasClass("deprecated")) {
160
- tooltip = "Deprecated. " + tooltip;
161
- }
162
- dt_element.attr("title", tooltip);
163
- });
164
- list.find(".docstring, .tags, dd").remove();
165
- next.before(list);
166
- next.toggle();
167
- }
168
- });
169
- return false;
170
- });
171
- if (localStorage.summaryCollapsed == "collapse") {
172
- $(".constants_summary_toggle").first().click();
173
- } else {
174
- localStorage.summaryCollapsed = "expand";
175
- }
176
- }
177
-
178
- function generateTOC() {
179
- if ($("#filecontents").length === 0) return;
180
- var _toc = $('<ol class="top"></ol>');
181
- var show = false;
182
- var toc = _toc;
183
- var counter = 0;
184
- var tags = ["h2", "h3", "h4", "h5", "h6"];
185
- var i;
186
- var curli;
187
- if ($("#filecontents h1").length > 1) tags.unshift("h1");
188
- for (i = 0; i < tags.length; i++) {
189
- tags[i] = "#filecontents " + tags[i];
190
- }
191
- var lastTag = parseInt(tags[0][1], 10);
192
- $(tags.join(", ")).each(function () {
193
- if ($(this).parents(".method_details .docstring").length != 0) return;
194
- if (this.id == "filecontents") return;
195
- show = true;
196
- var thisTag = parseInt(this.tagName[1], 10);
197
- if (this.id.length === 0) {
198
- var proposedId = $(this).attr("toc-id");
199
- if (typeof proposedId != "undefined") this.id = proposedId;
200
- else {
201
- var proposedId = $(this)
202
- .text()
203
- .replace(/[^a-z0-9-]/gi, "_");
204
- if ($("#" + proposedId).length > 0) {
205
- proposedId += counter;
206
- counter++;
207
- }
208
- this.id = proposedId;
209
- }
210
- }
211
- if (thisTag > lastTag) {
212
- for (i = 0; i < thisTag - lastTag; i++) {
213
- if (typeof curli == "undefined") {
214
- curli = $("<li/>");
215
- toc.append(curli);
216
- }
217
- toc = $("<ol/>");
218
- curli.append(toc);
219
- curli = undefined;
220
- }
221
- }
222
- if (thisTag < lastTag) {
223
- for (i = 0; i < lastTag - thisTag; i++) {
224
- toc = toc.parent();
225
- toc = toc.parent();
226
- }
227
- }
228
- var title = $(this).attr("toc-title");
229
- if (typeof title == "undefined") title = $(this).text();
230
- curli = $('<li><a href="#' + this.id + '">' + title + "</a></li>");
231
- toc.append(curli);
232
- lastTag = thisTag;
233
- });
234
- if (!show) return;
235
- html =
236
- '<div id="toc"><p class="title hide_toc"><a href="#"><strong>Table of Contents</strong></a></p></div>';
237
- $("#content").prepend(html);
238
- $("#toc").append(_toc);
239
- $("#toc .hide_toc").toggle(
240
- function () {
241
- $("#toc .top").slideUp("fast");
242
- $("#toc").toggleClass("hidden");
243
- $("#toc .title small").toggle();
244
- },
245
- function () {
246
- $("#toc .top").slideDown("fast");
247
- $("#toc").toggleClass("hidden");
248
- $("#toc .title small").toggle();
249
- }
250
- );
251
- }
252
-
253
- function navResizeFn(e) {
254
- if (e.which !== 1) {
255
- navResizeFnStop();
256
- return;
257
- }
258
-
259
- sessionStorage.navWidth = e.pageX.toString();
260
- $(".nav_wrap").css("width", e.pageX);
261
- $(".nav_wrap").css("-ms-flex", "inherit");
262
- }
263
-
264
- function navResizeFnStop() {
265
- $(window).unbind("mousemove", navResizeFn);
266
- window.removeEventListener("message", navMessageFn, false);
267
- }
268
-
269
- function navMessageFn(e) {
270
- if (e.data.action === "mousemove") navResizeFn(e.data.event);
271
- if (e.data.action === "mouseup") navResizeFnStop();
272
- }
273
-
274
- function navResizer() {
275
- $("#resizer").mousedown(function (e) {
276
- e.preventDefault();
277
- $(window).mousemove(navResizeFn);
278
- window.addEventListener("message", navMessageFn, false);
279
- });
280
- $(window).mouseup(navResizeFnStop);
281
-
282
- if (sessionStorage.navWidth) {
283
- navResizeFn({ which: 1, pageX: parseInt(sessionStorage.navWidth, 10) });
284
- }
285
- }
286
-
287
- function navExpander() {
288
- if (typeof pathId === "undefined") return;
289
- var done = false,
290
- timer = setTimeout(postMessage, 500);
291
- function postMessage() {
292
- if (done) return;
293
- clearTimeout(timer);
294
- var opts = { action: "expand", path: pathId };
295
- document.getElementById("nav").contentWindow.postMessage(opts, "*");
296
- done = true;
297
- }
298
-
299
- window.addEventListener(
300
- "message",
301
- function (event) {
302
- if (event.data === "navReady") postMessage();
303
- return false;
304
- },
305
- false
306
- );
307
- }
308
-
309
- function mainFocus() {
310
- var hash = window.location.hash;
311
- if (hash !== "" && $(hash)[0]) {
312
- $(hash)[0].scrollIntoView();
313
- }
314
-
315
- setTimeout(function () {
316
- $("#main").focus();
317
- }, 10);
318
- }
319
-
320
- function navigationChange() {
321
- // This works around the broken anchor navigation with the YARD template.
322
- window.onpopstate = function () {
323
- var hash = window.location.hash;
324
- if (hash !== "" && $(hash)[0]) {
325
- $(hash)[0].scrollIntoView();
326
- }
327
- };
328
- }
329
-
330
- $(document).ready(function () {
331
- navResizer();
332
- navExpander();
333
- createSourceLinks();
334
- createDefineLinks();
335
- createFullTreeLinks();
336
- searchFrameButtons();
337
- linkSummaries();
338
- summaryToggle();
339
- constantSummaryToggle();
340
- generateTOC();
341
- mainFocus();
342
- navigationChange();
343
- });
344
- })();
@@ -1,242 +0,0 @@
1
- (function() {
2
-
3
- var $clicked = $(null);
4
- var searchTimeout = null;
5
- var searchCache = [];
6
- var caseSensitiveMatch = false;
7
- var ignoreKeyCodeMin = 8;
8
- var ignoreKeyCodeMax = 46;
9
- var commandKey = 91;
10
-
11
- RegExp.escape = function(text) {
12
- return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
13
- }
14
-
15
- function escapeShortcut() {
16
- $(document).keydown(function(evt) {
17
- if (evt.which == 27) {
18
- window.parent.postMessage('navEscape', '*');
19
- }
20
- });
21
- }
22
-
23
- function navResizer() {
24
- $(window).mousemove(function(e) {
25
- window.parent.postMessage({
26
- action: 'mousemove', event: {pageX: e.pageX, which: e.which}
27
- }, '*');
28
- }).mouseup(function(e) {
29
- window.parent.postMessage({action: 'mouseup'}, '*');
30
- });
31
- window.parent.postMessage("navReady", "*");
32
- }
33
-
34
- function clearSearchTimeout() {
35
- clearTimeout(searchTimeout);
36
- searchTimeout = null;
37
- }
38
-
39
- function enableLinks() {
40
- // load the target page in the parent window
41
- $('#full_list li').on('click', function(evt) {
42
- $('#full_list li').removeClass('clicked');
43
- $clicked = $(this);
44
- $clicked.addClass('clicked');
45
- evt.stopPropagation();
46
-
47
- if (evt.target.tagName === 'A') return true;
48
-
49
- var elem = $clicked.find('> .item .object_link a')[0];
50
- var e = evt.originalEvent;
51
- var newEvent = new MouseEvent(evt.originalEvent.type);
52
- newEvent.initMouseEvent(e.type, e.canBubble, e.cancelable, e.view, e.detail, e.screenX, e.screenY, e.clientX, e.clientY, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, e.button, e.relatedTarget);
53
- elem.dispatchEvent(newEvent);
54
- evt.preventDefault();
55
- return false;
56
- });
57
- }
58
-
59
- function enableToggles() {
60
- // show/hide nested classes on toggle click
61
- $('#full_list a.toggle').on('click', function(evt) {
62
- evt.stopPropagation();
63
- evt.preventDefault();
64
- $(this).parent().parent().toggleClass('collapsed');
65
- $(this).attr('aria-expanded', function (i, attr) {
66
- return attr == 'true' ? 'false' : 'true'
67
- });
68
- highlight();
69
- });
70
-
71
- // navigation of nested classes using keyboard
72
- $('#full_list a.toggle').on('keypress',function(evt) {
73
- // enter key is pressed
74
- if (evt.which == 13) {
75
- evt.stopPropagation();
76
- evt.preventDefault();
77
- $(this).parent().parent().toggleClass('collapsed');
78
- $(this).attr('aria-expanded', function (i, attr) {
79
- return attr == 'true' ? 'false' : 'true'
80
- });
81
- highlight();
82
- }
83
- });
84
- }
85
-
86
- function populateSearchCache() {
87
- $('#full_list li .item').each(function() {
88
- var $node = $(this);
89
- var $link = $node.find('.object_link a');
90
- if ($link.length > 0) {
91
- searchCache.push({
92
- node: $node,
93
- link: $link,
94
- name: $link.text(),
95
- fullName: $link.attr('title').split(' ')[0]
96
- });
97
- }
98
- });
99
- }
100
-
101
- function enableSearch() {
102
- $('#search input').keyup(function(event) {
103
- if (ignoredKeyPress(event)) return;
104
- if (this.value === "") {
105
- clearSearch();
106
- } else {
107
- performSearch(this.value);
108
- }
109
- });
110
-
111
- $('#full_list').after("<div id='noresults' role='status' style='display: none'></div>");
112
- }
113
-
114
- function ignoredKeyPress(event) {
115
- if (
116
- (event.keyCode > ignoreKeyCodeMin && event.keyCode < ignoreKeyCodeMax) ||
117
- (event.keyCode == commandKey)
118
- ) {
119
- return true;
120
- } else {
121
- return false;
122
- }
123
- }
124
-
125
- function clearSearch() {
126
- clearSearchTimeout();
127
- $('#full_list .found').removeClass('found').each(function() {
128
- var $link = $(this).find('.object_link a');
129
- $link.text($link.text());
130
- });
131
- $('#full_list, #content').removeClass('insearch');
132
- $clicked.parents().removeClass('collapsed');
133
- highlight();
134
- }
135
-
136
- function performSearch(searchString) {
137
- clearSearchTimeout();
138
- $('#full_list, #content').addClass('insearch');
139
- $('#noresults').text('').hide();
140
- partialSearch(searchString, 0);
141
- }
142
-
143
- function partialSearch(searchString, offset) {
144
- var lastRowClass = '';
145
- var i = null;
146
- for (i = offset; i < Math.min(offset + 50, searchCache.length); i++) {
147
- var item = searchCache[i];
148
- var searchName = (searchString.indexOf('::') != -1 ? item.fullName : item.name);
149
- var matchString = buildMatchString(searchString);
150
- var matchRegexp = new RegExp(matchString, caseSensitiveMatch ? "" : "i");
151
- if (searchName.match(matchRegexp) == null) {
152
- item.node.removeClass('found');
153
- item.link.text(item.link.text());
154
- }
155
- else {
156
- item.node.addClass('found');
157
- item.node.removeClass(lastRowClass).addClass(lastRowClass == 'r1' ? 'r2' : 'r1');
158
- lastRowClass = item.node.hasClass('r1') ? 'r1' : 'r2';
159
- item.link.html(item.name.replace(matchRegexp, "<strong>$&</strong>"));
160
- }
161
- }
162
- if(i == searchCache.length) {
163
- searchDone();
164
- } else {
165
- searchTimeout = setTimeout(function() {
166
- partialSearch(searchString, i);
167
- }, 0);
168
- }
169
- }
170
-
171
- function searchDone() {
172
- searchTimeout = null;
173
- highlight();
174
- var found = $('#full_list li:visible').size();
175
- if (found === 0) {
176
- $('#noresults').text('No results were found.');
177
- } else {
178
- // This is read out to screen readers
179
- $('#noresults').text('There are ' + found + ' results.');
180
- }
181
- $('#noresults').show();
182
- $('#content').removeClass('insearch');
183
- }
184
-
185
- function buildMatchString(searchString, event) {
186
- caseSensitiveMatch = searchString.match(/[A-Z]/) != null;
187
- var regexSearchString = RegExp.escape(searchString);
188
- if (caseSensitiveMatch) {
189
- regexSearchString += "|" +
190
- $.map(searchString.split(''), function(e) { return RegExp.escape(e); }).
191
- join('.+?');
192
- }
193
- return regexSearchString;
194
- }
195
-
196
- function highlight() {
197
- $('#full_list li:visible').each(function(n) {
198
- $(this).removeClass('even odd').addClass(n % 2 == 0 ? 'odd' : 'even');
199
- });
200
- }
201
-
202
- /**
203
- * Expands the tree to the target element and its immediate
204
- * children.
205
- */
206
- function expandTo(path) {
207
- var $target = $(document.getElementById('object_' + path));
208
- $target.addClass('clicked');
209
- $target.removeClass('collapsed');
210
- $target.parentsUntil('#full_list', 'li').removeClass('collapsed');
211
-
212
- $target.find('a.toggle').attr('aria-expanded', 'true')
213
- $target.parentsUntil('#full_list', 'li').each(function(i, el) {
214
- $(el).find('> div > a.toggle').attr('aria-expanded', 'true');
215
- });
216
-
217
- if($target[0]) {
218
- window.scrollTo(window.scrollX, $target.offset().top - 250);
219
- highlight();
220
- }
221
- }
222
-
223
- function windowEvents(event) {
224
- var msg = event.data;
225
- if (msg.action === "expand") {
226
- expandTo(msg.path);
227
- }
228
- return false;
229
- }
230
-
231
- window.addEventListener("message", windowEvents, false);
232
-
233
- $(document).ready(function() {
234
- escapeShortcut();
235
- navResizer();
236
- enableLinks();
237
- enableToggles();
238
- populateSearchCache();
239
- enableSearch();
240
- });
241
-
242
- })();