mustache_render 0.0.21 → 0.0.22
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +22 -0
- data/lib/generators/mustache_render/install/templates/active_record/migration.rb +65 -0
- data/lib/generators/mustache_render/install/templates/config/initializers/mustache_render.rb +8 -14
- data/lib/generators/mustache_render/install/templates/models/active_record/mustache_render_folder.rb +6 -0
- data/lib/generators/mustache_render/install/templates/models/active_record/mustache_render_manager.rb +6 -0
- data/lib/generators/mustache_render/install/templates/models/active_record/mustache_render_template.rb +6 -0
- data/lib/generators/mustache_render/install/templates/models/active_record/mustache_render_template_version.rb +6 -0
- data/lib/generators/mustache_render/install_generator.rb +14 -2
- data/lib/mustache_render.rb +5 -14
- data/lib/mustache_render/ables.rb +7 -0
- data/lib/mustache_render/ables/render_able.rb +161 -0
- data/lib/mustache_render/config.rb +24 -62
- data/lib/mustache_render/errors.rb +5 -0
- data/lib/mustache_render/errors/mustache_template_miss_error.rb +6 -0
- data/lib/mustache_render/mustache.rb +85 -79
- data/lib/mustache_render/mustache/data.rb +155 -61
- data/lib/mustache_render/mustache/parser.rb +0 -4
- data/lib/mustache_render/mustache/template.rb +2 -7
- data/lib/mustache_render/populator.rb +7 -0
- data/lib/mustache_render/utils.rb +15 -0
- data/lib/mustache_render/{core_ext/base_controller_ext.rb → utils/action_controller_util.rb} +7 -6
- data/lib/mustache_render/utils/array_util.rb +15 -0
- data/lib/mustache_render/utils/fields_filter_util.rb +127 -0
- data/lib/mustache_render/version.rb +1 -1
- data/spec/lib/ables/render_able_spec.rb +183 -0
- data/spec/lib/mustache/basic_render_spec.rb +26 -1
- data/spec/lib/mustache/data_spec.rb +5 -5
- data/spec/lib/mustache/file_render_spec.rb +11 -2
- data/spec/lib/resources/templates/mustache_render_ables/1.mustache +11 -0
- data/spec/lib/utils/field_filter_spec.rb +71 -0
- data/spec/spec_helper.rb +0 -21
- metadata +69 -59
- data/README.md +0 -23
- data/lib/mustache_render/adapter.rb +0 -75
- data/lib/mustache_render/populator_base.rb +0 -88
- data/spec/lib/config_spec.rb +0 -14
- data/spec/lib/resources/templates/basic/8.mustache +0 -1
data/README.rdoc
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
= MustacheRender
|
2
|
+
|
3
|
+
This project rocks and uses MIT-LICENSE.
|
4
|
+
|
5
|
+
= Rails 3.1.x
|
6
|
+
|
7
|
+
routes
|
8
|
+
|
9
|
+
```
|
10
|
+
namespace :mustache_render do
|
11
|
+
namespace :manager do
|
12
|
+
resources :folders do
|
13
|
+
resources :templates, :only => [:show, :new, :edit, :update, :create, :destroy]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
```
|
18
|
+
|
19
|
+
install:
|
20
|
+
|
21
|
+
rails g mustache_render:migration:install
|
22
|
+
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
class MustacheRenderMigration < ActiveRecord::Migration
|
3
|
+
def self.up
|
4
|
+
create_table :mustache_render_folders, :options => 'DEFAULT CHARSET=utf8' do |t|
|
5
|
+
t.string :name, :default => '' # 文件夹的名称
|
6
|
+
|
7
|
+
t.string :full_path, :default => '' # 全路径
|
8
|
+
|
9
|
+
###### for nested_ful #####################
|
10
|
+
t.integer :parent_id # 父节点的id
|
11
|
+
t.integer :left_id
|
12
|
+
t.integer :right_id
|
13
|
+
t.integer :depth # 深度
|
14
|
+
t.integer :children_count, :default => 0
|
15
|
+
###########################################
|
16
|
+
|
17
|
+
t.text :note # 备注
|
18
|
+
|
19
|
+
t.timestamps
|
20
|
+
end
|
21
|
+
|
22
|
+
create_table :mustache_render_templates, :options => 'DEFAULT CHARSET=utf8' do |t|
|
23
|
+
t.integer :last_user_id # 最后一个修改模板的用户
|
24
|
+
t.integer :create_user_id # 创建者的用户id
|
25
|
+
t.integer :folder_id # 文件夹的ID
|
26
|
+
t.string :name # 模板的名称
|
27
|
+
t.text :content # 代码
|
28
|
+
|
29
|
+
t.text :note # 备注
|
30
|
+
t.timestamps
|
31
|
+
end
|
32
|
+
|
33
|
+
create_table :mustache_render_template_versions, :options => 'DEFAULT CHARSET=utf8' do |t|
|
34
|
+
t.integer :template_id # 模板的id
|
35
|
+
t.integer :last_user_id # 最后一个修改模板的用户
|
36
|
+
t.integer :create_user_id # 创建者的用户id
|
37
|
+
t.integer :folder_id # 文件夹的ID
|
38
|
+
t.string :name # 模板的名称
|
39
|
+
t.text :content # 代码
|
40
|
+
t.string :full_path
|
41
|
+
t.string :change_log # 修改日志
|
42
|
+
|
43
|
+
t.text :note # 备注
|
44
|
+
t.timestamps
|
45
|
+
end
|
46
|
+
|
47
|
+
create_table :mustache_render_managers, :options => 'DEFAULT CHARSET=utf8' do |t|
|
48
|
+
t.integer :user_id
|
49
|
+
|
50
|
+
t.integer :admin_able # 是否是管理权限
|
51
|
+
t.integer :edit_able # 是否可以编辑
|
52
|
+
|
53
|
+
t.timestamps
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.down
|
59
|
+
drop_table :mustache_render_folders
|
60
|
+
drop_table :mustache_render_template_versions
|
61
|
+
drop_table :mustache_render_templates
|
62
|
+
drop_table :mustache_render_managers
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
data/lib/generators/mustache_render/install/templates/config/initializers/mustache_render.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
MustacheRender.configure do |config|
|
3
3
|
# 默认的模板渲染媒介
|
4
|
+
# :db => 数据库渲染
|
4
5
|
# :file => 文件系统渲染
|
5
|
-
config.default_render_media = :
|
6
|
+
config.default_render_media = :db
|
6
7
|
|
7
8
|
# 默认的文件模板的根目录
|
8
9
|
config.file_template_root_path = "#{Rails.root}/app/templates"
|
@@ -10,25 +11,18 @@ MustacheRender.configure do |config|
|
|
10
11
|
# 默认的文件模板的扩展名称
|
11
12
|
config.file_template_extension = '.mustache'
|
12
13
|
|
14
|
+
# 默认的数据模板的扩展名称
|
15
|
+
config.db_template_extension = '.mustache'
|
16
|
+
|
13
17
|
# 当字段缺少的时候是否抛出异常
|
14
18
|
config.raise_on_context_miss = false
|
15
19
|
|
20
|
+
# 当数据库模板不存在时候是否抛出异常
|
21
|
+
config.raise_on_db_template_miss = true
|
22
|
+
|
16
23
|
# 当文件模板不存在时候是否抛出异常
|
17
24
|
config.raise_on_file_template_miss = true
|
18
25
|
|
19
26
|
config.logger = Rails.logger
|
20
|
-
|
21
|
-
# 版本适配器的配置
|
22
|
-
config.adapter_configure do |adapter|
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
# 管理中心是否需要登录
|
27
|
-
config.manage_center_need_login = true
|
28
|
-
# 用户登录的url
|
29
|
-
config.user_login_url = '/login'
|
30
|
-
# 管理员登录失败后跳往的URL
|
31
|
-
config.manager_authenticate_fail_url = '/login'
|
32
|
-
|
33
27
|
end
|
34
28
|
|
@@ -4,10 +4,22 @@ require 'rails/generators/migration'
|
|
4
4
|
|
5
5
|
module MustacheRender
|
6
6
|
class InstallGenerator < Rails::Generators::Base
|
7
|
-
|
7
|
+
include Rails::Generators::Migration
|
8
|
+
|
9
|
+
desc "Generates MustacheRender database migration, models"
|
8
10
|
|
9
11
|
def copy_files
|
12
|
+
orm = options[:orm].to_s
|
13
|
+
orm = "active_record" unless %w{active_record}.include?(orm)
|
14
|
+
%w(mustache_render_folder mustache_render_template mustache_render_manager mustache_render_template_version).each do |file|
|
15
|
+
copy_model(orm, file)
|
16
|
+
end
|
17
|
+
|
10
18
|
template "config/initializers/mustache_render.rb", "config/initializers/mustache_render.rb"
|
19
|
+
|
20
|
+
if self.class.orm_has_migration?
|
21
|
+
migration_template "#{orm}/migration.rb", 'db/migrate/mustache_render_migration'
|
22
|
+
end
|
11
23
|
end
|
12
24
|
|
13
25
|
def self.orm
|
@@ -31,7 +43,7 @@ module MustacheRender
|
|
31
43
|
"%.3d" % (current_migration_number(dirname) + 1)
|
32
44
|
end
|
33
45
|
end
|
34
|
-
|
46
|
+
|
35
47
|
private
|
36
48
|
|
37
49
|
def copy_model(orm, name)
|
data/lib/mustache_render.rb
CHANGED
@@ -1,23 +1,14 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
|
2
|
+
require "#{File.dirname(__FILE__)}/mustache_render/errors"
|
3
|
+
require "#{File.dirname(__FILE__)}/mustache_render/config"
|
4
|
+
require "#{File.dirname(__FILE__)}/mustache_render/mustache"
|
5
|
+
require "#{File.dirname(__FILE__)}/mustache_render/utils"
|
6
|
+
require "#{File.dirname(__FILE__)}/mustache_render/ables"
|
6
7
|
|
7
8
|
module MustacheRender
|
8
9
|
def self.logger
|
9
10
|
MustacheRender.config.logger
|
10
11
|
end
|
11
|
-
|
12
|
-
autoload :Adapter, 'mustache_render/adapter'
|
13
|
-
autoload :PopulatorBase, 'mustache_render/populator_base'
|
14
|
-
|
15
|
-
module CoreExt
|
16
|
-
autoload :BaseControllerExt, 'mustache_render/core_ext/base_controller_ext'
|
17
|
-
end
|
18
12
|
end
|
19
13
|
|
20
|
-
if defined?(::ActionController::Base)
|
21
|
-
::ActionController::Base.send :include, ::MustacheRender::CoreExt::BaseControllerExt
|
22
|
-
end
|
23
14
|
|
@@ -0,0 +1,161 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module MustacheRender
|
3
|
+
module RenderAble
|
4
|
+
class MustachePopulatorConfig
|
5
|
+
def filters_util
|
6
|
+
@filters_util ||= ::MustacheRender::FieldsFilterUtil.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def filters_util= options={}
|
10
|
+
@filters_util ||= ::MustacheRender::FieldsFilterUtil.new(options)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module SharedMethods
|
15
|
+
[:render, :file_render].each do |_render_method|
|
16
|
+
define_method "mustache_#{_render_method}" do |*args, &block|
|
17
|
+
options = ::MustacheRender::ArrayUtil.extract_options!(args)
|
18
|
+
template_or_path = args.first || ''
|
19
|
+
|
20
|
+
::MustacheRender::Mustache.send(_render_method, template_or_path, self.to_mustache(options, &block))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
module ForRecord
|
26
|
+
def self.included base
|
27
|
+
base.class_eval do
|
28
|
+
include ::MustacheRender::RenderAble::SharedMethods
|
29
|
+
extend ClassMethods
|
30
|
+
include InstanceMethods
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# 类方法
|
35
|
+
module ClassMethods
|
36
|
+
# options:
|
37
|
+
# - populators:
|
38
|
+
#
|
39
|
+
def load_mustache_populator *args, &block
|
40
|
+
options = ::MustacheRender::ArrayUtil.extract_options!(args)
|
41
|
+
|
42
|
+
(
|
43
|
+
::MustacheRender::ArrayUtil.init(options[:populators]).compact
|
44
|
+
).each do |populator_moule|
|
45
|
+
self.send :include, populator_moule if populator_moule.is_a?(Module)
|
46
|
+
end
|
47
|
+
|
48
|
+
if block_given?
|
49
|
+
block.call(
|
50
|
+
self.mustache_populator_config
|
51
|
+
)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def mustache_populator_config
|
56
|
+
@mustache_populator_config ||= ::MustacheRender::RenderAble::MustachePopulatorConfig.new
|
57
|
+
end
|
58
|
+
|
59
|
+
def mustache_populator_filters_util
|
60
|
+
self.mustache_populator_config.filters_util
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
module InstanceMethods
|
65
|
+
# 组装器的配置
|
66
|
+
def mustache_populator_config
|
67
|
+
self.class.mustache_populator_config
|
68
|
+
end
|
69
|
+
|
70
|
+
# 组装器的过滤工具
|
71
|
+
def mustache_populator_filters_util
|
72
|
+
self.class.mustache_populator_filters_util
|
73
|
+
end
|
74
|
+
|
75
|
+
# options:
|
76
|
+
# - filter:
|
77
|
+
# - ...
|
78
|
+
# - &block
|
79
|
+
def to_mustache options={}, &block
|
80
|
+
result = ::MustacheRender::Mustache::Data.new(
|
81
|
+
:nil? => false
|
82
|
+
)
|
83
|
+
|
84
|
+
filter_util = self.mustache_populator_filters_util.load(options[:filter] || :default)
|
85
|
+
|
86
|
+
self.impl_to_mustache result, filter_util, options if defined?(self.impl_to_mustache)
|
87
|
+
|
88
|
+
if block_given?
|
89
|
+
if(_block_result = block.call :record => self, :result => result).is_a?(::Hash)
|
90
|
+
result.merge! _block_result
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
result
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
module ForList
|
100
|
+
include ::MustacheRender::RenderAble::SharedMethods
|
101
|
+
|
102
|
+
def to_mustache options={}, &block
|
103
|
+
|
104
|
+
result = {
|
105
|
+
:any? => self.any?,
|
106
|
+
:list => self.map do |item|
|
107
|
+
item.to_mustache options, &block
|
108
|
+
end
|
109
|
+
}
|
110
|
+
|
111
|
+
# 支持分页?
|
112
|
+
# 分页相关的数据
|
113
|
+
|
114
|
+
if self.respond_to?(:total_pages)
|
115
|
+
total_entries = defined?(self.total_entries) ? self.total_entries : self.total_count
|
116
|
+
|
117
|
+
pagination_result = {
|
118
|
+
:support? => true,
|
119
|
+
:info => {
|
120
|
+
:current_page => self.current_page, # 当前页数
|
121
|
+
:total_entries => total_entries, # 总页数
|
122
|
+
:per_page => self.per_page, # 每页条数
|
123
|
+
:total_pages => self.total_pages, # 总页数
|
124
|
+
:first_page? => self.current_page == 1, # 是否是第一页?
|
125
|
+
:last_page? => self.current_page == self.total_pages, # 最后一页?
|
126
|
+
:next_page => self.next_page, # 下一页
|
127
|
+
:previous_page => self.previous_page # 前一页
|
128
|
+
}
|
129
|
+
}
|
130
|
+
else
|
131
|
+
pagination_result = {
|
132
|
+
:support? => false
|
133
|
+
}
|
134
|
+
end
|
135
|
+
|
136
|
+
result.merge!(
|
137
|
+
:pagination => pagination_result
|
138
|
+
)
|
139
|
+
|
140
|
+
result
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
module NilMethods
|
145
|
+
def to_mustache options={}
|
146
|
+
::MustacheRender::Mustache::Data.new(
|
147
|
+
:nil? => true
|
148
|
+
)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
if defined?(::NilClass)
|
155
|
+
::NilClass.send :include, ::MustacheRender::RenderAble::NilMethods
|
156
|
+
end
|
157
|
+
|
158
|
+
if defined?(::Array)
|
159
|
+
::Array.send :include, ::MustacheRender::RenderAble::ForList
|
160
|
+
end
|
161
|
+
|
@@ -5,46 +5,13 @@ module MustacheRender
|
|
5
5
|
|
6
6
|
def configure
|
7
7
|
yield self.config ||= Config.new
|
8
|
-
self.config.apply!
|
9
8
|
end
|
10
9
|
end
|
11
10
|
|
12
11
|
class Config
|
13
|
-
def apply!
|
14
|
-
# if self.action_view_handler?
|
15
|
-
# if defined?(::ActionView::Template)
|
16
|
-
# ::ActionView::Template.register_template_handler(
|
17
|
-
# self.action_view_handler_extension.to_sym,
|
18
|
-
# ::MustacheRender::CoreExt::ActionViewHandler
|
19
|
-
# )
|
20
|
-
# end
|
21
|
-
# end
|
22
|
-
end
|
23
|
-
|
24
12
|
def initialize
|
25
13
|
end
|
26
14
|
|
27
|
-
# 配置适配器
|
28
|
-
def adapter_configure(&block)
|
29
|
-
::MustacheRender.adapter_configure do |adapter|
|
30
|
-
if block_given?
|
31
|
-
block.call adapter
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def action_view_handler?
|
37
|
-
if defined?(@_use_action_view_handler)
|
38
|
-
@_use_action_view_handler
|
39
|
-
else
|
40
|
-
true
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def use_action_view_handler= _bool
|
45
|
-
@_use_action_view_handler = _bool unless defined?(@_use_action_view_handler)
|
46
|
-
end
|
47
|
-
|
48
15
|
#
|
49
16
|
# 默认的渲染媒介
|
50
17
|
#
|
@@ -56,22 +23,10 @@ module MustacheRender
|
|
56
23
|
@default_render_media ||= media
|
57
24
|
end
|
58
25
|
|
59
|
-
# def cache
|
60
|
-
# return @_cache_store if defined?(@_cache_store)
|
61
|
-
|
62
|
-
# @_cache_store ||= Rails.cache
|
63
|
-
# # @_cache_store ||= MemCache.new('localhost:11211', :namespace => 'mustache_render#cache')
|
64
|
-
# end
|
65
|
-
|
66
|
-
# def cache_store= cache_store
|
67
|
-
# @_cache_store ||= cache_store
|
68
|
-
# end
|
69
|
-
|
70
26
|
def logger
|
71
27
|
return @_logger if defined?(@_logger)
|
72
28
|
|
73
29
|
require 'logger'
|
74
|
-
|
75
30
|
@_logger ||= ::Logger.new(STDOUT)
|
76
31
|
end
|
77
32
|
|
@@ -79,6 +34,30 @@ module MustacheRender
|
|
79
34
|
@_logger ||= logger
|
80
35
|
end
|
81
36
|
|
37
|
+
def raise_on_context_miss?
|
38
|
+
return @_raise_on_context_miss if defined?(@_raise_on_context_miss)
|
39
|
+
|
40
|
+
@raise_on_context_miss = false
|
41
|
+
end
|
42
|
+
|
43
|
+
def raise_on_context_miss= _miss
|
44
|
+
return @_raise_on_context_miss if defined?(@_raise_on_context_miss)
|
45
|
+
|
46
|
+
@raise_on_context_miss = _miss
|
47
|
+
end
|
48
|
+
|
49
|
+
def raise_on_file_template_miss?
|
50
|
+
return @_raise_on_file_template_miss if defined?(@_raise_on_file_template_miss)
|
51
|
+
|
52
|
+
@raise_on_file_template_miss = true
|
53
|
+
end
|
54
|
+
|
55
|
+
def raise_on_file_template_miss= _miss
|
56
|
+
return @_raise_on_file_template_miss if defined?(@_raise_on_file_template_miss)
|
57
|
+
|
58
|
+
@raise_on_file_template_miss = _miss
|
59
|
+
end
|
60
|
+
|
82
61
|
#
|
83
62
|
# lib 的基本路径
|
84
63
|
#
|
@@ -102,22 +81,5 @@ module MustacheRender
|
|
102
81
|
@file_template_extension ||= name
|
103
82
|
end
|
104
83
|
|
105
|
-
# 是否抛出文件模板丢失的异常?
|
106
|
-
def raise_on_file_template_miss= _bool
|
107
|
-
@raise_on_file_template_miss = _bool unless defined?(@raise_on_file_template_miss)
|
108
|
-
end
|
109
|
-
|
110
|
-
def raise_on_file_template_miss?
|
111
|
-
defined?(@raise_on_file_template_miss) ? @raise_on_file_template_miss : true
|
112
|
-
end
|
113
|
-
|
114
|
-
def raise_on_context_miss?
|
115
|
-
defined?(@raise_on_context_miss) ? @raise_on_context_miss : false
|
116
|
-
end
|
117
|
-
|
118
|
-
def raise_on_context_miss=(_bool)
|
119
|
-
@raise_on_context_miss = _bool unless defined?(@raise_on_context_miss)
|
120
|
-
end
|
121
84
|
end
|
122
85
|
end
|
123
|
-
|