app_stack 1.3.4 → 1.4.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.
- checksums.yaml +15 -0
- data/Gemfile +6 -5
- data/Gemfile.lock +17 -5
- data/README.md +13 -1
- data/app_stack.gemspec +6 -5
- data/lib/app_stack/app.rb +86 -0
- data/lib/app_stack/cli_options.rb +42 -36
- data/lib/app_stack/compare_list.rb +195 -0
- data/lib/app_stack/configuration.rb +119 -0
- data/lib/app_stack/operator.rb +60 -0
- data/lib/app_stack/version.rb +1 -1
- data/lib/app_stack.rb +34 -6
- data/spec/app_stack_spec.rb +17 -0
- data/spec/cli_options_spec.rb +20 -0
- data/spec/compare_list_spec.rb +18 -0
- data/spec/configuration_spec.rb +95 -0
- data/spec/examples/la-assets-helper/app_stack.yml +14 -0
- data/spec/examples/la-assets-helper/lib/la_assets.rb +319 -0
- data/spec/examples/la-import_app/Trivia.erb +2 -0
- data/spec/examples/la-import_app/app_stack.yml +83 -0
- data/spec/examples/la-mongoid/app_stack.yml +49 -0
- data/spec/examples/la-mongoid/config/boot.rb +15 -0
- data/spec/examples/la-mongoid/config/database.rb +12 -0
- data/spec/examples/la-mongoid/config/mongoid.yml +22 -0
- data/spec/examples/la-mongoid/config/mongoid.yml.erb +22 -0
- data/spec/examples/la-sinatra/Gemfile.erb +11 -0
- data/spec/examples/la-sinatra/app_stack.yml +16 -0
- data/spec/examples/no-stacked/some_list.rb +4 -0
- data/spec/examples/sample_config/app_stack.yml +82 -0
- data/spec/examples/sample_config/hash_export.yml +4 -0
- data/spec/load_stack_spec.rb +13 -0
- data/spec/spec_helper.rb +7 -2
- data/tags +87 -34
- metadata +66 -87
- data/.app_stack.yml +0 -14
- data/bin/config_assets +0 -3
- data/lib/app_stack/copy_list_builder.rb +0 -147
- data/lib/app_stack/local_files_parser.rb +0 -95
- data/lib/app_stack/stack_app.rb +0 -119
- data/spec/config_spec.rb +0 -82
- data/spec/fixtures/config_sample/sample.yml +0 -19
- data/spec/fixtures/sample_files/module_1/Gemfile.erb +0 -1
- data/spec/fixtures/sample_files/module_1/app_stack.yml +0 -10
- data/spec/fixtures/sample_files/module_1/config/boot_sample.rb +0 -0
- data/spec/fixtures/sample_files/module_1/doc/excluding.txt +0 -1
- data/spec/fixtures/sample_files/module_1/doc/including.txt +0 -0
- data/spec/fixtures/sample_files/module_1/lib/mixins/b_lib.rb +0 -0
- data/spec/fixtures/sample_files/module_1/lib/mixins/s_lib.rb +0 -0
- data/spec/fixtures/sample_files/module_1/lib/samples/a_lib.rb +0 -0
- data/spec/fixtures/sample_files/module_1/spec/config_spec.rb +0 -0
- data/spec/fixtures/sample_files/module_2/Gemfile +0 -0
- data/spec/fixtures/sample_files/module_2/Gemfile.liquid +0 -1
- data/spec/fixtures/sample_files/module_2/app/lib/sequence.rb +0 -0
- data/spec/fixtures/sample_files/module_2/app_stack.yml +0 -3
- data/spec/fixtures/sample_files/module_3/app_stack.yml +0 -3
- data/spec/fixtures/sample_files/module_3/bin/del +0 -0
- data/spec/fixtures/sample_files/module_3/bin/rm +0 -0
- data/spec/fixtures/sample_files/module_3/config/application.yml +0 -0
- data/spec/fixtures/sample_files/module_3/config/database_development.yml +0 -0
- data/spec/fixtures/sample_files/module_3/config/database_production.yml +0 -0
- data/spec/fixtures/sample_files/module_3/lib/libfile_1.rb +0 -0
- data/spec/fixtures/sample_files/module_3/lib/libfile_2.rb +0 -0
- data/spec/fixtures/sample_files/my_app/app_stack.yml +0 -15
- data/spec/fixtures/sample_files/my_app/doc/excluding.txt +0 -1
- data/spec/fixtures/sample_files/my_app/local.conf +0 -0
- data/spec/fixtures/sample_files/my_app/local.conf.erb +0 -1
- data/spec/fixtures/sample_files/my_app/spec/config_spec.rb +0 -0
- data/spec/fixtures/sample_files/my_app_back/app_stack.yml +0 -15
- data/spec/fixtures/sample_files/my_app_back/doc/excluding.txt +0 -1
- data/spec/fixtures/sample_files/my_app_back/local.conf +0 -0
- data/spec/fixtures/sample_files/my_app_back/local.conf.erb +0 -1
- data/spec/fixtures/sample_files/my_app_back/spec/config_spec.rb +0 -0
- data/spec/merger_spec.rb +0 -43
- data/spec/stackup_spec.rb +0 -18
- /data/{file.erb → spec/examples/find_conf_file/both/.app_stack.yml} +0 -0
- /data/spec/{fixtures/sample_files/module_1/Gemfile → examples/find_conf_file/both/app_stack.yml} +0 -0
- /data/spec/{fixtures/sample_files/module_1/Rakefile → examples/find_conf_file/with_dot/.app_stack.yml} +0 -0
- /data/spec/{fixtures/config_sample → examples/sample_config}/wrong_key.yml +0 -0
- /data/spec/{fixtures/config_sample → examples/sample_config}/wrong_type.yml +0 -0
metadata
CHANGED
@@ -1,68 +1,60 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: app_stack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.4.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Huang Wei
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-11-13 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: tilt
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ! '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
19
|
+
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ! '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
26
|
+
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: term-ansicolor
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ! '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
33
|
+
version: '0'
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ! '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
40
|
+
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: activesupport
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
45
|
- - ! '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
47
|
+
version: '0'
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
52
|
- - ! '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
54
|
+
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: diffy
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
59
|
- - ! '>='
|
68
60
|
- !ruby/object:Gem::Version
|
@@ -70,7 +62,6 @@ dependencies:
|
|
70
62
|
type: :runtime
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
66
|
- - ! '>='
|
76
67
|
- !ruby/object:Gem::Version
|
@@ -78,35 +69,45 @@ dependencies:
|
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: rspec
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
73
|
- - ! '>='
|
84
74
|
- !ruby/object:Gem::Version
|
85
|
-
version:
|
75
|
+
version: '0'
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
80
|
- - ! '>='
|
92
81
|
- !ruby/object:Gem::Version
|
93
|
-
version:
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
94
97
|
- !ruby/object:Gem::Dependency
|
95
98
|
name: simplecov
|
96
99
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
100
|
requirements:
|
99
101
|
- - ! '>='
|
100
102
|
- !ruby/object:Gem::Version
|
101
|
-
version: 0
|
103
|
+
version: '0'
|
102
104
|
type: :development
|
103
105
|
prerelease: false
|
104
106
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
107
|
requirements:
|
107
108
|
- - ! '>='
|
108
109
|
- !ruby/object:Gem::Version
|
109
|
-
version: 0
|
110
|
+
version: '0'
|
110
111
|
description: Merge app source code in a stack to increase module reusability
|
111
112
|
email: huangw@7lime.com
|
112
113
|
executables:
|
@@ -114,99 +115,77 @@ executables:
|
|
114
115
|
extensions: []
|
115
116
|
extra_rdoc_files: []
|
116
117
|
files:
|
117
|
-
- .app_stack.yml
|
118
118
|
- Gemfile
|
119
119
|
- Gemfile.lock
|
120
120
|
- README.md
|
121
121
|
- app_stack.gemspec
|
122
|
-
- bin/config_assets
|
123
122
|
- bin/stackup
|
124
|
-
- file.erb
|
125
123
|
- lib/app_stack.rb
|
124
|
+
- lib/app_stack/app.rb
|
126
125
|
- lib/app_stack/cli_options.rb
|
127
|
-
- lib/app_stack/
|
128
|
-
- lib/app_stack/
|
129
|
-
- lib/app_stack/
|
126
|
+
- lib/app_stack/compare_list.rb
|
127
|
+
- lib/app_stack/configuration.rb
|
128
|
+
- lib/app_stack/operator.rb
|
130
129
|
- lib/app_stack/version.rb
|
131
|
-
- spec/
|
132
|
-
- spec/
|
133
|
-
- spec/
|
134
|
-
- spec/
|
135
|
-
- spec/
|
136
|
-
- spec/
|
137
|
-
- spec/
|
138
|
-
- spec/
|
139
|
-
- spec/
|
140
|
-
- spec/
|
141
|
-
- spec/
|
142
|
-
- spec/
|
143
|
-
- spec/
|
144
|
-
- spec/
|
145
|
-
- spec/
|
146
|
-
- spec/
|
147
|
-
- spec/
|
148
|
-
- spec/
|
149
|
-
- spec/
|
150
|
-
- spec/
|
151
|
-
- spec/
|
152
|
-
- spec/
|
153
|
-
- spec/
|
154
|
-
- spec/
|
155
|
-
- spec/fixtures/sample_files/module_3/config/database_production.yml
|
156
|
-
- spec/fixtures/sample_files/module_3/lib/libfile_1.rb
|
157
|
-
- spec/fixtures/sample_files/module_3/lib/libfile_2.rb
|
158
|
-
- spec/fixtures/sample_files/my_app/app_stack.yml
|
159
|
-
- spec/fixtures/sample_files/my_app/doc/excluding.txt
|
160
|
-
- spec/fixtures/sample_files/my_app/local.conf
|
161
|
-
- spec/fixtures/sample_files/my_app/local.conf.erb
|
162
|
-
- spec/fixtures/sample_files/my_app/spec/config_spec.rb
|
163
|
-
- spec/fixtures/sample_files/my_app_back/app_stack.yml
|
164
|
-
- spec/fixtures/sample_files/my_app_back/doc/excluding.txt
|
165
|
-
- spec/fixtures/sample_files/my_app_back/local.conf
|
166
|
-
- spec/fixtures/sample_files/my_app_back/local.conf.erb
|
167
|
-
- spec/fixtures/sample_files/my_app_back/spec/config_spec.rb
|
168
|
-
- spec/merger_spec.rb
|
130
|
+
- spec/app_stack_spec.rb
|
131
|
+
- spec/cli_options_spec.rb
|
132
|
+
- spec/compare_list_spec.rb
|
133
|
+
- spec/configuration_spec.rb
|
134
|
+
- spec/examples/find_conf_file/both/.app_stack.yml
|
135
|
+
- spec/examples/find_conf_file/both/app_stack.yml
|
136
|
+
- spec/examples/find_conf_file/with_dot/.app_stack.yml
|
137
|
+
- spec/examples/la-assets-helper/app_stack.yml
|
138
|
+
- spec/examples/la-assets-helper/lib/la_assets.rb
|
139
|
+
- spec/examples/la-import_app/Trivia.erb
|
140
|
+
- spec/examples/la-import_app/app_stack.yml
|
141
|
+
- spec/examples/la-mongoid/app_stack.yml
|
142
|
+
- spec/examples/la-mongoid/config/boot.rb
|
143
|
+
- spec/examples/la-mongoid/config/database.rb
|
144
|
+
- spec/examples/la-mongoid/config/mongoid.yml
|
145
|
+
- spec/examples/la-mongoid/config/mongoid.yml.erb
|
146
|
+
- spec/examples/la-sinatra/Gemfile.erb
|
147
|
+
- spec/examples/la-sinatra/app_stack.yml
|
148
|
+
- spec/examples/no-stacked/some_list.rb
|
149
|
+
- spec/examples/sample_config/app_stack.yml
|
150
|
+
- spec/examples/sample_config/hash_export.yml
|
151
|
+
- spec/examples/sample_config/wrong_key.yml
|
152
|
+
- spec/examples/sample_config/wrong_type.yml
|
153
|
+
- spec/load_stack_spec.rb
|
169
154
|
- spec/spec_helper.rb
|
170
|
-
- spec/stackup_spec.rb
|
171
155
|
- tags
|
172
156
|
homepage: https://github.com/7lime/app_stack-gem
|
173
157
|
licenses:
|
174
158
|
- MIT
|
159
|
+
metadata: {}
|
175
160
|
post_install_message:
|
176
161
|
rdoc_options: []
|
177
162
|
require_paths:
|
178
163
|
- lib
|
179
164
|
required_ruby_version: !ruby/object:Gem::Requirement
|
180
|
-
none: false
|
181
165
|
requirements:
|
182
166
|
- - ! '>='
|
183
167
|
- !ruby/object:Gem::Version
|
184
168
|
version: '0'
|
185
169
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
186
|
-
none: false
|
187
170
|
requirements:
|
188
171
|
- - ! '>='
|
189
172
|
- !ruby/object:Gem::Version
|
190
173
|
version: '0'
|
191
174
|
requirements: []
|
192
175
|
rubyforge_project:
|
193
|
-
rubygems_version:
|
176
|
+
rubygems_version: 2.0.6
|
194
177
|
signing_key:
|
195
|
-
specification_version:
|
178
|
+
specification_version: 4
|
196
179
|
summary: Use as a rake task, define a stack of modules and app-stack will merge files
|
197
180
|
from those stack-apps to the local application directory.
|
198
181
|
test_files:
|
199
|
-
- spec/
|
200
|
-
- spec/
|
201
|
-
- spec/
|
202
|
-
- spec/
|
203
|
-
- spec/
|
204
|
-
- spec/
|
205
|
-
- spec/
|
206
|
-
- spec/
|
207
|
-
- spec/
|
208
|
-
- spec/fixtures/sample_files/my_app/spec/config_spec.rb
|
209
|
-
- spec/fixtures/sample_files/my_app_back/spec/config_spec.rb
|
210
|
-
- spec/merger_spec.rb
|
182
|
+
- spec/app_stack_spec.rb
|
183
|
+
- spec/cli_options_spec.rb
|
184
|
+
- spec/compare_list_spec.rb
|
185
|
+
- spec/configuration_spec.rb
|
186
|
+
- spec/examples/la-assets-helper/lib/la_assets.rb
|
187
|
+
- spec/examples/la-mongoid/config/boot.rb
|
188
|
+
- spec/examples/la-mongoid/config/database.rb
|
189
|
+
- spec/examples/no-stacked/some_list.rb
|
190
|
+
- spec/load_stack_spec.rb
|
211
191
|
- spec/spec_helper.rb
|
212
|
-
- spec/stackup_spec.rb
|
data/.app_stack.yml
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
stack:
|
2
|
-
- la-sinatra: [default, { Gemfile: Gemfile, Procfile: Procfile.imp }]
|
3
|
-
- la-mongoid: [default, mixins]
|
4
|
-
- la-mancha-models-syobu-p1
|
5
|
-
- la-assets-helper
|
6
|
-
export: []
|
7
|
-
exclude:
|
8
|
-
- '*sample_files/**/*'
|
9
|
-
attrs:
|
10
|
-
application_code: ficus_syobu_p1
|
11
|
-
application_name: Ficus Web Framework
|
12
|
-
gems:
|
13
|
-
default: {}
|
14
|
-
development: {}
|
data/bin/config_assets
DELETED
@@ -1,147 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'diffy'
|
4
|
-
require 'tilt'
|
5
|
-
require 'ostruct'
|
6
|
-
|
7
|
-
module AppStack
|
8
|
-
# import from outside apps
|
9
|
-
module CopyListBuilder
|
10
|
-
# get exported source file list from app, filtered by import_conf
|
11
|
-
def import_files(import_conf)
|
12
|
-
file_list = {}
|
13
|
-
import_conf.each do |c|
|
14
|
-
if c.is_a?(String) # group name
|
15
|
-
echo "import from group #{c.bold.blue}"
|
16
|
-
file_list.merge! export_files(c)
|
17
|
-
elsif c.is_a?(Hash)
|
18
|
-
echo "import form file: ", c
|
19
|
-
file_list.merge! glob_files(c, true)
|
20
|
-
else
|
21
|
-
fail 'unknown import options: ' + c.inspect
|
22
|
-
end
|
23
|
-
end
|
24
|
-
file_list
|
25
|
-
end
|
26
|
-
|
27
|
-
# render/copy file list
|
28
|
-
def check_mtime
|
29
|
-
@render_files, @copy_candidates = {}, {}
|
30
|
-
@copy_list.each do |f, t|
|
31
|
-
type, f = f.split ':', 2
|
32
|
-
|
33
|
-
# exclude file in the exclude list
|
34
|
-
excluded = false
|
35
|
-
@config[:exclude].each do |patt|
|
36
|
-
if File.fnmatch?(patt, t)
|
37
|
-
echo "exclude #{short_path(t)} by patthern ", patt
|
38
|
-
excluded = true
|
39
|
-
break
|
40
|
-
end
|
41
|
-
end
|
42
|
-
next if excluded
|
43
|
-
|
44
|
-
# check modification time
|
45
|
-
if type == 'c'
|
46
|
-
if newer?(f, t)
|
47
|
-
@copy_candidates[t] = f
|
48
|
-
else
|
49
|
-
echo "skip copy #{short_path(t).blue} (mtime or existence)."
|
50
|
-
end
|
51
|
-
elsif type == 'r'
|
52
|
-
if newer?(f, t) or @attr_mtime > File.mtime(t)
|
53
|
-
@render_files[t] = f
|
54
|
-
else
|
55
|
-
echo "skip render #{short_path(t).blue} (mtime or existence)."
|
56
|
-
end
|
57
|
-
else
|
58
|
-
fail "unknown operation type #{type} for #{short_path(t)}"
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def check_diff
|
64
|
-
@copy_files, @diffs = {}, {}
|
65
|
-
@copy_candidates.each do |t, f|
|
66
|
-
if File.exists?(t)
|
67
|
-
diff = Diffy::Diff.new(f, t, :source => 'files')
|
68
|
-
if diff.to_s.chomp.size > 0
|
69
|
-
@diffs[t] = diff
|
70
|
-
@copy_files[t] = f
|
71
|
-
else
|
72
|
-
echo "Skip copy #{short_path(t).blue} (no diff)."
|
73
|
-
end
|
74
|
-
else
|
75
|
-
@copy_files[t] = f
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def merge!
|
81
|
-
check_mtime
|
82
|
-
check_diff
|
83
|
-
echo 'final copy list: ', @copy_files
|
84
|
-
echo 'final diff list: ', @diffs
|
85
|
-
echo 'final render lists: ', @render_files
|
86
|
-
|
87
|
-
if @diffs.keys.size > 0 and !@options.force
|
88
|
-
ask_diffs # quit, copy and show diffs special files
|
89
|
-
else
|
90
|
-
do_copy!
|
91
|
-
do_render!
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def ask_diffs
|
96
|
-
puts "These files are changed remotely:"
|
97
|
-
i = 1
|
98
|
-
@diffs.each do |t, diff|
|
99
|
-
puts "[#{i.to_s.bold}] " + short_path(t).blue
|
100
|
-
puts "from: #{@copy_files[t].blue}"
|
101
|
-
puts diff.to_s(:color)
|
102
|
-
i += 1
|
103
|
-
end
|
104
|
-
|
105
|
-
puts "use -f (--force) option to overwrite all files,"
|
106
|
-
puts "or 'touch' local file to disable warn for specific file."
|
107
|
-
end
|
108
|
-
|
109
|
-
def do_copy!
|
110
|
-
@copy_files.each { |to, fr| copy_file!(fr, to) }
|
111
|
-
end
|
112
|
-
|
113
|
-
def do_render!
|
114
|
-
@render_files.each { |to, fr| render_file!(fr, to) }
|
115
|
-
end
|
116
|
-
|
117
|
-
# if f1 newer than f2, or f2 not exits but f1 does.
|
118
|
-
def newer?(f1, f2)
|
119
|
-
return false unless File.exists?(f1)
|
120
|
-
return true unless File.exists?(f2)
|
121
|
-
File.mtime(f1) > File.mtime(f2)
|
122
|
-
end
|
123
|
-
|
124
|
-
def copy_file!(fr, to)
|
125
|
-
target_dir = File.dirname(to)
|
126
|
-
puts "copy #{fr.blue} \n to: " + to.green.bold
|
127
|
-
return if @options.simulate
|
128
|
-
FileUtils.mkdir_p target_dir unless File.directory?(target_dir)
|
129
|
-
FileUtils.cp_r fr, to
|
130
|
-
end
|
131
|
-
|
132
|
-
def render_file!(fr, to)
|
133
|
-
puts "reader #{fr.blue}\n to: " + to.green.bold
|
134
|
-
return if @options.simulate
|
135
|
-
oh = File.open(to, 'wb')
|
136
|
-
if fr.match(/\.liquid$/)
|
137
|
-
require 'liquid'
|
138
|
-
oh.write Liquid::Template.parse(File.open(fr,
|
139
|
-
'r:utf-8').read).render(attrs)
|
140
|
-
else
|
141
|
-
tilt = Tilt.new(fr)
|
142
|
-
oh.write tilt.render(OpenStruct.new(attrs))
|
143
|
-
end
|
144
|
-
oh.close
|
145
|
-
end
|
146
|
-
end
|
147
|
-
end
|
@@ -1,95 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module AppStack
|
4
|
-
# parse local files from a local app directory
|
5
|
-
module LocalFilesParser
|
6
|
-
def attrs
|
7
|
-
@config[:attrs]
|
8
|
-
end
|
9
|
-
|
10
|
-
def directory
|
11
|
-
File.expand_path('../', @file)
|
12
|
-
end
|
13
|
-
|
14
|
-
# use the direct name of the config file as app name
|
15
|
-
def app_name
|
16
|
-
File.basename(directory)
|
17
|
-
end
|
18
|
-
|
19
|
-
def full_path(file)
|
20
|
-
File.expand_path(file, directory)
|
21
|
-
end
|
22
|
-
|
23
|
-
def short_path(path)
|
24
|
-
lpath = path.sub(/^((c|r)\:)?#{directory}\/?/, '')
|
25
|
-
lpath.sub(/^\//, '')
|
26
|
-
end
|
27
|
-
|
28
|
-
# get export files list (copy_from => copy_to hash) for a specific group
|
29
|
-
def export_files(group = 'default')
|
30
|
-
@export_files ||= parse_export_files
|
31
|
-
group = 'default' if group.to_s == 'defaults' # back-compatibility
|
32
|
-
@export_files[group.to_s]
|
33
|
-
end
|
34
|
-
|
35
|
-
# get all exported files in groups
|
36
|
-
def parse_export_files
|
37
|
-
# 'file_group_name' => { copy_from => copy_to_base_name }
|
38
|
-
@export_files ||= {}
|
39
|
-
@config[:export].each do |p_list| # pattern list
|
40
|
-
if p_list.is_a?(Hash) # group, file list
|
41
|
-
p_list.each do |n, p|
|
42
|
-
@export_files[n] ||= {}
|
43
|
-
@export_files[n].merge! find_files(p)
|
44
|
-
end
|
45
|
-
elsif p_list.is_a?(String)
|
46
|
-
@export_files['default'] ||= {}
|
47
|
-
@export_files['default'].merge! find_files([p_list])
|
48
|
-
else
|
49
|
-
fail 'invalid export option ' + p_list.inspect
|
50
|
-
end
|
51
|
-
end
|
52
|
-
@export_files
|
53
|
-
end
|
54
|
-
|
55
|
-
def switch_to_tpl(file)
|
56
|
-
f = full_path(file)
|
57
|
-
tpl_file = nil
|
58
|
-
@config[:tpl_ext].each { |ex| tpl_file = f + ex if File.exists?(f + ex) }
|
59
|
-
tpl_file ? 'r:' + tpl_file : 'c:' + f
|
60
|
-
end
|
61
|
-
|
62
|
-
# from file pattern to copy_from => copy_to (remove directory header) hash
|
63
|
-
def glob_files(dir, allow_hash = false)
|
64
|
-
fhsh = {}
|
65
|
-
if dir.is_a?(Hash)
|
66
|
-
raise 'Can not use hash here for ' + dir.keys.join.to_s + ' in file ' +
|
67
|
-
filename unless allow_hash
|
68
|
-
dir.each do |f, t|
|
69
|
-
t = '/' + t.gsub(/^\//, '')
|
70
|
-
fhsh[switch_to_tpl(f)] = t
|
71
|
-
echo "found: #{short_path(switch_to_tpl(f)).blue} to: ",
|
72
|
-
short_path(t)
|
73
|
-
end
|
74
|
-
else
|
75
|
-
Dir[File.expand_path(dir, directory)].each do |f|
|
76
|
-
fhsh[switch_to_tpl(f)] = f.gsub(/^#{directory}/, '')
|
77
|
-
echo "found: #{short_path(switch_to_tpl(f)).blue} to: ",
|
78
|
-
short_path(short_path(f.gsub(/^#{directory}/, '')))
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
fhsh
|
83
|
-
end
|
84
|
-
|
85
|
-
# from array (or string) of file patterns, glob files and build a
|
86
|
-
# large array
|
87
|
-
def find_files(plist)
|
88
|
-
fhsh = {}
|
89
|
-
plist.each do |file_pattern|
|
90
|
-
fhsh.merge! glob_files(file_pattern)
|
91
|
-
end
|
92
|
-
fhsh
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
data/lib/app_stack/stack_app.rb
DELETED
@@ -1,119 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'yaml'
|
4
|
-
require 'pp'
|
5
|
-
|
6
|
-
module AppStack
|
7
|
-
# content parse error
|
8
|
-
class ParseError < RuntimeError; end
|
9
|
-
|
10
|
-
# represent a single stacked application
|
11
|
-
class StackApp
|
12
|
-
attr_reader :file_mtime
|
13
|
-
|
14
|
-
include LocalFilesParser
|
15
|
-
include CopyListBuilder
|
16
|
-
|
17
|
-
def initialize(filename, options)
|
18
|
-
@filename, @options = filename, options
|
19
|
-
@file = File.expand_path(filename)
|
20
|
-
@file_mtime = File.mtime(@file)
|
21
|
-
|
22
|
-
# default configuration, also restrict known keys and data type
|
23
|
-
@config = {
|
24
|
-
stack: [],
|
25
|
-
export: [],
|
26
|
-
exclude: [],
|
27
|
-
attrs: {},
|
28
|
-
stack_dir: '..',
|
29
|
-
tpl_ext: %w[.erb .haml .liquid]
|
30
|
-
}
|
31
|
-
|
32
|
-
echo "load app #{app_name.bold} from file:", @file
|
33
|
-
# use yaml file to set configuration
|
34
|
-
YAML.load(File.open(@file, 'r:utf-8').read).each do |k, v|
|
35
|
-
fail ParseError,
|
36
|
-
"unkown option `#{k}` in #{@filename}" unless @config[k.to_sym]
|
37
|
-
fail ParseError,
|
38
|
-
"'#{k}' must be a #{@config[k.to_sym].class.to_s}" unless
|
39
|
-
v.is_a?(@config[k.to_sym].class)
|
40
|
-
echo "set #{k.blue} to: ", v
|
41
|
-
@config[k.to_sym] = v
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
# load definitions from all apps in the stack config
|
46
|
-
def load_stack
|
47
|
-
unless @stack
|
48
|
-
@stack = { } # stack_app => import list
|
49
|
-
@config[:stack].each do |app_conf|
|
50
|
-
if app_conf.is_a?(String)
|
51
|
-
app_name, groups = app_conf, ['default']
|
52
|
-
elsif app_conf.is_a?(Hash)
|
53
|
-
fail 'invalid app: ' + app_conf.inspect if app_conf.keys.size > 1
|
54
|
-
app_conf.each { |an, ac| app_name, groups = an, ac }
|
55
|
-
else
|
56
|
-
fail 'invalid stack app: ' + app_conf.inspect
|
57
|
-
end
|
58
|
-
|
59
|
-
conf_file = @config[:stack_dir].sub(/\/?$/, '/') + app_name
|
60
|
-
conf_file += '/' + File.basename(@file)
|
61
|
-
app = StackApp.new(conf_file, @options)
|
62
|
-
@stack[app] = groups
|
63
|
-
end
|
64
|
-
end
|
65
|
-
@stack
|
66
|
-
end
|
67
|
-
|
68
|
-
# entry point: copy or simulate copy
|
69
|
-
def stackup!
|
70
|
-
@copy_list = {} # from_file_full_path => copy item
|
71
|
-
new_attrs, @attr_mtime = {}, file_mtime
|
72
|
-
load_stack.each do |app, import_conf|
|
73
|
-
echo 'load files from ' + app.app_name.bold.blue
|
74
|
-
|
75
|
-
# get file list from app
|
76
|
-
app.import_files(import_conf).each do |f, t|
|
77
|
-
@copy_list[f] = full_path(short_path(t))
|
78
|
-
end
|
79
|
-
|
80
|
-
# update global attrs
|
81
|
-
new_attrs.deep_merge! app.attrs
|
82
|
-
@attr_mtime = app.file_mtime if app.file_mtime > @attr_mtime
|
83
|
-
end
|
84
|
-
|
85
|
-
@config[:attrs] = new_attrs.deep_merge attrs
|
86
|
-
echo 'the merged attributes', attrs
|
87
|
-
|
88
|
-
# add local template files the copy list
|
89
|
-
Dir[directory + "/**/*{#{@config[:tpl_ext].join(',')}}"].each do |f|
|
90
|
-
of = f.gsub(/#{@config[:tpl_ext].join('|')}$/, '')
|
91
|
-
if File.exists?(of)
|
92
|
-
@copy_list['r:' + f] = of
|
93
|
-
echo 'found local template file: ',
|
94
|
-
short_path(f) + ' -> ' + short_path(of)
|
95
|
-
else
|
96
|
-
echo 'skip template file: ', f
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
merge!
|
101
|
-
end
|
102
|
-
|
103
|
-
# echo message only if verbose specified to be true
|
104
|
-
def echo(msg, var = nil)
|
105
|
-
return unless @options.verbose
|
106
|
-
|
107
|
-
msg = "[#{app_name || self.class.name}] ".green + msg
|
108
|
-
msg += "\n" if var && var.inspect.size > 30
|
109
|
-
|
110
|
-
print msg
|
111
|
-
if var
|
112
|
-
print Term::ANSIColor.bold
|
113
|
-
var.inspect.size > 30 ? PP.pp(var) : PP.singleline_pp(var)
|
114
|
-
print Term::ANSIColor.reset
|
115
|
-
end
|
116
|
-
puts unless var && var.inspect.size > 30
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|