tiny_support 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,56 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module TinySupport
3
+ class << self
4
+ attr_writer :config
5
+
6
+ def config
7
+ @config ||= Config.new
8
+ end
9
+
10
+ def configure
11
+ yield self.config ||= Config.new
12
+ end
13
+ end
14
+
15
+ DEFAULT_UPLOAD_ATTACHMENT_OPTIONS = {
16
+ :storage => :gridfs,
17
+ :gridfs => {
18
+ :database => 'tiny_gridfs',
19
+ :host => '127.0.0.1',
20
+ :port => '27017'
21
+ }
22
+ }.freeze
23
+
24
+ class Config
25
+ def upload_attachment_options= options={}
26
+ @upload_attachment_options ||= DEFAULT_UPLOAD_ATTACHMENT_OPTIONS.merge(options)
27
+ end
28
+
29
+ def upload_attachment_options
30
+ @upload_attachment_options ||= (
31
+ DEFAULT_UPLOAD_ATTACHMENT_OPTIONS
32
+ )
33
+ end
34
+
35
+ def asset_hosts= hosts=[]
36
+ @asset_hosts ||= hosts
37
+ end
38
+
39
+ def asset_hosts
40
+ @asset_hosts ||= []
41
+ end
42
+
43
+ def default_upload_prefix= prefix
44
+ @default_upload_prefix ||= prefix
45
+ end
46
+
47
+ def default_upload_prefix
48
+ @default_upload_prefix ||= "uploads"
49
+ end
50
+
51
+ def rack_upload_max_age
52
+ @rack_upload_max_age ||= 3.years.to_i
53
+ end
54
+
55
+ end
56
+ end
@@ -0,0 +1,7 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module TinySupport
3
+ class Const
4
+ FAMALE = 2 # 女性
5
+ MALE = 1 # 男性
6
+ end
7
+ end
@@ -2,5 +2,9 @@
2
2
  module TinySupport
3
3
  class Engine < ::Rails::Engine
4
4
  isolate_namespace TinySupport
5
+
6
+ initializer "tiny_support.add_middleware" do |app|
7
+ app.middleware.use ::TinySupport::Middlewares::GridFS
8
+ end
5
9
  end
6
10
  end
@@ -0,0 +1,48 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module TinySupport
3
+ class GridFSClient
4
+ attr_reader :gridfs
5
+
6
+ def initialize options={}
7
+ @gridfs_connection = get_database_connection(parse_credentials(options))
8
+ @gridfs = ::Mongo::GridFileSystem.new(@gridfs_connection)
9
+ end
10
+
11
+ def parse_credentials creds
12
+ creds = find_credentials(creds).stringify_keys
13
+ env = ::Object.const_defined?(:Rails) ? ::Rails.env : nil
14
+ (creds[env] || creds).symbolize_keys
15
+ end
16
+
17
+ private
18
+
19
+ #
20
+ # {
21
+ # :database => '',
22
+ # :host => '',
23
+ # :port => '',
24
+ # :username => '',
25
+ # :password => ''
26
+ # }
27
+ #
28
+ def get_database_connection creds
29
+ return creds[:database] if creds[:database].is_a? ::Mongo::DB
30
+ db = ::Mongo::MongoClient.new(creds[:host], creds[:port]).db(creds[:database])
31
+ db.authenticate(creds[:username], creds[:password]) if creds[:username] && creds[:password]
32
+ return db
33
+ end
34
+
35
+ def find_credentials creds
36
+ case creds
37
+ when File
38
+ YAML::load(ERB.new(File.read(creds.path)).result)
39
+ when String, Pathname
40
+ YAML::load(ERB.new(File.read(creds)).result)
41
+ when Hash
42
+ creds
43
+ else
44
+ raise ArgumentError, "Credentials are not a path, file or hash."
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,83 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module TinySupport
3
+ module Middlewares
4
+ class GridFS
5
+ def initialize(app, options={})
6
+ @app = app
7
+ @options = normalize_options(options)
8
+ end
9
+
10
+ def call(env)
11
+ if request_upload?(env)
12
+ with_rescues do
13
+ request = Rack::Request.new(env)
14
+ file = find_file_by_path(request.path_info)
15
+
16
+ response_for(file, request)
17
+ end
18
+ else
19
+ @app.call(env)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def request_upload? env={}
26
+ @options[:hosts].include?(env['HTTP_HOST']) &&
27
+ env['PATH_INFO'].start_with?("/#{@options[:prefix]}")
28
+ end
29
+
30
+ def with_rescues
31
+ rescue_connection_failure { yield }
32
+ rescue Mongo::GridFileNotFound, BSON::InvalidObjectId => e
33
+ [ 404, {'Content-Type' => 'text/plain'}, [] ]
34
+ rescue Mongo::GridError => e
35
+ [ 500, {'Content-Type' => 'text/plain'}, [] ]
36
+ end
37
+
38
+ def rescue_connection_failure(max_retries=2)
39
+ retries = 0
40
+ begin
41
+ yield
42
+ rescue Mongo::ConnectionFailure => e
43
+ retries += 1
44
+ raise e if retries > max_retries
45
+ sleep(0.5)
46
+ retry
47
+ end
48
+ end
49
+
50
+ def response_for(file, request)
51
+ [ 200, headers_of_file(file), file ]
52
+ end
53
+
54
+ def normalize_options(options)
55
+ options.tap do |opts|
56
+ opts[:expires] ||= ::TinySupport.config.rack_upload_max_age
57
+ opts[:prefix] ||= ::TinySupport.config.default_upload_prefix
58
+ opts[:prefix].gsub!(/^\//, '')
59
+ opts[:hosts] ||= ::TinySupport.config.asset_hosts
60
+ end
61
+ end
62
+
63
+ def gridfs
64
+ @gridfs ||= ::TinySupport::GridFSClient.new(::TinySupport.config.upload_attachment_options[:gridfs]).gridfs
65
+ end
66
+
67
+ def find_file_by_path(path)
68
+ gridfs.open(path, "r")
69
+ end
70
+
71
+ def headers_of_file(file)
72
+ {
73
+ 'Content-Type' => file.content_type,
74
+ 'Last-Modified' => file.upload_date.httpdate,
75
+ 'Etag' => file.files_id.to_s,
76
+ "Cache-Control" => "max-age=#{@options[:expires]}, public"
77
+ }
78
+ end
79
+
80
+ end
81
+ end
82
+ end
83
+
@@ -1,4 +1,4 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  module TinySupport
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
data/lib/tiny_support.rb CHANGED
@@ -1,6 +1,46 @@
1
1
  # -*- encoding : utf-8 -*-
2
+ require "active_support"
3
+ require "rails-i18n" # Rails 的国际化
2
4
  require "tiny_support/engine"
5
+ require "tiny_support/config"
6
+ require "tiny_support/const"
7
+ require "tiny_support/action_controller"
8
+ require "tiny_support/gridfs_client"
9
+
10
+ require "tiny_support/active_record/has_avatar_able"
11
+ require "tiny_support/active_record/display_able"
12
+ require "tiny_support/active_record/display_base"
13
+ require "tiny_support/active_record/nested_set"
14
+
15
+ require "tiny_support/middlewares/gridfs"
16
+
17
+ require "tiny_util"
18
+
19
+ require "tiny_captcha"
20
+
21
+ # 用于存放图片的 gridfs
22
+ require "mongo"
23
+ require "bson_ext/cbson"
24
+
25
+ # 用于一些处理图片上传的方法
26
+ require "paperclip"
27
+
28
+ # Nested Set
29
+ # require "awesome_nested_set"
30
+ # require "ancestry"
31
+
32
+ # 增加水印的
33
+ require "paperclip-watermark"
34
+ require "paperclip/storage/gridfs"
3
35
 
4
36
  module TinySupport
5
37
 
6
38
  end
39
+
40
+ if defined?(ActiveRecord::Base)
41
+ ::ActiveRecord::Base.send :include, ::TinySupport::ActiveRecord::HasAvatarAble
42
+ ::ActiveRecord::Base.send :include, ::TinySupport::ActiveRecord::DisplayAble
43
+ # ::ActiveRecord::Base.send :include, ::TinySupport::ActiveRecord::NestedSet
44
+ end
45
+
46
+ I18n.load_path += Dir[Pathname.new(__FILE__).join('..', '..', 'config', 'locales', '**', '*.{rb,yml}').to_s]
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tiny_support
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
5
- prerelease:
4
+ version: 0.0.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - happy
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-11-22 00:00:00.000000000 Z
11
+ date: 2014-01-23 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rails
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - "~>"
20
18
  - !ruby/object:Gem::Version
@@ -22,15 +20,125 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - "~>"
28
25
  - !ruby/object:Gem::Version
29
26
  version: 4.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rails-i18n
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 4.0.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 4.0.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: tiny_util
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: tiny_captcha
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: paperclip
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: paperclip-watermark
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: mongo
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: bson_ext
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: sanitize
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
30
139
  - !ruby/object:Gem::Dependency
31
140
  name: sqlite3
32
141
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
142
  requirements:
35
143
  - - ">="
36
144
  - !ruby/object:Gem::Version
@@ -38,7 +146,6 @@ dependencies:
38
146
  type: :development
39
147
  prerelease: false
40
148
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
149
  requirements:
43
150
  - - ">="
44
151
  - !ruby/object:Gem::Version
@@ -50,118 +157,126 @@ executables: []
50
157
  extensions: []
51
158
  extra_rdoc_files: []
52
159
  files:
160
+ - MIT-LICENSE
161
+ - README.rdoc
162
+ - Rakefile
53
163
  - app/ables/tiny_support/configable.rb
54
- - app/ables/tiny_support/serviceable.rb
55
164
  - app/ables/tiny_support/formable.rb
165
+ - app/ables/tiny_support/serviceable.rb
166
+ - app/assets/javascripts/tiny_support/application.js
167
+ - app/assets/stylesheets/tiny_support/application.css
56
168
  - app/controllers/tiny_support/application_controller.rb
57
169
  - app/helpers/tiny_support/application_helper.rb
58
170
  - app/views/layouts/tiny_support/application.html.erb
59
- - app/assets/stylesheets/tiny_support/application.css
60
- - app/assets/javascripts/tiny_support/application.js
171
+ - app/views/tiny_captcha/_tiny_captcha.erb
172
+ - config/locales/en/tiny_support.en.yml
173
+ - config/locales/zh-CN/tiny_support.zh-CN.yml
61
174
  - config/routes.rb
62
- - lib/tiny_support/version.rb
63
- - lib/tiny_support/engine.rb
64
- - lib/tiny_support.rb
175
+ - db/migrate/20131129224440_create_tiny_captcha_data.rb
176
+ - lib/paperclip/storage/gridfs.rb
65
177
  - lib/tasks/tiny_support_tasks.rake
66
- - MIT-LICENSE
67
- - Rakefile
68
- - README.rdoc
69
- - test/test_helper.rb
70
- - test/integration/navigation_test.rb
178
+ - lib/tiny_support.rb
179
+ - lib/tiny_support/action_controller.rb
180
+ - lib/tiny_support/action_controller/request_init.rb
181
+ - lib/tiny_support/active_record/display_able.rb
182
+ - lib/tiny_support/active_record/display_base.rb
183
+ - lib/tiny_support/active_record/has_avatar_able.rb
184
+ - lib/tiny_support/active_record/nested_set.rb
185
+ - lib/tiny_support/config.rb
186
+ - lib/tiny_support/const.rb
187
+ - lib/tiny_support/engine.rb
188
+ - lib/tiny_support/gridfs_client.rb
189
+ - lib/tiny_support/middlewares/gridfs.rb
190
+ - lib/tiny_support/version.rb
71
191
  - test/dummy/README.rdoc
72
- - test/dummy/config/routes.rb
73
- - test/dummy/config/boot.rb
192
+ - test/dummy/Rakefile
193
+ - test/dummy/app/assets/javascripts/application.js
194
+ - test/dummy/app/assets/stylesheets/application.css
195
+ - test/dummy/app/controllers/application_controller.rb
196
+ - test/dummy/app/helpers/application_helper.rb
197
+ - test/dummy/app/views/layouts/application.html.erb
198
+ - test/dummy/bin/bundle
199
+ - test/dummy/bin/rails
200
+ - test/dummy/bin/rake
201
+ - test/dummy/config.ru
74
202
  - test/dummy/config/application.rb
203
+ - test/dummy/config/boot.rb
204
+ - test/dummy/config/database.yml
205
+ - test/dummy/config/environment.rb
206
+ - test/dummy/config/environments/development.rb
207
+ - test/dummy/config/environments/production.rb
208
+ - test/dummy/config/environments/test.rb
75
209
  - test/dummy/config/initializers/backtrace_silencers.rb
210
+ - test/dummy/config/initializers/filter_parameter_logging.rb
211
+ - test/dummy/config/initializers/inflections.rb
76
212
  - test/dummy/config/initializers/mime_types.rb
77
213
  - test/dummy/config/initializers/secret_token.rb
78
214
  - test/dummy/config/initializers/session_store.rb
79
215
  - test/dummy/config/initializers/wrap_parameters.rb
80
- - test/dummy/config/initializers/inflections.rb
81
- - test/dummy/config/initializers/filter_parameter_logging.rb
82
216
  - test/dummy/config/locales/en.yml
83
- - test/dummy/config/environment.rb
84
- - test/dummy/config/environments/development.rb
85
- - test/dummy/config/environments/test.rb
86
- - test/dummy/config/environments/production.rb
87
- - test/dummy/config/database.yml
88
- - test/dummy/bin/rake
89
- - test/dummy/bin/bundle
90
- - test/dummy/bin/rails
217
+ - test/dummy/config/routes.rb
91
218
  - test/dummy/public/404.html
92
219
  - test/dummy/public/422.html
93
- - test/dummy/public/favicon.ico
94
220
  - test/dummy/public/500.html
95
- - test/dummy/config.ru
96
- - test/dummy/Rakefile
97
- - test/dummy/app/controllers/application_controller.rb
98
- - test/dummy/app/helpers/application_helper.rb
99
- - test/dummy/app/views/layouts/application.html.erb
100
- - test/dummy/app/assets/stylesheets/application.css
101
- - test/dummy/app/assets/javascripts/application.js
221
+ - test/dummy/public/favicon.ico
222
+ - test/integration/navigation_test.rb
223
+ - test/test_helper.rb
102
224
  - test/tiny_support_test.rb
103
225
  homepage: http://github.com/xiuxian123
104
226
  licenses: []
227
+ metadata: {}
105
228
  post_install_message:
106
229
  rdoc_options: []
107
230
  require_paths:
108
231
  - lib
109
232
  required_ruby_version: !ruby/object:Gem::Requirement
110
- none: false
111
233
  requirements:
112
234
  - - ">="
113
235
  - !ruby/object:Gem::Version
114
236
  version: '0'
115
- segments:
116
- - 0
117
- hash: -2785796288651652329
118
237
  required_rubygems_version: !ruby/object:Gem::Requirement
119
- none: false
120
238
  requirements:
121
239
  - - ">="
122
240
  - !ruby/object:Gem::Version
123
241
  version: '0'
124
- segments:
125
- - 0
126
- hash: -2785796288651652329
127
242
  requirements: []
128
243
  rubyforge_project:
129
- rubygems_version: 1.8.25
244
+ rubygems_version: 2.2.1
130
245
  signing_key:
131
- specification_version: 3
246
+ specification_version: 4
132
247
  summary: Summary of TinySupport.
133
248
  test_files:
134
- - test/test_helper.rb
135
- - test/integration/navigation_test.rb
136
- - test/dummy/README.rdoc
137
- - test/dummy/config/routes.rb
138
- - test/dummy/config/boot.rb
249
+ - test/dummy/app/assets/javascripts/application.js
250
+ - test/dummy/app/assets/stylesheets/application.css
251
+ - test/dummy/app/controllers/application_controller.rb
252
+ - test/dummy/app/helpers/application_helper.rb
253
+ - test/dummy/app/views/layouts/application.html.erb
254
+ - test/dummy/bin/bundle
255
+ - test/dummy/bin/rails
256
+ - test/dummy/bin/rake
139
257
  - test/dummy/config/application.rb
258
+ - test/dummy/config/boot.rb
259
+ - test/dummy/config/database.yml
260
+ - test/dummy/config/environment.rb
261
+ - test/dummy/config/environments/development.rb
262
+ - test/dummy/config/environments/production.rb
263
+ - test/dummy/config/environments/test.rb
140
264
  - test/dummy/config/initializers/backtrace_silencers.rb
265
+ - test/dummy/config/initializers/filter_parameter_logging.rb
266
+ - test/dummy/config/initializers/inflections.rb
141
267
  - test/dummy/config/initializers/mime_types.rb
142
268
  - test/dummy/config/initializers/secret_token.rb
143
269
  - test/dummy/config/initializers/session_store.rb
144
270
  - test/dummy/config/initializers/wrap_parameters.rb
145
- - test/dummy/config/initializers/inflections.rb
146
- - test/dummy/config/initializers/filter_parameter_logging.rb
147
271
  - test/dummy/config/locales/en.yml
148
- - test/dummy/config/environment.rb
149
- - test/dummy/config/environments/development.rb
150
- - test/dummy/config/environments/test.rb
151
- - test/dummy/config/environments/production.rb
152
- - test/dummy/config/database.yml
153
- - test/dummy/bin/rake
154
- - test/dummy/bin/bundle
155
- - test/dummy/bin/rails
272
+ - test/dummy/config/routes.rb
273
+ - test/dummy/config.ru
156
274
  - test/dummy/public/404.html
157
275
  - test/dummy/public/422.html
158
- - test/dummy/public/favicon.ico
159
276
  - test/dummy/public/500.html
160
- - test/dummy/config.ru
277
+ - test/dummy/public/favicon.ico
161
278
  - test/dummy/Rakefile
162
- - test/dummy/app/controllers/application_controller.rb
163
- - test/dummy/app/helpers/application_helper.rb
164
- - test/dummy/app/views/layouts/application.html.erb
165
- - test/dummy/app/assets/stylesheets/application.css
166
- - test/dummy/app/assets/javascripts/application.js
279
+ - test/dummy/README.rdoc
280
+ - test/integration/navigation_test.rb
281
+ - test/test_helper.rb
167
282
  - test/tiny_support_test.rb