remotty-rails 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.
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: []