push_type_core 0.1.0.beta3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.md +22 -0
- data/README.md +3 -0
- data/app/controllers/push_type/application_controller.rb +4 -0
- data/app/controllers/push_type/front_end_controller.rb +21 -0
- data/app/fields/push_type/date_field.rb +11 -0
- data/app/fields/push_type/number_field.rb +15 -0
- data/app/fields/push_type/rich_text_field.rb +10 -0
- data/app/fields/push_type/string_field.rb +4 -0
- data/app/fields/push_type/text_field.rb +7 -0
- data/app/helpers/push_type/application_helper.rb +4 -0
- data/app/models/concerns/push_type/field_store.rb +56 -0
- data/app/models/concerns/push_type/nestable.rb +23 -0
- data/app/models/concerns/push_type/templatable.rb +33 -0
- data/app/models/concerns/push_type/trashable.rb +23 -0
- data/app/models/push_type/asset.rb +61 -0
- data/app/models/push_type/node.rb +57 -0
- data/app/models/push_type/user.rb +18 -0
- data/app/views/layouts/push_type/application.html.erb +14 -0
- data/config/initializers/dragonfly.rb +24 -0
- data/config/routes.rb +2 -0
- data/db/migrate/20141117170533_create_push_type_users.rb +12 -0
- data/db/migrate/20141117204630_create_push_type_nodes.rb +24 -0
- data/db/migrate/20141117210644_create_push_type_node_hierarchies.rb +16 -0
- data/db/migrate/20141127151930_create_push_type_assets.rb +18 -0
- data/lib/generators/push_type/dummy/dummy_generator.rb +56 -0
- data/lib/generators/push_type/dummy/templates/application.rb +14 -0
- data/lib/generators/push_type/dummy/templates/boot.rb +4 -0
- data/lib/generators/push_type/dummy/templates/page.rb +6 -0
- data/lib/generators/push_type/install/install_generator.rb +28 -0
- data/lib/generators/push_type/install/templates/push_type.rb +5 -0
- data/lib/generators/push_type/node/USAGE +8 -0
- data/lib/generators/push_type/node/node_generator.rb +12 -0
- data/lib/generators/push_type/node/templates/node.rb +10 -0
- data/lib/generators/push_type/node/templates/template.html.erb +3 -0
- data/lib/push_type/core/engine.rb +24 -0
- data/lib/push_type/core.rb +45 -0
- data/lib/push_type/field_type.rb +40 -0
- data/lib/push_type/rails/routes.rb +19 -0
- data/lib/push_type/testing/common_rake.rb +19 -0
- data/lib/push_type/testing/factories.rb +41 -0
- data/lib/push_type/testing/setup.rb +26 -0
- data/lib/push_type/testing/support/expectations.rb +10 -0
- data/lib/push_type_core.rb +1 -0
- data/lib/tasks/push_type_tasks.rake +4 -0
- data/test/controllers/push_type/front_end_controller_test.rb +31 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +16 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/models/page.rb +10 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/app/views/nodes/page.html.erb +3 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/config/application.rb +14 -0
- data/test/dummy/config/boot.rb +4 -0
- data/test/dummy/config/database.yml +85 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +78 -0
- data/test/dummy/config/environments/test.rb +39 -0
- data/test/dummy/config/initializers/assets.rb +8 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/push_type.rb +5 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +59 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/migrate/20141205213452_create_push_type_users.push_type.rb +13 -0
- data/test/dummy/db/migrate/20141205213453_create_push_type_nodes.push_type.rb +25 -0
- data/test/dummy/db/migrate/20141205213454_create_push_type_node_hierarchies.push_type.rb +17 -0
- data/test/dummy/db/migrate/20141205213455_create_push_type_assets.push_type.rb +19 -0
- data/test/dummy/db/schema.rb +67 -0
- data/test/dummy/db/seeds.rb +7 -0
- data/test/dummy/log/test.log +1234 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/public/robots.txt +5 -0
- data/test/files/audio.m3u +1 -0
- data/test/files/document.pdf +0 -0
- data/test/files/image.png +0 -0
- data/test/files/video.mp4 +0 -0
- data/test/models/push_type/asset_test.rb +63 -0
- data/test/models/push_type/node_test.rb +87 -0
- data/test/models/push_type/user_test.rb +24 -0
- data/test/test_helper.rb +19 -0
- metadata +293 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1e5cfc57c3068c45c73376c6905e192f03321f06
|
4
|
+
data.tar.gz: 04013f98749da8c8a5be4902c7041fbae14c79d5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 291069e98b7024375031e14c0abfd2aec2d01e904c2e24ac9fbb1a011b5f1ca91a04a917c8e85c567f5d267e88599ed3e8d69c08a5fe369903938b3198776ab5
|
7
|
+
data.tar.gz: 7eb951c044e25becd8ce2764713aec11e669b43d4cc5a9308adae8c8ee23063cf3585f7f5c617379878cbeb0eab108c42e75a16268341c26b46a64437ad45fdc
|
data/LICENSE.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# PushType License
|
2
|
+
|
3
|
+
Copyright 2014 Push Code Ltd
|
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,21 @@
|
|
1
|
+
require_dependency "push_type/application_controller"
|
2
|
+
|
3
|
+
module PushType
|
4
|
+
class FrontEndController < ApplicationController
|
5
|
+
|
6
|
+
before_filter :load_node, only: :node
|
7
|
+
|
8
|
+
def node
|
9
|
+
render *@node.template_args
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def load_node
|
15
|
+
@node = PushType::Node.published.find_by_path params[:permalink].split('/')
|
16
|
+
raise ActiveRecord::RecordNotFound unless @node
|
17
|
+
instance_variable_set "@#{ @node.type.underscore }", @node
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module PushType
|
2
|
+
module FieldStore
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
def fields
|
6
|
+
self.class.fields
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
|
11
|
+
attr_reader :fields
|
12
|
+
|
13
|
+
def fields
|
14
|
+
@fields ||= ActiveSupport::OrderedHash.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def field(name, *args)
|
18
|
+
raise ArgumentError if args.size > 2
|
19
|
+
kind, opts = case args.size
|
20
|
+
when 2 then args
|
21
|
+
when 1 then args[0].is_a?(Hash) ? args.insert(0, :string) : args.insert(-1, {})
|
22
|
+
else [ :string, {} ]
|
23
|
+
end
|
24
|
+
|
25
|
+
fields[name] = field_factory(kind).new(name, opts)
|
26
|
+
store_accessor :field_store, name
|
27
|
+
|
28
|
+
validates name, opts[:validates] if opts[:validates]
|
29
|
+
|
30
|
+
override_accessor fields[name]
|
31
|
+
end
|
32
|
+
|
33
|
+
protected
|
34
|
+
|
35
|
+
def field_factory(kind)
|
36
|
+
begin
|
37
|
+
"push_type/#{ kind }_field".camelize.constantize
|
38
|
+
rescue NameError
|
39
|
+
"#{ kind }_field".camelize.constantize
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def override_accessor(f)
|
44
|
+
define_method "#{f.name}=".to_sym do |val|
|
45
|
+
return unless val
|
46
|
+
super f.to_json(val)
|
47
|
+
end
|
48
|
+
define_method f.name do
|
49
|
+
return unless val = super()
|
50
|
+
f.from_json val
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module PushType
|
2
|
+
module Nestable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
def child_node_types
|
6
|
+
self.class.child_node_types
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
|
11
|
+
def child_node_types
|
12
|
+
types = @child_node_types || PushType.config.root_node_types
|
13
|
+
PushType.node_types_from_list(types)
|
14
|
+
end
|
15
|
+
|
16
|
+
def has_child_nodes(*args)
|
17
|
+
@child_node_types = args
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module PushType
|
2
|
+
module Templatable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
def template
|
6
|
+
self.class.template_name
|
7
|
+
end
|
8
|
+
|
9
|
+
def template_args
|
10
|
+
[template, self.class.template_opts.except!(:path, :template)]
|
11
|
+
end
|
12
|
+
|
13
|
+
module ClassMethods
|
14
|
+
|
15
|
+
def template(name, opts = {})
|
16
|
+
@template_opts = opts.merge(template: name)
|
17
|
+
end
|
18
|
+
|
19
|
+
def template_name
|
20
|
+
File.join template_opts[:path], template_opts[:template]
|
21
|
+
end
|
22
|
+
|
23
|
+
def template_opts
|
24
|
+
{
|
25
|
+
path: 'nodes',
|
26
|
+
template: self.name.underscore
|
27
|
+
}.merge(@template_opts || {})
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module PushType
|
2
|
+
module Trashable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
scope :not_trash, -> { where(deleted_at: nil) }
|
7
|
+
scope :trashed, -> { where('deleted_at IS NOT NULL') }
|
8
|
+
end
|
9
|
+
|
10
|
+
def trash!
|
11
|
+
update_attribute :deleted_at, Time.zone.now
|
12
|
+
end
|
13
|
+
|
14
|
+
def restore!
|
15
|
+
update_attribute :deleted_at, nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def trashed?
|
19
|
+
deleted_at.present?
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module PushType
|
2
|
+
class Asset < ActiveRecord::Base
|
3
|
+
|
4
|
+
include PushType::Trashable
|
5
|
+
|
6
|
+
dragonfly_accessor :file
|
7
|
+
|
8
|
+
belongs_to :uploader, class_name: 'PushType::User'
|
9
|
+
|
10
|
+
validates :file, presence: true
|
11
|
+
|
12
|
+
default_scope { order(created_at: :desc) }
|
13
|
+
|
14
|
+
before_create :set_mime_type
|
15
|
+
after_destroy :destroy_file!
|
16
|
+
|
17
|
+
def kind
|
18
|
+
return nil unless file_stored?
|
19
|
+
case mime_type
|
20
|
+
when /\Aaudio\/.*\z/ then :audio
|
21
|
+
when /\Aimage\/.*\z/ then :image
|
22
|
+
when /\Avideo\/.*\z/ then :video
|
23
|
+
else :document
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
[:audio, :image, :video].each do |k|
|
28
|
+
define_method("#{k}?".to_sym) { kind == k }
|
29
|
+
end
|
30
|
+
|
31
|
+
def description_or_file_name
|
32
|
+
description? ? description : file_name
|
33
|
+
end
|
34
|
+
|
35
|
+
def preview_thumb_url(args = ['300x300#'])
|
36
|
+
return nil unless file_stored?
|
37
|
+
if image?
|
38
|
+
file.thumb(*args).url
|
39
|
+
else
|
40
|
+
"push_type/icon-file-#{ kind }.png"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def as_json(options = nil)
|
45
|
+
options = { only: [:id, :file_name, :file_size, :mime_type, :created_at], methods: [:new_record?, :image?, :description_or_file_name, :preview_thumb_url] } if options.empty?
|
46
|
+
super(options)
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def set_mime_type
|
52
|
+
self.file_ext = file.ext
|
53
|
+
self.mime_type = file.mime_type
|
54
|
+
end
|
55
|
+
|
56
|
+
def destroy_file!
|
57
|
+
self.file.destroy!
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module PushType
|
2
|
+
class Node < ActiveRecord::Base
|
3
|
+
|
4
|
+
include PushType::FieldStore
|
5
|
+
include PushType::Nestable
|
6
|
+
include PushType::Templatable
|
7
|
+
include PushType::Trashable
|
8
|
+
|
9
|
+
belongs_to :creator, class_name: 'PushType::User'
|
10
|
+
belongs_to :updater, class_name: 'PushType::User'
|
11
|
+
|
12
|
+
enum status: [ :draft, :published ]
|
13
|
+
|
14
|
+
acts_as_tree name_column: 'slug', order: 'sort_order'
|
15
|
+
|
16
|
+
validates :title, presence: true
|
17
|
+
validates :slug, presence: true, uniqueness: { scope: :parent_id }
|
18
|
+
|
19
|
+
scope :published, -> {
|
20
|
+
not_trash.where(['push_type_nodes.status = ? AND push_type_nodes.published_at <= ?', Node.statuses[:published], Time.zone.now]).
|
21
|
+
where(['push_type_nodes.published_to IS NULL OR push_type_nodes.published_to > ?', Time.zone.now])
|
22
|
+
}
|
23
|
+
|
24
|
+
after_initialize :default_values
|
25
|
+
before_save :set_published_at
|
26
|
+
|
27
|
+
def permalink
|
28
|
+
@permalink ||= self_and_ancestors.map(&:slug).reverse.join('/')
|
29
|
+
end
|
30
|
+
|
31
|
+
def published?
|
32
|
+
super and !scheduled? and !expired?
|
33
|
+
end
|
34
|
+
|
35
|
+
def scheduled?
|
36
|
+
published_at? and published_at > Time.zone.now
|
37
|
+
end
|
38
|
+
|
39
|
+
def expired?
|
40
|
+
published_to? and published_to < Time.zone.now
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def default_values
|
46
|
+
self.status ||= Node.statuses[:draft]
|
47
|
+
end
|
48
|
+
|
49
|
+
def set_published_at
|
50
|
+
case status
|
51
|
+
when 'draft', Node.statuses[:draft] then self.published_at = nil
|
52
|
+
when 'published', Node.statuses[:published] then self.published_at ||= Time.zone.now
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module PushType
|
2
|
+
class User < ActiveRecord::Base
|
3
|
+
|
4
|
+
include PushType::FieldStore
|
5
|
+
|
6
|
+
validates :name, presence: true
|
7
|
+
validates :email, presence: true, uniqueness: true
|
8
|
+
|
9
|
+
default_scope { order(:name) }
|
10
|
+
|
11
|
+
def initials
|
12
|
+
chunks = name ? name.split(' ') : []
|
13
|
+
chunks.slice!(1..-2)
|
14
|
+
chunks.map { |n| n[0] }.join.upcase
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>PushType</title>
|
5
|
+
<%= stylesheet_link_tag "push_type/application", media: "all" %>
|
6
|
+
<%= javascript_include_tag "push_type/application" %>
|
7
|
+
<%= csrf_meta_tags %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<%= yield %>
|
12
|
+
|
13
|
+
</body>
|
14
|
+
</html>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Configure
|
2
|
+
Dragonfly.app.configure do
|
3
|
+
plugin :imagemagick
|
4
|
+
|
5
|
+
secret "6fa0d3bcb6c44e897ca39a48eb86eb6262e4351bd0311674ff350ebaeb08c982"
|
6
|
+
|
7
|
+
url_format "/media/:job/:name"
|
8
|
+
|
9
|
+
datastore :file,
|
10
|
+
root_path: Rails.root.join('public/system/dragonfly', Rails.env),
|
11
|
+
server_root: Rails.root.join('public')
|
12
|
+
end
|
13
|
+
|
14
|
+
# Logger
|
15
|
+
Dragonfly.logger = Rails.logger
|
16
|
+
|
17
|
+
# Mount as middleware
|
18
|
+
Rails.application.middleware.use Dragonfly::Middleware
|
19
|
+
|
20
|
+
# Add model functionality
|
21
|
+
if defined?(ActiveRecord::Base)
|
22
|
+
ActiveRecord::Base.extend Dragonfly::Model
|
23
|
+
ActiveRecord::Base.extend Dragonfly::Model::Validations
|
24
|
+
end
|
data/config/routes.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
class CreatePushTypeUsers < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
enable_extension 'uuid-ossp' unless extension_enabled?('uuid-ossp')
|
4
|
+
create_table :push_type_users, id: :uuid, default: 'uuid_generate_v4()' do |t|
|
5
|
+
t.string :name
|
6
|
+
t.string :email
|
7
|
+
t.json :field_store
|
8
|
+
|
9
|
+
t.timestamps
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class CreatePushTypeNodes < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
enable_extension 'uuid-ossp' unless extension_enabled?('uuid-ossp')
|
4
|
+
create_table :push_type_nodes, id: :uuid, default: 'uuid_generate_v4()' do |t|
|
5
|
+
t.string :type
|
6
|
+
t.string :title
|
7
|
+
t.string :slug
|
8
|
+
t.json :field_store
|
9
|
+
|
10
|
+
t.uuid :parent_id
|
11
|
+
t.integer :sort_order
|
12
|
+
|
13
|
+
t.integer :status
|
14
|
+
t.datetime :published_at
|
15
|
+
t.datetime :published_to
|
16
|
+
|
17
|
+
t.uuid :creator_id
|
18
|
+
t.uuid :updater_id
|
19
|
+
|
20
|
+
t.timestamps
|
21
|
+
t.datetime :deleted_at
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class CreatePushTypeNodeHierarchies < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :push_type_node_hierarchies, id: false do |t|
|
4
|
+
t.uuid :ancestor_id, null: false
|
5
|
+
t.uuid :descendant_id, null: false
|
6
|
+
t.integer :generations, null: false
|
7
|
+
end
|
8
|
+
|
9
|
+
add_index :push_type_node_hierarchies, [:ancestor_id, :descendant_id, :generations],
|
10
|
+
unique: true,
|
11
|
+
name: "anc_desc_idx"
|
12
|
+
|
13
|
+
add_index :push_type_node_hierarchies, [:descendant_id],
|
14
|
+
name: "desc_idx"
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class CreatePushTypeAssets < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
enable_extension 'uuid-ossp' unless extension_enabled?('uuid-ossp')
|
4
|
+
create_table :push_type_assets, id: :uuid, default: 'uuid_generate_v4()' do |t|
|
5
|
+
t.string :file_uid
|
6
|
+
t.string :file_name
|
7
|
+
t.integer :file_size
|
8
|
+
t.string :file_ext
|
9
|
+
t.string :mime_type
|
10
|
+
t.string :description
|
11
|
+
|
12
|
+
t.uuid :uploader_id
|
13
|
+
|
14
|
+
t.timestamps
|
15
|
+
t.datetime :deleted_at
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require "rails/generators/rails/app/app_generator"
|
2
|
+
|
3
|
+
module PushType
|
4
|
+
class PushType::DummyGenerator < Rails::Generators::Base
|
5
|
+
desc "Creates blank Rails application and installs PushType"
|
6
|
+
|
7
|
+
source_root File.expand_path('../templates', __FILE__)
|
8
|
+
|
9
|
+
class_option :lib_name, default: 'push_type_core'
|
10
|
+
class_option :path, default: 'test/dummy'
|
11
|
+
|
12
|
+
def clean_up_test_dummy
|
13
|
+
remove_dir(dummy_path) if File.directory?(dummy_path)
|
14
|
+
end
|
15
|
+
|
16
|
+
PASSTHROUGH_OPTIONS = [
|
17
|
+
:skip_active_record, :skip_javascript, :database, :javascript, :quiet, :pretend, :force, :skip
|
18
|
+
]
|
19
|
+
|
20
|
+
def generate_test_dummy
|
21
|
+
opts = {}.merge(options).slice(*PASSTHROUGH_OPTIONS)
|
22
|
+
opts[:database] = 'postgresql'
|
23
|
+
opts[:force] = true
|
24
|
+
opts[:skip_git] = true
|
25
|
+
opts[:skip_keeps] = true
|
26
|
+
opts[:skip_gemfile] = true
|
27
|
+
opts[:skip_bundle] = true
|
28
|
+
|
29
|
+
puts "Generating dummy Rails application... (#{options[:lib_name]})"
|
30
|
+
invoke Rails::Generators::AppGenerator, [ File.expand_path(dummy_path, destination_root) ], opts
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_dummy_config
|
34
|
+
template 'application.rb', "#{ dummy_path }/config/application.rb", force: true
|
35
|
+
copy_file 'boot.rb', "#{ dummy_path }/config/boot.rb", force: true
|
36
|
+
#copy_file 'page.rb', "#{ dummy_path }/app/models/page.rb", force: true
|
37
|
+
end
|
38
|
+
|
39
|
+
def clean_test_dummy
|
40
|
+
remove_file "#{ dummy_path }/test"
|
41
|
+
remove_file "#{ dummy_path }/vendor"
|
42
|
+
end
|
43
|
+
|
44
|
+
protected
|
45
|
+
|
46
|
+
def dummy_path
|
47
|
+
options[:path]
|
48
|
+
end
|
49
|
+
|
50
|
+
def lib_name
|
51
|
+
options[:lib_name]
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.expand_path('../boot', __FILE__)
|
2
|
+
|
3
|
+
require 'rails/all'
|
4
|
+
|
5
|
+
Bundler.require(*Rails.groups)
|
6
|
+
|
7
|
+
require '<%= lib_name %>'
|
8
|
+
|
9
|
+
module Dummy
|
10
|
+
class Application < Rails::Application
|
11
|
+
config.action_mailer.default_url_options = { host: 'localhost:3000' }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module PushType
|
2
|
+
class PushType::InstallGenerator < Rails::Generators::Base
|
3
|
+
desc "Install and configure PushType for this application"
|
4
|
+
|
5
|
+
source_root File.expand_path('../templates', __FILE__)
|
6
|
+
|
7
|
+
class_option :migrate, type: :boolean, default: true
|
8
|
+
|
9
|
+
def create_push_type_initializer
|
10
|
+
copy_file 'push_type.rb', 'config/initializers/push_type.rb'
|
11
|
+
end
|
12
|
+
|
13
|
+
def inject_push_type_routes
|
14
|
+
inject_into_file 'config/routes.rb', "\n\n mount_push_type\n", after: 'Rails.application.routes.draw do', verbose: true
|
15
|
+
end
|
16
|
+
|
17
|
+
def install_migrations
|
18
|
+
rake 'railties:install:migrations'
|
19
|
+
end
|
20
|
+
|
21
|
+
def run_migrations
|
22
|
+
if options[:migrate]
|
23
|
+
rake 'db:migrate'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module PushType
|
2
|
+
class NodeGenerator < Rails::Generators::NamedBase
|
3
|
+
source_root File.expand_path('../templates', __FILE__)
|
4
|
+
|
5
|
+
def create_model
|
6
|
+
template 'node.rb', "app/models/#{ file_name }.rb"
|
7
|
+
template 'template.html.erb', "app/views/nodes/#{ file_name }.html.erb"
|
8
|
+
end
|
9
|
+
|
10
|
+
hook_for :test_framework, as: :model
|
11
|
+
end
|
12
|
+
end
|