page_fragments 0.0.1
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.
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +54 -0
- data/Rakefile +1 -0
- data/app/controllers/page_fragments/page_fragments_controller.rb +21 -0
- data/app/helpers/page_fragments/page_fragment_helper.rb +8 -0
- data/app/models/page_fragments/page_fragment.rb +123 -0
- data/app/views/page_fragments/page_fragments/edit.html.haml +11 -0
- data/app/views/page_fragments/page_fragments/index.html.haml +11 -0
- data/config/routes.rb +4 -0
- data/lib/generators/page_fragments/install_generator.rb +43 -0
- data/lib/generators/page_fragments/templates/initialize.rb +5 -0
- data/lib/generators/page_fragments/templates/migration.rb +13 -0
- data/lib/generators/page_fragments/templates/page_fragments.en.yml +6 -0
- data/lib/generators/page_fragments/templates/templates.rb +3 -0
- data/lib/generators/page_fragments/views_generator.rb +17 -0
- data/lib/page_fragments.rb +22 -0
- data/lib/page_fragments/routes.rb +50 -0
- data/lib/page_fragments/version.rb +3 -0
- data/lib/tasks/pf.rake +5 -0
- data/page_fragments.gemspec +23 -0
- metadata +84 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Alexandr Promakh
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
# PageFragments
|
2
|
+
|
3
|
+
Page Fragments is gem for Ruby On Rails.
|
4
|
+
PageFragments allow you to store snippets of pages in the database and edit them in the admin application.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
gem "page_fragments"
|
11
|
+
|
12
|
+
First, execute
|
13
|
+
|
14
|
+
$ rails generate page_fragments:install
|
15
|
+
|
16
|
+
this create config/page_fragments.rb when you write you templates
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
PageFragment.templates do
|
20
|
+
#fragment :fragment_type, :fragment_key
|
21
|
+
|
22
|
+
fragment :string, :header
|
23
|
+
fragment :text, :about
|
24
|
+
end
|
25
|
+
```
|
26
|
+
|
27
|
+
After edit templates config you should execute 'rake pf:init'. This create templates in your database.
|
28
|
+
|
29
|
+
And this generator create migration for PageFragment model.
|
30
|
+
Now we have to perform
|
31
|
+
|
32
|
+
$ rake db:migrate
|
33
|
+
|
34
|
+
PageFragments have standard controller and views. You can using own controller inherited from `PageFragments::PageFragmentsController`.
|
35
|
+
After this you should to edit routes.
|
36
|
+
|
37
|
+
It will copy all views to your application:
|
38
|
+
|
39
|
+
$ rails generate page_fragments:views
|
40
|
+
|
41
|
+
## Usage
|
42
|
+
|
43
|
+
In you view:
|
44
|
+
|
45
|
+
```erb
|
46
|
+
<%= render_page_fragment :key_of_fragment %>
|
47
|
+
```
|
48
|
+
|
49
|
+
## Authors
|
50
|
+
|
51
|
+
Promakh Alexandr: s-promakh@ya.ru
|
52
|
+
MyStand: http://mystand.ru/
|
53
|
+
|
54
|
+
MIT License. Copyright 2013 Promakh Alexandr.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module PageFragments
|
2
|
+
class PageFragmentsController < ApplicationController
|
3
|
+
|
4
|
+
def index
|
5
|
+
@page_fragments = PageFragment.all
|
6
|
+
end
|
7
|
+
|
8
|
+
def edit
|
9
|
+
@page_fragment = PageFragment.find(params[:id])
|
10
|
+
end
|
11
|
+
|
12
|
+
def update
|
13
|
+
@page_fragment = PageFragment.find(params[:id])
|
14
|
+
if @page_fragment.update_attributes(params[:page_fragment])
|
15
|
+
redirect_to :action => :index
|
16
|
+
else
|
17
|
+
render :edit
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
module PageFragments
|
2
|
+
class PageFragment < ActiveRecord::Base
|
3
|
+
default_scope where(:hidden => false) if self.column_names.include?('hidden')
|
4
|
+
attr_accessible :key, :content
|
5
|
+
|
6
|
+
KEY_REGEXP = /^[a-z_.]+$/
|
7
|
+
AVAILABLE_CONTENT_TYPES = [:text, :string, :integer]
|
8
|
+
|
9
|
+
before_save :validate
|
10
|
+
|
11
|
+
validates :key, :uniqueness => true, :presence => true, :format => {:with => KEY_REGEXP}
|
12
|
+
|
13
|
+
serialize :validation, Hash
|
14
|
+
|
15
|
+
def self.config &block
|
16
|
+
if PageFragment.table_exists?
|
17
|
+
if PageFragment.column_names.include?('hidden')
|
18
|
+
PageFragment.all.each { |pf| pf.hidden = true; pf.save(:validate => false) }
|
19
|
+
end
|
20
|
+
PageFragment::Configuring.instance_eval(&block)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.get *keys
|
25
|
+
key = PageFragment.parse_key keys.flatten
|
26
|
+
PageFragment.where(:key => key).first || raise(ActiveRecord::RecordNotFound)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.set keys, value
|
30
|
+
item = PageFragment.get(keys)
|
31
|
+
item.content = value
|
32
|
+
item.save
|
33
|
+
item
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_s
|
37
|
+
I18n.t("page_fragments.#{self.key}.name")
|
38
|
+
end
|
39
|
+
|
40
|
+
def parents
|
41
|
+
names = []
|
42
|
+
self.keys.each { |k| names << [names.last, k].join(".") }
|
43
|
+
names
|
44
|
+
end
|
45
|
+
|
46
|
+
def short_name
|
47
|
+
I18n.t("page_fragments.#{self.key}.name")
|
48
|
+
end
|
49
|
+
|
50
|
+
def keys
|
51
|
+
(self.key || "").split(".")
|
52
|
+
end
|
53
|
+
|
54
|
+
def nesting_level
|
55
|
+
self.keys.size
|
56
|
+
end
|
57
|
+
|
58
|
+
def type? target
|
59
|
+
if target.is_a? Array
|
60
|
+
target.map { |t| t.to_s }.include?(self.content_type)
|
61
|
+
else
|
62
|
+
self.content_type == target.to_s
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def self.parse_key *keys
|
69
|
+
keys.flatten.map { |k| k.to_s }.join(".") #its for i18n
|
70
|
+
end
|
71
|
+
|
72
|
+
def validate
|
73
|
+
return if self.new_record?
|
74
|
+
self.validation.each do |name, options|
|
75
|
+
case options
|
76
|
+
when TrueClass
|
77
|
+
options = {}
|
78
|
+
when Hash
|
79
|
+
options
|
80
|
+
when Range, Array
|
81
|
+
options = {:in => options}
|
82
|
+
else
|
83
|
+
options = {:with => options}
|
84
|
+
end
|
85
|
+
options[:attributes] = [:content]
|
86
|
+
begin
|
87
|
+
validator_name = (name.to_s.camelize + "Validator")
|
88
|
+
validator_class = ("ActiveModel::Validations::" + validator_name).constantize
|
89
|
+
rescue
|
90
|
+
raise "can't find validator #{validator_name}"
|
91
|
+
end
|
92
|
+
validator = validator_class.new(options)
|
93
|
+
validator.validate(self)
|
94
|
+
end
|
95
|
+
self.errors.empty?
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
module Configuring
|
100
|
+
#def self.validates options, &block
|
101
|
+
# PageFragment::Configuring.instance_eval(&block)
|
102
|
+
#end
|
103
|
+
|
104
|
+
def self.fragment *args
|
105
|
+
type = args.delete(args.first)
|
106
|
+
params = args.last.is_a?(Hash) ? args.delete(args.last) : {}
|
107
|
+
keys = args.flatten
|
108
|
+
PageFragment::Configuring.init type, keys, params
|
109
|
+
end
|
110
|
+
|
111
|
+
def self.init type, keys, validation
|
112
|
+
key = PageFragment.parse_key keys.flatten
|
113
|
+
item = PageFragment.unscoped.where(:key => key).first || PageFragment.new(:key => key)
|
114
|
+
raise "unexpected type of fragment" unless AVAILABLE_CONTENT_TYPES.include? type
|
115
|
+
item.content_type = type.to_s
|
116
|
+
item.validation = validation
|
117
|
+
item.hidden = false if PageFragment.column_names.include?('hidden')
|
118
|
+
item.save
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
@@ -0,0 +1,11 @@
|
|
1
|
+
= form_for @page_fragment, :as => :page_fragment, :url => url_for(:action => :update, :id => @page_fragment.id) do |f|
|
2
|
+
%fieldset
|
3
|
+
%legend= @page_fragment.short_name
|
4
|
+
|
5
|
+
%div
|
6
|
+
= f.label :content
|
7
|
+
%br
|
8
|
+
= f.text_area :content
|
9
|
+
|
10
|
+
= f.submit "Save"
|
11
|
+
= link_to "Cancel", url_for(:action => :index)
|
data/config/routes.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'rails/generators/active_record'
|
2
|
+
require 'rails/generators/migration'
|
3
|
+
|
4
|
+
module PageFragments
|
5
|
+
module Generators
|
6
|
+
class InstallGenerator < Rails::Generators::Base
|
7
|
+
include Rails::Generators::Migration
|
8
|
+
|
9
|
+
def self.source_root
|
10
|
+
@source_root ||= File.join(File.dirname(__FILE__), 'templates')
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.next_migration_number(dirname)
|
14
|
+
if ActiveRecord::Base.timestamped_migrations
|
15
|
+
Time.new.utc.strftime("%Y%m%d%H%M%S")
|
16
|
+
else
|
17
|
+
"%.3d" % (current_migration_number(dirname) + 1)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def copy_templates
|
22
|
+
copy_file "templates.rb", "config/page_fragments.rb"
|
23
|
+
end
|
24
|
+
|
25
|
+
#def copy_locales
|
26
|
+
# copy_file "page_fragments.en.yml", "config/locales/page_fragments.en.yml"
|
27
|
+
#end
|
28
|
+
|
29
|
+
#def copy_initialize
|
30
|
+
# template "initialize.rb", "config/initializers/page_fragments.rb"
|
31
|
+
#end
|
32
|
+
|
33
|
+
def insert_route
|
34
|
+
route 'resources :page_fragments, :only => [:index, :edit, :update, :destroy], :controller => "page_fragments/page_fragments"'
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_migration_file
|
38
|
+
migration_template 'migration.rb', 'db/migrate/create_page_fragments.rb'
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreatePageFragments < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :page_fragments do |t|
|
4
|
+
t.string :key
|
5
|
+
t.string :content_type
|
6
|
+
t.text :validation
|
7
|
+
t.text :content
|
8
|
+
t.boolean :hidden, :default => false
|
9
|
+
|
10
|
+
t.timestamps
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module PageFragments
|
2
|
+
module Generators
|
3
|
+
class ViewsGenerator < Rails::Generators::Base
|
4
|
+
include Rails::Generators::Migration
|
5
|
+
|
6
|
+
def self.source_root
|
7
|
+
@source_root = File.join(File.dirname(__FILE__), '../../../app/views/page_fragments/page_fragments')
|
8
|
+
end
|
9
|
+
|
10
|
+
def copy_vies
|
11
|
+
copy_file "index.html.haml", "app/views/page_fragments/page_fragments/index.html.haml"
|
12
|
+
copy_file "edit.html.haml", "app/views/page_fragments/page_fragments/edit.html.haml"
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "rails"
|
2
|
+
require "page_fragments/version"
|
3
|
+
|
4
|
+
module PageFragments
|
5
|
+
#def self.config
|
6
|
+
# yield self
|
7
|
+
#end
|
8
|
+
|
9
|
+
def self.templates &block
|
10
|
+
self::PageFragment.config &block
|
11
|
+
end
|
12
|
+
|
13
|
+
class Railtie < Rails::Railtie
|
14
|
+
rake_tasks do
|
15
|
+
load File.join(File.dirname(__FILE__), 'tasks/pf.rake')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class Engine < Rails::Engine
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module ActionDispatch::Routing
|
2
|
+
class Mapper
|
3
|
+
def devise_for(*resources)
|
4
|
+
options = resources.extract_options!
|
5
|
+
|
6
|
+
options[:as] ||= @scope[:as] if @scope[:as].present?
|
7
|
+
options[:module] ||= @scope[:module] if @scope[:module].present?
|
8
|
+
options[:path_prefix] ||= @scope[:path] if @scope[:path].present?
|
9
|
+
options[:path_names] = (@scope[:path_names] || {}).merge(options[:path_names] || {})
|
10
|
+
options[:constraints] = (@scope[:constraints] || {}).merge(options[:constraints] || {})
|
11
|
+
options[:defaults] = (@scope[:defaults] || {}).merge(options[:defaults] || {})
|
12
|
+
options[:options] = @scope[:options] || {}
|
13
|
+
options[:options][:format] = false if options[:format] == false
|
14
|
+
|
15
|
+
resources.map!(&:to_sym)
|
16
|
+
|
17
|
+
resources.each do |resource|
|
18
|
+
mapping = Devise.add_mapping(resource, options)
|
19
|
+
|
20
|
+
begin
|
21
|
+
raise_no_devise_method_error!(mapping.class_name) unless mapping.to.respond_to?(:devise)
|
22
|
+
rescue NameError => e
|
23
|
+
raise unless mapping.class_name == resource.to_s.classify
|
24
|
+
warn "[WARNING] You provided devise_for #{resource.inspect} but there is " <<
|
25
|
+
"no model #{mapping.class_name} defined in your application"
|
26
|
+
next
|
27
|
+
rescue NoMethodError => e
|
28
|
+
raise unless e.message.include?("undefined method `devise'")
|
29
|
+
raise_no_devise_method_error!(mapping.class_name)
|
30
|
+
end
|
31
|
+
|
32
|
+
routes = mapping.used_routes
|
33
|
+
|
34
|
+
devise_scope mapping.name do
|
35
|
+
if block_given?
|
36
|
+
ActiveSupport::Deprecation.warn "Passing a block to devise_for is deprecated. " \
|
37
|
+
"Please remove the block from devise_for (only the block, the call to " \
|
38
|
+
"devise_for must still exist) and call devise_scope :#{mapping.name} do ... end " \
|
39
|
+
"with the block instead", caller
|
40
|
+
yield
|
41
|
+
end
|
42
|
+
|
43
|
+
with_devise_exclusive_scope mapping.fullpath, mapping.name, options do
|
44
|
+
routes.each { |mod| send("devise_#{mod}", mapping, mapping.controllers) }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/tasks/pf.rake
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'page_fragments/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "page_fragments"
|
8
|
+
gem.version = PageFragments::VERSION
|
9
|
+
gem.authors = ["Alexandr Promakh"]
|
10
|
+
gem.email = ["s-promakh@ya.ru"]
|
11
|
+
gem.description = %q{ Storage page fragments in database }
|
12
|
+
gem.summary = gem.description
|
13
|
+
gem.homepage = "http://mystand.ru/"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.require_paths = ["lib"]
|
17
|
+
|
18
|
+
gem.required_ruby_version = ">= 1.9.2"
|
19
|
+
|
20
|
+
gem.license = "MIT"
|
21
|
+
|
22
|
+
gem.add_dependency "haml", "~> 4.0.3"
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: page_fragments
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Alexandr Promakh
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-05-26 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: haml
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 4.0.3
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 4.0.3
|
30
|
+
description: ! ' Storage page fragments in database '
|
31
|
+
email:
|
32
|
+
- s-promakh@ya.ru
|
33
|
+
executables: []
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- .gitignore
|
38
|
+
- Gemfile
|
39
|
+
- LICENSE.txt
|
40
|
+
- README.md
|
41
|
+
- Rakefile
|
42
|
+
- app/controllers/page_fragments/page_fragments_controller.rb
|
43
|
+
- app/helpers/page_fragments/page_fragment_helper.rb
|
44
|
+
- app/models/page_fragments/page_fragment.rb
|
45
|
+
- app/views/page_fragments/page_fragments/edit.html.haml
|
46
|
+
- app/views/page_fragments/page_fragments/index.html.haml
|
47
|
+
- config/routes.rb
|
48
|
+
- lib/generators/page_fragments/install_generator.rb
|
49
|
+
- lib/generators/page_fragments/templates/initialize.rb
|
50
|
+
- lib/generators/page_fragments/templates/migration.rb
|
51
|
+
- lib/generators/page_fragments/templates/page_fragments.en.yml
|
52
|
+
- lib/generators/page_fragments/templates/templates.rb
|
53
|
+
- lib/generators/page_fragments/views_generator.rb
|
54
|
+
- lib/page_fragments.rb
|
55
|
+
- lib/page_fragments/routes.rb
|
56
|
+
- lib/page_fragments/version.rb
|
57
|
+
- lib/tasks/pf.rake
|
58
|
+
- page_fragments.gemspec
|
59
|
+
homepage: http://mystand.ru/
|
60
|
+
licenses:
|
61
|
+
- MIT
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options: []
|
64
|
+
require_paths:
|
65
|
+
- lib
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: 1.9.2
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
requirements: []
|
79
|
+
rubyforge_project:
|
80
|
+
rubygems_version: 1.8.24
|
81
|
+
signing_key:
|
82
|
+
specification_version: 3
|
83
|
+
summary: Storage page fragments in database
|
84
|
+
test_files: []
|