remotty-rails 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +24 -0
  3. data/Gemfile +18 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +234 -0
  6. data/Rakefile +2 -0
  7. data/app/controllers/remotty/base_application_controller.rb +36 -0
  8. data/app/controllers/remotty/users/base_controller.rb +16 -0
  9. data/app/controllers/remotty/users/confirmations_controller.rb +25 -0
  10. data/app/controllers/remotty/users/omniauth_callbacks_controller.rb +102 -0
  11. data/app/controllers/remotty/users/passwords_controller.rb +47 -0
  12. data/app/controllers/remotty/users/registrations_controller.rb +132 -0
  13. data/app/controllers/remotty/users/sessions_controller.rb +48 -0
  14. data/app/models/remotty/base_user.rb +83 -0
  15. data/app/serializers/remotty/user_serializer.rb +30 -0
  16. data/config/locales/ko.yml +58 -0
  17. data/lib/generators/remotty/rails/install_generator.rb +68 -0
  18. data/lib/generators/remotty/rails/templates/add_column_to_users.rb +42 -0
  19. data/lib/generators/remotty/rails/templates/auth_token.rb +22 -0
  20. data/lib/generators/remotty/rails/templates/create_auth_tokens.rb +28 -0
  21. data/lib/generators/remotty/rails/templates/create_oauth_authentications.rb +28 -0
  22. data/lib/generators/remotty/rails/templates/oauth_authentication.rb +18 -0
  23. data/lib/generators/remotty/rails/templates/paperclip_hash.rb +1 -0
  24. data/lib/generators/remotty/rails/templates/user_serializer.rb +3 -0
  25. data/lib/remotty/rails.rb +8 -0
  26. data/lib/remotty/rails/authentication.rb +6 -0
  27. data/lib/remotty/rails/authentication/json_auth_failure.rb +29 -0
  28. data/lib/remotty/rails/authentication/strategies/token_header_authenticable.rb +71 -0
  29. data/lib/remotty/rails/engine.rb +72 -0
  30. data/lib/remotty/rails/version.rb +5 -0
  31. data/rdoc.sh +3 -0
  32. data/remotty-rails.gemspec +35 -0
  33. metadata +231 -0
@@ -0,0 +1,42 @@
1
+ # User 모델에 이름, 프로필 사진, 메일 인증 관련 컬럼을 추가 migration 파일
2
+ #
3
+ # ==== Columns
4
+ #
5
+ # * +avatar+ - Paperclip style 사용자 프로필 이미지
6
+ # * +name+ - 사용자 이름
7
+ # * +use_password+ - 사용자 패스워드 (일반 회원가입시 +true+, oauth 로그인시 +false+)
8
+ # * +avatar+ - Paperclip style 사용자 프로필 이미지
9
+ # * +confirmation_token+ - Device's confirmation column
10
+ # * +confirmed_at+ - Device's confirmation column
11
+ # * +confirmation_sent_at+ - Device's confirmation column
12
+ # * +unconfirmed_email+ - Device's confirmation column
13
+ #
14
+ class AddColumnToUsers < ActiveRecord::Migration
15
+ def self.up
16
+ add_attachment :users, :avatar
17
+ add_column :users, :name, :string, limit: 50
18
+ add_column :users, :use_password, :boolean
19
+
20
+ add_column :users, :confirmation_token, :string
21
+ add_column :users, :confirmed_at, :datetime
22
+ add_column :users, :confirmation_sent_at , :datetime
23
+ add_column :users, :unconfirmed_email, :string
24
+
25
+ add_index :users, :confirmation_token, :unique => true
26
+ end
27
+
28
+ def self.down
29
+ remove_attachment :users, :avatar
30
+ remove_column :users, :name
31
+ remove_column :users, :use_password
32
+
33
+ remove_index :users, :confirmation_token
34
+
35
+ remove_column :users, :unconfirmed_email
36
+ remove_column :users, :confirmation_sent_at
37
+ remove_column :users, :confirmed_at
38
+ remove_column :users, :confirmation_token
39
+ end
40
+ end
41
+
42
+
@@ -0,0 +1,22 @@
1
+ # Auth Token 모델
2
+ #
3
+ class AuthToken < ActiveRecord::Base
4
+ # relation
5
+ belongs_to :user
6
+
7
+ # validation
8
+ validates :user_id, presence: true
9
+ validates :token, presence: true
10
+ validates :source, presence: true
11
+ validates :source_info, presence: true
12
+
13
+ # source 정보 업데이트
14
+ # 보통 ip가 변경될 경우가 많을듯 하고 변하지 않더라도 최종 갱신시간을 변경함
15
+ def update_source(source, source_info)
16
+ if self.source != source || self.source_info != source_info
17
+ self.update(source: source, source_info: source_info)
18
+ else
19
+ self.touch
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,28 @@
1
+ # Auth Token 모델생성 migration 파일
2
+ #
3
+ # ==== Columns
4
+ #
5
+ # * +user+ - User 모델
6
+ # * +token+ - 인증 토큰
7
+ # * token은 Devise.friendly_token로 생성하고 Digest::SHA512.hexdigest로 암호화하여 저장
8
+ # * +source+ - 토큰 생성자
9
+ # * web(default)
10
+ # * ios
11
+ # * android
12
+ # * ...
13
+ # * +source_info+ - 토큰 생성자 정보
14
+ # * ip(default)
15
+ # * ...
16
+ #
17
+ class CreateAuthTokens < ActiveRecord::Migration
18
+ def change
19
+ create_table :auth_tokens do |t|
20
+ t.references :user, index: true
21
+ t.string :token
22
+ t.string :source
23
+ t.string :source_info
24
+
25
+ t.timestamps
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ # OAuth Authentication 모델생성 migration 파일
2
+ #
3
+ # ==== Columns
4
+ #
5
+ # * +user+ - User 모델
6
+ # * +provider+ - 인증 제공자
7
+ # * facebook
8
+ # * twitter
9
+ # * google
10
+ # * ...
11
+ # * +uid+ - 인증 ID
12
+ # * +access_token+ - access token
13
+ # * +access_token_secret+ - access token secret
14
+ #
15
+ class CreateOauthAuthentications < ActiveRecord::Migration
16
+ def change
17
+ create_table :oauth_authentications do |t|
18
+ t.references :user, index: true
19
+ t.string :provider, index: true
20
+ t.string :uid, index: true
21
+ t.string :access_token
22
+ t.string :access_token_secret
23
+ t.datetime :expires_at
24
+
25
+ t.timestamps
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,18 @@
1
+ # OAuth Authentication 모델
2
+ #
3
+ class OauthAuthentication < ActiveRecord::Base
4
+ # relation
5
+ belongs_to :user
6
+
7
+ # validation
8
+ validates :user_id, presence: true
9
+ validates :provider, presence: true
10
+ validates :uid, presence: true
11
+
12
+ # access_token, access_token_secret, expires 정보 업데이트
13
+ def update_with_credential(credential)
14
+ self.access_token = credential[:token]
15
+ self.access_token_secret = credential[:secret] if credential[:secret]
16
+ self.expires_at = Time.at(credential[:expires_at]).to_datetime if credential[:expires_at]
17
+ end
18
+ end
@@ -0,0 +1 @@
1
+ # The secret key used by Paperclip.
@@ -0,0 +1,3 @@
1
+ # User serializer
2
+ class UserSerializer < Remotty::UserSerializer
3
+ end
@@ -0,0 +1,8 @@
1
+ require 'remotty/rails/version'
2
+
3
+ module Remotty
4
+ module Rails
5
+ require 'remotty/rails/engine' if defined?(Rails)
6
+ require 'remotty/rails/authentication'
7
+ end
8
+ end
@@ -0,0 +1,6 @@
1
+ module Remotty::Rails
2
+ module Authentication
3
+ require 'remotty/rails/authentication/strategies/token_header_authenticable'
4
+ autoload :JsonAuthFailure, 'remotty/rails/authentication/json_auth_failure'
5
+ end
6
+ end
@@ -0,0 +1,29 @@
1
+ module Remotty::Rails
2
+ module Authentication
3
+ # return json Device error occur
4
+ class JsonAuthFailure < ::Devise::FailureApp
5
+ def http_auth_body
6
+ return i18n_message unless request_format
7
+
8
+ method = "to_#{request_format}"
9
+ if method == "to_xml"
10
+ {
11
+ error: {
12
+ code: "UNAUTHORIZED",
13
+ message: i18n_message
14
+ }
15
+ }.to_xml(:root => "errors")
16
+ elsif {}.respond_to?(method)
17
+ {
18
+ error: {
19
+ code: "UNAUTHORIZED",
20
+ message: i18n_message
21
+ }
22
+ }.send(method)
23
+ else
24
+ i18n_message
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,71 @@
1
+ require 'devise'
2
+
3
+ # Request Header의 auth token을 이용한 authentication
4
+ #
5
+ # ==== header
6
+ #
7
+ # +X-Auth-Email+ - e-mail
8
+ # +X-Auth-Token+ - auth token
9
+ # +X-Auth-Device+ - source (web(default)/ios/android/...)
10
+ # +X-Auth-Device-Info+ - source info (ip(default)/...)
11
+ #
12
+ module Remotty::Rails
13
+ module Authentication
14
+ module Strategies
15
+ class TokenHeaderAuthenticable < ::Devise::Strategies::Base
16
+ # use session?
17
+ def store?
18
+ super && !mapping.to.skip_session_storage.include?(:token_header_auth)
19
+ end
20
+
21
+ # 개발일 경우는 email만 있어도 통과! 아니면 email + token header 필요
22
+ def valid?
23
+ header_email && (ENV["RAILS_ENV"] == "development" || header_token)
24
+ end
25
+
26
+ # email에 해당하는 token을 auth_token 테이블에서 확인
27
+ def authenticate!
28
+ resource_scope = mapping.to
29
+ resource = resource_scope.find_by_email(header_email)
30
+
31
+ if resource
32
+ if ENV["RAILS_ENV"] == "development"# && header_token.nil?
33
+ success!(resource)
34
+ else
35
+ auth_token = resource.auth_tokens.where("token = ? and updated_at > ?",
36
+ Digest::SHA512.hexdigest(header_token), mapping.to.remember_for.ago).first
37
+ if auth_token
38
+ auth_token.update_source source, source_info
39
+
40
+ success!(resource)
41
+ else
42
+ fail!
43
+ end
44
+ end
45
+ else
46
+ fail!
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def source
53
+ request.headers["X-Auth-Device"] || 'web'
54
+ end
55
+
56
+ def source_info
57
+ request.headers["X-Auth-Device-Info"] || request.remote_ip
58
+ end
59
+
60
+ def header_email
61
+ request.headers["X-Auth-Email"]
62
+ end
63
+
64
+ def header_token
65
+ request.headers["X-Auth-Token"]
66
+ end
67
+
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,72 @@
1
+ require 'rails'
2
+ require 'rack/cors'
3
+ require 'active_model/serializer'
4
+ require 'active_model/array_serializer'
5
+
6
+ module Remotty::Rails
7
+ # 기본 설정
8
+ #
9
+ # * serializer
10
+ # * root key를 사용하지 않음
11
+ # * wrap parameters
12
+ # * enable for json
13
+ # * paperclip
14
+ # * url => '/system/:class/:attachment/:id_partition/:style/:hash.:extension'
15
+ # * default_url => nil (angular에서 처리)
16
+ # * Devise
17
+ # * skip session storage
18
+ # * use custom view
19
+ # * return json error occur
20
+ # * add token based authentication strategy
21
+ # * CORS
22
+ # * allow all
23
+ # * Rails middleware
24
+ # * Rack::Session::Pool
25
+ # * ActionDispatch::Session::CookieStore, :cookie_only => false, :defer => true
26
+ # * ActionDispatch::Flash
27
+ #
28
+ class Engine < ::Rails::Engine
29
+ initializer '0.remotty.rails.configuration' do |app|
30
+ # active serializer
31
+ ActiveModel::Serializer.root = false
32
+ ActiveModel::ArraySerializer.root = false
33
+
34
+ # wrap parameters
35
+ ActiveSupport.on_load(:action_controller) do
36
+ include ActionController::ParamsWrapper
37
+ wrap_parameters format: [:json] if respond_to?(:wrap_parameters)
38
+ end
39
+
40
+ # paperclip
41
+ Paperclip::Attachment.default_options.update({
42
+ :url => '/system/:class/:attachment/:id_partition/:style/:hash.:extension',
43
+ :default_url => ''
44
+ })
45
+
46
+ # Devise
47
+ Devise.setup do |config|
48
+ config.skip_session_storage = [:http_auth, :token_header_auth, :params_auth]
49
+ config.scoped_views = true
50
+ config.warden do |manager|
51
+ manager.failure_app = Remotty::Rails::Authentication::JsonAuthFailure
52
+ manager.strategies.add :token_header_authenticable, Remotty::Rails::Authentication::Strategies::TokenHeaderAuthenticable
53
+ manager.default_strategies(:scope => :user).unshift :token_header_authenticable
54
+ end
55
+ end
56
+
57
+ # CORS
58
+ ::Rails.application.config.middleware.use Rack::Cors do
59
+ allow do
60
+ origins "*"
61
+ resource "*", :headers => :any, :methods => [:get, :post, :delete, :put, :patch, :options]
62
+ end
63
+ end
64
+
65
+ # session for oauth/devise (no cookie)
66
+ ::Rails.application.config.middleware.use Rack::Session::Pool
67
+ ::Rails.application.config.middleware.use ActionDispatch::Session::CookieStore, :cookie_only => false, :defer => true
68
+ ::Rails.application.config.middleware.use ActionDispatch::Flash
69
+ end
70
+
71
+ end
72
+ end
@@ -0,0 +1,5 @@
1
+ module Remotty
2
+ module Rails
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
data/rdoc.sh ADDED
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+
3
+ rdoc --exclude ./doc
@@ -0,0 +1,35 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'remotty/rails/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "remotty-rails"
8
+ spec.version = Remotty::Rails::VERSION
9
+ spec.authors = ["subicura", "bbugguj"]
10
+ spec.email = ["subicura@subicura.com", "bbugguj@gmail.com"]
11
+ spec.summary = 'rails base package by remotty'
12
+ spec.description = 'token based authentication and more useful library..'
13
+ spec.homepage = "https://github.com/remotty/remotty-rails"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
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 'rack-cors', '>= 0.2.9'
22
+ spec.add_dependency 'active_model_serializers', '>= 0.8.1'
23
+
24
+ spec.add_dependency 'devise', '>= 3.2.4'
25
+ spec.add_dependency 'omniauth-facebook', '>= 1.6.0'
26
+ spec.add_dependency 'omniauth-twitter', '>= 1.0.1'
27
+
28
+ spec.add_dependency 'paperclip', '>= 4.1.1'
29
+ spec.add_dependency 'rmagick', '>= 2.13.2'
30
+ spec.add_dependency 'fog', '>= 1.22.0'
31
+ spec.add_dependency 'open_uri_redirections', '>= 0.1.4'
32
+
33
+ spec.add_development_dependency "bundler", "~> 1.6"
34
+ spec.add_development_dependency "rake"
35
+ end
metadata ADDED
@@ -0,0 +1,231 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: remotty-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - subicura
8
+ - bbugguj
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-05-17 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rack-cors
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: 0.2.9
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: 0.2.9
28
+ - !ruby/object:Gem::Dependency
29
+ name: active_model_serializers
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 0.8.1
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 0.8.1
42
+ - !ruby/object:Gem::Dependency
43
+ name: devise
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: 3.2.4
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: 3.2.4
56
+ - !ruby/object:Gem::Dependency
57
+ name: omniauth-facebook
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 1.6.0
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 1.6.0
70
+ - !ruby/object:Gem::Dependency
71
+ name: omniauth-twitter
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: 1.0.1
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: 1.0.1
84
+ - !ruby/object:Gem::Dependency
85
+ name: paperclip
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: 4.1.1
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: 4.1.1
98
+ - !ruby/object:Gem::Dependency
99
+ name: rmagick
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: 2.13.2
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: 2.13.2
112
+ - !ruby/object:Gem::Dependency
113
+ name: fog
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: 1.22.0
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: 1.22.0
126
+ - !ruby/object:Gem::Dependency
127
+ name: open_uri_redirections
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: 0.1.4
133
+ type: :runtime
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: 0.1.4
140
+ - !ruby/object:Gem::Dependency
141
+ name: bundler
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: '1.6'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: '1.6'
154
+ - !ruby/object:Gem::Dependency
155
+ name: rake
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ description: token based authentication and more useful library..
169
+ email:
170
+ - subicura@subicura.com
171
+ - bbugguj@gmail.com
172
+ executables: []
173
+ extensions: []
174
+ extra_rdoc_files: []
175
+ files:
176
+ - ".gitignore"
177
+ - Gemfile
178
+ - LICENSE.txt
179
+ - README.md
180
+ - Rakefile
181
+ - app/controllers/remotty/base_application_controller.rb
182
+ - app/controllers/remotty/users/base_controller.rb
183
+ - app/controllers/remotty/users/confirmations_controller.rb
184
+ - app/controllers/remotty/users/omniauth_callbacks_controller.rb
185
+ - app/controllers/remotty/users/passwords_controller.rb
186
+ - app/controllers/remotty/users/registrations_controller.rb
187
+ - app/controllers/remotty/users/sessions_controller.rb
188
+ - app/models/remotty/base_user.rb
189
+ - app/serializers/remotty/user_serializer.rb
190
+ - config/locales/ko.yml
191
+ - lib/generators/remotty/rails/install_generator.rb
192
+ - lib/generators/remotty/rails/templates/add_column_to_users.rb
193
+ - lib/generators/remotty/rails/templates/auth_token.rb
194
+ - lib/generators/remotty/rails/templates/create_auth_tokens.rb
195
+ - lib/generators/remotty/rails/templates/create_oauth_authentications.rb
196
+ - lib/generators/remotty/rails/templates/oauth_authentication.rb
197
+ - lib/generators/remotty/rails/templates/paperclip_hash.rb
198
+ - lib/generators/remotty/rails/templates/user_serializer.rb
199
+ - lib/remotty/rails.rb
200
+ - lib/remotty/rails/authentication.rb
201
+ - lib/remotty/rails/authentication/json_auth_failure.rb
202
+ - lib/remotty/rails/authentication/strategies/token_header_authenticable.rb
203
+ - lib/remotty/rails/engine.rb
204
+ - lib/remotty/rails/version.rb
205
+ - rdoc.sh
206
+ - remotty-rails.gemspec
207
+ homepage: https://github.com/remotty/remotty-rails
208
+ licenses:
209
+ - MIT
210
+ metadata: {}
211
+ post_install_message:
212
+ rdoc_options: []
213
+ require_paths:
214
+ - lib
215
+ required_ruby_version: !ruby/object:Gem::Requirement
216
+ requirements:
217
+ - - ">="
218
+ - !ruby/object:Gem::Version
219
+ version: '0'
220
+ required_rubygems_version: !ruby/object:Gem::Requirement
221
+ requirements:
222
+ - - ">="
223
+ - !ruby/object:Gem::Version
224
+ version: '0'
225
+ requirements: []
226
+ rubyforge_project:
227
+ rubygems_version: 2.2.2
228
+ signing_key:
229
+ specification_version: 4
230
+ summary: rails base package by remotty
231
+ test_files: []