marathon_deploy 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/bin/expand_macros +0 -0
  4. data/bin/json2yaml +0 -0
  5. data/doc/MarathonDeploy/Application.html +906 -0
  6. data/doc/MarathonDeploy/Deployment.html +1348 -0
  7. data/doc/MarathonDeploy/Environment.html +480 -0
  8. data/doc/MarathonDeploy/Error/BadFormatError.html +131 -0
  9. data/doc/MarathonDeploy/Error/BadURLError.html +131 -0
  10. data/doc/MarathonDeploy/Error/DeploymentError.html +131 -0
  11. data/doc/MarathonDeploy/Error/IOError.html +131 -0
  12. data/doc/MarathonDeploy/Error/MarathonError.html +127 -0
  13. data/doc/MarathonDeploy/Error/MissingMarathonAttributesError.html +131 -0
  14. data/doc/MarathonDeploy/Error/TimeoutError.html +131 -0
  15. data/doc/MarathonDeploy/Error/UndefinedMacroError.html +131 -0
  16. data/doc/MarathonDeploy/Error/UnsupportedFileExtension.html +131 -0
  17. data/doc/MarathonDeploy/Error.html +115 -0
  18. data/doc/MarathonDeploy/HttpUtil.html +664 -0
  19. data/doc/MarathonDeploy/Macro.html +192 -0
  20. data/doc/MarathonDeploy/MarathonClient.html +615 -0
  21. data/doc/MarathonDeploy/MarathonDefaults.html +460 -0
  22. data/doc/MarathonDeploy/Utils.html +354 -0
  23. data/doc/MarathonDeploy/YamlJson.html +374 -0
  24. data/doc/MarathonDeploy.html +156 -0
  25. data/doc/_index.html +318 -0
  26. data/doc/class_list.html +58 -0
  27. data/doc/css/common.css +1 -0
  28. data/doc/css/full_list.css +57 -0
  29. data/doc/css/style.css +339 -0
  30. data/doc/file.README.html +223 -0
  31. data/doc/file_list.html +60 -0
  32. data/doc/frames.html +26 -0
  33. data/doc/index.html +223 -0
  34. data/doc/js/app.js +219 -0
  35. data/doc/js/full_list.js +181 -0
  36. data/doc/js/jquery.js +4 -0
  37. data/doc/method_list.html +393 -0
  38. data/doc/top-level-namespace.html +112 -0
  39. data/lib/marathon_deploy/application.rb +7 -7
  40. data/lib/marathon_deploy/version.rb +1 -1
  41. data/lib/marathon_deploy.rb +1 -0
  42. data/marathon_deploy.gemspec +1 -0
  43. metadata +52 -3
data/doc/index.html ADDED
@@ -0,0 +1,223 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6
+ <title>
7
+ File: README
8
+
9
+ &mdash; Documentation by YARD 0.8.7.6
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ hasFrames = window.top.frames.main ? true : false;
19
+ relpath = '';
20
+ framesUrl = "frames.html#!file.README.html";
21
+ </script>
22
+
23
+
24
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
25
+
26
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
27
+
28
+
29
+ </head>
30
+ <body>
31
+ <div id="header">
32
+ <div id="menu">
33
+
34
+ <a href="_index.html">Index</a> &raquo;
35
+ <span class="title">File: README</span>
36
+
37
+
38
+ <div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
39
+ </div>
40
+
41
+ <div id="search">
42
+
43
+ <a class="full_list_link" id="class_list_link"
44
+ href="class_list.html">
45
+ Class List
46
+ </a>
47
+
48
+ <a class="full_list_link" id="method_list_link"
49
+ href="method_list.html">
50
+ Method List
51
+ </a>
52
+
53
+ <a class="full_list_link" id="file_list_link"
54
+ href="file_list.html">
55
+ File List
56
+ </a>
57
+
58
+ </div>
59
+ <div class="clear"></div>
60
+ </div>
61
+
62
+ <iframe id="search_frame"></iframe>
63
+
64
+ <div id="content"><div id='filecontents'>
65
+ <h1 id="label-Marathon+Deploy">Marathon Deploy</h1>
66
+
67
+ <p>A <a href="https://mesosphere.github.io/marathon/">Marathon</a>
68
+ command-line deployment tool in Ruby. Takes a json or yaml file describing
69
+ an application and pushes it to the Marathon <a
70
+ href="https://mesosphere.github.io/marathon/docs/rest-api.html">REST
71
+ API</a></p>
72
+
73
+ <h3 id="label-Feature+Summary">Feature Summary</h3>
74
+ <ul><li>
75
+ <p>Deploy a single application descriptor to multiple marathon endpoints</p>
76
+ </li><li>
77
+ <p>Checks for existing deployment of application before starting new
78
+ deployment</p>
79
+ </li><li>
80
+ <p>Polls for Healthcheck results after deployment</p>
81
+ </li><li>
82
+ <p>Proper exit codes for easier integration with Jenkins automated pipelines</p>
83
+ </li><li>
84
+ <p>Deploy file macro substitution using values from ENV variables (eg,
85
+ %%MACRO_NAME%%)</p>
86
+ </li><li>
87
+ <p>PRODUCTION / PREPRODUCTION modes (specified with –environment)</p>
88
+ </li><li>
89
+ <p>Rolling upgrade deployment strategy (Marathon default)</p>
90
+ </li></ul>
91
+
92
+ <h3 id="label-Roadmap+Features">Roadmap Features</h3>
93
+ <ul><li>
94
+ <p>Record actions and json payload to a database (for rollback, history,
95
+ auditing)</p>
96
+ </li><li>
97
+ <p>Deploy a deployment descriptor containing multiple applications</p>
98
+ </li><li>
99
+ <p>Specify deployment strategy (using minimumHealthCapacity) as an option. See
100
+ <a
101
+ href="https://mesosphere.github.io/marathon/docs/deployments.html">Marathon
102
+ Deployment document</a></p>
103
+ </li></ul>
104
+
105
+ <h2 id="label-Installation">Installation</h2>
106
+
107
+ <p>Ensure Ruby (1.9+) and gem are installed on you system, then run:</p>
108
+
109
+ <pre class="code ruby"><code class="ruby">$ gem install marathon_deploy</code></pre>
110
+
111
+ <p>Executables from this gem (automatically added to your $PATH):</p>
112
+
113
+ <pre class="code ruby"><code class="ruby">$ marathon_deploy (client program executable)
114
+ $ json2yaml.rb (convenience utility for converting json to yaml)
115
+ $ expand_macros.rb (expands all macros in the form %%MACRO%% with value of ENV[MACRO])</code></pre>
116
+
117
+ <h2 id="label-Usage">Usage</h2>
118
+
119
+ <h3 id="label-Help">Help</h3>
120
+
121
+ <pre class="code ruby"><code class="ruby">&gt;marathon_deploy -h
122
+ Usage: bin/marathon_deploy [options]
123
+ -u, --url MARATHON_URL(S) Default: [&quot;http://localhost:8080&quot;]
124
+ -l, --logfile LOGFILE Default: STDOUT
125
+ -d, --debug Run in debug mode
126
+ -v, --version Version info
127
+ -f, --force Force deployment when sending same deploy JSON to Marathon
128
+ -n, --noop No action. Just display what would be performed.
129
+ -e, --environment ENVIRONMENT Default: PREPRODUC</code></pre>
130
+
131
+ <h3 id="label-Example+Deployfile">Example Deployfile</h3>
132
+
133
+ <p>By default, a file called &#39;deploy.yaml&#39; is searched for in the
134
+ current directory where deploy.rb is run from. An alternative file name can
135
+ be provided with the -f parameter.</p>
136
+
137
+ <p>The file format must conform to the <a
138
+ href="https://mesosphere.github.io/marathon/docs/rest-api.html#post-/v2/apps">Marathon
139
+ API specification</a></p>
140
+
141
+ <p>Minimalistic example (using Docker container):</p>
142
+
143
+ <pre class="code ruby"><code class="ruby">id: python-example-stable
144
+ cmd: echo python stable `hostname` &gt; index.html; python3 -m http.server 8080
145
+ mem: 16
146
+ cpus: 0.1
147
+ instances: 5
148
+ container:
149
+ type: DOCKER
150
+ docker:
151
+ image: ubuntu:14.04
152
+ network: BRIDGE
153
+ portMappings:
154
+ - containerPort: 8080
155
+ hostPort: 0
156
+ protocol: tcp
157
+ env:
158
+ SERVICE_TAGS: python,webapp,http,weight=100
159
+ SERVICE_NAME: python
160
+ healthChecks:
161
+ - portIndex: 0
162
+ protocol: TCP
163
+ gracePeriodSeconds: 30
164
+ intervalSeconds: 10
165
+ timeoutSeconds: 30
166
+ maxConsecutiveFailures: 3
167
+ - path: &quot;/&quot;
168
+ portIndex: 0
169
+ protocol: HTTP
170
+ gracePeriodSeconds: 30
171
+ intervalSeconds: 10
172
+ timeoutSeconds: 30
173
+ maxConsecutiveFailures: 3</code></pre>
174
+
175
+ <h3 id="label-JSON+to+YAML+file+conversion">JSON to YAML file conversion</h3>
176
+
177
+ <p>As a convenience, the provided json2yaml.rb script can convert a JSON file
178
+ to the arguably more human-readable YAML format:</p>
179
+
180
+ <pre class="code ruby"><code class="ruby"><span class='gvar'>$json2yaml</span><span class='period'>.</span><span class='id identifier rubyid_rb'>rb</span> <span class='id identifier rubyid_marathon'>marathon</span><span class='op'>-</span><span class='id identifier rubyid_webapp'>webapp</span><span class='period'>.</span><span class='id identifier rubyid_json'>json</span> <span class='op'>&gt;</span> <span class='id identifier rubyid_marathon'>marathon</span><span class='op'>-</span><span class='id identifier rubyid_webapp'>webapp</span><span class='period'>.</span><span class='id identifier rubyid_yaml'>yaml</span>
181
+ </code></pre>
182
+
183
+ <h3 id="label-Parsing+a+file+with+macro+expansion+from+ENV+variables">Parsing a file with macro expansion from ENV variables</h3>
184
+
185
+ <p>A helper script which takes a file and replaces all macros having the
186
+ format %%MACRO%% with the values from ENV variables. Script will fail if
187
+ there are no ENV values for macro names contained in the template.</p>
188
+
189
+ <pre class="code ruby"><code class="ruby">$expand_macros.rb -h
190
+ Usage: bin/expand_macros.rb [options]
191
+ -o, --outfile OUTFILE Default: STDOUT
192
+ -l, --logfile LOGFILE Default: STDOUT
193
+ -d, --debug Run in debug mode
194
+ -v, --version Version info
195
+ -f, --force force overwrite of existing OUTFILE
196
+ -t, --template TEMPLATE_FILE Input file. Default: dockerfile.tpl
197
+ -h, --help Show this message</code></pre>
198
+
199
+ <h2 id="label-Contributing">Contributing</h2>
200
+ <ol><li>
201
+ <p>Fork it ( <a
202
+ href="https://github.com/[my-github-username]/marathon_deploy/fork">github.com/[my-github-username]/marathon_deploy/fork</a>
203
+ )</p>
204
+ </li><li>
205
+ <p>Create your feature branch (<code>git checkout -b my-new-feature</code>)</p>
206
+ </li><li>
207
+ <p>Commit your changes (<code>git commit -am &#39;Add some
208
+ feature&#39;</code>)</p>
209
+ </li><li>
210
+ <p>Push to the branch (<code>git push origin my-new-feature</code>)</p>
211
+ </li><li>
212
+ <p>Create a new Pull Request</p>
213
+ </li></ol>
214
+ </div></div>
215
+
216
+ <div id="footer">
217
+ Generated on Thu Aug 6 12:50:37 2015 by
218
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
219
+ 0.8.7.6 (ruby-2.2.0).
220
+ </div>
221
+
222
+ </body>
223
+ </html>
data/doc/js/app.js ADDED
@@ -0,0 +1,219 @@
1
+ function createSourceLinks() {
2
+ $('.method_details_list .source_code').
3
+ before("<span class='showSource'>[<a href='#' class='toggleSource'>View source</a>]</span>");
4
+ $('.toggleSource').toggle(function() {
5
+ $(this).parent().nextAll('.source_code').slideDown(100);
6
+ $(this).text("Hide source");
7
+ },
8
+ function() {
9
+ $(this).parent().nextAll('.source_code').slideUp(100);
10
+ $(this).text("View source");
11
+ });
12
+ }
13
+
14
+ function createDefineLinks() {
15
+ var tHeight = 0;
16
+ $('.defines').after(" <a href='#' class='toggleDefines'>more...</a>");
17
+ $('.toggleDefines').toggle(function() {
18
+ tHeight = $(this).parent().prev().height();
19
+ $(this).prev().show();
20
+ $(this).parent().prev().height($(this).parent().height());
21
+ $(this).text("(less)");
22
+ },
23
+ function() {
24
+ $(this).prev().hide();
25
+ $(this).parent().prev().height(tHeight);
26
+ $(this).text("more...");
27
+ });
28
+ }
29
+
30
+ function createFullTreeLinks() {
31
+ var tHeight = 0;
32
+ $('.inheritanceTree').toggle(function() {
33
+ tHeight = $(this).parent().prev().height();
34
+ $(this).parent().toggleClass('showAll');
35
+ $(this).text("(hide)");
36
+ $(this).parent().prev().height($(this).parent().height());
37
+ },
38
+ function() {
39
+ $(this).parent().toggleClass('showAll');
40
+ $(this).parent().prev().height(tHeight);
41
+ $(this).text("show all");
42
+ });
43
+ }
44
+
45
+ function fixBoxInfoHeights() {
46
+ $('dl.box dd.r1, dl.box dd.r2').each(function() {
47
+ $(this).prev().height($(this).height());
48
+ });
49
+ }
50
+
51
+ function searchFrameLinks() {
52
+ $('.full_list_link').click(function() {
53
+ toggleSearchFrame(this, $(this).attr('href'));
54
+ return false;
55
+ });
56
+ }
57
+
58
+ function toggleSearchFrame(id, link) {
59
+ var frame = $('#search_frame');
60
+ $('#search a').removeClass('active').addClass('inactive');
61
+ if (frame.attr('src') == link && frame.css('display') != "none") {
62
+ frame.slideUp(100);
63
+ $('#search a').removeClass('active inactive');
64
+ }
65
+ else {
66
+ $(id).addClass('active').removeClass('inactive');
67
+ frame.attr('src', link).slideDown(100);
68
+ }
69
+ }
70
+
71
+ function linkSummaries() {
72
+ $('.summary_signature').click(function() {
73
+ document.location = $(this).find('a').attr('href');
74
+ });
75
+ }
76
+
77
+ function framesInit() {
78
+ if (hasFrames) {
79
+ document.body.className = 'frames';
80
+ $('#menu .noframes a').attr('href', document.location);
81
+ try {
82
+ window.top.document.title = $('html head title').text();
83
+ } catch(error) {
84
+ // some browsers will not allow this when serving from file://
85
+ // but we don't want to stop the world.
86
+ }
87
+ }
88
+ else {
89
+ $('#menu .noframes a').text('frames').attr('href', framesUrl);
90
+ }
91
+ }
92
+
93
+ function keyboardShortcuts() {
94
+ if (window.top.frames.main) return;
95
+ $(document).keypress(function(evt) {
96
+ if (evt.altKey || evt.ctrlKey || evt.metaKey || evt.shiftKey) return;
97
+ if (typeof evt.target !== "undefined" &&
98
+ (evt.target.nodeName == "INPUT" ||
99
+ evt.target.nodeName == "TEXTAREA")) return;
100
+ switch (evt.charCode) {
101
+ case 67: case 99: $('#class_list_link').click(); break; // 'c'
102
+ case 77: case 109: $('#method_list_link').click(); break; // 'm'
103
+ case 70: case 102: $('#file_list_link').click(); break; // 'f'
104
+ default: break;
105
+ }
106
+ });
107
+ }
108
+
109
+ function summaryToggle() {
110
+ $('.summary_toggle').click(function() {
111
+ if (localStorage) {
112
+ localStorage.summaryCollapsed = $(this).text();
113
+ }
114
+ $('.summary_toggle').each(function() {
115
+ $(this).text($(this).text() == "collapse" ? "expand" : "collapse");
116
+ var next = $(this).parent().parent().nextAll('ul.summary').first();
117
+ if (next.hasClass('compact')) {
118
+ next.toggle();
119
+ next.nextAll('ul.summary').first().toggle();
120
+ }
121
+ else if (next.hasClass('summary')) {
122
+ var list = $('<ul class="summary compact" />');
123
+ list.html(next.html());
124
+ list.find('.summary_desc, .note').remove();
125
+ list.find('a').each(function() {
126
+ $(this).html($(this).find('strong').html());
127
+ $(this).parent().html($(this)[0].outerHTML);
128
+ });
129
+ next.before(list);
130
+ next.toggle();
131
+ }
132
+ });
133
+ return false;
134
+ });
135
+ if (localStorage) {
136
+ if (localStorage.summaryCollapsed == "collapse") {
137
+ $('.summary_toggle').first().click();
138
+ }
139
+ else localStorage.summaryCollapsed = "expand";
140
+ }
141
+ }
142
+
143
+ function fixOutsideWorldLinks() {
144
+ $('a').each(function() {
145
+ if (window.location.host != this.host) this.target = '_parent';
146
+ });
147
+ }
148
+
149
+ function generateTOC() {
150
+ if ($('#filecontents').length === 0) return;
151
+ var _toc = $('<ol class="top"></ol>');
152
+ var show = false;
153
+ var toc = _toc;
154
+ var counter = 0;
155
+ var tags = ['h2', 'h3', 'h4', 'h5', 'h6'];
156
+ var i;
157
+ if ($('#filecontents h1').length > 1) tags.unshift('h1');
158
+ for (i = 0; i < tags.length; i++) { tags[i] = '#filecontents ' + tags[i]; }
159
+ var lastTag = parseInt(tags[0][1], 10);
160
+ $(tags.join(', ')).each(function() {
161
+ if ($(this).parents('.method_details .docstring').length != 0) return;
162
+ if (this.id == "filecontents") return;
163
+ show = true;
164
+ var thisTag = parseInt(this.tagName[1], 10);
165
+ if (this.id.length === 0) {
166
+ var proposedId = $(this).attr('toc-id');
167
+ if (typeof(proposedId) != "undefined") this.id = proposedId;
168
+ else {
169
+ var proposedId = $(this).text().replace(/[^a-z0-9-]/ig, '_');
170
+ if ($('#' + proposedId).length > 0) { proposedId += counter; counter++; }
171
+ this.id = proposedId;
172
+ }
173
+ }
174
+ if (thisTag > lastTag) {
175
+ for (i = 0; i < thisTag - lastTag; i++) {
176
+ var tmp = $('<ol/>'); toc.append(tmp); toc = tmp;
177
+ }
178
+ }
179
+ if (thisTag < lastTag) {
180
+ for (i = 0; i < lastTag - thisTag; i++) toc = toc.parent();
181
+ }
182
+ var title = $(this).attr('toc-title');
183
+ if (typeof(title) == "undefined") title = $(this).text();
184
+ toc.append('<li><a href="#' + this.id + '">' + title + '</a></li>');
185
+ lastTag = thisTag;
186
+ });
187
+ if (!show) return;
188
+ html = '<div id="toc"><p class="title"><a class="hide_toc" href="#"><strong>Table of Contents</strong></a> <small>(<a href="#" class="float_toc">left</a>)</small></p></div>';
189
+ $('#content').prepend(html);
190
+ $('#toc').append(_toc);
191
+ $('#toc .hide_toc').toggle(function() {
192
+ $('#toc .top').slideUp('fast');
193
+ $('#toc').toggleClass('hidden');
194
+ $('#toc .title small').toggle();
195
+ }, function() {
196
+ $('#toc .top').slideDown('fast');
197
+ $('#toc').toggleClass('hidden');
198
+ $('#toc .title small').toggle();
199
+ });
200
+ $('#toc .float_toc').toggle(function() {
201
+ $(this).text('float');
202
+ $('#toc').toggleClass('nofloat');
203
+ }, function() {
204
+ $(this).text('left');
205
+ $('#toc').toggleClass('nofloat');
206
+ });
207
+ }
208
+
209
+ $(framesInit);
210
+ $(createSourceLinks);
211
+ $(createDefineLinks);
212
+ $(createFullTreeLinks);
213
+ $(fixBoxInfoHeights);
214
+ $(searchFrameLinks);
215
+ $(linkSummaries);
216
+ $(keyboardShortcuts);
217
+ $(summaryToggle);
218
+ $(fixOutsideWorldLinks);
219
+ $(generateTOC);
@@ -0,0 +1,181 @@
1
+ var inSearch = null;
2
+ var searchIndex = 0;
3
+ var searchCache = [];
4
+ var searchString = '';
5
+ var regexSearchString = '';
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 fullListSearch() {
16
+ // generate cache
17
+ searchCache = [];
18
+ $('#full_list li').each(function() {
19
+ var link = $(this).find('.object_link a');
20
+ if (link.length === 0) return;
21
+ var fullName = link.attr('title').split(' ')[0];
22
+ searchCache.push({name:link.text(), fullName:fullName, node:$(this), link:link});
23
+ });
24
+
25
+ $('#search input').keyup(function(event) {
26
+ if ((event.keyCode > ignoreKeyCodeMin && event.keyCode < ignoreKeyCodeMax)
27
+ || event.keyCode == commandKey)
28
+ return;
29
+ searchString = this.value;
30
+ caseSensitiveMatch = searchString.match(/[A-Z]/) != null;
31
+ regexSearchString = RegExp.escape(searchString);
32
+ if (caseSensitiveMatch) {
33
+ regexSearchString += "|" +
34
+ $.map(searchString.split(''), function(e) { return RegExp.escape(e); }).
35
+ join('.+?');
36
+ }
37
+ if (searchString === "") {
38
+ clearTimeout(inSearch);
39
+ inSearch = null;
40
+ $('ul .search_uncollapsed').removeClass('search_uncollapsed');
41
+ $('#full_list, #content').removeClass('insearch');
42
+ $('#full_list li').removeClass('found').each(function() {
43
+
44
+ var link = $(this).find('.object_link a');
45
+ if (link.length > 0) link.text(link.text());
46
+ });
47
+ if (clicked) {
48
+ clicked.parents('ul').each(function() {
49
+ $(this).removeClass('collapsed').prev().removeClass('collapsed');
50
+ });
51
+ }
52
+ highlight();
53
+ }
54
+ else {
55
+ if (inSearch) clearTimeout(inSearch);
56
+ searchIndex = 0;
57
+ lastRowClass = '';
58
+ $('#full_list, #content').addClass('insearch');
59
+ $('#noresults').text('');
60
+ searchItem();
61
+ }
62
+ });
63
+
64
+ $('#search input').focus();
65
+ $('#full_list').after("<div id='noresults'></div>");
66
+ }
67
+
68
+ var lastRowClass = '';
69
+ function searchItem() {
70
+ for (var i = 0; i < searchCache.length / 50; i++) {
71
+ var item = searchCache[searchIndex];
72
+ var searchName = (searchString.indexOf('::') != -1 ? item.fullName : item.name);
73
+ var matchString = regexSearchString;
74
+ var matchRegexp = new RegExp(matchString, caseSensitiveMatch ? "" : "i");
75
+ if (searchName.match(matchRegexp) == null) {
76
+ item.node.removeClass('found');
77
+ }
78
+ else {
79
+ item.node.css('padding-left', '10px').addClass('found');
80
+ item.node.parents().addClass('search_uncollapsed');
81
+ item.node.removeClass(lastRowClass).addClass(lastRowClass == 'r1' ? 'r2' : 'r1');
82
+ lastRowClass = item.node.hasClass('r1') ? 'r1' : 'r2';
83
+ item.link.html(item.name.replace(matchRegexp, "<strong>$&</strong>"));
84
+ }
85
+
86
+ if (searchCache.length === searchIndex + 1) {
87
+ searchDone();
88
+ return;
89
+ }
90
+ else {
91
+ searchIndex++;
92
+ }
93
+ }
94
+ inSearch = setTimeout('searchItem()', 0);
95
+ }
96
+
97
+ function searchDone() {
98
+ highlight(true);
99
+ if ($('#full_list li:visible').size() === 0) {
100
+ $('#noresults').text('No results were found.').hide().fadeIn();
101
+ }
102
+ else {
103
+ $('#noresults').text('');
104
+ }
105
+ $('#content').removeClass('insearch');
106
+ clearTimeout(inSearch);
107
+ inSearch = null;
108
+ }
109
+
110
+ clicked = null;
111
+ function linkList() {
112
+ $('#full_list li, #full_list li a:last').click(function(evt) {
113
+ if ($(this).hasClass('toggle')) return true;
114
+ if (this.tagName.toLowerCase() == "li") {
115
+ if ($(this).find('.object_link a').length === 0) {
116
+ $(this).children('a.toggle').click();
117
+ return false;
118
+ }
119
+ var toggle = $(this).children('a.toggle');
120
+ if (toggle.size() > 0 && evt.pageX < toggle.offset().left) {
121
+ toggle.click();
122
+ return false;
123
+ }
124
+ }
125
+ if (clicked) clicked.removeClass('clicked');
126
+ var win;
127
+ try {
128
+ win = window.top.frames.main ? window.top.frames.main : window.parent;
129
+ } catch (e) { win = window.parent; }
130
+ if (this.tagName.toLowerCase() == "a") {
131
+ clicked = $(this).parents('li').addClass('clicked');
132
+ win.location = this.href;
133
+ }
134
+ else {
135
+ clicked = $(this).addClass('clicked');
136
+ win.location = $(this).find('a:last').attr('href');
137
+ }
138
+ return false;
139
+ });
140
+ }
141
+
142
+ function collapse() {
143
+ if (!$('#full_list').hasClass('class')) return;
144
+ $('#full_list.class a.toggle').click(function() {
145
+ $(this).parent().toggleClass('collapsed').next().toggleClass('collapsed');
146
+ highlight();
147
+ return false;
148
+ });
149
+ $('#full_list.class ul').each(function() {
150
+ $(this).addClass('collapsed').prev().addClass('collapsed');
151
+ });
152
+ $('#full_list.class').children().removeClass('collapsed');
153
+ highlight();
154
+ }
155
+
156
+ function highlight(no_padding) {
157
+ var n = 1;
158
+ $('#full_list li:visible').each(function() {
159
+ var next = n == 1 ? 2 : 1;
160
+ $(this).removeClass("r" + next).addClass("r" + n);
161
+ if (!no_padding && $('#full_list').hasClass('class')) {
162
+ $(this).css('padding-left', (10 + $(this).parents('ul').size() * 15) + 'px');
163
+ }
164
+ n = next;
165
+ });
166
+ }
167
+
168
+ function escapeShortcut() {
169
+ $(document).keydown(function(evt) {
170
+ if (evt.which == 27) {
171
+ $('#search_frame', window.top.document).slideUp(100);
172
+ $('#search a', window.top.document).removeClass('active inactive');
173
+ $(window.top).focus();
174
+ }
175
+ });
176
+ }
177
+
178
+ $(escapeShortcut);
179
+ $(fullListSearch);
180
+ $(linkList);
181
+ $(collapse);