the_storages 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in the_storages.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Ilya N. Zykin
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,19 @@
1
+ ## TheStorages
2
+
3
+ Easy file attaching to any AR models
4
+
5
+ ## Installation
6
+
7
+ ```
8
+ gem 'the_storages'
9
+ ```
10
+
11
+ And then execute:
12
+
13
+ ```
14
+ bundle
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ TODO: Write usage instructions here
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,25 @@
1
+ module TheStoragesHelper
2
+ def file_type_icon file
3
+ case
4
+ when file.is_doc? then
5
+ image_tag('doctype/100x100/doc.jpg', :alt=>t('file_types.text_document'), :title=>t('file_types.text_document'))
6
+ when file.is_txt? then
7
+ image_tag('doctype/100x100/txt.jpg', :alt=>t('file_types.text_file'), :title=>t('file_types.text_file'))
8
+ when file.is_ppt? then
9
+ image_tag('doctype/100x100/ppt.jpg', :alt=>t('file_types.presentation'), :title=>t('file_types.presentation'))
10
+ when file.is_xls? then
11
+ image_tag('doctype/100x100/xls.jpg', :alt=>t('file_types.e_table'), :title=>t('file_types.e_table'))
12
+ when file.is_pdf? then
13
+ image_tag('doctype/100x100/pdf.jpg', :alt=>t('file_types.pdf'), :title=>t('file_types.pdf'))
14
+ when file.is_psd? then
15
+ image_tag('doctype/100x100/psd.jpg', :alt=>t('file_types.psd'), :title=>t('file_types.psd'))
16
+ when file.is_media? then
17
+ image_tag('doctype/100x100/media.jpg', :alt=>t('file_types.media'), :title=>t('file_types.media'))
18
+ when file.is_arch? then
19
+ image_tag('doctype/100x100/zip.jpg', :alt=>t('file_types.archive'), :title=>t('file_types.archive'))
20
+ else
21
+ image_tag 'doctype/100x100/default.jpg', :alt=>t('file_types.file'), :title=>t('file_types.file')
22
+ end
23
+ end#fn
24
+
25
+ end
@@ -0,0 +1,36 @@
1
+ module ActAsStorage
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ has_many :uploaded_files, as: :storage
6
+
7
+ before_update :recalculate_files_data
8
+ after_update :recalculate_files_data_for_user
9
+ after_destroy :recalculate_files_data_for_user
10
+ end
11
+
12
+ def recalculate_files_data
13
+ sum = 0
14
+ files = self.uploaded_files.active
15
+
16
+ files.each{ |f| sum += f.file_file_size }
17
+ self.files_size = sum
18
+ self.files_count = files.size
19
+ end
20
+
21
+ def recalculate_files_data_for_user
22
+ user = self.user
23
+ storages = user.storages.active | user.recipes.active | user.pages.active | user.articles.active
24
+ files_size = 0
25
+ files_count = 0
26
+
27
+ storages.each do |s|
28
+ files_size += s.files_size
29
+ files_count += s.files_count
30
+ end
31
+
32
+ user.files_size = files_size
33
+ user.files_count = files_count
34
+ user.save(:validation => false)
35
+ end
36
+ end
@@ -0,0 +1,113 @@
1
+ class UploadedFile < ActiveRecord::Base
2
+ include PublishedObject::InitMethod
3
+ include PublishedObject::BasicStates
4
+
5
+ belongs_to :user
6
+ belongs_to :storage, :polymorphic => true
7
+ acts_as_nested_set :scope => [:user_id, :storage_id, :storage_type]
8
+
9
+ def to_param
10
+ self.zip
11
+ end
12
+
13
+ has_attached_file :file,
14
+ :url => Project::FILE_URL,
15
+ :default_url=>Project::FILE_DEFAULT,
16
+ :styles => { :normal => '600x400#', :std => '270x180#', :small => '100x100#', :mini => '50x50#', :micro => '25x25#' },
17
+ :convert_options => { :all => "-strip" }
18
+
19
+ validates :file_file_name, :uniqueness => {:message => I18n.translate('uploaded_files.uniqueness.file_name'), :scope=>[:user_id, :storage_type, :storage_id]}
20
+ validates_attachment_size :file, :in => 10.bytes..2.megabytes, :message=>I18n.translate('uploaded_files.attachment_size')
21
+
22
+ # FILTERS
23
+ before_validation :generate_file_name
24
+ before_destroy :update_storage
25
+ after_create :update_storage
26
+ after_update :update_storage
27
+
28
+ def update_storage
29
+ self.storage.save
30
+ end
31
+
32
+ def generate_file_name
33
+ #file_name= self.title
34
+ #self.title= self.file_title_filter(self.title)
35
+ extension= File.extname(self.base_file_name).downcase
36
+ file_name= File.basename(self.base_file_name, extension)
37
+ file_name= self.file_name_filter(file_name)
38
+ self.file.instance_write(:file_name, "#{file_name}#{extension}")
39
+ end
40
+
41
+ # functions for FILTERS
42
+ # Russian.translit(' _ Иван _ Иванов ^@#$&№%*«»!?.,:;{}()<>_+|/~ Test ----').text_symbols2dash.underscore2dash.spaces2dash.strip_dashes.downcase
43
+ # => "ivan-ivanov-test"
44
+ def file_name_filter file_name
45
+ return Russian.translit(file_name).text_symbols2dash.remove_quotes.underscore2dash.spaces2dash.strip_dashes.downcase
46
+ end
47
+
48
+ # '«Олимпиада для школьников» и новый год + снегурочка & Dead Moро$O;ff!!!'.text_symbols2dash.spaces2dash.strip_dashes.dashes2space
49
+ # => "Олимпиада для школьников и новый год снегурочка Dead Moро O ff"
50
+ def file_title_filter title
51
+ return title.text_symbols2dash.remove_quotes.spaces2dash.strip_dashes.dashes2space
52
+ end
53
+
54
+ # HELPERS
55
+ def full_filepath
56
+ Project::ADDRESS + self.file.url.split('?').first
57
+ end
58
+
59
+ def to_textile_link
60
+ "\"#{self.file_file_name}\":#{self.full_filepath}"
61
+ end
62
+
63
+ # FILE INFO METHODS
64
+ def base_file_name
65
+ self.file_file_name.to_s
66
+ end
67
+
68
+ def base_file_type
69
+ self.file.content_type
70
+ end
71
+
72
+ # FILE TYPES METHODS
73
+ def is_image?
74
+ ['.gif','.jpeg','.jpg','.pjpeg','.png','.bmp'].include?(File.extname(base_file_name))
75
+ end
76
+
77
+ def need_thumb?
78
+ is_image?
79
+ end
80
+
81
+ def is_doc?
82
+ ['.doc', '.docx'].include?(File.extname(base_file_name))
83
+ end
84
+
85
+ def is_txt?
86
+ ['text/plain'].include?(base_file_type)
87
+ end
88
+
89
+ def is_ppt?
90
+ ['application/vnd.ms-powerpoint', 'application/x-ppt'].include?(base_file_type)
91
+ end
92
+
93
+ def is_xls?
94
+ ['application/vnd.ms-excel'].include?(base_file_type)
95
+ end
96
+
97
+ def is_pdf?
98
+ ['application/pdf'].include?(base_file_type)
99
+ end
100
+
101
+ def is_psd?
102
+ ['.psd'].include?(File.extname(base_file_name))
103
+ end
104
+
105
+ def is_media?
106
+ ['video/x-msvideo','audio/wav','application/x-wmf','video/mpeg','audio/mpeg','audio/mp3'].include?(base_file_type)
107
+ end
108
+
109
+ def is_arch?
110
+ ['.zip','.rar','.gz','.tar'].include?(File.extname(base_file_name))
111
+ end
112
+
113
+ end
@@ -0,0 +1,18 @@
1
+ = hidden_field_tag 'storage_type', storage.class
2
+ = hidden_field_tag 'storage_id', storage.to_param
3
+
4
+ %p
5
+ = f.label :file, t('uploaded_files.form.file')
6
+ = file_field_tag 'files[]', :class => :multi
7
+
8
+ .file_notice
9
+ %ul
10
+ %li= t('uploaded_files.file_size_for_uploading_notice')
11
+ %li= t('uploaded_files.file_foto_for_uploading_notice')
12
+
13
+ = form_buttons_for(uploaded_file)
14
+
15
+ .submit_button
16
+ = submit_tag button, :class => :submit
17
+
18
+ = moderation_buttons_for(uploaded_file)
@@ -0,0 +1,17 @@
1
+ - content_for :gallery_lightbox do
2
+ -# lightbox gallery 0.5
3
+ =javascript_include_tag "/javascripts/gallery/gallery.pack.js"
4
+ :javascript
5
+ $(function(){
6
+ $('a.gallery').lightBox({
7
+ overlayBgColor: '#000',
8
+ overlayOpacity: 0.6,
9
+ imageLoading: '/javascripts/gallery/loading.gif',
10
+ imageBtnClose: '/javascripts/gallery/close.gif',
11
+ imageBtnPrev: '/javascripts/gallery/prev.gif',
12
+ imageBtnNext: '/javascripts/gallery/next.gif',
13
+ containerResizeSpeed: 350,
14
+ txtImage: 'Изображения: ',
15
+ txtOf: 'из'
16
+ });//$('a.gallery')
17
+ });//$(function())
@@ -0,0 +1,41 @@
1
+ - uploaded_files = storage.uploaded_files.reversed_nested_set.active.all.paginate(:page=>params[:page], :per_page=>25)
2
+
3
+ - unless uploaded_files.blank?
4
+ = will_paginate uploaded_files
5
+
6
+ %ul.uploaded_files_list
7
+ - uploaded_files.each do |uploaded_file|
8
+ %li
9
+ .form.overblock
10
+ .upload_file_header
11
+ .icon
12
+ - img = uploaded_file.is_image? ? |
13
+ image_tag(uploaded_file.file.url(:small), :alt=>uploaded_file.file_file_name) : |
14
+ file_type_icon(uploaded_file) |
15
+ = link_to img, uploaded_file.full_filepath, :title=>uploaded_file.title, :class=>(uploaded_file.is_image? ? :gallery : nil )
16
+ .title
17
+ = link_to uploaded_file.file_file_name, uploaded_file.full_filepath, :title=>uploaded_file.title
18
+ .file_size
19
+ = sprintf("%.3f", (uploaded_file.file.size.to_f/1.megabyte.to_f))
20
+ = t('shared.megabytes')
21
+ %p
22
+ %label{:name=>:url}= t('shared.url_address')
23
+ %input{:value=>uploaded_file.full_filepath, :class=>:input}
24
+
25
+ = link_to t('uploaded_files.delete'), uploaded_file_url(uploaded_file, :subdomain=>@user.subdomain), :method=>:delete, :class=>'button delete', :confirm=>t('uploaded_files.delete_confirm')
26
+
27
+ - id = object_id(uploaded_file, 'other_codes_link')
28
+ - fn = "show_other_codes('#{object_id(uploaded_file)}')"
29
+ = link_to_function t('uploaded_files.other_codes'), fn, :class=>:button, :id=>id
30
+
31
+ %div{:id=>object_id(uploaded_file, 'other_codes'), :style=>'display:none;'}
32
+ %p
33
+ %label{:name=>:textile_link}= t('uploaded_files.textile_link')
34
+ %input{:value=>uploaded_file.to_textile_link, :class=>:input}
35
+ %p
36
+ %label{:name=>:center_textile_link}= t('uploaded_files.center_code')
37
+ %input{:value=>'p=. '+uploaded_file.to_textile_link, :class=>:input}
38
+ - fn = "hide_other_codes('#{object_id(uploaded_file)}')"
39
+ = link_to_function t('uploaded_files.hide_other_codes'), fn, :class=>:button
40
+
41
+ = will_paginate uploaded_files
@@ -0,0 +1,36 @@
1
+ - uploaded_file = storage.uploaded_files.new
2
+
3
+ :css
4
+ .file_notice ul{
5
+ margin-bottom:10px;
6
+ padding:5px;
7
+ border:1px dashed red;
8
+ background-color: PeachPuff;
9
+ }
10
+ .file_notice ul li{
11
+ font-weight:bold;
12
+ list-style: disc outside none;
13
+ margin-left: 20px;
14
+ }
15
+ #add_file_link a{
16
+ background-color: PowderBlue;
17
+ font-size: 16pt;
18
+ padding:5px 15px;
19
+ -moz-border-radius:5px;
20
+ border: 1px solid Blue;
21
+ }
22
+ #add_file_link{
23
+ margin-bottom:15px;
24
+ }
25
+
26
+ -#
27
+ #add_file_link
28
+ =link_to_function t('uploaded_files.show_upload_new_file_form'), "$('#upload_file_form').show();$('#add_file_link').hide()"
29
+
30
+ - content_for :js do
31
+ = javascript_include_tag "jqMultiUploads"
32
+
33
+ #upload_file_form.form.overblock{:style => "background: #CCFFCC"}
34
+ = form_for :uploaded_file, :url => uploaded_files_url(:subdomain=>@user.subdomain), :html => { :style => "background: #CCFFCC", :multipart => true, :method=>:post } do |f|
35
+ = render :partial => 'uploaded_files/form', :locals => {:f => f, :uploaded_file=>uploaded_file, :button=>t('uploaded_files.create'), :storage=>storage}
36
+
@@ -0,0 +1,25 @@
1
+ class UploadedFiles < ActiveRecord::Migration
2
+ def change
3
+ create_table :uploaded_files do |t|
4
+ t.integer :user_id
5
+ t.references :storage, polymorphic: true
6
+
7
+ t.string :title, null: false
8
+ t.string :state, default: :active
9
+
10
+ # paperclip
11
+ t.string :file_file_name
12
+ t.string :file_content_type
13
+ t.integer :file_file_size, default: 0
14
+ t.datetime :file_updated_at
15
+
16
+ # nested set
17
+ t.integer :parent_id
18
+ t.integer :lft
19
+ t.integer :rgt
20
+ t.integer :depth, default: 0
21
+
22
+ t.timestamps
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,15 @@
1
+ class ChangeStorages < ActiveRecord::Migration
2
+ def change
3
+ change_table :users do |t|
4
+ t.integer :storages_files_count, default: 0
5
+ t.integer :storages_files_size, default: 0
6
+ end
7
+
8
+ # [:users, :pages, :posts, :articles, :recipes, :blogs, :notes, :hubs].each do |table_name|
9
+ # change_table table_name do |t|
10
+ # t.integer :storage_files_count, default: 0
11
+ # t.integer :storage_files_size, default: 0
12
+ # end
13
+ # end
14
+ end
15
+ end
@@ -0,0 +1,33 @@
1
+ Description:
2
+ TheStorages generator will copy files for organize comment's tree in your web project
3
+
4
+ This text:
5
+ bundle exec rails g the_storages --help
6
+
7
+ Generators:
8
+ bundle exec rails g the_storages install
9
+
10
+ This will create:
11
+ config/initializers/the_storages.rb
12
+
13
+ app/models/ip_black_list.rb
14
+ app/models/user_agent_black_list.rb
15
+
16
+ app/controllers/comments_controller.rb
17
+ app/controllers/ip_black_lists_controller.rb
18
+ app/controllers/user_agent_black_lists_controller.rb
19
+
20
+ bundle exec rails g the_storages controllers
21
+
22
+ This will create:
23
+ app/controllers/comments_controller.rb
24
+ app/controllers/ip_black_lists_controller.rb
25
+ app/controllers/user_agent_black_lists_controller.rb
26
+
27
+ View Generators:
28
+ bundle exec rails g the_storages:views assets
29
+ bundle exec rails g the_storages:views helper
30
+ bundle exec rails g the_storages:views views
31
+
32
+ Migrations:
33
+ bundle exec rake the_storages_engine:install:migrations
@@ -0,0 +1,40 @@
1
+ class TheStoragesGenerator < Rails::Generators::NamedBase
2
+ source_root File.expand_path('../templates', __FILE__)
3
+ # argument :xname, type: :string, default: :xname
4
+
5
+ def generate_controllers
6
+ if gen_name == 'install'
7
+ cp_setup
8
+ cp_models
9
+ cp_controllers
10
+ elsif gen_name == 'controllers'
11
+ cp_controllers
12
+ elsif gen_name == 'models'
13
+ cp_models
14
+ else
15
+ puts 'TheStorages Generator - wrong Name'
16
+ puts 'Try to use [install|controllers]'
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def gen_name
23
+ name.to_s.downcase
24
+ end
25
+
26
+ def cp_setup
27
+ copy_file 'the_comments.rb', 'config/initializers/the_comments.rb'
28
+ end
29
+
30
+ def cp_models
31
+ copy_file 'ip_black_list.rb', 'app/models/ip_black_list.rb'
32
+ copy_file 'user_agent_black_list.rb', 'app/models/user_agent_black_list.rb'
33
+ end
34
+
35
+ def cp_controllers
36
+ copy_file 'comments_controller.rb', 'app/controllers/comments_controller.rb'
37
+ copy_file 'ip_black_lists_controller.rb', 'app/controllers/ip_black_lists_controller.rb'
38
+ copy_file 'user_agent_black_lists_controller.rb', 'app/controllers/user_agent_black_lists_controller.rb'
39
+ end
40
+ end
@@ -0,0 +1,43 @@
1
+ module TheStorages
2
+ module Generators
3
+ class ViewsGenerator < Rails::Generators::NamedBase
4
+ source_root File.expand_path('../../../../app/views', __FILE__)
5
+
6
+ def self.banner
7
+ <<-BANNER.chomp
8
+
9
+ bundle exec rails g the_storages:views assets
10
+ bundle exec rails g the_storages:views views
11
+ bundle exec rails g the_storages:views helper
12
+
13
+ BANNER
14
+ end
15
+
16
+ def copy_sortable_tree_files
17
+ copy_gem_files
18
+ end
19
+
20
+ private
21
+
22
+ def param_name
23
+ name.downcase
24
+ end
25
+
26
+ def copy_gem_files
27
+ # if param_name == 'assets'
28
+ # copy_file "../assets/javascripts/the_storages", "app/assets/javascripts/the_storages"
29
+ # copy_file "../assets/stylesheets/the_storages", "app/assets/stylesheets/the_storages"
30
+ # elsif param_name == 'views'
31
+ # directory "../views/the_storages", "app/views/the_storages"
32
+ # directory "../views/ip_black_lists", "app/views/ip_black_lists"
33
+ # directory "../views/user_agent_black_lists", "app/views/user_agent_black_lists"
34
+ # elsif param_name == 'helper'
35
+ # copy_file "../helpers/render_comments_tree_helper.rb", "app/helpers/render_comments_tree_helper.rb"
36
+ # else
37
+ # puts "Wrong params - use only [assets | views | helper] values"
38
+ # end
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,5 @@
1
+ require "the_storages/version"
2
+
3
+ module TheStorages
4
+ class Engine < Rails::Engine; end
5
+ end
@@ -0,0 +1,3 @@
1
+ module TheStorages
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'the_storages/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "the_storages"
8
+ spec.version = TheStorages::VERSION
9
+ spec.authors = ["Ilya N. Zykin"]
10
+ spec.email = ["zykin-ilya@ya.ru"]
11
+ spec.description = %q{TheStorages - act as file storage }
12
+ spec.summary = %q{easy file attaching to any AR Model}
13
+ spec.homepage = "https://github.com/the-teacher"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ # spec.add_dependency 'paperclip'
22
+ spec.add_dependency 'state_machine'
23
+ spec.add_dependency 'the_sortable_tree'
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.3"
26
+ spec.add_development_dependency "rake"
27
+ end
metadata ADDED
@@ -0,0 +1,110 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: the_storages
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ilya N. Zykin
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-30 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: state_machine
16
+ requirement: &76205340 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *76205340
25
+ - !ruby/object:Gem::Dependency
26
+ name: the_sortable_tree
27
+ requirement: &76205130 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *76205130
36
+ - !ruby/object:Gem::Dependency
37
+ name: bundler
38
+ requirement: &76204870 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: '1.3'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *76204870
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: &76204660 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *76204660
58
+ description: ! 'TheStorages - act as file storage '
59
+ email:
60
+ - zykin-ilya@ya.ru
61
+ executables: []
62
+ extensions: []
63
+ extra_rdoc_files: []
64
+ files:
65
+ - .gitignore
66
+ - Gemfile
67
+ - LICENSE.txt
68
+ - README.md
69
+ - Rakefile
70
+ - app/helpers/the_storages_helper.rb
71
+ - app/models/concerns/act_as_storage.rb
72
+ - app/models/uploaded_file.rb
73
+ - app/views/the_storages/_form.haml
74
+ - app/views/the_storages/_lightbox_init.haml
75
+ - app/views/the_storages/_list.haml
76
+ - app/views/the_storages/_new.haml
77
+ - db/migrate/20130101010101_uploaded_files.rb
78
+ - db/migrate/20130101010102_change_storages.rb
79
+ - lib/generators/the_storages/USAGE
80
+ - lib/generators/the_storages/the_storages_generator.rb
81
+ - lib/generators/the_storages/views_generator.rb
82
+ - lib/the_storages.rb
83
+ - lib/the_storages/version.rb
84
+ - the_storages.gemspec
85
+ homepage: https://github.com/the-teacher
86
+ licenses:
87
+ - MIT
88
+ post_install_message:
89
+ rdoc_options: []
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ! '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ requirements: []
105
+ rubyforge_project:
106
+ rubygems_version: 1.8.15
107
+ signing_key:
108
+ specification_version: 3
109
+ summary: easy file attaching to any AR Model
110
+ test_files: []