app_stack 1.4.0 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/README.html +172 -0
- data/README.md +106 -76
- data/lib/app_stack/app.rb +2 -2
- data/lib/app_stack/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MDM3Mzk3NGEzZjlkMzFmYmUxZTgyZWQ4YzkwMTA3YjFiOTM5ZDY0ZA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YWU5NDA4ZWFkYTk1ZGIzYjRmZTM2ZTQ4ZjM1NDM1NmY2NmYyMGU0Mw==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
Mjc3NTIxOWEwMDc3NDkyMWQ2NDUyMjVlMDA4YzQ5MzAxM2ZjN2MxNzNlMDEw
|
10
|
+
NjdmMjRiYmU0ZGEyZWVhNjAzYzI2MTYwNzI5Njc4YTkxYjgyNmI3ODEyNDRh
|
11
|
+
NmI0MGI3OGY3MmQ4ZjgxNTBmYjFlYTkyOGQ3MzIxY2FlZmY3NDg=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NDBlNDk4MjM0ODExODc5NGFhOTA0YWUyMzMwZjE2Y2QwZWFhMzkxYTFlMzg5
|
14
|
+
MTVlYWFiM2MwNTYxYTI5MDI5NTExYzNlZjJiMjE0NjMwZGQ3Zjc0OTE1MWFl
|
15
|
+
ODMwNjA4MmI1ZDkwOTQ0Y2M0ZmEzMTkwZDVmMDllMjNmNjI2MTg=
|
data/README.html
ADDED
@@ -0,0 +1,172 @@
|
|
1
|
+
<!DOCTYPE HTML>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset='utf-8'>
|
5
|
+
<title>Preview</title>
|
6
|
+
<!--this style include the test_md/css screen.css(first) and base.css -->
|
7
|
+
<style type="text/css">
|
8
|
+
pre code{display:block;background:#fff;color:#4d4d4c;font-family:Menlo, Monaco, Consolas, monospace;font-size:12px;line-height:1.5;border:1px solid #ccc;padding:10px}html,body,div,span,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,code,del,dfn,em,img,q,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline}table{border-collapse:separate;border-spacing:0}caption,th,td{text-align:left;font-weight:normal}table,td,th{vertical-align:middle}blockquote:before,blockquote:after,q:before,q:after{content:""}blockquote,q{quotes:"" ""}a img{border:none}body{margin:10px}html{height:100%}body{padding:0;margin:0;font:14px/22px "adelle", Georgia, sans-serif;font-size-adjust:none;font-style:normal;font-variant:normal;font-weight:normal;background:#f4f6ec}a{color:#369}#markdown-toc{float:left;width:230px;margin-right:30px;margin-top:40px}#markdown-toc a{display:block;font-weight:bold;text-decoration:none}#markdown-toc #sections{list-style-type:none;border-bottom:3px solid rgba(0,0,0,0.1);padding-bottom:10px;margin-bottom:10px}#markdown-toc #sections>li>a{padding:5px 0;color:#444;font-size:16px}#markdown-toc #sections ul{margin-bottom:15px}#markdown-toc #sections ul li{list-style-type:none}#markdown-toc #sections ul li a{padding:1px 15px;font-size:13px;font-weight:normal}#markdown-toc .extra{padding:5px 0;min-height:1.4em}#markdown-toc .extra a{color:#555;font-size:14px}#markdown-toc #travis img{margin-top:10px;display:block}#markdown-toc>*:last-child{margin-bottom:20px}#content{padding:30px 30px 20px 30px;min-height:100px;width:600px;background:#fff;float:left;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;margin-top:15px}#content #loader{color:#888;width:300px;height:24px;line-height:24px;position:absolute;top:30px;left:30px;background:url("data:image/gif;base64,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") no-repeat center left;padding-left:32px;font-size:18px}#content>p{zoom:1}#content>p:before,#content>p:after{content:"";display:table}#content>p:after{clear:both}#content p{padding:0 0 0.8125em 0;color:#444}#content p img{float:left;margin:0.5em 0.8125em 0.8125em 0;padding:0}#content img{max-width:100%}#content h1,#content h2,#content h3,#content h4,#content h5,#content h6{font-weight:bold;line-height:1.2em}#content h1{font-size:2.125em;margin-bottom:0.4em}#content h2{font-size:1.7em;margin:0.855em 0 0.4em;color:#cc333f}#content h3{font-size:1.3em;margin:0.956em 0 0.4em}#content h4{font-size:1.1em;margin:1.161em 0 0.4em}#content h5,#content h6{font-size:1em;font-weight:bold;margin:1.238em 0 0.4em}#content>h1,#content>h2{margin-top:0}#content ul{list-style-position:outside}#content li ul,#content li ol{margin:0 1.625em}#content ul,#content ol{margin:0 0 1.625em 1.25em}#content dl{margin:0 0 1.625em 0}#content dl dt{font-weight:bold}#content dl dd{margin-left:1.625em}#content a{text-decoration:none}#content a:hover{text-decoration:underline}#content table{margin-bottom:1.625em;border-collapse:collapse}#content th{font-weight:bold}#content tr,#content th,#content td{margin:0;padding:0 1.625em 0 1em;height:26px}#content tfoot{font-style:italic}#content caption{text-align:center;font-family:Georgia, serif}#content abbr,#content acronym{border-bottom:1px dotted #000}#content address{margin-top:1.625em;font-style:italic}#content del{color:#000}#content blockquote{padding:1em 1em 1.625em 1em;font-family:georgia, serif;font-style:italic}#content blockquote:before{content:"\201C";font-size:3em;margin-left:-0.625em;font-family:georgia, serif;color:#aaa;line-height:0}#content blockquote>p{padding:0;margin:0}#content strong{font-weight:bold}#content em,#content dfn{font-style:italic}#content dfn{font-weight:bold}#content pre,#content code{margin:0 0 1.625em;white-space:pre}#content pre,#content code,#content tt{font-size:1em;font-family:Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace;line-height:1.5}#content code{background:#f7f8f1;padding:1px 2px;border:1px solid #ccc}#content pre code{padding:10px 12px;word-wrap:normal;overflow-y:auto}#content tt{display:block;margin:1.625em 0}#content hr{margin-bottom:1.625em}#content table{font-family:"Helvetica Neue", Helvetica, Arial, sans-serif;width:100%}#content th,#content td{padding:5px 10px;border:1px solid #ccc}#content th{background:#eee;padding:7px 10px}#content td{font-size:0.9em;border-color:#ddd}#content tbody tr:nth-child(2n){background:#f5f5f5}@media only screen and (max-width: 480px){#container{width:100%}#markdown-toc{width:100%;margin-top:10px;float:none}#markdown-toc #sections,#markdown-toc #header,#markdown-toc .extra{padding-left:30px;padding-right:30px}#content{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border-width:1px;float:none;margin:0;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}}@media only screen and (min-device-pixel-ratio: 1.5), only screen and (min-resolution: 1.5dppx){#github-ribbon img{width:100px}}*{margin:0;padding:0}body{margin-left:40px}#markdown-toc{float:right !important;position:fixed;left:745px;height:90%;overflow:auto}#content{float:left !important;filter:progid:DXImageTransform.Microsoft.Shadow(color=#909090,direction=120,strength=4);-moz-box-shadow:2px 2px 10px #909090;-webkit-box-shadow:2px 2px 10px #909090;box-shadow:2px 2px 10px #909090}#markdown-toc{width:auto;max-width:300px !important;top:40px}#markdown-toc>li>ul>li>a{color:#cc333f;margin-top:10px}#markdown-toc>li>ul>li>ul>li>a,h3{color:#009999}#markdown-toc>li>ul>li>ul>li>ul>li>a,h4{color:#669999}#markdown-toc>li>a{margin-bottom:20px;padding-bottom:20px;border-bottom:3px solid rgba(0,0,0,0.1);font-size:20px;color:#000000}#content code{border-radius:3px}#content>h1{font-size:2.0em}.title{font-size: 2.4em;color: #ff5456 !important}#markdown-toc>li{margin-bottom: 30px}#markdown-toc>li>a{padding-bottom:10px;}#markdown-toc>li>a{font-size: 18px;}#markdown-toc{white-space: nowrap}h1,h2,h3,h4,h5,h6{margin-bottom:1em !important;}#markdown-toc>li>ul>li>ul>li>ul>li>ul>li>a,h5{color:#7bb8b8 !important}#markdown-toc>li>ul>li>ul>li>ul>li>a,h4{color:#6c9e00 !important}#markdown-toc>li>ul>li>ul>li>a, h3{color:#3C6E6E !important}#markdown-toc>li>ul>li>a, h2{color:#4E6EA0 !important}#markdown-toc>li>a, h1{color:#134da5 !important}body{background:#ffffff}.code pre{border:1px solid rgb(204, 204, 204);overflow:auto;border-radius:3px}.code pre{background: none repeat scroll 0% 0% rgb(247, 248, 241)}#content sup{background: #c8deff}#content sup a{color: #273650}#content .footnotes{background: rgba(0,0,0,0.1);padding: 10px 0 0px 10px;border-radius: 5px}.reversefootnote{color: #000000;}
|
9
|
+
</style>
|
10
|
+
|
11
|
+
</head>
|
12
|
+
|
13
|
+
<body>
|
14
|
+
<div id="content">
|
15
|
+
|
16
|
+
<ul id="markdown-toc">
|
17
|
+
<li><a href="#merge-source-files-from-directories-in-chain">Merge Source Files from Directories in Chain</a> <ul>
|
18
|
+
<li><a href="#concept">Concept</a></li>
|
19
|
+
<li><a href="#synposis">Synposis</a> <ul>
|
20
|
+
<li><a href="#syncimport-from-other-modules">Sync/Import from other modules</a></li>
|
21
|
+
<li><a href="#export-groups">Export groups</a></li>
|
22
|
+
<li><a href="#render-a-template-file">Render a template file</a></li>
|
23
|
+
</ul>
|
24
|
+
</li>
|
25
|
+
<li><a href="#parking-list-for-new-version-14">Parking list for new version (1.4)</a></li>
|
26
|
+
</ul>
|
27
|
+
</li>
|
28
|
+
</ul>
|
29
|
+
|
30
|
+
<h1 id="merge-source-files-from-directories-in-chain">Merge Source Files from Directories in Chain</h1>
|
31
|
+
|
32
|
+
<h2 id="concept">Concept</h2>
|
33
|
+
|
34
|
+
<p>Import source files from a chain of application modules.</p>
|
35
|
+
|
36
|
+
<h2 id="synposis">Synposis</h2>
|
37
|
+
|
38
|
+
<h3 id="syncimport-from-other-modules">Sync/Import from other modules</h3>
|
39
|
+
|
40
|
+
<p>Suppose your local application is <code>dulcinea</code> and you want a file <code>lab.lua</code> from
|
41
|
+
directory <code>separate_module</code>, suppose directory <code>dulcinea</code> and <code>separate_module</code> are
|
42
|
+
located in the same location, then create a file <code>dulcinea/.app_stack.yml</code> like:</p>
|
43
|
+
|
44
|
+
<pre><code>sync:
|
45
|
+
- separate_module: { lab.lua: '' }
|
46
|
+
</code></pre>
|
47
|
+
|
48
|
+
<p>and run</p>
|
49
|
+
|
50
|
+
<pre><code>$ stackup
|
51
|
+
</code></pre>
|
52
|
+
|
53
|
+
<p>under the <code>dulcinea</code> directory, <code>lab.lua</code> will copied from <code>separate_module</code>.</p>
|
54
|
+
|
55
|
+
<p>If the file <code>lab.lua</code> in <code>separate_module</code> changed, run <code>stackup</code> again in
|
56
|
+
<code>dulcinea</code> will get a warning with colored diff message (you need <code>diff</code> command
|
57
|
+
installed in your system). If you want to over-writtern <code>dulcinea/lab.lua</code>, run</p>
|
58
|
+
|
59
|
+
<pre><code>$ stackup -f
|
60
|
+
</code></pre>
|
61
|
+
|
62
|
+
<p>If you want copy outside file only if local file not exists, use</p>
|
63
|
+
|
64
|
+
<pre><code>sync:
|
65
|
+
- separate_module: { lab.lua: '' }
|
66
|
+
- other_module: { copymeto.inc: 'copymeto.php' }
|
67
|
+
import:
|
68
|
+
- separate_module: { copyme: '' }
|
69
|
+
</code></pre>
|
70
|
+
|
71
|
+
<p>Note <code>other_module/copymeto.inc</code> will be copied as <code>dulcinea/copymeto.php</code>,
|
72
|
+
as explicitly defined in the above example.</p>
|
73
|
+
|
74
|
+
<h3 id="export-groups">Export groups</h3>
|
75
|
+
|
76
|
+
<p>If the <em>remote</em> module, like <code>separate_module</code> in the last example also <em>appstack aware</em>,
|
77
|
+
it may have a file <code>.app_stack.yml</code> or <code>app_stack.yml</code> in their root folder like:</p>
|
78
|
+
|
79
|
+
<pre><code>export:
|
80
|
+
- some.lua
|
81
|
+
- lib/**/*.lua
|
82
|
+
- config:
|
83
|
+
- config/*.lua
|
84
|
+
</code></pre>
|
85
|
+
|
86
|
+
<p>In this example setting, <code>separate_module</code> defined two <strong>export groups</strong>: <code>default</code>
|
87
|
+
and <code>config</code>, default group contains <code>some.lua</code> and all lua files under <code>lib/</code> folder
|
88
|
+
and all it’s sub-folders. <code>config</code> group (which defined as a Hash with an Array value, in YAML format)
|
89
|
+
conains all lua files under <code>config/</code> folder. You can <strong>import</strong> config files while <strong>sync</strong> default files from
|
90
|
+
<code>separate_module</code> by setting in <code>dulcinea/.app_stack.yml</code> like:</p>
|
91
|
+
|
92
|
+
<pre><code>import:
|
93
|
+
- separate_module
|
94
|
+
sync:
|
95
|
+
- separate_module: [ config ]
|
96
|
+
</code></pre>
|
97
|
+
|
98
|
+
<p>Or you want to sync both:</p>
|
99
|
+
|
100
|
+
<pre><code>sync:
|
101
|
+
- separate_module: [ config, default ]
|
102
|
+
</code></pre>
|
103
|
+
|
104
|
+
<p>You can still request for files that not explicitly exported by the remote configuration:</p>
|
105
|
+
|
106
|
+
<pre><code>sync:
|
107
|
+
- separate_module: [ config, default, { config.lua: config.sample.lua } ]
|
108
|
+
</code></pre>
|
109
|
+
|
110
|
+
<p>will sync <code>separate_module/config.lua</code> as <code>dulcinea/config.sample.lua</code>, as expected.</p>
|
111
|
+
|
112
|
+
<h3 id="render-a-template-file">Render a template file</h3>
|
113
|
+
|
114
|
+
<p>Suppose you have a template file <code>separate_module/main.lua.erb</code> like:</p>
|
115
|
+
|
116
|
+
<pre><code>...
|
117
|
+
|
118
|
+
local app_name = '<%= app_name %>'
|
119
|
+
local version = <%= version_code %>
|
120
|
+
|
121
|
+
...
|
122
|
+
</code></pre>
|
123
|
+
|
124
|
+
<p>And in <code>separate_module/.app_stack.yml</code>:</p>
|
125
|
+
|
126
|
+
<pre><code>...
|
127
|
+
attrs:
|
128
|
+
app_name: Separated Module
|
129
|
+
version_code: 1.0
|
130
|
+
</code></pre>
|
131
|
+
|
132
|
+
<p>And in <code>dulcinea/.app_stack.yml</code>:</p>
|
133
|
+
|
134
|
+
<pre><code>render:
|
135
|
+
- separate_module: { main.lua.erb: '' }
|
136
|
+
attrs:
|
137
|
+
app_name: Main App
|
138
|
+
version_code: 1.0
|
139
|
+
</code></pre>
|
140
|
+
|
141
|
+
<p>You will get a file <code>dulcinea/main.lua</code> with contents</p>
|
142
|
+
|
143
|
+
<pre><code>...
|
144
|
+
|
145
|
+
local app_name = 'Main App'
|
146
|
+
local version = 1.0
|
147
|
+
|
148
|
+
...
|
149
|
+
</code></pre>
|
150
|
+
|
151
|
+
<p>i.e., <code>attrs</code> are merged up from <strong>ALL</strong> stacked modules.</p>
|
152
|
+
|
153
|
+
<h2 id="parking-list-for-new-version-14">Parking list for new version (1.4)</h2>
|
154
|
+
|
155
|
+
<ul>
|
156
|
+
<li>[OK] Optional <code>.app_stack.yml</code> for stacked modules</li>
|
157
|
+
<li>[OK] Better detection for yaml file error</li>
|
158
|
+
<li>[OK] Better message with short file name</li>
|
159
|
+
<li>[OK] Render files only if contents really changed</li>
|
160
|
+
<li><del datetime="2013-11-11T10:05:01 +0800"><em>new file only</em> mode</del></li>
|
161
|
+
<li><del datetime="2013-11-11T10:05:15 +0800">Better simulate, new file only, force mode</del></li>
|
162
|
+
<li>Recursive stackup (?)</li>
|
163
|
+
<li>[OK] Separate sync/import group instead of one single <code>stackapps</code></li>
|
164
|
+
</ul>
|
165
|
+
|
166
|
+
</div>
|
167
|
+
|
168
|
+
|
169
|
+
|
170
|
+
|
171
|
+
</body>
|
172
|
+
</html>
|
data/README.md
CHANGED
@@ -4,110 +4,140 @@
|
|
4
4
|
|
5
5
|
Import source files from a chain of application modules.
|
6
6
|
|
7
|
-
##
|
7
|
+
## Synposis
|
8
8
|
|
9
|
-
|
10
|
-
- Better detection for yaml file error
|
11
|
-
- Better message with short file name
|
12
|
-
- Render files only if contents really changed
|
13
|
-
- <del datetime="2013-11-11T10:05:01 +0800">*new file only* mode</del>
|
14
|
-
- <del datetime="2013-11-11T10:05:15 +0800">Better simulate, new file only, force mode</del>
|
15
|
-
- Recursive stackup (?)
|
16
|
-
- Separate sync/import group instead of one single `stackapps`
|
9
|
+
### Sync/Import from other modules
|
17
10
|
|
18
|
-
|
11
|
+
Suppose your local application is `dulcinea` and you want a file `lab.lua` from
|
12
|
+
directory `separate_module`, suppose directory `dulcinea` and `separate_module` are
|
13
|
+
located in the same location, then create a file `dulcinea/.app_stack.yml` like:
|
14
|
+
|
15
|
+
~~~~~~~~~~~~~~~~~~~
|
16
|
+
sync:
|
17
|
+
- separate_module: { lab.lua: '' }
|
18
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
19
|
+
|
20
|
+
and run
|
21
|
+
|
22
|
+
$ stackup
|
19
23
|
|
20
|
-
|
21
|
-
directory, in format like:
|
24
|
+
under the `dulcinea` directory, `lab.lua` will copied from `separate_module`.
|
22
25
|
|
23
|
-
|
26
|
+
If the file `lab.lua` in `separate_module` changed, run `stackup` again in
|
27
|
+
`dulcinea` will get a warning with colored diff message (you need `diff` command
|
28
|
+
installed in your system). If you want to over-writtern `dulcinea/lab.lua`, run
|
24
29
|
|
25
|
-
|
30
|
+
$ stackup -f
|
26
31
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
If you want copy outside file only if local file not exists, use
|
33
|
+
|
34
|
+
~~~~~~~~~~~~~~~~~~~
|
35
|
+
sync:
|
36
|
+
- separate_module: { lab.lua: '' }
|
37
|
+
- other_module: { copymeto.inc: 'copymeto.php' }
|
38
|
+
import:
|
39
|
+
- separate_module: { copyme: '' }
|
40
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
35
41
|
|
36
|
-
|
37
|
-
|
38
|
-
the `default` and `tests` set of files from `module-2` (file sets defined as string
|
39
|
-
in array), and `defaults` set of files from `module-3`, plus `file_a.html` copied
|
40
|
-
as `file_a.htm` and `file_b.txt` copied as it is (single files defined as a hash).
|
42
|
+
Note `other_module/copymeto.inc` will be copied as `dulcinea/copymeto.php`,
|
43
|
+
as explicitly defined in the above example.
|
41
44
|
|
42
|
-
|
43
|
-
- config/*
|
44
|
-
- filename_2
|
45
|
+
### Export groups
|
45
46
|
|
46
|
-
|
47
|
+
If the _remote_ module, like `separate_module` in the last example also _appstack aware_,
|
48
|
+
it may have a file `.app_stack.yml` or `app_stack.yml` in their root folder like:
|
47
49
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
50
|
+
~~~~~~~~~~~~~~~~~~~~
|
51
|
+
export:
|
52
|
+
- some.lua
|
53
|
+
- lib/**/*.lua
|
54
|
+
- config:
|
55
|
+
- config/*.lua
|
56
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
53
57
|
|
54
|
-
|
55
|
-
and `
|
58
|
+
In this example setting, `separate_module` defined two **export groups**: `default`
|
59
|
+
and `config`, default group contains `some.lua` and all lua files under `lib/` folder
|
60
|
+
and all it's sub-folders. `config` group (which defined as a Hash with an Array value, in YAML format)
|
61
|
+
conains all lua files under `config/` folder. You can **import** config files while **sync** default files from
|
62
|
+
`separate_module` by setting in `dulcinea/.app_stack.yml` like:
|
56
63
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
- rspec: '~> 2.0.0'
|
64
|
-
- ...
|
65
|
-
development:
|
64
|
+
~~~~~~~~~~~~~~~~~~~~
|
65
|
+
import:
|
66
|
+
- separate_module
|
67
|
+
sync:
|
68
|
+
- separate_module: [ config ]
|
69
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
66
70
|
|
67
|
-
|
71
|
+
Or you want to sync both:
|
68
72
|
|
69
|
-
|
73
|
+
~~~~~~~~~~~~~~~~~~~~
|
74
|
+
sync:
|
75
|
+
- separate_module: [ config, default ]
|
76
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
70
77
|
|
71
|
-
|
78
|
+
You can still request for files that not explicitly exported by the remote configuration:
|
72
79
|
|
73
|
-
|
80
|
+
~~~~~~~~~~~~~~~~~~~~
|
81
|
+
sync:
|
82
|
+
- separate_module: [ config, default, { config.lua: config.sample.lua } ]
|
83
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
74
84
|
|
75
|
-
|
85
|
+
will sync `separate_module/config.lua` as `dulcinea/config.sample.lua`, as expected.
|
76
86
|
|
77
|
-
|
87
|
+
### Render a template file
|
78
88
|
|
79
|
-
|
89
|
+
Suppose you have a template file `separate_module/main.lua.erb` like:
|
80
90
|
|
81
|
-
|
91
|
+
~~~~~~~~~~~~~~~~~~~~
|
92
|
+
...
|
82
93
|
|
83
|
-
|
94
|
+
local app_name = '<%= app_name %>'
|
95
|
+
local version = <%= version_code %>
|
84
96
|
|
85
|
-
|
86
|
-
|
87
|
-
- `-s, --simulate` only show the copy list, do not actually copy
|
88
|
-
- `-f, --force` force overwrite new files (only import new file and
|
89
|
-
ask for updated files by default)
|
97
|
+
...
|
98
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~
|
90
99
|
|
91
|
-
|
100
|
+
And in `separate_module/.app_stack.yml`:
|
92
101
|
|
93
|
-
|
94
|
-
|
102
|
+
~~~~~~~~~~~~~~~~~~~~
|
103
|
+
...
|
104
|
+
attrs:
|
105
|
+
app_name: Separated Module
|
106
|
+
version_code: 1.0
|
107
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
95
108
|
|
96
|
-
|
97
|
-
and set it to `exclude` list.
|
109
|
+
And in `dulcinea/.app_stack.yml`:
|
98
110
|
|
99
|
-
|
100
|
-
|
111
|
+
~~~~~~~~~~~~~~~~~~~~
|
112
|
+
render:
|
113
|
+
- separate_module: { main.lua.erb: '' }
|
114
|
+
attrs:
|
115
|
+
app_name: Main App
|
116
|
+
version_code: 1.0
|
117
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
101
118
|
|
102
|
-
|
119
|
+
You will get a file `dulcinea/main.lua` with contents
|
103
120
|
|
104
|
-
If defined to export, for example `Gemfile`, and also defined a `Gemfile.erb`,
|
105
|
-
the later will be used as a template to render `Gemefile`.
|
106
121
|
|
107
|
-
|
108
|
-
|
122
|
+
~~~~~~~~~~~~~~~~~~~~
|
123
|
+
...
|
109
124
|
|
110
|
-
|
111
|
-
|
112
|
-
|
125
|
+
local app_name = 'Main App'
|
126
|
+
local version = 1.0
|
127
|
+
|
128
|
+
...
|
129
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~
|
130
|
+
|
131
|
+
i.e., `attrs` are merged up from **ALL** stacked modules.
|
132
|
+
|
133
|
+
## Parking list for new version (1.4)
|
134
|
+
|
135
|
+
- [OK] Optional `.app_stack.yml` for stacked modules
|
136
|
+
- [OK] Better detection for yaml file error
|
137
|
+
- [OK] Better message with short file name
|
138
|
+
- [OK] Render files only if contents really changed
|
139
|
+
- <del datetime="2013-11-11T10:05:01 +0800">*new file only* mode</del>
|
140
|
+
- <del datetime="2013-11-11T10:05:15 +0800">Better simulate, new file only, force mode</del>
|
141
|
+
- Recursive stackup (?)
|
142
|
+
- [OK] Separate sync/import group instead of one single `stackapps`
|
113
143
|
|
data/lib/app_stack/app.rb
CHANGED
@@ -34,13 +34,13 @@ module AppStack
|
|
34
34
|
@app_stacks[app] = App.new(AppStack.find_conf_file(app_dir), app_dir)
|
35
35
|
@app_stacks[app].rel_path = File.join(directory, config.stack_dir, app)
|
36
36
|
@app_stacks[app].parse_export_groups!
|
37
|
-
@attrs.
|
37
|
+
@attrs.deep_merge! @app_stacks[app].config.attrs
|
38
38
|
|
39
39
|
# info "load app #{app.bold} as", @app_stacks[app]
|
40
40
|
info "load app #{app.bold}"
|
41
41
|
end
|
42
42
|
|
43
|
-
@attrs.
|
43
|
+
@attrs.deep_merge! config.attrs
|
44
44
|
info 'merged attrs', attrs
|
45
45
|
@app_stacks
|
46
46
|
end
|
data/lib/app_stack/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: app_stack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Huang Wei
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tilt
|
@@ -117,6 +117,7 @@ extra_rdoc_files: []
|
|
117
117
|
files:
|
118
118
|
- Gemfile
|
119
119
|
- Gemfile.lock
|
120
|
+
- README.html
|
120
121
|
- README.md
|
121
122
|
- app_stack.gemspec
|
122
123
|
- bin/stackup
|