marv 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. data/.document +5 -0
  2. data/CHANGELOG.md +13 -0
  3. data/Gemfile +8 -10
  4. data/Gemfile.lock +16 -43
  5. data/LICENSE +0 -24
  6. data/README.md +9 -10
  7. data/Rakefile +4 -20
  8. data/VERSION +1 -1
  9. data/bin/marv +1 -1
  10. data/layouts/config/global.rb +31 -0
  11. data/layouts/config/project.rb +27 -0
  12. data/layouts/config/{router.php.erb → router.php} +5 -1
  13. data/layouts/config/server.rb +12 -0
  14. data/layouts/config/{wp-config.php.erb → wp-config.php} +0 -0
  15. data/layouts/plugin/{images → assets/images}/screenshot.png +0 -0
  16. data/layouts/plugin/{javascripts → assets/javascripts}/admin.coffee +0 -0
  17. data/layouts/plugin/{javascripts → assets/javascripts}/admin.js +0 -0
  18. data/layouts/plugin/{javascripts → assets/javascripts}/plugin.coffee +0 -0
  19. data/layouts/plugin/assets/javascripts/plugin.js +1 -0
  20. data/layouts/plugin/{stylesheets → assets/stylesheets}/plugin.scss +0 -0
  21. data/layouts/plugin/functions/{plugin.php.erb → plugin.php} +8 -7
  22. data/layouts/theme/{images → assets/images}/screenshot.png +0 -0
  23. data/layouts/theme/{javascripts → assets/javascripts}/admin.coffee +0 -0
  24. data/layouts/theme/{javascripts → assets/javascripts}/admin.js +0 -0
  25. data/layouts/theme/{javascripts → assets/javascripts}/theme.coffee +0 -0
  26. data/layouts/theme/{javascripts → assets/javascripts}/theme.js +0 -0
  27. data/layouts/theme/assets/stylesheets/_header.scss +18 -0
  28. data/layouts/theme/{stylesheets/style.scss.erb → assets/stylesheets/style.scss} +0 -0
  29. data/layouts/theme/functions/{functions.php.erb → functions.php} +0 -0
  30. data/layouts/theme/includes/{filters-admin.php.erb → filters-admin.php} +0 -0
  31. data/layouts/theme/includes/{filters.php.erb → filters.php} +0 -0
  32. data/layouts/theme/includes/{helpers.php.erb → helpers.php} +0 -0
  33. data/layouts/theme/templates/{404.php.erb → pages/404.php} +0 -0
  34. data/layouts/theme/templates/{archive.php.erb → pages/archive.php} +0 -0
  35. data/layouts/theme/templates/{author.php.erb → pages/author.php} +0 -0
  36. data/layouts/theme/templates/{search.php.erb → pages/search.php} +0 -0
  37. data/layouts/theme/templates/partials/{comments.php.erb → comments.php} +0 -0
  38. data/layouts/theme/templates/partials/{content-none.php.erb → content-none.php} +0 -0
  39. data/layouts/theme/templates/partials/{content.php.erb → content.php} +0 -0
  40. data/layouts/theme/templates/partials/{searchform.php.erb → searchform.php} +0 -0
  41. data/lib/marv.rb +8 -8
  42. data/lib/marv/cli.rb +15 -192
  43. data/lib/marv/cli/project.rb +57 -0
  44. data/lib/marv/cli/server.rb +65 -0
  45. data/lib/marv/global.rb +285 -0
  46. data/lib/marv/project/actions.rb +144 -0
  47. data/lib/marv/project/builder.rb +61 -0
  48. data/lib/marv/project/builder/assets.rb +112 -0
  49. data/lib/marv/{engines.rb → project/builder/engines.rb} +3 -1
  50. data/lib/marv/project/builder/functions.rb +112 -0
  51. data/lib/marv/project/builder/templates.rb +37 -0
  52. data/lib/marv/project/create.rb +139 -0
  53. data/lib/marv/project/guard.rb +83 -0
  54. data/lib/marv/project/guard/assets.rb +37 -0
  55. data/lib/{guard/marv → marv/project/guard}/config.rb +5 -9
  56. data/lib/marv/project/guard/functions.rb +44 -0
  57. data/lib/marv/project/guard/templates.rb +35 -0
  58. data/lib/marv/project/project.rb +149 -0
  59. data/lib/marv/server/actions.rb +79 -0
  60. data/lib/marv/server/create.rb +100 -0
  61. data/lib/marv/server/server.rb +201 -0
  62. data/marv.gemspec +69 -71
  63. metadata +82 -107
  64. data/.rspec +0 -1
  65. data/features/step_definitions/marv_steps.rb +0 -38
  66. data/features/support/env.rb +0 -17
  67. data/layouts/config/project-config.rb +0 -17
  68. data/layouts/plugin/javascripts/plugin.js +0 -1
  69. data/layouts/theme/stylesheets/_header.scss.erb +0 -18
  70. data/lib/guard/marv/assets.rb +0 -33
  71. data/lib/guard/marv/folders.rb +0 -33
  72. data/lib/guard/marv/functions.rb +0 -34
  73. data/lib/guard/marv/templates.rb +0 -33
  74. data/lib/marv/builder.rb +0 -355
  75. data/lib/marv/error.rb +0 -8
  76. data/lib/marv/generator.rb +0 -140
  77. data/lib/marv/guard.rb +0 -68
  78. data/lib/marv/project.rb +0 -134
  79. data/lib/marv/server.rb +0 -284
  80. data/spec/lib/marv/project_spec.rb +0 -34
  81. data/spec/spec_helper.rb +0 -12
data/lib/marv/error.rb DELETED
@@ -1,8 +0,0 @@
1
- module Marv
2
- class Error < StandardError
3
- end
4
-
5
- # Raised when the link source could not be found
6
- class LinkSourceDirNotFound < Error
7
- end
8
- end
@@ -1,140 +0,0 @@
1
- module Marv
2
- class Generator
3
-
4
- class << self
5
- def run(project, layout, local_layout)
6
- generator = self.new(project, layout, local_layout)
7
- generator.run
8
- end
9
- end
10
-
11
- def initialize(project, layout, local_layout)
12
- @project = project
13
- @task = project.task
14
- @layout = layout
15
- @local = local_layout
16
- end
17
-
18
- def create_structure
19
- # Create the build directory for Marv output
20
- @task.empty_directory @project.build_path
21
-
22
- source_paths = [
23
- ['assets', 'images'],
24
- ['assets', 'javascripts'],
25
- ['assets', 'stylesheets'],
26
-
27
- ['functions'],
28
- ['includes'],
29
-
30
- ['templates', 'pages'],
31
- ['templates', 'partials'],
32
- ]
33
-
34
- # Build out Marv structure in the source directory
35
- source_paths.each do |path|
36
- @task.empty_directory File.join(@project.source_path, path)
37
- end
38
-
39
- self
40
- end
41
-
42
- def copy_assets
43
- ['stylesheets', 'javascripts', 'images'].each do |folder|
44
- source = File.expand_path(File.join(self.layout_path, folder))
45
- target = File.expand_path(File.join(@project.assets_path, folder))
46
-
47
- render_directory(source, target)
48
- end
49
-
50
- self
51
- end
52
-
53
- def copy_folders
54
- ['templates', 'includes'].each do |folder|
55
- source = File.expand_path(File.join(self.layout_path, folder))
56
- target = File.expand_path(File.join(@project.source_path, folder))
57
-
58
- render_directory(source, target)
59
- end
60
-
61
- self
62
- end
63
-
64
- def copy_functions
65
- ['functions.php', @project.project_php_file].each do |file|
66
- source = File.expand_path(File.join(self.layout_path, 'functions', "#{file}.erb"))
67
- if File.exist?(source)
68
- target = File.expand_path(File.join(@project.source_path, 'functions', file))
69
- write_template(source, target)
70
- end
71
- end
72
- end
73
-
74
- def layout_path
75
- if @local
76
- @layout_path ||= File.join(ENV['HOME'], '.marv', 'layouts', @layout)
77
- else
78
- @layout_path ||= File.join(Marv::ROOT, 'layouts', @layout)
79
- end
80
- end
81
-
82
- def run
83
- write_config
84
- create_structure
85
- copy_assets
86
- copy_folders
87
- copy_functions
88
-
89
- return self
90
- end
91
-
92
- def write_config
93
- unless File.exists?(@project.global_config_file)
94
- @task.shell.mute do
95
- @task.create_file(@project.global_config_file) do
96
- "# Place your global configuration values here\n# config[:livereload] = true"
97
- end
98
- end
99
- end
100
-
101
- write_template(['config', 'project-config.rb'], @project.config_file)
102
-
103
- self
104
- end
105
-
106
- def write_template(source, target)
107
- source = File.join(source)
108
- template = File.expand_path(@task.find_in_source_paths((source)))
109
- target = File.expand_path(File.join(target))
110
-
111
- @task.create_file target do
112
- @project.parse_erb(template)
113
- end
114
- end
115
-
116
- protected
117
-
118
- def render_directory(source, target)
119
- Dir.glob("#{source}/**/*") do |file|
120
- unless File.directory?(file)
121
- source_file = file.gsub(source, '')
122
- target_file = File.join(target, source_file)
123
-
124
- if source_file.end_with? ".erb"
125
- target_file = target_file.slice(0..-5)
126
-
127
- content = @project.parse_erb(file)
128
- else
129
- content = File.open(file).read
130
- end
131
-
132
- @task.create_file target_file do
133
- content
134
- end
135
- end
136
- end
137
- end
138
-
139
- end
140
- end
data/lib/marv/guard.rb DELETED
@@ -1,68 +0,0 @@
1
- require 'guard'
2
- require 'guard/guard'
3
-
4
- module Marv
5
- module Guard
6
-
7
- class << self
8
- attr_accessor :project, :task, :builder
9
- end
10
-
11
- def self.add_guard(&block)
12
- @additional_guards ||= []
13
- @additional_guards << block
14
- end
15
-
16
- def self.start(project, task, options={}, livereload={})
17
- @project = project
18
- @task = task
19
- @builder = Builder.new(project)
20
-
21
- options_hash = ""
22
- options.each do |k,v|
23
- options_hash << ", :#{k} => '#{v}'"
24
- end
25
-
26
- assets_path = @project.assets_path.gsub(/#{@project.root}\//, '')
27
- source_path = @project.source_path.gsub(/#{@project.root}\//, '')
28
- config_file = @project.config_file.gsub(/#{@project.root}\//, '')
29
-
30
- guardfile_contents = %Q{
31
- guard 'marvconfig'#{options_hash} do
32
- watch("#{config_file}")
33
- end
34
- guard 'marvassets' do
35
- watch(%r{#{assets_path}/javascripts/*})
36
- watch(%r{#{assets_path}/stylesheets/*})
37
- watch(%r{#{assets_path}/images/*})
38
- end
39
- guard 'marvtemplates' do
40
- watch(%r{#{source_path}/templates/*})
41
- watch(%r{#{source_path}/partials/*})
42
- end
43
- guard 'marvfunctions' do
44
- watch(%r{#{source_path}/functions/*})
45
- watch(%r{#{source_path}/includes/*})
46
- end
47
- guard 'marvfolders' do
48
- watch(%r{#{source_path}/*})
49
- end
50
- }
51
-
52
- if @project.config[:livereload]
53
- guardfile_contents << %Q{
54
- guard 'livereload' do
55
- watch(%r{#{source_path}/*})
56
- end
57
- }
58
- end
59
-
60
- (@additional_guards || []).each do |block|
61
- result = block.call(options, livereload)
62
- guardfile_contents << result unless result.nil?
63
- end
64
- ::Guard.start({ :guardfile_contents => guardfile_contents }).join
65
- end
66
-
67
- end
68
- end
data/lib/marv/project.rb DELETED
@@ -1,134 +0,0 @@
1
- require 'pathname'
2
-
3
- module Marv
4
- class Project
5
-
6
- class << self
7
- def create(root, config, task, layout, local_layout)
8
- root = File.expand_path(root)
9
-
10
- project = self.new(root, task, config)
11
- Generator.run(project, layout, local_layout)
12
-
13
- project
14
- end
15
- end
16
-
17
- attr_accessor :root, :config, :task
18
-
19
- def initialize(root, task, config={}, config_file=nil)
20
- @root = File.expand_path(root)
21
- @config = config || {}
22
- @task = task
23
- @config_file = config_file
24
-
25
- self.load_config if @config.empty?
26
- end
27
-
28
- def assets_path
29
- @assets_path ||= File.join(self.source_path, 'assets')
30
- end
31
-
32
- def build_path
33
- File.join(self.root, '.watch', 'build')
34
- end
35
-
36
- def source_path
37
- File.join(self.root, 'source')
38
- end
39
-
40
- def package_path
41
- File.join(self.root, 'package')
42
- end
43
-
44
- def templates_path
45
- File.join(self.source_path, 'templates')
46
- end
47
-
48
- def functions_path
49
- File.join(self.source_path, 'functions')
50
- end
51
-
52
- def includes_path
53
- File.join(self.source_path, 'includes')
54
- end
55
-
56
- def config_file
57
- @config_file ||= File.join(self.root, 'config.rb')
58
- end
59
-
60
- def global_config_file
61
- @global_config_file ||= File.join(ENV['HOME'], '.marv', 'config.rb')
62
- end
63
-
64
- # Create a symlink from source to the project build dir
65
- def link(source)
66
- source = File.expand_path(source)
67
-
68
- unless File.writable?(File.dirname(source))
69
- @task.say "Permission Denied!", :red
70
- @task.say "You do not have write permissions for the destination folder"
71
- abort
72
- end
73
-
74
- unless File.directory?(File.dirname(source))
75
- raise Marv::LinkSourceDirNotFound
76
- end
77
-
78
- @task.link_file build_path, source
79
- end
80
-
81
- def project_id
82
- File.basename(self.root).gsub(/\W/, '_')
83
- end
84
-
85
- def project_php_file
86
- "#{File.basename(self.root).gsub(/\W/, '-').downcase}.php"
87
- end
88
-
89
- def load_config
90
- config = {}
91
-
92
- # Check for global (user) config.rb
93
- if File.exists?(self.global_config_file)
94
- config.merge!(load_ruby_config(self.global_config_file))
95
- end
96
-
97
- # Check for config.rb
98
- if File.exists?(self.config_file)
99
- config.merge!(load_ruby_config(self.config_file))
100
- else
101
- @task.say "Could not find the config file!", :red
102
- @task.say "Are you sure you're in a marv project directory?"
103
- abort
104
- end
105
-
106
- @config = config
107
- end
108
-
109
- def get_binding
110
- binding
111
- end
112
-
113
- def parse_erb(file)
114
- ERB.new(::File.binread(file), nil, '-', '@output_buffer').result(binding)
115
- end
116
-
117
- private
118
-
119
- def load_ruby_config(file)
120
- config = {}
121
-
122
- begin
123
- # Config file is just executed as straight ruby
124
- eval(File.read(file))
125
- rescue Exception => e
126
- @task.say "Error while evaluating config file:"
127
- @task.say e.message, :red
128
- end
129
-
130
- return config
131
- end
132
-
133
- end
134
- end
data/lib/marv/server.rb DELETED
@@ -1,284 +0,0 @@
1
- require 'net/http'
2
- require 'mysql2'
3
- require 'childprocess'
4
-
5
- module Marv
6
- class Server
7
-
8
- def initialize(name, config, options)
9
- @task = config
10
-
11
- # Deploy variables
12
- @server_name = name
13
- @server_path = server_path
14
- @db_name = 'marv_'+name.gsub(/\W/, '_').downcase
15
-
16
- # CLI Options
17
- unless options.nil?
18
- if options[:password] == "required"
19
- @task.say "Mysql password is required. Aborting...", :red
20
- abort
21
- end
22
-
23
- @wp_version = options[:version]
24
- @db_user = options[:user]
25
- @db_password = options[:password]
26
- @db_host = options[:host]
27
- @db_port = options[:port]
28
- end
29
- end
30
-
31
- def servers_root
32
- File.join(ENV['HOME'], '.marv', 'servers')
33
- end
34
-
35
- def server_path
36
- File.join(ENV['HOME'], '.marv', 'servers', @server_name)
37
- end
38
-
39
- def db_name
40
- @db_name
41
- end
42
-
43
- def db_password
44
- @db_password
45
- end
46
-
47
- def db_host
48
- @db_host
49
- end
50
-
51
- def run_php_server
52
- # Setup server
53
- server = TCPServer.new('127.0.0.1', 0)
54
- port = server.addr[1]
55
- server.close()
56
-
57
- # Run PHP server
58
- ::Dir.chdir @server_path
59
- @php = ChildProcess.build 'php', '-S', "localhost:#{port}", 'router.php'
60
- @php.start
61
-
62
- # Write PHP proccess id to file
63
- File.open(File.join(@server_path, 'php.pid'), 'w') do |file|
64
- file.write(@php.pid)
65
- end
66
-
67
- @task.say "Visit http://localhost:#{port}"
68
- end
69
-
70
- def create_server
71
- create_server_directory
72
-
73
- copy_wordpress_files
74
- add_config_file('router.php.erb', 'router.php')
75
-
76
- create_server_database
77
- add_config_file('wp-config.php.erb', 'wp-config.php')
78
-
79
- add_global_content
80
-
81
- @task.say "Server #{@server_name} created successfuly!", :green
82
- @task.say "Start server using marv server #{@server_name} --start"
83
- exit
84
- end
85
-
86
- def start_server
87
- begin
88
- update_global_projects
89
- run_php_server
90
- rescue Exception => e
91
- @task.say "Error while starting server:"
92
- @task.say e.message + "\n", :red
93
- end
94
- @task.say "Server #{@server_name} running", :green
95
- end
96
-
97
- def stop_server
98
- begin
99
- @task.shell.mute do
100
- php_pid_file = File.join(@server_path, 'php.pid')
101
-
102
- if File.exists?(php_pid_file)
103
- php_pid = File.read(php_pid_file).to_i
104
-
105
- Process.kill('KILL', php_pid)
106
- @task.say "Server #{@server_name} stopped", :yellow
107
- else
108
- @task.say "Server #{@server_name} is not running", :red
109
- end
110
- end
111
- rescue Exception => e
112
- @task.say "Error while stoping server:"
113
- @task.say e.message + "\n", :red
114
- end
115
- end
116
-
117
- def restart_server
118
- stop_server
119
- start_server
120
- end
121
-
122
- def remove_server
123
- @task.say "Removing server..."
124
- @task.shell.mute do
125
- stop_server
126
- end
127
- @task.say "Removing server files..."
128
-
129
- begin
130
- @task.shell.mute do
131
- FileUtils.rm_r(@server_path)
132
- end
133
- @task.say "Server files removed", :green
134
- rescue Exception => e
135
- @task.say "Error while removing server files:"
136
- @task.say e.message + "\n", :red
137
- end
138
-
139
- remove_server_database
140
-
141
- @task.say "Server successfuly removed!", :green
142
- exit
143
- end
144
-
145
- private
146
-
147
- # Creates a directory for a new server
148
- def create_server_directory
149
- # Create dir
150
- unless ::File.exist?(self.servers_root)
151
- ::Dir.mkdir(servers_root)
152
- end
153
- # Exit if dir exists
154
- if ::File.exist?(@server_path)
155
- @task.say "A server with name #{@server_name} already exists", :red
156
- exit
157
- end
158
- end
159
-
160
- # Downloads WordPress from wordpress.org
161
- def download_wordpress
162
- package = "/tmp/wordpress-#{@wp_version}.tar.gz"
163
-
164
- # Download package file
165
- @task.shell.mute do
166
- unless ::File.exists?(package)
167
- @task.get "https://wordpress.org/wordpress-#{@wp_version}.tar.gz" do |content|
168
- @task.create_file package, content
169
- end
170
- end
171
- end
172
-
173
- # Return package file
174
- package
175
- end
176
-
177
- # Copy WordPress files
178
- def copy_wordpress_files
179
- package = download_wordpress
180
-
181
- # Get package content and extract to dir
182
- tmp_dir = "/tmp/wordpress-latest-#{Time.now.to_i}"
183
- # Create temporary dir
184
- unless ::File.exists?(tmp_dir)
185
- Dir.mkdir(tmp_dir)
186
- end
187
-
188
- # Extract package to temporary dir
189
- @task.shell.mute do
190
- @task.run "cd #{tmp_dir};tar -xzf #{package}"
191
- @task.directory "#{tmp_dir}/wordpress", @server_path
192
- end
193
-
194
- # Remove temporary dir
195
- if ::File.exists?(tmp_dir)
196
- FileUtils.rm_r(tmp_dir)
197
- end
198
- end
199
-
200
- def add_config_file(source, target)
201
- unless File.exists?(target)
202
- config = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'layouts', 'config', source))
203
- config_template = ERB.new(::File.binread(config), nil, '-', '@output_buffer')
204
-
205
- File.open(File.join(@server_path, target), 'w') do |file|
206
- file.write(config_template.result(binding))
207
- end
208
- end
209
- end
210
-
211
- def create_server_database
212
- begin
213
- @task.shell.mute do
214
- client = Mysql2::Client.new(:host => @db_host, :port => @db_port, :username => @db_user, :password => @db_password)
215
- client.query("CREATE DATABASE IF NOT EXISTS #{@db_name}")
216
- client.query("GRANT ALL PRIVILEGES ON #{@db_name}.* TO '#{@db_user}'@'#{@db_host}'")
217
- client.query("FLUSH PRIVILEGES")
218
- client.close
219
- end
220
- rescue Exception => e
221
- @task.say "Error while creating Mysql database:"
222
- @task.say e.message + "\n", :red
223
- exit
224
- end
225
- end
226
-
227
- def remove_server_database
228
- begin
229
- @task.shell.mute do
230
- client = Mysql2::Client.new(:host => @db_host, :port => @db_port, :username => @db_user, :password => @db_password)
231
- client.query("DROP DATABASE IF EXISTS #{@db_name}")
232
- client.query("REVOKE ALL PRIVILEGES ON #{@db_name}.* FROM '#{@db_user}'@'#{@db_host}'")
233
- client.query("FLUSH PRIVILEGES")
234
- client.close
235
- end
236
- rescue Exception => e
237
- @task.say "Error while removing Mysql database:"
238
- @task.say e.message + "\n", :red
239
- end
240
- end
241
-
242
- def add_global_content
243
- @task.shell.mute do
244
- global = File.join(ENV['HOME'], '.marv')
245
- themes = Dir.glob(File.join(global, 'themes', '*'))
246
-
247
- themes.each do |theme|
248
- @task.create_link File.join(@server_path, 'wp-content', 'themes', File.basename(theme)), theme
249
- end
250
-
251
- plugins = Dir.glob(File.join(global, 'plugins', '*'))
252
-
253
- plugins.each do |plugin|
254
- @task.create_link File.join(@server_path, 'wp-content', 'plugins', File.basename(plugin)), plugin
255
- end
256
- end
257
- end
258
-
259
- def update_global_folders(dir, folders)
260
- begin
261
- folders.each do |folder|
262
- if File.symlink?(folder)
263
- unless File.exists?(folder)
264
- File.delete(folder)
265
- File.delete(File.join(ENV['HOME'], '.marv', dir, File.basename(folder)))
266
- end
267
- end
268
- end
269
- rescue Exception => e
270
- @task.say "Error while updating global projects:"
271
- @task.say e.message + "\n", :red
272
- end
273
- end
274
-
275
- def update_global_projects
276
- themes = Dir.glob(File.join(@server_path, 'wp-content', 'themes', '*'))
277
- update_global_folders('themes', themes)
278
-
279
- plugins = Dir.glob(File.join(@server_path, 'wp-content', 'plugins', '*'))
280
- update_global_folders('plugins', plugins)
281
- end
282
-
283
- end
284
- end