app_stack 0.0.6 → 0.0.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.
- checksums.yaml +15 -0
- data/README.md +6 -1
- data/examples/my_app/.app-stack.yml +11 -11
- data/examples/my_app/README +1 -0
- data/examples/my_app/app/api_controller.rb +0 -0
- data/examples/my_app/app/config.rb +0 -0
- data/examples/my_app/app/controllers/hello_controller.rb +0 -0
- data/examples/my_app/fileabc.rb +0 -0
- data/examples/stack-apps/auth-app/app/config.rb.erb +1 -0
- data/lib/app_stack/version.rb +1 -1
- data/lib/app_stack.rb +92 -84
- metadata +10 -15
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
Mjg0MTY2ZmU2NDExMmU3ZjVlYTM5ZDdiODZjYTEyMzg2ZTM4MGM4MA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NTllMzU1NmZkZjJlYzM2N2UxYjMzZTQwYWZkZDEzNmNjZGE3NWM1ZQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
NWJkOTZlY2ZmNmNjZDc2YWU5MDZmMTljOGM0ZTYzZDUwNTIyMjc2N2NiMmQ3
|
10
|
+
ZjIwNTYxZDk5MGRkYWM0YjhkY2FhZGI1NjY3NTFlMmUwZjlmYjBmYzJkMTNi
|
11
|
+
MTk2ZDYxZTRhNzE3OTFjMGY5YmE5ZjFiMDBiYTg4MjNlN2I5MmQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NmQ4ZTRjNDI3MzI4NWY4MTlhYzc4MWRmM2U4ZWNjMjhlZDVlODFiNzVhZDYz
|
14
|
+
YTUyMWY5ZDZhMzIwYWY3Y2JhNGMzZmE0MDkzYmI0MjhhZTllMmM0ZTA3ODFl
|
15
|
+
OGM0ODFhNGQzMTVlMDMyZmUzZWZkMGE3ODQ3MmZiOGViY2I2ZmY=
|
data/README.md
CHANGED
@@ -10,6 +10,11 @@ A configuration file `.app-stack.yml` in you app-root, in format like:
|
|
10
10
|
app_dir: '../stack-apps'
|
11
11
|
tpl_ext: '.sample.erb'
|
12
12
|
verbose: 1
|
13
|
+
file_patterns:
|
14
|
+
spec/**/*.rb
|
15
|
+
lib/**/*.rb
|
16
|
+
**/*.line_addon
|
17
|
+
**/*.erb
|
13
18
|
attrs:
|
14
19
|
dababase_name: 'nameofdatabase'
|
15
20
|
files:
|
@@ -22,7 +27,7 @@ And in `Rakefile` add:
|
|
22
27
|
|
23
28
|
namespace :stack do
|
24
29
|
task :update do
|
25
|
-
AppStack.
|
30
|
+
AppStack.run!('.app-stack.yml')
|
26
31
|
end
|
27
32
|
end
|
28
33
|
|
@@ -6,18 +6,18 @@ stack_apps_dir: ../stack-apps
|
|
6
6
|
tpl_ext: .template.erb
|
7
7
|
addon_ext: .line_addon
|
8
8
|
verbose: 1
|
9
|
-
|
10
|
-
-
|
11
|
-
-
|
12
|
-
-
|
13
|
-
-
|
14
|
-
-
|
9
|
+
file_patterns:
|
10
|
+
- app/**/*.rb
|
11
|
+
- spec/**/*.rb
|
12
|
+
- lib/**/*.rb
|
13
|
+
- config/**/*.rb
|
14
|
+
- config/**/*.conf
|
15
|
+
- config/**/*.yaml
|
15
16
|
attrs:
|
16
17
|
application_name: My App
|
17
18
|
from_self: myapp
|
18
19
|
files:
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
config/configuration.yml: __self
|
20
|
+
config/app.config.rb: base-app
|
21
|
+
app/controllers/hello_controller.rb: __self
|
22
|
+
app/api_controller.rb: __self
|
23
|
+
app/config.rb: __self
|
data/examples/my_app/README
CHANGED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= "Holly OK." %>
|
data/lib/app_stack/version.rb
CHANGED
data/lib/app_stack.rb
CHANGED
@@ -3,17 +3,19 @@
|
|
3
3
|
require 'yaml'
|
4
4
|
require 'find'
|
5
5
|
require 'fileutils'
|
6
|
+
require 'ostruct'
|
7
|
+
require 'tilt/erb'
|
8
|
+
|
6
9
|
require 'term/ansicolor'
|
7
10
|
# mixin String class for term-color methods
|
8
11
|
class String; include Term::ANSIColor end
|
9
|
-
require 'tilt/erb'
|
10
|
-
require 'ostruct'
|
11
12
|
|
12
13
|
## A namespace for app-stack based modules
|
13
14
|
module AppStack
|
14
15
|
|
15
16
|
CONF_FILE = '.app-stack.yml'
|
16
17
|
|
18
|
+
# public entry ponit, receive a configuration filename
|
17
19
|
def run!(file = '.app-stack.yml')
|
18
20
|
# load configuration
|
19
21
|
@config = YAML.load(File.read(file))
|
@@ -21,79 +23,40 @@ module AppStack
|
|
21
23
|
# assign default values:
|
22
24
|
@app_root = File.expand_path(File.dirname(file)) unless @config['app_root']
|
23
25
|
@stack_apps_dir = @config['stack_apps_dir']
|
26
|
+
# convert relative path:
|
24
27
|
@stack_apps_dir = @app_root + '/' +
|
25
28
|
@stack_apps_dir if @stack_apps_dir.match(/^\.\.?\//)
|
26
29
|
|
27
30
|
@files = @config['files'] || {}
|
28
31
|
register_own_files!
|
29
32
|
# loop over each stack application
|
30
|
-
@config['stack'].each { |stack_app|
|
33
|
+
@config['stack'].each { |stack_app| do_copy_stack!(stack_app) }
|
34
|
+
|
31
35
|
# rewrite configuration back to app-stack file
|
32
36
|
@config['files'] = @files
|
33
37
|
File.open(file, 'wb') { |fh| fh.puts YAML.dump(@config) }
|
34
38
|
end
|
35
39
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
add_lines.each { |line| afh.puts line }
|
51
|
-
afh.close
|
52
|
-
done = 'add lines'.bold.green if add_lines.size > 0
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
# rubocop:disable MethodLength
|
57
|
-
def copy_file!(f, basename)
|
58
|
-
done = 'keeped'.green
|
59
|
-
target = File.expand_path(@app_root + '/' + basename)
|
60
|
-
# directory?
|
61
|
-
if File.directory?(f)
|
62
|
-
if File.directory?(target)
|
63
|
-
done = 'exists'.green
|
64
|
-
else
|
65
|
-
FileUtils.mkdir_p target
|
66
|
-
done = 'created'.bold.green
|
40
|
+
# for files already in the app root, register to no-copy list
|
41
|
+
def register_own_files!
|
42
|
+
@config['file_patterns'].each do |pt|
|
43
|
+
Dir[@app_root + '/' + pt].each do |f|
|
44
|
+
next if f == @app_root
|
45
|
+
basename = f.sub(/^#{@app_root}\//, '')
|
46
|
+
if @files[basename]
|
47
|
+
carp "From #{'self'.blue.bold} #{basename.bold} ",
|
48
|
+
'keep'.white if @files[basename] == '__self'
|
49
|
+
else
|
50
|
+
carp "From #{'self'.blue.bold} #{basename.bold}",
|
51
|
+
'registed'.green.bold
|
52
|
+
@files[basename] = '__self'
|
53
|
+
end
|
67
54
|
end
|
68
|
-
else
|
69
|
-
tpl_file = f + @config['tpl_ext']
|
70
|
-
if File.exists?(tpl_file) && newer(tpl_file, target)
|
71
|
-
@tilt = Tilt::ERBTemplate.new(tpl_file)
|
72
|
-
oh = File.open(target, 'wb')
|
73
|
-
oh.write @tilt.render(OpenStruct.new(@attr.merge(@config['attrs'])))
|
74
|
-
oh.close
|
75
|
-
done = 'rendered'.bold.green
|
76
|
-
elsif newer(f, target)
|
77
|
-
FileUtils.copy f, target
|
78
|
-
done = 'copied'.bold.green
|
79
|
-
end
|
80
55
|
end
|
81
|
-
done
|
82
|
-
end
|
83
|
-
# rubocop:able MethodLength
|
84
|
-
|
85
|
-
def ignores(f)
|
86
|
-
@config['ignores'] = [] unless @config['ignores']
|
87
|
-
return true if f == CONF_FILE
|
88
|
-
return true if /#{@config['tpl_ext']}$/.match(f)
|
89
|
-
return true if /#{@config['addon_ext']}$/.match(f)
|
90
|
-
@config['ignores'].each do |ptn|
|
91
|
-
return true if /^#{ptn}$/.match(f)
|
92
|
-
end
|
93
|
-
false
|
94
56
|
end
|
95
57
|
|
96
|
-
|
58
|
+
# copy files for each included file
|
59
|
+
def do_copy_stack!(stack_app)
|
97
60
|
raise 'invalid app name "__self"' if stack_app == '__self'
|
98
61
|
stack_app_dir = File.expand_path(@stack_apps_dir + '/' + stack_app)
|
99
62
|
|
@@ -104,39 +67,84 @@ module AppStack
|
|
104
67
|
stack_conf['attrs'].is_a?(Hash)
|
105
68
|
end
|
106
69
|
|
70
|
+
# for each included files
|
71
|
+
@config['file_patterns'].each do |pt|
|
72
|
+
Dir[stack_app_dir + '/' + pt].each do |f|
|
73
|
+
basename = f.sub(/^#{stack_app_dir}\//, '')
|
74
|
+
# trivial ignore the stack directory itself:
|
75
|
+
next if f == stack_app_dir
|
76
|
+
if (@files[basename].nil? or @files[basename] == stack_app)
|
77
|
+
@files[basename] = stack_app unless @files[basename] # register
|
78
|
+
done = copy_file!(f, File.expand_path(@app_root + '/' + basename))
|
79
|
+
carp "From #{stack_app.blue.bold} #{basename.bold}", done
|
80
|
+
else
|
81
|
+
carp "From #{stack_app.blue.bold} #{basename.bold}",
|
82
|
+
'skip, use '.white + @files[basename]
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# for templates and addons
|
107
88
|
Find.find(stack_app_dir).each do |f|
|
108
89
|
basename = f.sub(/^#{stack_app_dir}\//, '')
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
90
|
+
|
91
|
+
if basename.gsub!(/#{@config['tpl_ext']}$/, '')
|
92
|
+
target = File.expand_path(@app_root + '/' + basename)
|
93
|
+
# next unless File.exists?(target)
|
94
|
+
done = 'keep'.white
|
95
|
+
if newer?(f, target)
|
96
|
+
tilt = Tilt::ERBTemplate.new(f)
|
97
|
+
oh = File.open(target, 'wb')
|
98
|
+
oh.write tilt.render(OpenStruct.new(@attr.merge(@config['attrs'])))
|
99
|
+
oh.close
|
100
|
+
done = 'rendered'.bold.green
|
101
|
+
end
|
102
|
+
carp "From #{stack_app.blue.bold} render #{basename.bold}", done
|
103
|
+
elsif basename.gsub!(/#{@config['addon_ext']}$/, '')
|
104
|
+
target = File.expand_path(@app_root + '/' + basename)
|
105
|
+
if File.exists?(target)
|
106
|
+
done = do_addon!(f, target)
|
107
|
+
end
|
108
|
+
done ||= 'keep'.white
|
109
|
+
carp "From #{stack_app.blue.bold} addon #{basename.bold}", done
|
120
110
|
end
|
121
|
-
done = do_addon!(f, basename)
|
122
|
-
carp "From #{stack_app.blue.bold} addon #{basename.bold}", done if done
|
123
111
|
end
|
124
112
|
end
|
125
113
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
114
|
+
def newer?(f1, f2)
|
115
|
+
return false unless File.exists?(f1)
|
116
|
+
return true unless File.exists?(f2)
|
117
|
+
File.mtime(f1) > File.mtime(f2)
|
118
|
+
end
|
119
|
+
|
120
|
+
def do_addon!(addon_file, target)
|
121
|
+
add_lines = File.read(addon_file).split("\n")
|
122
|
+
add_lines -= File.read(target).split("\n")
|
123
|
+
afh = File.open(target, 'a')
|
124
|
+
add_lines.each { |line| afh.puts line }
|
125
|
+
afh.close
|
126
|
+
lines = add_lines.size
|
127
|
+
done = "add #{lines} lines".bold.green if lines > 0
|
128
|
+
end
|
129
|
+
|
130
|
+
def copy_file!(f, target)
|
131
|
+
# directory?
|
132
|
+
if File.directory?(f)
|
133
|
+
if File.directory?(target)
|
134
|
+
done = 'exists'.green
|
135
135
|
else
|
136
|
-
|
137
|
-
|
136
|
+
FileUtils.mkdir_p target
|
137
|
+
done = 'created'.bold.green
|
138
|
+
end
|
139
|
+
else
|
140
|
+
if newer?(f, target)
|
141
|
+
FileUtils.copy f, target
|
142
|
+
done = 'copied'.bold.green
|
143
|
+
else
|
144
|
+
done = 'keep'.white
|
138
145
|
end
|
139
146
|
end
|
147
|
+
done
|
140
148
|
end
|
141
149
|
|
142
150
|
def carp(job, state = 'done'.green)
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: app_stack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.7
|
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-09-03 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
|
@@ -22,7 +20,6 @@ dependencies:
|
|
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
|
@@ -30,7 +27,6 @@ dependencies:
|
|
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
|
@@ -38,7 +34,6 @@ dependencies:
|
|
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
|
@@ -46,7 +41,6 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rspec
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
45
|
- - ~>
|
52
46
|
- !ruby/object:Gem::Version
|
@@ -54,7 +48,6 @@ dependencies:
|
|
54
48
|
type: :development
|
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
|
@@ -62,7 +55,6 @@ dependencies:
|
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: simplecov
|
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: :development
|
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
|
@@ -86,11 +77,16 @@ files:
|
|
86
77
|
- examples/my_app/.app-stack.yml
|
87
78
|
- examples/my_app/Gemfile
|
88
79
|
- examples/my_app/README
|
80
|
+
- examples/my_app/app/api_controller.rb
|
81
|
+
- examples/my_app/app/config.rb
|
82
|
+
- examples/my_app/app/controllers/hello_controller.rb
|
89
83
|
- examples/my_app/config/app.config.rb
|
90
84
|
- examples/my_app/config/configuration.yml
|
85
|
+
- examples/my_app/fileabc.rb
|
91
86
|
- examples/stack-apps/auth-app/Gemfile
|
92
87
|
- examples/stack-apps/auth-app/Gemfile.line_addon
|
93
88
|
- examples/stack-apps/auth-app/README
|
89
|
+
- examples/stack-apps/auth-app/app/config.rb.erb
|
94
90
|
- examples/stack-apps/auth-app/config/app.config.rb
|
95
91
|
- examples/stack-apps/auth-app/config/configuration.yml
|
96
92
|
- examples/stack-apps/auth-app/config/configuration.yml.template.erb
|
@@ -102,27 +98,26 @@ files:
|
|
102
98
|
homepage: https://github.com/7lime/app-stack-gem
|
103
99
|
licenses:
|
104
100
|
- MIT
|
101
|
+
metadata: {}
|
105
102
|
post_install_message:
|
106
103
|
rdoc_options: []
|
107
104
|
require_paths:
|
108
105
|
- lib
|
109
106
|
required_ruby_version: !ruby/object:Gem::Requirement
|
110
|
-
none: false
|
111
107
|
requirements:
|
112
108
|
- - ! '>='
|
113
109
|
- !ruby/object:Gem::Version
|
114
110
|
version: '0'
|
115
111
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
|
-
none: false
|
117
112
|
requirements:
|
118
113
|
- - ! '>='
|
119
114
|
- !ruby/object:Gem::Version
|
120
115
|
version: '0'
|
121
116
|
requirements: []
|
122
117
|
rubyforge_project:
|
123
|
-
rubygems_version:
|
118
|
+
rubygems_version: 2.0.6
|
124
119
|
signing_key:
|
125
|
-
specification_version:
|
120
|
+
specification_version: 4
|
126
121
|
summary: Use as a rake task, define a stack of modules and app-stack will merge files
|
127
122
|
from those stack-apps to the local application directory.
|
128
123
|
test_files: []
|