kubes 0.7.0 → 0.7.5
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.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE.md +7 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +84 -0
- data/.github/ISSUE_TEMPLATE/documentation.md +12 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +64 -0
- data/.github/ISSUE_TEMPLATE/question.md +14 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +50 -0
- data/CHANGELOG.md +18 -0
- data/README.md +2 -0
- data/docs/_docs/config/reference.md +1 -1
- data/docs/_docs/dsl/multiple-resources.md +14 -17
- data/docs/_docs/intro/concepts.md +8 -9
- data/docs/_docs/intro/docker-image.md +2 -2
- data/docs/_docs/intro/ordering.md +9 -10
- data/docs/_docs/patterns/multiple-envs.md +6 -6
- data/docs/_docs/resources/role.md +8 -9
- data/docs/_docs/yaml.md +4 -5
- data/docs/_docs/yaml/multiple-files.md +6 -7
- data/docs/_docs/yaml/multiple-resources.md +13 -14
- data/docs/_includes/commands.html +8 -9
- data/docs/_includes/header.html +7 -0
- data/docs/_includes/vs/kubes/structure.md +12 -13
- data/docs/_sass/theme.scss +92 -0
- data/docs/search/data.json +44 -0
- data/docs/search/index.html +30 -0
- data/docs/search/lunr.js +3475 -0
- data/docs/search/search.js +247 -0
- data/docs/search/tips.md +48 -0
- data/lib/kubes.rb +1 -0
- data/lib/kubes/cli/compile.rb +1 -1
- data/lib/kubes/command.rb +1 -0
- data/lib/kubes/compiler/decorator/base.rb +2 -2
- data/lib/kubes/compiler/dsl/core/base.rb +2 -6
- data/lib/kubes/compiler/dsl/core/fields.rb +1 -1
- data/lib/kubes/compiler/dsl/syntax/resource.rb +2 -3
- data/lib/kubes/compiler/shared/helpers.rb +4 -2
- data/lib/kubes/compiler/shared/runtime_helpers.rb +78 -0
- data/lib/kubes/compiler/strategy/dispatcher.rb +4 -3
- data/lib/kubes/compiler/strategy/erb.rb +2 -7
- data/lib/kubes/config.rb +1 -1
- data/lib/kubes/core.rb +6 -0
- data/lib/kubes/docker/strategy/image_name.rb +7 -3
- data/lib/kubes/version.rb +1 -1
- metadata +15 -6
- data/lib/kubes/compiler/shared/custom_helpers.rb +0 -17
- data/lib/kubes/compiler/shared/custom_variables.rb +0 -38
- data/lib/kubes/compiler/shared/plugin_helpers.rb +0 -14
@@ -0,0 +1,247 @@
|
|
1
|
+
/**
|
2
|
+
* A simple JSON search
|
3
|
+
* Requires jQuery (v 1.7+)
|
4
|
+
*
|
5
|
+
* @author Mat Hayward - Erskine Design
|
6
|
+
* @author Rishikesh Darandale <Rishikesh.Darandale@gmail.com>
|
7
|
+
* @version 1.1
|
8
|
+
*/
|
9
|
+
|
10
|
+
var q, jsonFeedUrl = "/search/data.json",
|
11
|
+
$searchForm = $("[data-search-form]"),
|
12
|
+
$searchInput = $("[data-search-input]"),
|
13
|
+
$resultTemplate = $("#search-result"),
|
14
|
+
$resultsPlaceholder = $("[data-search-results]"),
|
15
|
+
$foundContainer = $("[data-search-found]"),
|
16
|
+
$foundTerm = $("[data-search-found-term]"),
|
17
|
+
$foundCount = $("[data-search-found-count]"),
|
18
|
+
$foundWord = $("[data-search-found-word]"),
|
19
|
+
allowEmpty = true,
|
20
|
+
showLoader = true,
|
21
|
+
loadingClass = "is--loading",
|
22
|
+
indexVar;
|
23
|
+
|
24
|
+
|
25
|
+
$(document).ready( function() {
|
26
|
+
// hide items found string
|
27
|
+
$foundContainer.hide();
|
28
|
+
// initiate search functionality
|
29
|
+
initSearch();
|
30
|
+
});
|
31
|
+
|
32
|
+
function initSearch() {
|
33
|
+
if(!sessionStorage.getItem("lunrIndex")) {
|
34
|
+
// get the data
|
35
|
+
getData();
|
36
|
+
} else {
|
37
|
+
// Get search results if q parameter is set in querystring
|
38
|
+
if (getParameterByName('q')) {
|
39
|
+
q = decodeURIComponent(getParameterByName('q'));
|
40
|
+
$searchInput.val(q);
|
41
|
+
execSearch(q);
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
// Get search results on submission of form
|
46
|
+
$(document).on("submit", $searchForm, function(e) {
|
47
|
+
console.log("form submitted");
|
48
|
+
e.preventDefault();
|
49
|
+
q = $searchInput.val();
|
50
|
+
execSearch(q);
|
51
|
+
});
|
52
|
+
}
|
53
|
+
|
54
|
+
/**
|
55
|
+
* Get the JSON data
|
56
|
+
* Get the generated feeds/feed.json file so lunr.js can search it locally.
|
57
|
+
* Store the index in sessionStorage
|
58
|
+
*/
|
59
|
+
function getData(indexVar) {
|
60
|
+
jqxhr = $.getJSON(jsonFeedUrl)
|
61
|
+
.done(function(loaded_data){
|
62
|
+
// save the actual data as well
|
63
|
+
sessionStorage.setItem("actualData", JSON.stringify(loaded_data));
|
64
|
+
// set the index fields
|
65
|
+
indexVar = lunr(function () {
|
66
|
+
this.field('id');
|
67
|
+
this.field('title', { boost: 10 });
|
68
|
+
this.field('search_title', { boost: 10 });
|
69
|
+
this.field('content', { boost: 10 });
|
70
|
+
this.field('author');
|
71
|
+
loaded_data.forEach(function (doc, index) {
|
72
|
+
if ( doc.search_omit != "true" ) {
|
73
|
+
console.log("adding to index: " + doc.title);
|
74
|
+
this.add($.extend({ "id": index }, doc));
|
75
|
+
}
|
76
|
+
}, this)
|
77
|
+
});
|
78
|
+
// store the index in sessionStorage
|
79
|
+
sessionStorage.setItem("lunrIndex", JSON.stringify(indexVar));
|
80
|
+
// Get search results if q parameter is set in querystring
|
81
|
+
if (getParameterByName('q')) {
|
82
|
+
q = decodeURIComponent(getParameterByName('q'));
|
83
|
+
$searchInput.val(q);
|
84
|
+
execSearch(q);
|
85
|
+
}
|
86
|
+
})
|
87
|
+
.fail( function() {
|
88
|
+
console.log("get json failed...");
|
89
|
+
})
|
90
|
+
.always( function() {
|
91
|
+
console.log("finally...");
|
92
|
+
});
|
93
|
+
}
|
94
|
+
|
95
|
+
/**
|
96
|
+
* Get the search result from lunr
|
97
|
+
* @param {String} q
|
98
|
+
* @returns search results
|
99
|
+
*/
|
100
|
+
function getResults(q) {
|
101
|
+
var savedIndexData = JSON.parse(sessionStorage.getItem("lunrIndex"));
|
102
|
+
console.log("Indexed var from sessionStorage: " + savedIndexData);
|
103
|
+
return lunr.Index.load(savedIndexData).search(q);
|
104
|
+
}
|
105
|
+
|
106
|
+
/**
|
107
|
+
* Executes search
|
108
|
+
* @param {String} q
|
109
|
+
* @return null
|
110
|
+
*/
|
111
|
+
function execSearch(q) {
|
112
|
+
if (q != '' || allowEmpty) {
|
113
|
+
if (showLoader) {
|
114
|
+
toggleLoadingClass();
|
115
|
+
}
|
116
|
+
processResultData(getResults(q));
|
117
|
+
changeUrl("Search", "/search/?q=" + encodeURIComponent(q));
|
118
|
+
}
|
119
|
+
}
|
120
|
+
|
121
|
+
/**
|
122
|
+
* Toggles loading class on results and found string
|
123
|
+
* @return null
|
124
|
+
*/
|
125
|
+
function toggleLoadingClass() {
|
126
|
+
$resultsPlaceholder.toggleClass(loadingClass);
|
127
|
+
$foundContainer.toggleClass(loadingClass);
|
128
|
+
}
|
129
|
+
|
130
|
+
/**
|
131
|
+
* Process search result data
|
132
|
+
* @return null
|
133
|
+
*/
|
134
|
+
function processResultData(searchResults) {
|
135
|
+
$results = [];
|
136
|
+
|
137
|
+
console.log("Search Results: " + searchResults);
|
138
|
+
var resultsCount = 0,
|
139
|
+
results = "";
|
140
|
+
|
141
|
+
// Iterate over the results
|
142
|
+
searchResults.forEach(function(result) {
|
143
|
+
var loaded_data = JSON.parse(sessionStorage.getItem("actualData"));
|
144
|
+
var item = loaded_data[result.ref];
|
145
|
+
var result = populateResultContent($resultTemplate.html(), item);
|
146
|
+
resultsCount++;
|
147
|
+
results += result;
|
148
|
+
});
|
149
|
+
|
150
|
+
|
151
|
+
if (showLoader) {
|
152
|
+
toggleLoadingClass();
|
153
|
+
}
|
154
|
+
|
155
|
+
populateResultsString(resultsCount);
|
156
|
+
showSearchResults(results);
|
157
|
+
}
|
158
|
+
|
159
|
+
/**
|
160
|
+
* Add search results to placeholder
|
161
|
+
* @param {String} results
|
162
|
+
* @return null
|
163
|
+
*/
|
164
|
+
function showSearchResults(results) {
|
165
|
+
// Add results HTML to placeholder
|
166
|
+
$resultsPlaceholder.html(results);
|
167
|
+
}
|
168
|
+
|
169
|
+
/**
|
170
|
+
* Add results content to item template
|
171
|
+
* @param {String} html
|
172
|
+
* @param {object} item
|
173
|
+
* @return {String} Populated HTML
|
174
|
+
*/
|
175
|
+
function populateResultContent(html, item) {
|
176
|
+
var title = item.search_title || item.title
|
177
|
+
html = injectContent(html, title, '##Title##');
|
178
|
+
html = injectContent(html, item.link, '##Url##');
|
179
|
+
var content = text_truncate(item.content);
|
180
|
+
html = injectContent(html, content, '##Content##');
|
181
|
+
return html;
|
182
|
+
}
|
183
|
+
|
184
|
+
function text_truncate(str, length, ending) {
|
185
|
+
if (length == null) {
|
186
|
+
length = 255;
|
187
|
+
}
|
188
|
+
if (ending == null) {
|
189
|
+
ending = '...';
|
190
|
+
}
|
191
|
+
if (str.length > length) {
|
192
|
+
return str.substring(0, length - ending.length) + ending;
|
193
|
+
} else {
|
194
|
+
return str;
|
195
|
+
}
|
196
|
+
};
|
197
|
+
|
198
|
+
/**
|
199
|
+
* Populates results string
|
200
|
+
* @param {String} count
|
201
|
+
* @return null
|
202
|
+
*/
|
203
|
+
function populateResultsString(count) {
|
204
|
+
$foundTerm.text(q);
|
205
|
+
$foundCount.text(count);
|
206
|
+
if (count == 1)
|
207
|
+
$foundWord.text("result")
|
208
|
+
else
|
209
|
+
$foundWord.text("results")
|
210
|
+
$foundContainer.show();
|
211
|
+
}
|
212
|
+
|
213
|
+
/* ==========================================================================
|
214
|
+
Helper functions
|
215
|
+
========================================================================== */
|
216
|
+
|
217
|
+
|
218
|
+
/**
|
219
|
+
* Gets query string parameter - taken from http://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript
|
220
|
+
* @param {String} name
|
221
|
+
* @return {String} parameter value
|
222
|
+
*/
|
223
|
+
function getParameterByName(name) {
|
224
|
+
var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
|
225
|
+
return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
|
226
|
+
}
|
227
|
+
|
228
|
+
/**
|
229
|
+
* Injects content into template using placeholder
|
230
|
+
* @param {String} originalContent
|
231
|
+
* @param {String} injection
|
232
|
+
* @param {String} placeholder
|
233
|
+
* @return {String} injected content
|
234
|
+
*/
|
235
|
+
function injectContent(originalContent, injection, placeholder) {
|
236
|
+
var regex = new RegExp(placeholder, 'g');
|
237
|
+
return originalContent.replace(regex, injection);
|
238
|
+
}
|
239
|
+
|
240
|
+
function changeUrl(page, url) {
|
241
|
+
if (typeof(window.history.pushState) != "undefined") {
|
242
|
+
var obj = { Page: page, Url: url };
|
243
|
+
window.history.pushState(obj, obj.Page, obj.Url);
|
244
|
+
} else {
|
245
|
+
console.log("Browser does not support HTML5.");
|
246
|
+
}
|
247
|
+
}
|
data/docs/search/tips.md
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
---
|
2
|
+
title: Search Tips
|
3
|
+
---
|
4
|
+
|
5
|
+
Here are some useful search tips that can help to make searching more effective.
|
6
|
+
|
7
|
+
## OR Searches
|
8
|
+
|
9
|
+
By default, searches for multiple terms are combined with OR. If a document matches at least one of the search terms, it will show in the results. So:
|
10
|
+
|
11
|
+
install aws
|
12
|
+
|
13
|
+
Will always result in more results just `install` by itself.
|
14
|
+
|
15
|
+
|
16
|
+
## AND Searches
|
17
|
+
|
18
|
+
To do an AND search of "install AND aws" mark both terms as required, you use a `+` sign in front of each term. Example:
|
19
|
+
|
20
|
+
+install +aws
|
21
|
+
|
22
|
+
This results in pages only with both exactly install and aws.
|
23
|
+
|
24
|
+
## Filter Terms
|
25
|
+
|
26
|
+
To filter "keywords", you use a `-` sign in front of each term. Example:
|
27
|
+
|
28
|
+
+install -aws
|
29
|
+
|
30
|
+
This results in pages only with install but filter or reject any pages with aws.
|
31
|
+
|
32
|
+
## Wildcard
|
33
|
+
|
34
|
+
You can use wildcards:
|
35
|
+
|
36
|
+
install*
|
37
|
+
|
38
|
+
## Fields
|
39
|
+
|
40
|
+
You can target specific fields:
|
41
|
+
|
42
|
+
title:install
|
43
|
+
|
44
|
+
For fields see: [search data.json]({% link search/data.json %})
|
45
|
+
|
46
|
+
## More Tips
|
47
|
+
|
48
|
+
More search tips can be found at: [lunrjs searching](https://lunrjs.com/guides/searching.html)
|
data/lib/kubes.rb
CHANGED
data/lib/kubes/cli/compile.rb
CHANGED
@@ -16,7 +16,7 @@ class Kubes::CLI
|
|
16
16
|
|
17
17
|
# auto build docker image and push image if kubes docker build not yet called
|
18
18
|
def build_docker_image
|
19
|
-
return if File.exist?(
|
19
|
+
return if File.exist?(Kubes.config.state.path)
|
20
20
|
Build.new(@options).run
|
21
21
|
end
|
22
22
|
end
|
data/lib/kubes/command.rb
CHANGED
@@ -12,9 +12,9 @@ module Kubes::Compiler::Decorator
|
|
12
12
|
|
13
13
|
def result
|
14
14
|
if @data.key?(Kubes::Compiler::Dsl::Core::Blocks)
|
15
|
-
@data.results.each { |k,v|
|
15
|
+
@data.results.each { |k,v| run(v) } # returns nil
|
16
16
|
else
|
17
|
-
|
17
|
+
run # processes and returns @data
|
18
18
|
end
|
19
19
|
@data # important to return @data so we keep the original @data structure: Blocks or Hash
|
20
20
|
end
|
@@ -3,17 +3,13 @@ module Kubes::Compiler::Dsl::Core
|
|
3
3
|
extend Fields
|
4
4
|
include DslEvaluator
|
5
5
|
include Helpers
|
6
|
-
include Kubes::Compiler::Shared::
|
7
|
-
include Kubes::Compiler::Shared::CustomVariables
|
8
|
-
include Kubes::Compiler::Shared::PluginHelpers
|
6
|
+
include Kubes::Compiler::Shared::RuntimeHelpers
|
9
7
|
|
10
8
|
def initialize(options={})
|
11
9
|
@options = options
|
12
10
|
@name = options[:name]
|
13
11
|
@path = options[:path]
|
14
|
-
|
15
|
-
load_custom_variables
|
16
|
-
load_custom_helpers
|
12
|
+
load_runtime_helpers
|
17
13
|
end
|
18
14
|
|
19
15
|
def run
|
@@ -64,7 +64,7 @@ module Kubes::Compiler::Dsl::Core
|
|
64
64
|
result = instance_variable_get(ivar)
|
65
65
|
result = {} if mode == "reset" # allow user to override with mode: reset option
|
66
66
|
result ||= {} # maintain value for layering
|
67
|
-
|
67
|
+
Kubes.deep_merge!(result, value)
|
68
68
|
instance_variable_set(ivar, result)
|
69
69
|
end
|
70
70
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module Kubes::Compiler::Dsl::Syntax
|
2
2
|
class Resource < Kubes::Compiler::Dsl::Core::Base
|
3
3
|
include Kubes::Compiler::Util::Normalize
|
4
|
-
include Kubes::Compiler::Shared::Helpers
|
5
4
|
|
6
5
|
fields :apiVersion, # <string>
|
7
6
|
:kind, # <string>
|
@@ -19,7 +18,7 @@ module Kubes::Compiler::Dsl::Syntax
|
|
19
18
|
# top-level of resource is quite common
|
20
19
|
def default_result
|
21
20
|
data = top.merge(default_top)
|
22
|
-
|
21
|
+
Kubes.deep_merge!(data, default_result_append)
|
23
22
|
data.deep_stringify_keys!
|
24
23
|
HashSqueezer.squeeze(data)
|
25
24
|
end
|
@@ -64,7 +63,7 @@ module Kubes::Compiler::Dsl::Syntax
|
|
64
63
|
|
65
64
|
# For generic kind
|
66
65
|
def field(name, data)
|
67
|
-
|
66
|
+
Kubes.deep_merge!(top, {name => data})
|
68
67
|
end
|
69
68
|
end
|
70
69
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "base64"
|
2
|
+
require "json"
|
2
3
|
|
3
4
|
module Kubes::Compiler::Shared
|
4
5
|
module Helpers
|
@@ -17,11 +18,12 @@ module Kubes::Compiler::Shared
|
|
17
18
|
end
|
18
19
|
|
19
20
|
def built_image_helper
|
20
|
-
path = Kubes.config.state.
|
21
|
+
path = Kubes.config.state.path
|
21
22
|
unless File.exist?(path)
|
22
23
|
raise Kubes::MissingDockerImage.new("Missing file with docker image built by kubes: #{path}. Try first running: kubes docker build")
|
23
24
|
end
|
24
|
-
IO.read(path)
|
25
|
+
data = JSON.load(IO.read(path))
|
26
|
+
data['image']
|
25
27
|
end
|
26
28
|
|
27
29
|
def with_extra(value)
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module Kubes::Compiler::Shared
|
2
|
+
module RuntimeHelpers
|
3
|
+
include Kubes::Compiler::Shared::Helpers
|
4
|
+
|
5
|
+
def load_runtime_helpers
|
6
|
+
load_custom_variables # also load custom variables
|
7
|
+
load_plugin_helpers
|
8
|
+
load_custom_helpers
|
9
|
+
end
|
10
|
+
|
11
|
+
@@custom_helpers_loaded = false
|
12
|
+
def load_custom_helpers
|
13
|
+
return if @@custom_helpers_loaded
|
14
|
+
paths = Dir.glob("#{Kubes.root}/.kubes/helpers/**/*.rb")
|
15
|
+
paths.sort_by! { |p| p.size } # so namespaces are loaded first
|
16
|
+
|
17
|
+
paths.each do |path|
|
18
|
+
filename = path.sub(%r{.*.kubes/helpers/},'').sub('.rb','')
|
19
|
+
module_name = filename.camelize
|
20
|
+
base_class_for_helper.send :include, module_name.constantize
|
21
|
+
end
|
22
|
+
@@custom_helpers_loaded = true
|
23
|
+
end
|
24
|
+
|
25
|
+
# Load plugin helper methods from project
|
26
|
+
@@plugin_helpers_loaded = false
|
27
|
+
def load_plugin_helpers
|
28
|
+
return if @@plugin_helpers_loaded
|
29
|
+
Kubes::Plugin.plugins.each do |klass|
|
30
|
+
helpers_class = "#{klass}::Helpers".constantize # IE: KubesAws::Helpers
|
31
|
+
base_class_for_helper.send :include, helpers_class
|
32
|
+
end
|
33
|
+
@@plugin_helpers_loaded = true
|
34
|
+
end
|
35
|
+
|
36
|
+
def base_class_for_helper
|
37
|
+
if self.is_a?(Kubes::Compiler::Strategy::Erb)
|
38
|
+
Kubes::Compiler::Strategy::Erb
|
39
|
+
else
|
40
|
+
Kubes::Compiler::Dsl::Core::Base
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
include DslEvaluator
|
45
|
+
# Load custom variables from project
|
46
|
+
@@custom_variables_loaded = false
|
47
|
+
def load_custom_variables
|
48
|
+
return if Kubes.kustomize?
|
49
|
+
|
50
|
+
ext = File.extname(@path)
|
51
|
+
role = @path.sub(%r{.*\.kubes/resources/},'').sub(ext,'').split('/').first # IE: web
|
52
|
+
kind = File.basename(@path).sub(ext,'') # IE: deployment
|
53
|
+
all = "all"
|
54
|
+
if @block_form
|
55
|
+
kind = kind.pluralize
|
56
|
+
all = all.pluralize
|
57
|
+
end
|
58
|
+
|
59
|
+
layers = [
|
60
|
+
"base.rb",
|
61
|
+
"#{Kubes.env}.rb",
|
62
|
+
"base/all.rb",
|
63
|
+
"base/all/#{Kubes.env}.rb",
|
64
|
+
"base/#{kind}.rb",
|
65
|
+
"base/#{kind}/base.rb",
|
66
|
+
"base/#{kind}/#{Kubes.env}.rb",
|
67
|
+
"#{role}/#{kind}.rb",
|
68
|
+
"#{role}/#{kind}/base.rb",
|
69
|
+
"#{role}/#{kind}/#{Kubes.env}.rb",
|
70
|
+
]
|
71
|
+
|
72
|
+
layers.each do |layer|
|
73
|
+
path = "#{Kubes.root}/.kubes/variables/#{layer}"
|
74
|
+
evaluate_file(path)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|