themeable 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +123 -18
- data/lib/generators/themeable/scaffold_admin_controller_generator.rb +17 -0
- data/lib/themeable/command.rb +13 -3
- data/lib/themeable/railtie.rb +11 -2
- data/lib/themeable/theme.rb +9 -9
- data/lib/themeable/version.rb +1 -1
- data/lib/themeable.rb +14 -4
- data/templates/generators/copy_assets_generator.rb +11 -0
- data/templates/generators/copy_views_generator.rb +12 -0
- data/templates/generators/scaffold_generator.rb +30 -0
- metadata +6 -4
- data/templates/theme_assets_generator.rb +0 -10
- data/templates/theme_views_generator.rb +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c2c88465cfcd7a507c2f118801ad8b5f707e568
|
4
|
+
data.tar.gz: ec2e1826e7d404f8b3286fe9f1716255fe4e18b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9dbd7f95f31a7c182ba13214eb6658374ece3a4765922801d7efae104b876577ce5bfa98bf0ed05524646ea90d3f8931ed664b817329328de06a2cd04795c134
|
7
|
+
data.tar.gz: 98f9b7da433ffdd4e7ff6c97336e9433e4c8ef30f3676f7562ffea1ee20a60c9b39613fdf1f89b356e1994762310386c67ecd2b365a9d0baa7b81798f9b5a984
|
data/README.md
CHANGED
@@ -6,38 +6,70 @@ You can create theme with this tool, make your Rails app choose theme dynamicall
|
|
6
6
|
|
7
7
|
gem i themeable
|
8
8
|
|
9
|
-
### Create
|
9
|
+
### Create your theme with command line
|
10
10
|
|
11
|
-
themeable new
|
11
|
+
themeable new my_theme
|
12
12
|
|
13
|
-
Now, directory `
|
13
|
+
Now, directory `theme_my_theme` created with this tool.
|
14
14
|
|
15
|
-
### Design
|
15
|
+
### Design your theme
|
16
16
|
|
17
17
|
Start designing your theme in folder `theme`:
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
│
|
22
|
-
│
|
23
|
-
│
|
24
|
-
|
25
|
-
│
|
26
|
-
│
|
27
|
-
│
|
19
|
+
theme
|
20
|
+
├── assets
|
21
|
+
│ └── my_theme
|
22
|
+
│ ├── application.css
|
23
|
+
│ └── application.js
|
24
|
+
├── scaffold_templates
|
25
|
+
│ ├── admin
|
26
|
+
│ │ ├── _form.html.erb
|
27
|
+
│ │ ├── edit.html.erb
|
28
|
+
│ │ ├── index.html.erb
|
29
|
+
│ │ ├── new.html.erb
|
30
|
+
│ │ └── show.html.erb
|
31
|
+
│ └── default
|
32
|
+
│ ├── _form.html.erb
|
33
|
+
│ ├── edit.html.erb
|
34
|
+
│ ├── index.html.erb
|
35
|
+
│ ├── new.html.erb
|
36
|
+
│ └── show.html.erb
|
37
|
+
└── views
|
38
|
+
└── layouts
|
39
|
+
└── application.html.erb
|
28
40
|
|
29
|
-
|
41
|
+
- theme/assets/my_theme: where your stylesheets and javascripts should put in
|
42
|
+
- theme/scaffold_templates/xxx: your scaffold templates, generated default and admin by default, sure you can add more
|
43
|
+
- theme/views: your views
|
44
|
+
|
45
|
+
|
46
|
+
If you have some vendor scripts and stylesheets, please put them in vendor/my_theme:
|
47
|
+
|
48
|
+
vendor
|
49
|
+
└── my_theme
|
50
|
+
|
51
|
+
To require vendor files, do it as this:
|
52
|
+
|
53
|
+
# in some.js
|
54
|
+
|
55
|
+
//= require my_theme/xxx/xxx
|
56
|
+
|
57
|
+
# in some.css
|
58
|
+
|
59
|
+
*= require my_theme/xxx/xxx
|
60
|
+
|
61
|
+
### Use your theme in your Rails project
|
30
62
|
|
31
63
|
Add gem to Rails app:
|
32
64
|
|
33
|
-
gem '
|
65
|
+
gem 'theme_my_theme', path: 'path_of_theme_my_theme'
|
34
66
|
|
35
67
|
Use theme in controller:
|
36
68
|
|
37
69
|
By default you need to remove `views/layouts/application.html.erb` from Rails app, make sure Rails can use theme's layout.
|
38
70
|
|
39
71
|
class HomeController < ApplicationController
|
40
|
-
acts_as_themeable '
|
72
|
+
acts_as_themeable 'my_theme'
|
41
73
|
def index
|
42
74
|
end
|
43
75
|
end
|
@@ -53,9 +85,82 @@ Or, you can make this controller use dynamic themes:
|
|
53
85
|
|
54
86
|
def choose_theme
|
55
87
|
case params[:theme]
|
56
|
-
when '
|
88
|
+
when 'my_theme' then 'my_theme'
|
57
89
|
when 'classic' then 'classic'
|
58
90
|
else; :none # :none means don't use theme
|
59
91
|
end
|
60
92
|
end
|
61
|
-
end
|
93
|
+
end
|
94
|
+
|
95
|
+
### Use `theme_my_theme` as template engine to scaffold controller views
|
96
|
+
|
97
|
+
$ rails g scaffold_controller User --template-engine=theme_my_theme --scaffold-template=default
|
98
|
+
|
99
|
+
create app/controllers/users_controller.rb
|
100
|
+
invoke theme_my_theme
|
101
|
+
create app/views/users
|
102
|
+
create app/views/users/index.html.erb
|
103
|
+
create app/views/users/edit.html.erb
|
104
|
+
create app/views/users/show.html.erb
|
105
|
+
create app/views/users/new.html.erb
|
106
|
+
create app/views/users/_form.html.erb
|
107
|
+
invoke test_unit
|
108
|
+
create test/controllers/users_controller_test.rb
|
109
|
+
invoke helper
|
110
|
+
create app/helpers/users_helper.rb
|
111
|
+
invoke test_unit
|
112
|
+
invoke jbuilder
|
113
|
+
create app/views/users/index.json.jbuilder
|
114
|
+
create app/views/users/show.json.jbuilder
|
115
|
+
create app/views/users/_user.json.jbuilder
|
116
|
+
|
117
|
+
### Customize `theme_my_theme` in your Rails project
|
118
|
+
|
119
|
+
In your Rails project, if you feel `theme_my_theme` is not perfect, and want to make some changes to it only affect current Rails project, instead of all Rails projects which are using gem `theme_my_theme`, now you can do this:
|
120
|
+
|
121
|
+
$ rails g theme_my_theme:copy_assets
|
122
|
+
|
123
|
+
exist app/assets/themes
|
124
|
+
create app/assets/themes/my_theme/application.css
|
125
|
+
create app/assets/themes/my_theme/application.js
|
126
|
+
|
127
|
+
$ rails g theme_my_theme:copy_views
|
128
|
+
exist app/views
|
129
|
+
identical app/views/layouts/.gitkeep
|
130
|
+
conflict app/views/layouts/application.html.erb
|
131
|
+
Overwrite /test_theme/app/views/layouts/application.html.erb? (enter "h" for help) [Ynaqdh] a
|
132
|
+
force app/views/layouts/application.html.erb
|
133
|
+
create lib/templates/theme_my_theme/scaffold
|
134
|
+
create lib/templates/theme_my_theme/scaffold/admin/_form.html.erb
|
135
|
+
create lib/templates/theme_my_theme/scaffold/admin/edit.html.erb
|
136
|
+
create lib/templates/theme_my_theme/scaffold/admin/index.html.erb
|
137
|
+
create lib/templates/theme_my_theme/scaffold/admin/new.html.erb
|
138
|
+
create lib/templates/theme_my_theme/scaffold/admin/show.html.erb
|
139
|
+
create lib/templates/theme_my_theme/scaffold/default/_form.html.erb
|
140
|
+
create lib/templates/theme_my_theme/scaffold/default/edit.html.erb
|
141
|
+
create lib/templates/theme_my_theme/scaffold/default/index.html.erb
|
142
|
+
create lib/templates/theme_my_theme/scaffold/default/new.html.erb
|
143
|
+
create lib/templates/theme_my_theme/scaffold/default/show.html.erb
|
144
|
+
|
145
|
+
### Set `theme_my_them` as default template engine
|
146
|
+
|
147
|
+
If you feel each time to generate scaffold controller has to provide `--template-engine=theme_my_theme` is annoying, now you can set a default value like this:
|
148
|
+
|
149
|
+
in config/application.rb, add `Themeable.template_engine = :my_theme`, note this is `:my_theme` but `:theme_my_theme`, this is different from the value of `--template-engine`
|
150
|
+
|
151
|
+
module TestTheme
|
152
|
+
class Application < Rails::Application
|
153
|
+
|
154
|
+
....
|
155
|
+
|
156
|
+
Themeable.template_engine = :my_theme
|
157
|
+
|
158
|
+
...
|
159
|
+
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
|
166
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Themeable
|
2
|
+
module Generators
|
3
|
+
class ScaffoldAdminControllerGenerator < Rails::Generators::NamedBase
|
4
|
+
|
5
|
+
def do_everything
|
6
|
+
return if @options.fetch('skip_scaffold_admin', false)
|
7
|
+
old_invocations = {}.merge(@_invocations)
|
8
|
+
@_invocations.clear
|
9
|
+
new_options = @options.merge('skip_scaffold_admin' => true, 'theme_template' => 'admin')
|
10
|
+
invoke :resource_route, ["admin/#{file_path}"]
|
11
|
+
invoke :scaffold_controller, ["admin/#{file_path}"], new_options
|
12
|
+
@_invocations.update(old_invocations)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
data/lib/themeable/command.rb
CHANGED
@@ -17,7 +17,7 @@ module Themeable
|
|
17
17
|
@app_name = "theme_#{name}"
|
18
18
|
say('Initializing theme project...', :green)
|
19
19
|
# say("\"rails plugin new #{app_name} -T\"")
|
20
|
-
system "rails plugin new #{app_name} -T"
|
20
|
+
system "rails plugin new #{app_name} -T -B"
|
21
21
|
|
22
22
|
@destination_stack ||= []
|
23
23
|
@destination_stack[0] = File.expand_path(app_name)
|
@@ -32,8 +32,9 @@ module Themeable
|
|
32
32
|
end
|
33
33
|
|
34
34
|
# generators
|
35
|
-
template '
|
36
|
-
template '
|
35
|
+
template 'generators/copy_views_generator.rb', "lib/generators/theme_#{theme_name}/copy_views_generator.rb"
|
36
|
+
template 'generators/copy_assets_generator.rb', "lib/generators/theme_#{theme_name}/copy_assets_generator.rb"
|
37
|
+
template 'generators/scaffold_generator.rb', "lib/generators/theme_#{theme_name}/scaffold_generator.rb"
|
37
38
|
|
38
39
|
# assets and views
|
39
40
|
create_file "theme/assets/#{theme_name}/application.css"
|
@@ -41,6 +42,15 @@ module Themeable
|
|
41
42
|
create_file "theme/views/layouts/.gitkeep"
|
42
43
|
template "view_application.html.erb", "theme/views/layouts/application.html.erb"
|
43
44
|
|
45
|
+
# scaffold templates
|
46
|
+
%w(default admin).each do |name|
|
47
|
+
create_file "theme/scaffold_templates/#{name}/index.html.erb"
|
48
|
+
create_file "theme/scaffold_templates/#{name}/edit.html.erb"
|
49
|
+
create_file "theme/scaffold_templates/#{name}/show.html.erb"
|
50
|
+
create_file "theme/scaffold_templates/#{name}/new.html.erb"
|
51
|
+
create_file "theme/scaffold_templates/#{name}/_form.html.erb"
|
52
|
+
end
|
53
|
+
|
44
54
|
# vender files
|
45
55
|
create_file "vendor/#{theme_name}/.gitkeep"
|
46
56
|
|
data/lib/themeable/railtie.rb
CHANGED
@@ -1,16 +1,25 @@
|
|
1
1
|
require 'rails'
|
2
2
|
module Themeable
|
3
3
|
class Railtie < Rails::Railtie
|
4
|
+
|
4
5
|
config.to_prepare do
|
5
6
|
ActionController::Base.send :include, Themeable::ActsAsThemeable
|
6
7
|
end
|
8
|
+
|
7
9
|
initializer :themeable do
|
10
|
+
config.app_generators.template_engine Themeable.template_engine if Themeable.template_engine
|
8
11
|
Themeable.themes.each do |theme|
|
9
12
|
config.assets.paths << File.join(theme.root_path, theme.theme_path, 'assets')
|
10
13
|
config.assets.paths << File.join(theme.root_path, 'vendor')
|
11
|
-
config.assets.precompile << /\A#{Regexp.escape(theme.
|
12
|
-
config.assets.precompile << /\A#{Regexp.escape(theme.
|
14
|
+
config.assets.precompile << /\A#{Regexp.escape(theme.theme_name)}\/[^\/]+\.(js|css)\z/
|
15
|
+
config.assets.precompile << /\A#{Regexp.escape(theme.theme_name)}\/.+\.(gif|jpg|png|svg)\z/
|
13
16
|
end
|
14
17
|
end
|
18
|
+
|
19
|
+
generators do |app|
|
20
|
+
Rails::Generators::ScaffoldControllerGenerator.class_option :scaffold_template, default: 'default', desc: 'Which scaffold template of themeable plugin you want to use'
|
21
|
+
end
|
22
|
+
|
15
23
|
end
|
16
24
|
end
|
25
|
+
|
data/lib/themeable/theme.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Themeable
|
2
2
|
|
3
3
|
# Theme's basic module, automatically define methods
|
4
|
-
# -
|
4
|
+
# - theme_name
|
5
5
|
# - root_path
|
6
6
|
# - theme_path
|
7
7
|
module Theme
|
@@ -12,18 +12,18 @@ module Themeable
|
|
12
12
|
# set default values
|
13
13
|
caller_file = caller.first
|
14
14
|
if caller_file =~ %r{/theme_(.+?)/lib/theme_\1\.rb}
|
15
|
-
|
15
|
+
default_theme_name = $1.to_sym
|
16
16
|
default_root = File.expand_path(File.join(caller_file, '../../'))
|
17
17
|
end
|
18
18
|
|
19
19
|
subclass.instance_eval <<-RUBY, __FILE__, __LINE__ + 1
|
20
|
-
@
|
20
|
+
@theme_name = #{default_theme_name.inspect}
|
21
21
|
|
22
22
|
# Theme name
|
23
23
|
#
|
24
24
|
# @return [Symbol]
|
25
|
-
def
|
26
|
-
@
|
25
|
+
def theme_name
|
26
|
+
@theme_name || raise("Theme name is no defined")
|
27
27
|
end
|
28
28
|
|
29
29
|
@root_path = #{default_root.inspect}
|
@@ -46,10 +46,10 @@ module Themeable
|
|
46
46
|
|
47
47
|
# Set theme name
|
48
48
|
#
|
49
|
-
# @param [String]
|
50
|
-
# @return [Symbol] symbolized
|
51
|
-
def
|
52
|
-
@
|
49
|
+
# @param [String, Symbol] theme_name
|
50
|
+
# @return [Symbol] symbolized theme_name
|
51
|
+
def set_theme_name(theme_name)
|
52
|
+
@theme_name = theme_name.to_sym
|
53
53
|
end
|
54
54
|
|
55
55
|
# Set root path of theme project
|
data/lib/themeable/version.rb
CHANGED
data/lib/themeable.rb
CHANGED
@@ -5,17 +5,27 @@ require 'themeable/acts_as_themeable'
|
|
5
5
|
|
6
6
|
module Themeable
|
7
7
|
|
8
|
+
module_function
|
9
|
+
|
8
10
|
@@theme_set = Set.new
|
9
|
-
def
|
11
|
+
def add_theme(theme_class)
|
10
12
|
@@theme_set << theme_class
|
11
13
|
end
|
12
14
|
|
13
|
-
def
|
15
|
+
def themes
|
14
16
|
@@theme_set
|
15
17
|
end
|
16
18
|
|
17
|
-
def
|
18
|
-
themes.find{|t| t.
|
19
|
+
def theme(theme_name)
|
20
|
+
themes.find{|t| t.theme_name == theme_name.to_sym } || raise("Theme #{theme_name} not found")
|
21
|
+
end
|
22
|
+
|
23
|
+
def template_engine=(theme_name)
|
24
|
+
@template_engine = "theme_#{theme(theme_name).theme_name}"
|
25
|
+
end
|
26
|
+
|
27
|
+
def template_engine
|
28
|
+
@template_engine
|
19
29
|
end
|
20
30
|
|
21
31
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Theme<%= theme_name.camelize %>
|
2
|
+
module Generators
|
3
|
+
class CopyAssetsGenerator < Rails::Generators::Base
|
4
|
+
source_root File.join(Theme<%= theme_name.camelize %>.root_path, 'theme')
|
5
|
+
def copy_assets
|
6
|
+
directory 'assets', 'app/assets/themes'
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Theme<%= theme_name.camelize %>
|
2
|
+
module Generators
|
3
|
+
class CopyViewsGenerator < Rails::Generators::Base
|
4
|
+
source_root File.join(Theme<%= theme_name.camelize %>.root_path, 'theme')
|
5
|
+
def copy_views
|
6
|
+
directory 'views', 'app/views'
|
7
|
+
directory 'scaffold_templates', 'lib/templates/theme_<%= theme_name %>/scaffold'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'rails/generators/erb/scaffold/scaffold_generator'
|
2
|
+
|
3
|
+
module Theme<%= theme_name.camelize %>
|
4
|
+
module Generators
|
5
|
+
class ScaffoldGenerator < Erb::Generators::ScaffoldGenerator
|
6
|
+
class_option :scaffold_template, type: :string, default: 'default',
|
7
|
+
desc: "Choose template to scaffold: default or admin"
|
8
|
+
source_root File.join(Theme<%= theme_name.camelize %>.root_path, "theme/scaffold_templates")
|
9
|
+
|
10
|
+
def copy_view_files
|
11
|
+
available_views.each do |view|
|
12
|
+
filename = filename_with_extensions view
|
13
|
+
template "#{options[:scaffold_template]}/#{view}.html.erb", File.join('app', 'views', controller_file_path, filename)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def available_views
|
20
|
+
['index', 'edit', 'show', 'new', '_form']
|
21
|
+
end
|
22
|
+
|
23
|
+
def handler
|
24
|
+
:erb
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: themeable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- xiaohui
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-10-
|
11
|
+
date: 2016-10-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -64,6 +64,7 @@ files:
|
|
64
64
|
- README.md
|
65
65
|
- Rakefile
|
66
66
|
- bin/themeable
|
67
|
+
- lib/generators/themeable/scaffold_admin_controller_generator.rb
|
67
68
|
- lib/tasks/themeable_tasks.rake
|
68
69
|
- lib/themeable.rb
|
69
70
|
- lib/themeable/acts_as_themeable.rb
|
@@ -71,9 +72,10 @@ files:
|
|
71
72
|
- lib/themeable/railtie.rb
|
72
73
|
- lib/themeable/theme.rb
|
73
74
|
- lib/themeable/version.rb
|
74
|
-
- templates/
|
75
|
+
- templates/generators/copy_assets_generator.rb
|
76
|
+
- templates/generators/copy_views_generator.rb
|
77
|
+
- templates/generators/scaffold_generator.rb
|
75
78
|
- templates/theme_main.rb
|
76
|
-
- templates/theme_views_generator.rb
|
77
79
|
- templates/view_application.html.erb
|
78
80
|
homepage: https://github.com/xiaohui-zhangxh/
|
79
81
|
licenses:
|