tiny_support 0.0.1 → 0.0.2

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.
@@ -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