marv 0.3.2 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/CHANGELOG.md +13 -0
- data/Gemfile +8 -10
- data/Gemfile.lock +16 -43
- data/LICENSE +0 -24
- data/README.md +9 -10
- data/Rakefile +4 -20
- data/VERSION +1 -1
- data/bin/marv +1 -1
- data/layouts/config/global.rb +31 -0
- data/layouts/config/project.rb +27 -0
- data/layouts/config/{router.php.erb → router.php} +5 -1
- data/layouts/config/server.rb +12 -0
- data/layouts/config/{wp-config.php.erb → wp-config.php} +0 -0
- data/layouts/plugin/{images → assets/images}/screenshot.png +0 -0
- data/layouts/plugin/{javascripts → assets/javascripts}/admin.coffee +0 -0
- data/layouts/plugin/{javascripts → assets/javascripts}/admin.js +0 -0
- data/layouts/plugin/{javascripts → assets/javascripts}/plugin.coffee +0 -0
- data/layouts/plugin/assets/javascripts/plugin.js +1 -0
- data/layouts/plugin/{stylesheets → assets/stylesheets}/plugin.scss +0 -0
- data/layouts/plugin/functions/{plugin.php.erb → plugin.php} +8 -7
- data/layouts/theme/{images → assets/images}/screenshot.png +0 -0
- data/layouts/theme/{javascripts → assets/javascripts}/admin.coffee +0 -0
- data/layouts/theme/{javascripts → assets/javascripts}/admin.js +0 -0
- data/layouts/theme/{javascripts → assets/javascripts}/theme.coffee +0 -0
- data/layouts/theme/{javascripts → assets/javascripts}/theme.js +0 -0
- data/layouts/theme/assets/stylesheets/_header.scss +18 -0
- data/layouts/theme/{stylesheets/style.scss.erb → assets/stylesheets/style.scss} +0 -0
- data/layouts/theme/functions/{functions.php.erb → functions.php} +0 -0
- data/layouts/theme/includes/{filters-admin.php.erb → filters-admin.php} +0 -0
- data/layouts/theme/includes/{filters.php.erb → filters.php} +0 -0
- data/layouts/theme/includes/{helpers.php.erb → helpers.php} +0 -0
- data/layouts/theme/templates/{404.php.erb → pages/404.php} +0 -0
- data/layouts/theme/templates/{archive.php.erb → pages/archive.php} +0 -0
- data/layouts/theme/templates/{author.php.erb → pages/author.php} +0 -0
- data/layouts/theme/templates/{search.php.erb → pages/search.php} +0 -0
- data/layouts/theme/templates/partials/{comments.php.erb → comments.php} +0 -0
- data/layouts/theme/templates/partials/{content-none.php.erb → content-none.php} +0 -0
- data/layouts/theme/templates/partials/{content.php.erb → content.php} +0 -0
- data/layouts/theme/templates/partials/{searchform.php.erb → searchform.php} +0 -0
- data/lib/marv.rb +8 -8
- data/lib/marv/cli.rb +15 -192
- data/lib/marv/cli/project.rb +57 -0
- data/lib/marv/cli/server.rb +65 -0
- data/lib/marv/global.rb +285 -0
- data/lib/marv/project/actions.rb +144 -0
- data/lib/marv/project/builder.rb +61 -0
- data/lib/marv/project/builder/assets.rb +112 -0
- data/lib/marv/{engines.rb → project/builder/engines.rb} +3 -1
- data/lib/marv/project/builder/functions.rb +112 -0
- data/lib/marv/project/builder/templates.rb +37 -0
- data/lib/marv/project/create.rb +139 -0
- data/lib/marv/project/guard.rb +83 -0
- data/lib/marv/project/guard/assets.rb +37 -0
- data/lib/{guard/marv → marv/project/guard}/config.rb +5 -9
- data/lib/marv/project/guard/functions.rb +44 -0
- data/lib/marv/project/guard/templates.rb +35 -0
- data/lib/marv/project/project.rb +149 -0
- data/lib/marv/server/actions.rb +79 -0
- data/lib/marv/server/create.rb +100 -0
- data/lib/marv/server/server.rb +201 -0
- data/marv.gemspec +69 -71
- metadata +82 -107
- data/.rspec +0 -1
- data/features/step_definitions/marv_steps.rb +0 -38
- data/features/support/env.rb +0 -17
- data/layouts/config/project-config.rb +0 -17
- data/layouts/plugin/javascripts/plugin.js +0 -1
- data/layouts/theme/stylesheets/_header.scss.erb +0 -18
- data/lib/guard/marv/assets.rb +0 -33
- data/lib/guard/marv/folders.rb +0 -33
- data/lib/guard/marv/functions.rb +0 -34
- data/lib/guard/marv/templates.rb +0 -33
- data/lib/marv/builder.rb +0 -355
- data/lib/marv/error.rb +0 -8
- data/lib/marv/generator.rb +0 -140
- data/lib/marv/guard.rb +0 -68
- data/lib/marv/project.rb +0 -134
- data/lib/marv/server.rb +0 -284
- data/spec/lib/marv/project_spec.rb +0 -34
- data/spec/spec_helper.rb +0 -12
@@ -0,0 +1,144 @@
|
|
1
|
+
require 'zip'
|
2
|
+
|
3
|
+
module Marv
|
4
|
+
module Project
|
5
|
+
class Actions
|
6
|
+
|
7
|
+
# Initialize project actions
|
8
|
+
def initialize(project, builder)
|
9
|
+
@project = project
|
10
|
+
@task = project.task
|
11
|
+
@builder = builder
|
12
|
+
@global = Marv::Global.new(project.task)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Link project
|
16
|
+
def link(dir)
|
17
|
+
@link_dir = dir
|
18
|
+
|
19
|
+
link_options
|
20
|
+
link_target
|
21
|
+
create_link
|
22
|
+
end
|
23
|
+
|
24
|
+
# Packgage project
|
25
|
+
def package(filename)
|
26
|
+
@package_name = filename
|
27
|
+
|
28
|
+
create_package
|
29
|
+
end
|
30
|
+
|
31
|
+
# Ask for link details
|
32
|
+
def link_options
|
33
|
+
options = {}
|
34
|
+
options[:folder] = @task.ask "Where do you want to link your project?", :limited_to => ["themes", "plugins"], :default => "themes"
|
35
|
+
|
36
|
+
@link_options = options
|
37
|
+
end
|
38
|
+
|
39
|
+
# Link to server
|
40
|
+
def link_to_server
|
41
|
+
unless @link_dir.nil?
|
42
|
+
::File.join(@global.servers_path, @link_dir, 'wp-content', @link_options[:folder], ::File.basename(@project.root))
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Link to wordpress
|
47
|
+
def link_to_folder
|
48
|
+
unless @link_dir.nil?
|
49
|
+
unless @global.servers.include?(@link_dir)
|
50
|
+
::File.join(@link_dir, 'wp-content', @link_options[:folder], ::File.basename(@project.root))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Link target
|
56
|
+
def link_target
|
57
|
+
target = ::File.join(@global.global_path, @link_options[:folder], ::File.basename(@project.root))
|
58
|
+
target = link_to_server unless link_to_server.nil?
|
59
|
+
target = link_to_folder unless link_to_folder.nil?
|
60
|
+
|
61
|
+
@link_target = target
|
62
|
+
end
|
63
|
+
|
64
|
+
# Create project link
|
65
|
+
def create_link
|
66
|
+
unless ::File.directory?(@project.build_path)
|
67
|
+
@task.shell.mute do
|
68
|
+
@task.empty_directory @project.build_path
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
@task.create_link @link_target, @project.build_path
|
73
|
+
end
|
74
|
+
|
75
|
+
# Create package
|
76
|
+
def create_package
|
77
|
+
create_package_dir
|
78
|
+
set_package_filename
|
79
|
+
build_to_temp_dir
|
80
|
+
create_temp_zip
|
81
|
+
create_zip_file
|
82
|
+
remove_temp_files
|
83
|
+
end
|
84
|
+
|
85
|
+
# Create package directory
|
86
|
+
def create_package_dir
|
87
|
+
@task.shell.mute do
|
88
|
+
unless ::File.directory?(@project.package_path)
|
89
|
+
@task.empty_directory @project.package_path
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Set the package file name
|
95
|
+
def set_package_filename
|
96
|
+
if @package_name.nil?
|
97
|
+
@package_name = ::File.basename(@project.root)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# Built to a temporary directory
|
102
|
+
def build_to_temp_dir
|
103
|
+
@builder.build_project
|
104
|
+
|
105
|
+
# Copy build files to temporary directory
|
106
|
+
@task.shell.mute do
|
107
|
+
@task.directory @project.build_path, ::File.join(@project.package_path, @package_name)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# Create temporary package
|
112
|
+
def create_temp_zip
|
113
|
+
tmp_filename = ::File.join(@project.package_path, "#{@package_name}.tmp")
|
114
|
+
|
115
|
+
# Create an temporary file
|
116
|
+
::Zip.continue_on_exists_proc = true
|
117
|
+
::Zip::File.open(tmp_filename, Zip::File::CREATE) do |zip|
|
118
|
+
# Get all filenames
|
119
|
+
filenames = ::Dir.glob(::File.join(@project.package_path, @package_name, '**', '*'))
|
120
|
+
|
121
|
+
# Add each file in the zip file
|
122
|
+
filenames.each do |filename|
|
123
|
+
zip.add filename.gsub("#{@project.package_path}/", ''), filename
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
# Create the package
|
129
|
+
def create_zip_file
|
130
|
+
zip_filename = ::File.join(@project.package_path, "#{@package_name}.zip")
|
131
|
+
@task.copy_file ::File.join(@project.package_path, "#{@package_name}.tmp"), zip_filename
|
132
|
+
end
|
133
|
+
|
134
|
+
# Remove temporary build directory
|
135
|
+
def remove_temp_files
|
136
|
+
@task.shell.mute do
|
137
|
+
@task.remove_dir ::File.join(@project.package_path, @package_name)
|
138
|
+
@task.remove_file ::File.join(@project.package_path, "#{@package_name}.tmp")
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'marv/project/builder/engines'
|
2
|
+
require 'marv/project/builder/assets'
|
3
|
+
require 'marv/project/builder/functions'
|
4
|
+
require 'marv/project/builder/templates'
|
5
|
+
|
6
|
+
module Marv
|
7
|
+
module Project
|
8
|
+
class Builder
|
9
|
+
|
10
|
+
attr_accessor :task, :project, :assets, :functions, :templates
|
11
|
+
|
12
|
+
# Initialize project builder
|
13
|
+
def initialize(project)
|
14
|
+
@project = project
|
15
|
+
@task = project.task
|
16
|
+
@config = project.config
|
17
|
+
@assets = Marv::Project::Assets.new(self)
|
18
|
+
@functions = Marv::Project::Functions.new(self)
|
19
|
+
@templates = Marv::Project::Templates.new(self)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Start builder
|
23
|
+
def build_project
|
24
|
+
clean_directory
|
25
|
+
|
26
|
+
@assets.build_assets
|
27
|
+
@assets.clean_images
|
28
|
+
@assets.copy_images
|
29
|
+
|
30
|
+
@templates.clean_templates
|
31
|
+
@templates.copy_templates
|
32
|
+
|
33
|
+
@functions.clean_functions
|
34
|
+
@functions.copy_functions
|
35
|
+
@functions.clean_includes
|
36
|
+
@functions.copy_includes
|
37
|
+
@functions.clean_folders
|
38
|
+
@functions.copy_folders
|
39
|
+
end
|
40
|
+
|
41
|
+
# Build project to a directory
|
42
|
+
def build_to(dir)
|
43
|
+
build_project
|
44
|
+
# Remove build directory
|
45
|
+
@task.shell.mute do
|
46
|
+
@task.remove_dir ::File.expand_path(dir)
|
47
|
+
end
|
48
|
+
# Copy files from .watch/build directory
|
49
|
+
@task.directory @project.build_path, ::File.expand_path(dir)
|
50
|
+
end
|
51
|
+
|
52
|
+
# Clean build directory
|
53
|
+
def clean_directory
|
54
|
+
@task.shell.mute do
|
55
|
+
@task.remove_dir @project.build_path
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'sprockets'
|
2
|
+
|
3
|
+
module Marv
|
4
|
+
module Project
|
5
|
+
class Assets
|
6
|
+
|
7
|
+
# Initialize assets builder
|
8
|
+
def initialize(builder)
|
9
|
+
@builder = builder
|
10
|
+
@task = builder.task
|
11
|
+
@project = builder.project
|
12
|
+
@config = builder.project.config
|
13
|
+
|
14
|
+
init_sprockets
|
15
|
+
end
|
16
|
+
|
17
|
+
# Clean images
|
18
|
+
def clean_images
|
19
|
+
@task.shell.mute do
|
20
|
+
# Remove screenshot image
|
21
|
+
::Dir.glob(::File.join(@project.build_path, 'screenshot.*')).each do |file|
|
22
|
+
@task.remove_file file
|
23
|
+
end
|
24
|
+
|
25
|
+
# Remove images folder
|
26
|
+
@task.remove_dir ::File.join(@project.build_path, 'images')
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Copy images
|
31
|
+
def copy_images
|
32
|
+
@task.shell.mute do
|
33
|
+
::Dir.glob(::File.join(@project.assets_path, 'images', '*')).each do |filename|
|
34
|
+
# Check for screenshot and move it into main build directory
|
35
|
+
if filename.index(/screenshot/)
|
36
|
+
@task.copy_file filename, ::File.join(@project.build_path, ::File.basename(filename)), :force => true
|
37
|
+
else
|
38
|
+
# Copy the other files in images directory
|
39
|
+
@task.copy_file filename, ::File.join(@project.build_path, 'images'), :force => true
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Build assets
|
46
|
+
def build_assets
|
47
|
+
@project.assets.each do |asset|
|
48
|
+
# Catch any sprockets errors and continue the process
|
49
|
+
begin
|
50
|
+
build_asset_file asset
|
51
|
+
rescue Exception => e
|
52
|
+
print_asset_error asset, e.message
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Build asset file
|
58
|
+
def build_asset_file(asset)
|
59
|
+
destination = ::File.join(@project.build_path, asset)
|
60
|
+
|
61
|
+
@task.shell.mute do
|
62
|
+
sprocket = @sprockets.find_asset(asset.last)
|
63
|
+
# Create asset destination
|
64
|
+
@task.empty_directory ::File.dirname(destination) unless ::File.directory?(::File.dirname(destination))
|
65
|
+
# Write file to destination
|
66
|
+
sprocket.write_to(destination) unless sprocket.nil?
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Print error to screen and file
|
71
|
+
def print_asset_error(asset, message)
|
72
|
+
destination = ::File.join(@project.build_path, asset)
|
73
|
+
|
74
|
+
@task.say "Error while building #{asset.last}:"
|
75
|
+
@task.say message, :red
|
76
|
+
|
77
|
+
@task.shell.mute do
|
78
|
+
@task.create_file destination unless ::File.exists?(destination)
|
79
|
+
@task.append_to_file destination, message
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# Init sprockets
|
84
|
+
def init_sprockets
|
85
|
+
@sprockets = ::Sprockets::Environment.new
|
86
|
+
|
87
|
+
['javascripts', 'stylesheets'].each do |dir|
|
88
|
+
@sprockets.append_path ::File.join(@project.assets_path, dir)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Check for js compression
|
92
|
+
if @config[:compress_js]
|
93
|
+
@sprockets.js_compressor = :uglify
|
94
|
+
end
|
95
|
+
|
96
|
+
# Check for css compression
|
97
|
+
if @config[:compress_css]
|
98
|
+
@sprockets.css_compressor = :scss
|
99
|
+
end
|
100
|
+
|
101
|
+
# Passing the @project instance variable to the Sprockets::Context instance
|
102
|
+
# used for processing the asset ERB files
|
103
|
+
@sprockets.context_class.instance_exec(@project) do |project|
|
104
|
+
define_method :config do
|
105
|
+
project.config
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module Marv
|
2
|
+
module Project
|
3
|
+
class Functions
|
4
|
+
|
5
|
+
# Initialize functions builder
|
6
|
+
def initialize(builder)
|
7
|
+
@builder = builder
|
8
|
+
@task = builder.task
|
9
|
+
@project = builder.project
|
10
|
+
@config = builder.project.config
|
11
|
+
end
|
12
|
+
|
13
|
+
# Clean functions
|
14
|
+
def clean_functions
|
15
|
+
@task.shell.mute do
|
16
|
+
#remove functions and plugin php
|
17
|
+
@task.remove_file ::File.join(@project.build_path, ::File.basename(@project.functions_file))
|
18
|
+
@task.remove_file ::File.join(@project.build_path, ::File.basename(@project.plugin_file))
|
19
|
+
|
20
|
+
# Remove functions folder
|
21
|
+
@task.remove_dir ::File.join(@project.build_path, 'functions')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Copy functions
|
26
|
+
def copy_functions
|
27
|
+
@task.shell.mute do
|
28
|
+
files = copy_functions_files
|
29
|
+
|
30
|
+
::Dir.glob(::File.join(@project.functions_path, '*')).each do |file|
|
31
|
+
unless files.include?(file)
|
32
|
+
@task.copy_file file, ::File.join(@project.build_path, 'functions', ::File.basename(file)), :force => true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Copy functions
|
39
|
+
def copy_functions_files
|
40
|
+
files = [@project.functions_file, @project.plugin_file]
|
41
|
+
|
42
|
+
::Dir.glob(::File.join(@project.functions_path, '*')).each do |file|
|
43
|
+
if files.include?(file)
|
44
|
+
@task.copy_file file, ::File.join(@project.build_path, ::File.basename(file)), :force => true
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
return files
|
49
|
+
end
|
50
|
+
|
51
|
+
# Clean includes
|
52
|
+
def clean_includes
|
53
|
+
@task.shell.mute do
|
54
|
+
@task.remove_dir ::File.join(@project.build_path, 'includes')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Copy includes
|
59
|
+
def copy_includes
|
60
|
+
@task.shell.mute do
|
61
|
+
::Dir.glob(::File.join(@project.includes_path, '**', '*')).each do |file|
|
62
|
+
source = file.gsub(@project.source_path, '')
|
63
|
+
target = ::File.join(@project.build_path, source)
|
64
|
+
|
65
|
+
@task.copy_file file, target, :force => true unless ::File.directory?(file)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Clean folders
|
71
|
+
def clean_folders
|
72
|
+
@task.shell.mute do
|
73
|
+
# Clean extra folder from project root
|
74
|
+
extra_folders.each do |folder|
|
75
|
+
source = folder.gsub(@project.source_path, '')
|
76
|
+
target = ::File.join(@project.build_path, source)
|
77
|
+
|
78
|
+
@task.remove_dir target
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# Copy folders
|
84
|
+
def copy_folders
|
85
|
+
@task.shell.mute do
|
86
|
+
# Copy extra folders to project root
|
87
|
+
extra_folders.each do |folder|
|
88
|
+
source = folder.gsub(@project.source_path, '')
|
89
|
+
target = ::File.join(@project.build_path, source)
|
90
|
+
|
91
|
+
@task.directory folder, target
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
# Extra folders
|
97
|
+
def extra_folders
|
98
|
+
default = ['assets', 'functions', 'includes', 'templates']
|
99
|
+
folders = []
|
100
|
+
# Remove marv folders from root path
|
101
|
+
::Dir.glob(::File.join(@project.source_path, '*')).each do |folder|
|
102
|
+
if ::File.directory?(folder) and ! default.include?(::File.basename(folder))
|
103
|
+
folders << folder
|
104
|
+
end
|
105
|
+
end
|
106
|
+
# Return folders array
|
107
|
+
return folders
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Marv
|
2
|
+
module Project
|
3
|
+
class Templates
|
4
|
+
|
5
|
+
# Initialize templates builder
|
6
|
+
def initialize(builder)
|
7
|
+
@builder = builder
|
8
|
+
@task = builder.task
|
9
|
+
@project = builder.project
|
10
|
+
@config = builder.project.config
|
11
|
+
end
|
12
|
+
|
13
|
+
# Clean Templates
|
14
|
+
def clean_templates
|
15
|
+
@task.shell.mute do
|
16
|
+
::Dir.glob(::File.join(@project.build_path, '*.php')).each do |file|
|
17
|
+
unless file.include?('functions.php') || file.include?(::File.basename(@project.plugin_file))
|
18
|
+
@task.remove_file file
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Copy templates
|
25
|
+
def copy_templates
|
26
|
+
@task.shell.mute do
|
27
|
+
::Dir.glob(::File.join(@project.templates_path, '**', '*')).each do |file|
|
28
|
+
target = ::File.join(@project.build_path, ::File.basename(file))
|
29
|
+
|
30
|
+
@task.copy_file file, target, :force => true unless ::File.directory?(file)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|