Commit cce95085b60147dca5e5d3d3fe77bed193b1578b
1 parent
3ffe1796
Exists in
master
and in
20 other branches
rails4.1: upgrade will_paginate, delayed_job and attachment_fu
Showing
142 changed files
with
6 additions
and
9253 deletions
Show diff stats
Too many changes.
To preserve performance only 100 of 142 files displayed.
Gemfile
1 | 1 | source "https://rubygems.org" |
2 | -gem 'rails', '~> 4.0' | |
2 | +gem 'rails', '~> 4.1' | |
3 | 3 | gem 'minitest', '~> 3.2.0' |
4 | 4 | gem 'fast_gettext', '~> 0.6.8' |
5 | 5 | gem 'acts-as-taggable-on', '~> 3.4.2' |
... | ... | @@ -7,11 +7,14 @@ gem 'rails_autolink', '~> 1.1.5' |
7 | 7 | gem 'pg', '~> 0.13.2' |
8 | 8 | gem 'rmagick', '~> 2.13.1' |
9 | 9 | gem 'RedCloth', '~> 4.2.9' |
10 | -gem 'will_paginate', '~> 3.0.3' | |
11 | 10 | gem 'ruby-feedparser', '~> 0.7' |
12 | 11 | gem 'daemons', '~> 1.1.5' |
13 | 12 | gem 'thin', '~> 1.3.1' |
14 | 13 | gem 'nokogiri', '~> 1.5.5' |
14 | +gem 'will_paginate' | |
15 | +gem 'pothoven-attachment_fu' | |
16 | +gem 'delayed_job' | |
17 | +gem 'delayed_job_active_record' | |
15 | 18 | gem 'rake', :require => false |
16 | 19 | gem 'rest-client', '~> 1.6.7' |
17 | 20 | gem 'exception_notification', '~> 4.0.1' |
... | ... | @@ -30,6 +33,7 @@ gem 'rails-observers' |
30 | 33 | gem 'actionpack-page_caching' |
31 | 34 | gem 'actionpack-action_caching' |
32 | 35 | gem 'activerecord-session_store' |
36 | +gem 'activerecord-deprecated_finders', require: 'active_record/deprecated_finders' | |
33 | 37 | |
34 | 38 | |
35 | 39 | # FIXME list here all actual dependencies (i.e. the ones in debian/control), | ... | ... |
vendor/plugins/delayed_job/.rspec
vendor/plugins/delayed_job/.travis.yml
... | ... | @@ -1,22 +0,0 @@ |
1 | -language: ruby | |
2 | -only: | |
3 | - - master | |
4 | -rvm: | |
5 | - - jruby-19mode | |
6 | - - rbx-19mode | |
7 | - - 1.9.2 | |
8 | - - 1.9.3 | |
9 | - - 2.0.0 | |
10 | -env: | |
11 | - matrix: | |
12 | - - "RAILS_VERSION=\"~> 3.0.0\"" | |
13 | - - "RAILS_VERSION=\"~> 3.1.0\"" | |
14 | - - "RAILS_VERSION=\"~> 3.2.0\"" | |
15 | - - "RAILS_VERSION=\"~> 4.0.0\"" | |
16 | -matrix: | |
17 | - exclude: | |
18 | - - rvm: 1.9.2 | |
19 | - env: "RAILS_VERSION=\"~> 4.0.0\"" | |
20 | - allow_failures: | |
21 | - - rvm: jruby-19mode | |
22 | - - rvm: rbx-19mode | |
23 | 0 | \ No newline at end of file |
vendor/plugins/delayed_job/CHANGELOG.md
... | ... | @@ -1,170 +0,0 @@ |
1 | -4.0.0 - 2013-07-30 | |
2 | -================== | |
3 | -* Rails 4 compatibility | |
4 | -* Reverted threaded startup due to daemons incompatibilities | |
5 | -* Attempt to recover from job reservation errors | |
6 | - | |
7 | -4.0.0.beta2 - 2013-05-28 | |
8 | -======================== | |
9 | -* Rails 4 compatibility | |
10 | -* Threaded startup script for faster multi-worker startup | |
11 | -* YAML compatibility changes | |
12 | -* Added jobs:check rake task | |
13 | - | |
14 | -4.0.0.beta1 - 2013-03-02 | |
15 | -======================== | |
16 | -* Rails 4 compatibility | |
17 | - | |
18 | -3.0.5 - 2013-01-28 | |
19 | -================== | |
20 | -* Better job timeout error logging | |
21 | -* psych support for delayed_job_data_mapper deserialization | |
22 | -* User can configure the worker to raise a SignalException on TERM and/or INT | |
23 | -* Add the ability to run all available jobs and exit when complete | |
24 | - | |
25 | -3.0.4 - 2012-11-09 | |
26 | -================== | |
27 | -* Allow the app to specify a default queue name | |
28 | -* Capistrano script now allows user to specify the DJ command, allowing the user to add "bundle exec" if necessary | |
29 | -* Persisted record check is now more general | |
30 | - | |
31 | -3.0.3 - 2012-05-25 | |
32 | -================== | |
33 | -* Fix a bug where the worker would not respect the exit condition | |
34 | -* Properly handle sleep delay command line argument | |
35 | - | |
36 | -3.0.2 - 2012-04-02 | |
37 | -================== | |
38 | -* Fix deprecation warnings | |
39 | -* Raise ArgumentError if attempting to enqueue a performable method on an object that hasn't been persisted yet | |
40 | -* Allow the number of jobs read at a time to be configured from the command line using --read-ahead | |
41 | -* Allow custom logger to be configured through Delayed::Worker.logger | |
42 | -* Various documentation improvements | |
43 | - | |
44 | -3.0.1 - 2012-01-24 | |
45 | -================== | |
46 | -* Added RecordNotFound message to deserialization error | |
47 | -* Direct JRuby's yecht parser to syck extensions | |
48 | -* Updated psych extensions for better compatibility with ruby 1.9.2 | |
49 | -* Updated syck extension for increased compatibility with class methods | |
50 | -* Test grooming | |
51 | - | |
52 | -3.0.0 - 2011-12-30 | |
53 | -================== | |
54 | -* New: Named queues | |
55 | -* New: Job/Worker lifecycle callbacks | |
56 | -* Change: daemons is no longer a runtime dependency | |
57 | -* Change: Active Record backend support is provided by a separate gem | |
58 | -* Change: Enqueue hook is called before jobs are saved so that they may be modified | |
59 | -* Fix problem deserializing models that use a custom primary key column | |
60 | -* Fix deserializing AR models when the object isn't in the default scope | |
61 | -* Fix hooks not getting called when delay_jobs is false | |
62 | - | |
63 | -2.1.4 - 2011-02-11 | |
64 | -================== | |
65 | -* Working around issues when psych is loaded, fixes issues with bundler 1.0.10 and Rails 3.0.4 | |
66 | -* Added -p/--prefix option to help differentiate multiple delayed job workers on the same host. | |
67 | - | |
68 | -2.1.3 - 2011-01-20 | |
69 | -================== | |
70 | -* Revert worker contention fix due to regressions | |
71 | -* Added Delayed::Worker.delay_jobs flag to support running jobs immediately | |
72 | - | |
73 | -2.1.2 - 2010-12-01 | |
74 | -================== | |
75 | -* Remove contention between multiple workers by performing an update to lock a job before fetching it | |
76 | -* Job payloads may implement #max_attempts to control how many times it should be retried | |
77 | -* Fix for loading ActionMailer extension | |
78 | -* Added 'delayed_job_server_role' Capistrano variable to allow delayed_job to run on its own worker server | |
79 | - set :delayed_job_server_role, :worker | |
80 | -* Fix `rake jobs:work` so it outputs to the console | |
81 | - | |
82 | -2.1.1 - 2010-11-14 | |
83 | -================== | |
84 | -* Fix issue with worker name not getting properly set when locking a job | |
85 | -* Fixes for YAML serialization | |
86 | - | |
87 | -2.1.0 - 2010-11-14 | |
88 | -================== | |
89 | -* Added enqueue, before, after, success, error, and failure. See the README | |
90 | -* Remove Merb support | |
91 | -* Remove all non Active Record backends into separate gems. See https://github.com/collectiveidea/delayed_job/wiki/Backends | |
92 | -* remove rails 2 support. delayed_job 2.1 will only support Rails 3 | |
93 | -* New pure-YAML serialization | |
94 | -* Added Rails 3 railtie and generator | |
95 | -* Changed @@sleep_delay to self.class.sleep_delay to be consistent with other class variable usage | |
96 | -* Added --sleep-delay command line option | |
97 | - | |
98 | -2.0.8 - Unreleased | |
99 | -================== | |
100 | -* Backport fix for deserialization errors that bring down the daemon | |
101 | - | |
102 | -2.0.7 - 2011-02-10 | |
103 | -================== | |
104 | -* Fixed missing generators and recipes for Rails 2.x | |
105 | - | |
106 | -2.0.6 - 2011-01-20 | |
107 | -================== | |
108 | -* Revert worker contention fix due to regressions | |
109 | - | |
110 | -2.0.5 - 2010-12-01 | |
111 | -================== | |
112 | -* Added #reschedule_at hook on payload to determine when the job should be rescheduled [backported from 2.1] | |
113 | -* Added --sleep-delay command line option [backported from 2.1] | |
114 | -* Added 'delayed_job_server_role' Capistrano variable to allow delayed_job to run on its own worker server | |
115 | - set :delayed_job_server_role, :worker | |
116 | -* Changed AR backend to reserve jobs using an UPDATE query to reduce worker contention [backported from 2.1] | |
117 | - | |
118 | -2.0.4 - 2010-11-14 | |
119 | -================== | |
120 | -* Fix issue where dirty tracking prevented job from being properly unlocked | |
121 | -* Add delayed_job_args variable for Capistrano recipe to allow configuration of started workers (e.g. "-n 2 --max-priority 10") | |
122 | -* Added options to handle_asynchronously | |
123 | -* Added Delayed::Worker.default_priority | |
124 | -* Allow private methods to be delayed | |
125 | -* Fixes for Ruby 1.9 | |
126 | -* Added -m command line option to start a monitor process | |
127 | -* normalize logging in worker | |
128 | -* Deprecate #send_later and #send_at in favor of new #delay method | |
129 | -* Added @#delay@ to Object that allows you to delay any method and pass options: | |
130 | - options = {:priority => 19, :run_at => 5.minutes.from_now} | |
131 | - UserMailer.delay(options).deliver_confirmation(@user) | |
132 | - | |
133 | -2.0.3 - 2010-04-16 | |
134 | -================== | |
135 | -* Fix initialization for Rails 2.x | |
136 | - | |
137 | -2.0.2 - 2010-04-08 | |
138 | -================== | |
139 | -* Fixes to Mongo Mapper backend [ "14be7a24":http://github.com/collectiveidea/delayed_job/commit/14be7a24, "dafd5f46":http://github.com/collectiveidea/delayed_job/commit/dafd5f46, "54d40913":http://github.com/collectiveidea/delayed_job/commit/54d40913 ] | |
140 | -* DataMapper backend performance improvements [ "93833cce":http://github.com/collectiveidea/delayed_job/commit/93833cce, "e9b1573e":http://github.com/collectiveidea/delayed_job/commit/e9b1573e, "37a16d11":http://github.com/collectiveidea/delayed_job/commit/37a16d11, "803f2bfa":http://github.com/collectiveidea/delayed_job/commit/803f2bfa ] | |
141 | -* Fixed Delayed::Command to create tmp/pids directory [ "8ec8ca41":http://github.com/collectiveidea/delayed_job/commit/8ec8ca41 ] | |
142 | -* Railtie to perform Rails 3 initialization [ "3e0fc41f":http://github.com/collectiveidea/delayed_job/commit/3e0fc41f ] | |
143 | -* Added on_permanent_failure hook [ "d2f14cd6":http://github.com/collectiveidea/delayed_job/commit/d2f14cd6 ] | |
144 | - | |
145 | -2.0.1 - 2010-04-03 | |
146 | -================== | |
147 | -* Bug fix for using ActiveRecord backend with daemon [martinbtt] | |
148 | - | |
149 | -2.0.0 - 2010-04-03 | |
150 | -================== | |
151 | -* Multiple backend support (See README for more details) | |
152 | -* Added MongoMapper backend [zbelzer, moneypools] | |
153 | -* Added DataMapper backend [lpetre] | |
154 | -* Reverse priority so the jobs table can be indexed. Lower numbers have higher priority. The default priority is 0, so increase it for jobs that are not important. | |
155 | -* Move most of the heavy lifting from Job to Worker (#work_off, #reschedule, #run, #min_priority, #max_priority, #max_run_time, #max_attempts, #worker_name) [albus522] | |
156 | -* Remove EvaledJob. Implement your own if you need this functionality. | |
157 | -* Only use Time.zone if it is set. Closes #20 | |
158 | -* Fix for last_error recording when destroy_failed_jobs = false, max_attempts = 1 | |
159 | -* Implemented worker name_prefix to maintain dynamic nature of pid detection | |
160 | -* Some Rails 3 compatibility fixes [fredwu] | |
161 | - | |
162 | -1.8.5 - 2010-03-15 | |
163 | -================== | |
164 | -* Set auto_flushing=true on Rails logger to fix logging in production | |
165 | -* Fix error message when trying to send_later on a method that doesn't exist | |
166 | -* Don't use rails_env in capistrano if it's not set. closes #22 | |
167 | -* Delayed job should append to delayed_job.log not overwrite | |
168 | -* Version bump to 1.8.5 | |
169 | -* fixing Time.now to be Time.zone.now if set to honor the app set local TimeZone | |
170 | -* Replaced @Worker::SLEEP@, @Job::MAX_ATTEMPTS@, and @Job::MAX_RUN_TIME@ with class methods that can be overridden. |
vendor/plugins/delayed_job/CONTRIBUTING.md
... | ... | @@ -1,27 +0,0 @@ |
1 | -How to contribute | |
2 | -================= | |
3 | - | |
4 | -If you find what looks like a bug: | |
5 | - | |
6 | -* Search the "mailing list":http://groups.google.com/group/delayed_job to see | |
7 | - if anyone else had the same issue. | |
8 | -* Check the "GitHub issue tracker":http://github.com/collectiveidea/delayed_job/issues/ | |
9 | - to see if anyone else has reported issue. | |
10 | -* Make sure you are using the latest version of delayed_job | |
11 | -  | |
12 | -* Make sure you are using the latest backend gem for delayed_job | |
13 | - * Active Record  | |
14 | - * Mongoid  | |
15 | -* If you are still having an issue, create an issue including: | |
16 | - * Ruby version | |
17 | - * Gemfile.lock contents or at least major gem versions, such as Rails version | |
18 | - * Steps to reproduce the issue | |
19 | - * Full backtrace for any errors encountered | |
20 | - | |
21 | -If you want to contribute an enhancement or a fix: | |
22 | - | |
23 | -* Fork the project on GitHub. | |
24 | -* Make your changes with tests. | |
25 | -* Commit the changes without making changes to the Rakefile or any other files | |
26 | - that aren't related to your enhancement or fix. | |
27 | -* Send a pull request. |
vendor/plugins/delayed_job/Gemfile
... | ... | @@ -1,22 +0,0 @@ |
1 | -source 'https://rubygems.org' | |
2 | - | |
3 | -gem 'rake' | |
4 | - | |
5 | -platforms :ruby do | |
6 | - gem 'sqlite3' | |
7 | -end | |
8 | - | |
9 | -platforms :jruby do | |
10 | - gem 'jruby-openssl' | |
11 | - gem 'activerecord-jdbcsqlite3-adapter' | |
12 | -end | |
13 | - | |
14 | -group :test do | |
15 | - gem 'activerecord', (ENV['RAILS_VERSION'] || ['>= 3.0', '< 4.1']) | |
16 | - gem 'actionmailer', (ENV['RAILS_VERSION'] || ['>= 3.0', '< 4.1']) | |
17 | - gem 'coveralls', :require => false | |
18 | - gem 'rspec', '>= 2.11' | |
19 | - gem 'simplecov', :require => false | |
20 | -end | |
21 | - | |
22 | -gemspec |
vendor/plugins/delayed_job/LICENSE.md
... | ... | @@ -1,20 +0,0 @@ |
1 | -Copyright (c) 2005 Tobias Lütke | |
2 | - | |
3 | -Permission is hereby granted, free of charge, to any person obtaining | |
4 | -a copy of this software and associated documentation files (the | |
5 | -"Software"), to deal in the Software without restriction, including | |
6 | -without limitation the rights to use, copy, modify, merge, publish, | |
7 | -distribute, sublicense, and/or sell copies of the Software, and to | |
8 | -permit persons to whom the Software is furnished to do so, subject to | |
9 | -the following conditions: | |
10 | - | |
11 | -The above copyright notice and this permission notice shall be | |
12 | -included in all copies or substantial portions of the Software. | |
13 | - | |
14 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
15 | -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
16 | -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOa AND | |
17 | -NONINFRINGEMENT. IN NO EVENT SaALL THE AUTHORS OR COPYRIGHT HOLDERS BE | |
18 | -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | |
19 | -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |
20 | -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
vendor/plugins/delayed_job/README.md
... | ... | @@ -1,346 +0,0 @@ |
1 | -Delayed::Job | |
2 | -============ | |
3 | -[][gem] | |
4 | -[][travis] | |
5 | -[][gemnasium] | |
6 | -[][codeclimate] | |
7 | -[][coveralls] | |
8 | - | |
9 | -[gem]: https://rubygems.org/gems/delayed_job | |
10 | -[travis]: http://travis-ci.org/collectiveidea/delayed_job | |
11 | -[gemnasium]: https://gemnasium.com/collectiveidea/delayed_job | |
12 | -[codeclimate]: https://codeclimate.com/github/collectiveidea/delayed_job | |
13 | -[coveralls]: https://coveralls.io/r/collectiveidea/delayed_job | |
14 | - | |
15 | -Delayed::Job (or DJ) encapsulates the common pattern of asynchronously executing | |
16 | -longer tasks in the background. | |
17 | - | |
18 | -It is a direct extraction from Shopify where the job table is responsible for a | |
19 | -multitude of core tasks. Amongst those tasks are: | |
20 | - | |
21 | -* sending massive newsletters | |
22 | -* image resizing | |
23 | -* http downloads | |
24 | -* updating smart collections | |
25 | -* updating solr, our search server, after product changes | |
26 | -* batch imports | |
27 | -* spam checks | |
28 | - | |
29 | -[Follow us on Twitter][twitter] to get updates and notices about new releases. | |
30 | - | |
31 | -[twitter]: https://twitter.com/delayedjob | |
32 | - | |
33 | -Installation | |
34 | -============ | |
35 | -delayed_job 3.0.0 only supports Rails 3.0+. See the [2.0 | |
36 | -branch](https://github.com/collectiveidea/delayed_job/tree/v2.0) for Rails 2. | |
37 | - | |
38 | -delayed_job supports multiple backends for storing the job queue. [See the wiki | |
39 | -for other backends](http://wiki.github.com/collectiveidea/delayed_job/backends). | |
40 | - | |
41 | -If you plan to use delayed_job with Active Record, add `delayed_job_active_record` to your `Gemfile`. | |
42 | - | |
43 | -```ruby | |
44 | -gem 'delayed_job_active_record' | |
45 | -``` | |
46 | - | |
47 | -If you plan to use delayed_job with Mongoid, add `delayed_job_mongoid` to your `Gemfile`. | |
48 | - | |
49 | -```ruby | |
50 | -gem 'delayed_job_mongoid' | |
51 | -``` | |
52 | - | |
53 | -Run `bundle install` to install the backend and delayed_job gems. | |
54 | - | |
55 | -The Active Record backend requires a jobs table. You can create that table by | |
56 | -running the following command: | |
57 | - | |
58 | - rails generate delayed_job:active_record | |
59 | - rake db:migrate | |
60 | - | |
61 | -Rails 4 | |
62 | -======= | |
63 | -If you are using the protected_attributes gem, it must appear before delayed_job in your gemfile. | |
64 | - | |
65 | -Upgrading from 2.x to 3.0.0 on Active Record | |
66 | -============================================ | |
67 | -Delayed Job 3.0.0 introduces a new column to the delayed_jobs table. | |
68 | - | |
69 | -If you're upgrading from Delayed Job 2.x, run the upgrade generator to create a migration to add the column. | |
70 | - | |
71 | - rails generate delayed_job:upgrade | |
72 | - rake db:migrate | |
73 | - | |
74 | -Queuing Jobs | |
75 | -============ | |
76 | -Call `.delay.method(params)` on any object and it will be processed in the background. | |
77 | - | |
78 | -```ruby | |
79 | -# without delayed_job | |
80 | -@user.activate!(@device) | |
81 | - | |
82 | -# with delayed_job | |
83 | -@user.delay.activate!(@device) | |
84 | -``` | |
85 | - | |
86 | -If a method should always be run in the background, you can call | |
87 | -`#handle_asynchronously` after the method declaration: | |
88 | - | |
89 | -```ruby | |
90 | -class Device | |
91 | - def deliver | |
92 | - # long running method | |
93 | - end | |
94 | - handle_asynchronously :deliver | |
95 | -end | |
96 | - | |
97 | -device = Device.new | |
98 | -device.deliver | |
99 | -``` | |
100 | - | |
101 | -handle_asynchronously can take as options anything you can pass to delay. In | |
102 | -addition, the values can be Proc objects allowing call time evaluation of the | |
103 | -value. For some examples: | |
104 | - | |
105 | -```ruby | |
106 | -class LongTasks | |
107 | - def send_mailer | |
108 | - # Some other code | |
109 | - end | |
110 | - handle_asynchronously :send_mailer, :priority => 20 | |
111 | - | |
112 | - def in_the_future | |
113 | - # Some other code | |
114 | - end | |
115 | - # 5.minutes.from_now will be evaluated when in_the_future is called | |
116 | - handle_asynchronously :in_the_future, :run_at => Proc.new { 5.minutes.from_now } | |
117 | - | |
118 | - def self.when_to_run | |
119 | - 2.hours.from_now | |
120 | - end | |
121 | - | |
122 | - def call_a_class_method | |
123 | - # Some other code | |
124 | - end | |
125 | - handle_asynchronously :call_a_class_method, :run_at => Proc.new { when_to_run } | |
126 | - | |
127 | - attr_reader :how_important | |
128 | - | |
129 | - def call_an_instance_method | |
130 | - # Some other code | |
131 | - end | |
132 | - handle_asynchronously :call_an_instance_method, :priority => Proc.new {|i| i.how_important } | |
133 | -end | |
134 | -``` | |
135 | - | |
136 | -If you ever want to call a `handle_asynchronously`'d method without Delayed Job, for instance while debugging something at the console, just add `_without_delay` to the method name. For instance, if your original method was `foo`, then call `foo_without_delay`. | |
137 | - | |
138 | -Rails 3 Mailers | |
139 | -=============== | |
140 | -Due to how mailers are implemented in Rails 3, we had to do a little work around to get delayed_job to work. | |
141 | - | |
142 | -```ruby | |
143 | -# without delayed_job | |
144 | -Notifier.signup(@user).deliver | |
145 | - | |
146 | -# with delayed_job | |
147 | -Notifier.delay.signup(@user) | |
148 | -``` | |
149 | - | |
150 | -Remove the `.deliver` method to make it work. It's not ideal, but it's the best | |
151 | -we could do for now. | |
152 | - | |
153 | -Named Queues | |
154 | -============ | |
155 | -DJ 3 introduces Resque-style named queues while still retaining DJ-style | |
156 | -priority. The goal is to provide a system for grouping tasks to be worked by | |
157 | -separate pools of workers, which may be scaled and controlled individually. | |
158 | - | |
159 | -Jobs can be assigned to a queue by setting the `queue` option: | |
160 | - | |
161 | -```ruby | |
162 | -object.delay(:queue => 'tracking').method | |
163 | - | |
164 | -Delayed::Job.enqueue job, :queue => 'tracking' | |
165 | - | |
166 | -handle_asynchronously :tweet_later, :queue => 'tweets' | |
167 | -``` | |
168 | - | |
169 | -Running Jobs | |
170 | -============ | |
171 | -`script/delayed_job` can be used to manage a background process which will | |
172 | -start working off jobs. | |
173 | - | |
174 | -To do so, add `gem "daemons"` to your `Gemfile` and make sure you've run `rails | |
175 | -generate delayed_job`. | |
176 | - | |
177 | -You can then do the following: | |
178 | - | |
179 | - RAILS_ENV=production script/delayed_job start | |
180 | - RAILS_ENV=production script/delayed_job stop | |
181 | - | |
182 | - # Runs two workers in separate processes. | |
183 | - RAILS_ENV=production script/delayed_job -n 2 start | |
184 | - RAILS_ENV=production script/delayed_job stop | |
185 | - | |
186 | - # Set the --queue or --queues option to work from a particular queue. | |
187 | - RAILS_ENV=production script/delayed_job --queue=tracking start | |
188 | - RAILS_ENV=production script/delayed_job --queues=mailers,tasks start | |
189 | - | |
190 | - # Runs all available jobs and then exits | |
191 | - RAILS_ENV=production script/delayed_job start --exit-on-complete | |
192 | - # or to run in the foreground | |
193 | - RAILS_ENV=production script/delayed_job run --exit-on-complete | |
194 | - | |
195 | -**Rails 4:** *replace script/delayed_job with bin/delayed_job* | |
196 | - | |
197 | -Workers can be running on any computer, as long as they have access to the | |
198 | -database and their clock is in sync. Keep in mind that each worker will check | |
199 | -the database at least every 5 seconds. | |
200 | - | |
201 | -You can also invoke `rake jobs:work` which will start working off jobs. You can | |
202 | -cancel the rake task with `CTRL-C`. | |
203 | - | |
204 | -If you want to just run all available jobs and exit you can use `rake jobs:workoff` | |
205 | - | |
206 | -Work off queues by setting the `QUEUE` or `QUEUES` environment variable. | |
207 | - | |
208 | - QUEUE=tracking rake jobs:work | |
209 | - QUEUES=mailers,tasks rake jobs:work | |
210 | - | |
211 | -Restarting delayed_job | |
212 | -====================== | |
213 | - | |
214 | -The following syntax will restart delayed jobs: | |
215 | - | |
216 | - RAILS_ENV=production script/delayed_job restart | |
217 | - | |
218 | -To restart multiple delayed_job workers: | |
219 | - | |
220 | - RAILS_ENV=production script/delayed_job -n2 restart | |
221 | - | |
222 | -**Rails 4:** *replace script/delayed_job with bin/delayed_job* | |
223 | - | |
224 | - | |
225 | - | |
226 | -Custom Jobs | |
227 | -=========== | |
228 | -Jobs are simple ruby objects with a method called perform. Any object which responds to perform can be stuffed into the jobs table. Job objects are serialized to yaml so that they can later be resurrected by the job runner. | |
229 | - | |
230 | -```ruby | |
231 | -class NewsletterJob < Struct.new(:text, :emails) | |
232 | - def perform | |
233 | - emails.each { |e| NewsletterMailer.deliver_text_to_email(text, e) } | |
234 | - end | |
235 | -end | |
236 | - | |
237 | -Delayed::Job.enqueue NewsletterJob.new('lorem ipsum...', Customers.find(:all).collect(&:email)) | |
238 | -``` | |
239 | -To set a per-job max attempts that overrides the Delayed::Worker.max_attempts you can define a max_attempts method on the job | |
240 | -```ruby | |
241 | -class NewsletterJob < Struct.new(:text, :emails) | |
242 | - def perform | |
243 | - emails.each { |e| NewsletterMailer.deliver_text_to_email(text, e) } | |
244 | - end | |
245 | - | |
246 | - def max_attempts | |
247 | - return 3 | |
248 | - end | |
249 | -end | |
250 | -```` | |
251 | - | |
252 | - | |
253 | -Hooks | |
254 | -===== | |
255 | -You can define hooks on your job that will be called at different stages in the process: | |
256 | - | |
257 | -```ruby | |
258 | -class ParanoidNewsletterJob < NewsletterJob | |
259 | - def enqueue(job) | |
260 | - record_stat 'newsletter_job/enqueue' | |
261 | - end | |
262 | - | |
263 | - def perform | |
264 | - emails.each { |e| NewsletterMailer.deliver_text_to_email(text, e) } | |
265 | - end | |
266 | - | |
267 | - def before(job) | |
268 | - record_stat 'newsletter_job/start' | |
269 | - end | |
270 | - | |
271 | - def after(job) | |
272 | - record_stat 'newsletter_job/after' | |
273 | - end | |
274 | - | |
275 | - def success(job) | |
276 | - record_stat 'newsletter_job/success' | |
277 | - end | |
278 | - | |
279 | - def error(job, exception) | |
280 | - Airbrake.notify(exception) | |
281 | - end | |
282 | - | |
283 | - def failure(job) | |
284 | - page_sysadmin_in_the_middle_of_the_night | |
285 | - end | |
286 | -end | |
287 | -``` | |
288 | - | |
289 | -Gory Details | |
290 | -============ | |
291 | -The library revolves around a delayed_jobs table which looks as follows: | |
292 | - | |
293 | -```ruby | |
294 | -create_table :delayed_jobs, :force => true do |table| | |
295 | - table.integer :priority, :default => 0 # Allows some jobs to jump to the front of the queue | |
296 | - table.integer :attempts, :default => 0 # Provides for retries, but still fail eventually. | |
297 | - table.text :handler # YAML-encoded string of the object that will do work | |
298 | - table.text :last_error # reason for last failure (See Note below) | |
299 | - table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future. | |
300 | - table.datetime :locked_at # Set when a client is working on this object | |
301 | - table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead) | |
302 | - table.string :locked_by # Who is working on this object (if locked) | |
303 | - table.string :queue # The name of the queue this job is in | |
304 | - table.timestamps | |
305 | -end | |
306 | -``` | |
307 | - | |
308 | -On failure, the job is scheduled again in 5 seconds + N ** 4, where N is the number of retries. | |
309 | - | |
310 | -The default Worker.max_attempts is 25. After this, the job either deleted (default), or left in the database with "failed_at" set. | |
311 | -With the default of 25 attempts, the last retry will be 20 days later, with the last interval being almost 100 hours. | |
312 | - | |
313 | -The default Worker.max_run_time is 4.hours. If your job takes longer than that, another computer could pick it up. It's up to you to | |
314 | -make sure your job doesn't exceed this time. You should set this to the longest time you think the job could take. | |
315 | - | |
316 | -By default, it will delete failed jobs (and it always deletes successful jobs). If you want to keep failed jobs, set | |
317 | -Delayed::Worker.destroy_failed_jobs = false. The failed jobs will be marked with non-null failed_at. | |
318 | - | |
319 | -By default all jobs are scheduled with priority = 0, which is top priority. You can change this by setting Delayed::Worker.default_priority to something else. Lower numbers have higher priority. | |
320 | - | |
321 | -The default behavior is to read 5 jobs from the queue when finding an available job. You can configure this by setting Delayed::Worker.read_ahead. | |
322 | - | |
323 | -By default all jobs will be queued without a named queue. A default named queue can be specified by using Delayed::Worker.default_queue_name. | |
324 | - | |
325 | -It is possible to disable delayed jobs for testing purposes. Set Delayed::Worker.delay_jobs = false to execute all jobs realtime. | |
326 | - | |
327 | -Here is an example of changing job parameters in Rails: | |
328 | - | |
329 | -```ruby | |
330 | -# config/initializers/delayed_job_config.rb | |
331 | -Delayed::Worker.destroy_failed_jobs = false | |
332 | -Delayed::Worker.sleep_delay = 60 | |
333 | -Delayed::Worker.max_attempts = 3 | |
334 | -Delayed::Worker.max_run_time = 5.minutes | |
335 | -Delayed::Worker.read_ahead = 10 | |
336 | -Delayed::Worker.default_queue_name = 'default' | |
337 | -Delayed::Worker.delay_jobs = !Rails.env.test? | |
338 | -``` | |
339 | - | |
340 | -Cleaning up | |
341 | -=========== | |
342 | -You can invoke `rake jobs:clear` to delete all jobs in the queue. | |
343 | - | |
344 | -Mailing List | |
345 | -============ | |
346 | -Join us on the [mailing list](http://groups.google.com/group/delayed_job) |
vendor/plugins/delayed_job/Rakefile
vendor/plugins/delayed_job/benchmarks.rb
... | ... | @@ -1,13 +0,0 @@ |
1 | -require 'spec/helper' | |
2 | -require 'logger' | |
3 | -require 'benchmark' | |
4 | - | |
5 | -# Delayed::Worker.logger = Logger.new('/dev/null') | |
6 | - | |
7 | -Benchmark.bm(10) do |x| | |
8 | - Delayed::Job.delete_all | |
9 | - n = 10000 | |
10 | - n.times { "foo".delay.length } | |
11 | - | |
12 | - x.report { Delayed::Worker.new(:quiet => true).work_off(n) } | |
13 | -end |
vendor/plugins/delayed_job/contrib/delayed_job.monitrc
... | ... | @@ -1,14 +0,0 @@ |
1 | -# an example Monit configuration file for delayed_job | |
2 | -# See: http://stackoverflow.com/questions/1226302/how-to-monitor-delayedjob-with-monit/1285611 | |
3 | -# | |
4 | -# To use: | |
5 | -# 1. copy to /var/www/apps/{app_name}/shared/delayed_job.monitrc | |
6 | -# 2. replace {app_name} as appropriate | |
7 | -# 3. add this to your /etc/monit/monitrc | |
8 | -# | |
9 | -# include /var/www/apps/{app_name}/shared/delayed_job.monitrc | |
10 | - | |
11 | -check process delayed_job | |
12 | - with pidfile /var/www/apps/{app_name}/shared/pids/delayed_job.pid | |
13 | - start program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/script/delayed_job start" | |
14 | - stop program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/script/delayed_job stop" |
vendor/plugins/delayed_job/contrib/delayed_job_multiple.monitrc
... | ... | @@ -1,34 +0,0 @@ |
1 | -# an example Monit configuration file for delayed_job running multiple processes | |
2 | -# | |
3 | -# To use: | |
4 | -# 1. copy to /var/www/apps/{app_name}/shared/delayed_job.monitrc | |
5 | -# 2. replace {app_name} as appropriate | |
6 | -# you might also need to change the program strings to | |
7 | -# "/bin/su - {username} -c '/usr/bin/env ...'" | |
8 | -# to load your shell environment. | |
9 | -# | |
10 | -# 3. add this to your /etc/monit/monitrc | |
11 | -# | |
12 | -# include /var/www/apps/{app_name}/shared/delayed_job.monitrc | |
13 | -# | |
14 | -# The processes are grouped so that monit can act on them as a whole, e.g. | |
15 | -# | |
16 | -# monit -g delayed_job restart | |
17 | - | |
18 | -check process delayed_job_0 | |
19 | - with pidfile /var/www/apps/{app_name}/shared/pids/delayed_job.0.pid | |
20 | - start program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/script/delayed_job start -i 0" | |
21 | - stop program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/script/delayed_job stop -i 0" | |
22 | - group delayed_job | |
23 | - | |
24 | -check process delayed_job_1 | |
25 | - with pidfile /var/www/apps/{app_name}/shared/pids/delayed_job.1.pid | |
26 | - start program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/script/delayed_job start -i 1" | |
27 | - stop program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/script/delayed_job stop -i 1" | |
28 | - group delayed_job | |
29 | - | |
30 | -check process delayed_job_2 | |
31 | - with pidfile /var/www/apps/{app_name}/shared/pids/delayed_job.2.pid | |
32 | - start program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/script/delayed_job start -i 2" | |
33 | - stop program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/script/delayed_job stop -i 2" | |
34 | - group delayed_job |
vendor/plugins/delayed_job/contrib/delayed_job_rails_4.monitrc
... | ... | @@ -1,14 +0,0 @@ |
1 | -# an example Monit configuration file for delayed_job | |
2 | -# See: http://stackoverflow.com/questions/1226302/how-to-monitor-delayedjob-with-monit/1285611 | |
3 | -# | |
4 | -# To use: | |
5 | -# 1. copy to /var/www/apps/{app_name}/shared/delayed_job.monitrc | |
6 | -# 2. replace {app_name} as appropriate | |
7 | -# 3. add this to your /etc/monit/monitrc | |
8 | -# | |
9 | -# include /var/www/apps/{app_name}/shared/delayed_job.monitrc | |
10 | - | |
11 | -check process delayed_job | |
12 | - with pidfile /var/www/apps/{app_name}/shared/pids/delayed_job.pid | |
13 | - start program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/bin/delayed_job start" | |
14 | - stop program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/bin/delayed_job stop" |
vendor/plugins/delayed_job/contrib/delayed_job_rails_4_multiple.monitrc
... | ... | @@ -1,34 +0,0 @@ |
1 | -# an example Monit configuration file for delayed_job running multiple processes | |
2 | -# | |
3 | -# To use: | |
4 | -# 1. copy to /var/www/apps/{app_name}/shared/delayed_job.monitrc | |
5 | -# 2. replace {app_name} as appropriate | |
6 | -# you might also need to change the program strings to | |
7 | -# "/bin/su - {username} -c '/usr/bin/env ...'" | |
8 | -# to load your shell environment. | |
9 | -# | |
10 | -# 3. add this to your /etc/monit/monitrc | |
11 | -# | |
12 | -# include /var/www/apps/{app_name}/shared/delayed_job.monitrc | |
13 | -# | |
14 | -# The processes are grouped so that monit can act on them as a whole, e.g. | |
15 | -# | |
16 | -# monit -g delayed_job restart | |
17 | - | |
18 | -check process delayed_job_0 | |
19 | - with pidfile /var/www/apps/{app_name}/shared/pids/delayed_job.0.pid | |
20 | - start program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/bin/delayed_job start -i 0" | |
21 | - stop program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/bin/delayed_job stop -i 0" | |
22 | - group delayed_job | |
23 | - | |
24 | -check process delayed_job_1 | |
25 | - with pidfile /var/www/apps/{app_name}/shared/pids/delayed_job.1.pid | |
26 | - start program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/bin/delayed_job start -i 1" | |
27 | - stop program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/bin/delayed_job stop -i 1" | |
28 | - group delayed_job | |
29 | - | |
30 | -check process delayed_job_2 | |
31 | - with pidfile /var/www/apps/{app_name}/shared/pids/delayed_job.2.pid | |
32 | - start program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/bin/delayed_job start -i 2" | |
33 | - stop program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/bin/delayed_job stop -i 2" | |
34 | - group delayed_job |
vendor/plugins/delayed_job/delayed_job.gemspec
... | ... | @@ -1,17 +0,0 @@ |
1 | -# -*- encoding: utf-8 -*- | |
2 | - | |
3 | -Gem::Specification.new do |spec| | |
4 | - spec.add_dependency 'activesupport', ['>= 3.0', '< 4.1'] | |
5 | - spec.authors = ["Brandon Keepers", "Brian Ryckbost", "Chris Gaffney", "David Genord II", "Erik Michaels-Ober", "Matt Griffin", "Steve Richert", "Tobias Lütke"] | |
6 | - spec.description = "Delayed_job (or DJ) encapsulates the common pattern of asynchronously executing longer tasks in the background. It is a direct extraction from Shopify where the job table is responsible for a multitude of core tasks." | |
7 | - spec.email = ['brian@collectiveidea.com'] | |
8 | - spec.files = %w(CHANGELOG.md CONTRIBUTING.md LICENSE.md README.md Rakefile delayed_job.gemspec) | |
9 | - spec.files += Dir.glob('{contrib,lib,recipes,spec}/**/*') | |
10 | - spec.homepage = 'http://github.com/collectiveidea/delayed_job' | |
11 | - spec.licenses = ['MIT'] | |
12 | - spec.name = 'delayed_job' | |
13 | - spec.require_paths = ['lib'] | |
14 | - spec.summary = 'Database-backed asynchronous priority queue system -- Extracted from Shopify' | |
15 | - spec.test_files = Dir.glob('spec/**/*') | |
16 | - spec.version = '4.0.0' | |
17 | -end |
vendor/plugins/delayed_job/lib/delayed/backend/base.rb
... | ... | @@ -1,156 +0,0 @@ |
1 | -module Delayed | |
2 | - module Backend | |
3 | - module Base | |
4 | - def self.included(base) | |
5 | - base.extend ClassMethods | |
6 | - end | |
7 | - | |
8 | - module ClassMethods | |
9 | - # Add a job to the queue | |
10 | - def enqueue(*args) | |
11 | - options = { | |
12 | - :priority => Delayed::Worker.default_priority, | |
13 | - :queue => Delayed::Worker.default_queue_name | |
14 | - }.merge!(args.extract_options!) | |
15 | - | |
16 | - options[:payload_object] ||= args.shift | |
17 | - | |
18 | - if args.size > 0 | |
19 | - warn "[DEPRECATION] Passing multiple arguments to `#enqueue` is deprecated. Pass a hash with :priority and :run_at." | |
20 | - options[:priority] = args.first || options[:priority] | |
21 | - options[:run_at] = args[1] | |
22 | - end | |
23 | - | |
24 | - unless options[:payload_object].respond_to?(:perform) | |
25 | - raise ArgumentError, 'Cannot enqueue items which do not respond to perform' | |
26 | - end | |
27 | - | |
28 | - if Delayed::Worker.delay_jobs | |
29 | - self.new(options).tap do |job| | |
30 | - Delayed::Worker.lifecycle.run_callbacks(:enqueue, job) do | |
31 | - job.hook(:enqueue) | |
32 | - job.save | |
33 | - end | |
34 | - end | |
35 | - else | |
36 | - Delayed::Job.new(:payload_object => options[:payload_object]).tap do |job| | |
37 | - job.invoke_job | |
38 | - end | |
39 | - end | |
40 | - end | |
41 | - | |
42 | - def reserve(worker, max_run_time = Worker.max_run_time) | |
43 | - # We get up to 5 jobs from the db. In case we cannot get exclusive access to a job we try the next. | |
44 | - # this leads to a more even distribution of jobs across the worker processes | |
45 | - find_available(worker.name, worker.read_ahead, max_run_time).detect do |job| | |
46 | - job.lock_exclusively!(max_run_time, worker.name) | |
47 | - end | |
48 | - end | |
49 | - | |
50 | - # Allow the backend to attempt recovery from reserve errors | |
51 | - def recover_from(error) | |
52 | - end | |
53 | - | |
54 | - # Hook method that is called before a new worker is forked | |
55 | - def before_fork | |
56 | - end | |
57 | - | |
58 | - # Hook method that is called after a new worker is forked | |
59 | - def after_fork | |
60 | - end | |
61 | - | |
62 | - def work_off(num = 100) | |
63 | - warn "[DEPRECATION] `Delayed::Job.work_off` is deprecated. Use `Delayed::Worker.new.work_off instead." | |
64 | - Delayed::Worker.new.work_off(num) | |
65 | - end | |
66 | - end | |
67 | - | |
68 | - def failed? | |
69 | - !!failed_at | |
70 | - end | |
71 | - alias_method :failed, :failed? | |
72 | - | |
73 | - ParseObjectFromYaml = /\!ruby\/\w+\:([^\s]+)/ | |
74 | - | |
75 | - def name | |
76 | - obj = payload_object | |
77 | - @name ||= obj.respond_to?(:display_name) ? obj.display_name : obj.class.name | |
78 | - rescue DeserializationError | |
79 | - ParseObjectFromYaml.match(handler)[1] | |
80 | - end | |
81 | - | |
82 | - def payload_object=(object) | |
83 | - @payload_object = object | |
84 | - self.handler = object.to_yaml | |
85 | - end | |
86 | - | |
87 | - def payload_object | |
88 | - if YAML.respond_to?(:unsafe_load) | |
89 | - #See https://github.com/dtao/safe_yaml | |
90 | - #When the method is there, we need to load our YAML like this... | |
91 | - @payload_object ||= YAML.load(self.handler, :safe => false) | |
92 | - else | |
93 | - @payload_object ||= YAML.load(self.handler) | |
94 | - end | |
95 | - rescue TypeError, LoadError, NameError, ArgumentError => e | |
96 | - raise DeserializationError, | |
97 | - "Job failed to load: #{e.message}. Handler: #{handler.inspect}" | |
98 | - end | |
99 | - | |
100 | - def invoke_job | |
101 | - Delayed::Worker.lifecycle.run_callbacks(:invoke_job, self) do | |
102 | - begin | |
103 | - hook :before | |
104 | - payload_object.perform | |
105 | - hook :success | |
106 | - rescue Exception => e | |
107 | - hook :error, e | |
108 | - raise e | |
109 | - ensure | |
110 | - hook :after | |
111 | - end | |
112 | - end | |
113 | - end | |
114 | - | |
115 | - # Unlock this job (note: not saved to DB) | |
116 | - def unlock | |
117 | - self.locked_at = nil | |
118 | - self.locked_by = nil | |
119 | - end | |
120 | - | |
121 | - def hook(name, *args) | |
122 | - if payload_object.respond_to?(name) | |
123 | - method = payload_object.method(name) | |
124 | - method.arity == 0 ? method.call : method.call(self, *args) | |
125 | - end | |
126 | - rescue DeserializationError | |
127 | - # do nothing | |
128 | - end | |
129 | - | |
130 | - def reschedule_at | |
131 | - payload_object.respond_to?(:reschedule_at) ? | |
132 | - payload_object.reschedule_at(self.class.db_time_now, attempts) : | |
133 | - self.class.db_time_now + (attempts ** 4) + 5 | |
134 | - end | |
135 | - | |
136 | - def max_attempts | |
137 | - payload_object.max_attempts if payload_object.respond_to?(:max_attempts) | |
138 | - end | |
139 | - | |
140 | - def fail! | |
141 | - update_attributes(:failed_at => self.class.db_time_now) | |
142 | - end | |
143 | - | |
144 | - protected | |
145 | - | |
146 | - def set_default_run_at | |
147 | - self.run_at ||= self.class.db_time_now | |
148 | - end | |
149 | - | |
150 | - # Call during reload operation to clear out internal state | |
151 | - def reset | |
152 | - @payload_object = nil | |
153 | - end | |
154 | - end | |
155 | - end | |
156 | -end |
vendor/plugins/delayed_job/lib/delayed/backend/shared_spec.rb
... | ... | @@ -1,594 +0,0 @@ |
1 | -require File.expand_path('../../../../spec/sample_jobs', __FILE__) | |
2 | - | |
3 | -require 'active_support/core_ext' | |
4 | - | |
5 | -shared_examples_for "a delayed_job backend" do | |
6 | - let(:worker) { Delayed::Worker.new } | |
7 | - | |
8 | - def create_job(opts = {}) | |
9 | - described_class.create(opts.merge(:payload_object => SimpleJob.new)) | |
10 | - end | |
11 | - | |
12 | - before do | |
13 | - Delayed::Worker.max_priority = nil | |
14 | - Delayed::Worker.min_priority = nil | |
15 | - Delayed::Worker.default_priority = 99 | |
16 | - Delayed::Worker.delay_jobs = true | |
17 | - SimpleJob.runs = 0 | |
18 | - described_class.delete_all | |
19 | - end | |
20 | - | |
21 | - after do | |
22 | - Delayed::Worker.reset | |
23 | - end | |
24 | - | |
25 | - it "sets run_at automatically if not set" do | |
26 | - expect(described_class.create(:payload_object => ErrorJob.new ).run_at).not_to be_nil | |
27 | - end | |
28 | - | |
29 | - it "does not set run_at automatically if already set" do | |
30 | - later = described_class.db_time_now + 5.minutes | |
31 | - job = described_class.create(:payload_object => ErrorJob.new, :run_at => later) | |
32 | - expect(job.run_at).to be_within(1).of(later) | |
33 | - end | |
34 | - | |
35 | - describe "#reload" do | |
36 | - it "reloads the payload" do | |
37 | - job = described_class.enqueue :payload_object => SimpleJob.new | |
38 | - expect(job.payload_object.object_id).not_to eq(job.reload.payload_object.object_id) | |
39 | - end | |
40 | - end | |
41 | - | |
42 | - describe "enqueue" do | |
43 | - context "with a hash" do | |
44 | - it "raises ArgumentError when handler doesn't respond_to :perform" do | |
45 | - expect{described_class.enqueue(:payload_object => Object.new)}.to raise_error(ArgumentError) | |
46 | - end | |
47 | - | |
48 | - it "is able to set priority" do | |
49 | - job = described_class.enqueue :payload_object => SimpleJob.new, :priority => 5 | |
50 | - expect(job.priority).to eq(5) | |
51 | - end | |
52 | - | |
53 | - it "uses default priority" do | |
54 | - job = described_class.enqueue :payload_object => SimpleJob.new | |
55 | - expect(job.priority).to eq(99) | |
56 | - end | |
57 | - | |
58 | - it "is able to set run_at" do | |
59 | - later = described_class.db_time_now + 5.minutes | |
60 | - job = described_class.enqueue :payload_object => SimpleJob.new, :run_at => later | |
61 | - expect(job.run_at).to be_within(1).of(later) | |
62 | - end | |
63 | - | |
64 | - it "is able to set queue" do | |
65 | - job = described_class.enqueue :payload_object => SimpleJob.new, :queue => 'tracking' | |
66 | - expect(job.queue).to eq('tracking') | |
67 | - end | |
68 | - end | |
69 | - | |
70 | - context "with multiple arguments" do | |
71 | - it "raises ArgumentError when handler doesn't respond_to :perform" do | |
72 | - expect{described_class.enqueue(Object.new)}.to raise_error(ArgumentError) | |
73 | - end | |
74 | - | |
75 | - it "increases count after enqueuing items" do | |
76 | - described_class.enqueue SimpleJob.new | |
77 | - expect(described_class.count).to eq(1) | |
78 | - end | |
79 | - | |
80 | - it "is able to set priority [DEPRECATED]" do | |
81 | - silence_warnings do | |
82 | - job = described_class.enqueue SimpleJob.new, 5 | |
83 | - expect(job.priority).to eq(5) | |
84 | - end | |
85 | - end | |
86 | - | |
87 | - it "uses default priority when it is not set" do | |
88 | - @job = described_class.enqueue SimpleJob.new | |
89 | - expect(@job.priority).to eq(99) | |
90 | - end | |
91 | - | |
92 | - it "is able to set run_at [DEPRECATED]" do | |
93 | - silence_warnings do | |
94 | - later = described_class.db_time_now + 5.minutes | |
95 | - @job = described_class.enqueue SimpleJob.new, 5, later | |
96 | - expect(@job.run_at).to be_within(1).of(later) | |
97 | - end | |
98 | - end | |
99 | - | |
100 | - it "works with jobs in modules" do | |
101 | - M::ModuleJob.runs = 0 | |
102 | - job = described_class.enqueue M::ModuleJob.new | |
103 | - expect{job.invoke_job}.to change { M::ModuleJob.runs }.from(0).to(1) | |
104 | - end | |
105 | - end | |
106 | - | |
107 | - context "with delay_jobs = false" do | |
108 | - before(:each) do | |
109 | - Delayed::Worker.delay_jobs = false | |
110 | - end | |
111 | - | |
112 | - it "does not increase count after enqueuing items" do | |
113 | - described_class.enqueue SimpleJob.new | |
114 | - expect(described_class.count).to eq(0) | |
115 | - end | |
116 | - | |
117 | - it "invokes the enqueued job" do | |
118 | - job = SimpleJob.new | |
119 | - job.should_receive(:perform) | |
120 | - described_class.enqueue job | |
121 | - end | |
122 | - | |
123 | - it "returns a job, not the result of invocation" do | |
124 | - expect(described_class.enqueue(SimpleJob.new)).to be_instance_of(described_class) | |
125 | - end | |
126 | - end | |
127 | - end | |
128 | - | |
129 | - describe "callbacks" do | |
130 | - before(:each) do | |
131 | - CallbackJob.messages = [] | |
132 | - end | |
133 | - | |
134 | - %w(before success after).each do |callback| | |
135 | - it "calls #{callback} with job" do | |
136 | - job = described_class.enqueue(CallbackJob.new) | |
137 | - job.payload_object.should_receive(callback).with(job) | |
138 | - job.invoke_job | |
139 | - end | |
140 | - end | |
141 | - | |
142 | - it "calls before and after callbacks" do | |
143 | - job = described_class.enqueue(CallbackJob.new) | |
144 | - expect(CallbackJob.messages).to eq(["enqueue"]) | |
145 | - job.invoke_job | |
146 | - expect(CallbackJob.messages).to eq(["enqueue", "before", "perform", "success", "after"]) | |
147 | - end | |
148 | - | |
149 | - it "calls the after callback with an error" do | |
150 | - job = described_class.enqueue(CallbackJob.new) | |
151 | - job.payload_object.should_receive(:perform).and_raise(RuntimeError.new("fail")) | |
152 | - | |
153 | - expect{job.invoke_job}.to raise_error | |
154 | - expect(CallbackJob.messages).to eq(["enqueue", "before", "error: RuntimeError", "after"]) | |
155 | - end | |
156 | - | |
157 | - it "calls error when before raises an error" do | |
158 | - job = described_class.enqueue(CallbackJob.new) | |
159 | - job.payload_object.should_receive(:before).and_raise(RuntimeError.new("fail")) | |
160 | - expect{job.invoke_job}.to raise_error(RuntimeError) | |
161 | - expect(CallbackJob.messages).to eq(["enqueue", "error: RuntimeError", "after"]) | |
162 | - end | |
163 | - end | |
164 | - | |
165 | - describe "payload_object" do | |
166 | - it "raises a DeserializationError when the job class is totally unknown" do | |
167 | - job = described_class.new :handler => "--- !ruby/object:JobThatDoesNotExist {}" | |
168 | - expect{job.payload_object}.to raise_error(Delayed::DeserializationError) | |
169 | - end | |
170 | - | |
171 | - it "raises a DeserializationError when the job struct is totally unknown" do | |
172 | - job = described_class.new :handler => "--- !ruby/struct:StructThatDoesNotExist {}" | |
173 | - expect{job.payload_object}.to raise_error(Delayed::DeserializationError) | |
174 | - end | |
175 | - | |
176 | - it "raises a DeserializationError when the YAML.load raises argument error" do | |
177 | - job = described_class.new :handler => "--- !ruby/struct:GoingToRaiseArgError {}" | |
178 | - YAML.should_receive(:load).and_raise(ArgumentError) | |
179 | - expect{job.payload_object}.to raise_error(Delayed::DeserializationError) | |
180 | - end | |
181 | - end | |
182 | - | |
183 | - describe "reserve" do | |
184 | - before do | |
185 | - Delayed::Worker.max_run_time = 2.minutes | |
186 | - end | |
187 | - | |
188 | - after do | |
189 | - Time.zone = nil | |
190 | - end | |
191 | - | |
192 | - it "does not reserve failed jobs" do | |
193 | - create_job :attempts => 50, :failed_at => described_class.db_time_now | |
194 | - expect(described_class.reserve(worker)).to be_nil | |
195 | - end | |
196 | - | |
197 | - it "does not reserve jobs scheduled for the future" do | |
198 | - create_job :run_at => described_class.db_time_now + 1.minute | |
199 | - expect(described_class.reserve(worker)).to be_nil | |
200 | - end | |
201 | - | |
202 | - it "reserves jobs scheduled for the past" do | |
203 | - job = create_job :run_at => described_class.db_time_now - 1.minute | |
204 | - expect(described_class.reserve(worker)).to eq(job) | |
205 | - end | |
206 | - | |
207 | - it "reserves jobs scheduled for the past when time zones are involved" do | |
208 | - Time.zone = 'US/Eastern' | |
209 | - job = create_job :run_at => described_class.db_time_now - 1.minute | |
210 | - expect(described_class.reserve(worker)).to eq(job) | |
211 | - end | |
212 | - | |
213 | - it "does not reserve jobs locked by other workers" do | |
214 | - job = create_job | |
215 | - other_worker = Delayed::Worker.new | |
216 | - other_worker.name = 'other_worker' | |
217 | - expect(described_class.reserve(other_worker)).to eq(job) | |
218 | - expect(described_class.reserve(worker)).to be_nil | |
219 | - end | |
220 | - | |
221 | - it "reserves open jobs" do | |
222 | - job = create_job | |
223 | - expect(described_class.reserve(worker)).to eq(job) | |
224 | - end | |
225 | - | |
226 | - it "reserves expired jobs" do | |
227 | - job = create_job(:locked_by => 'some other worker', :locked_at => described_class.db_time_now - Delayed::Worker.max_run_time - 1.minute) | |
228 | - expect(described_class.reserve(worker)).to eq(job) | |
229 | - end | |
230 | - | |
231 | - it "reserves own jobs" do | |
232 | - job = create_job(:locked_by => worker.name, :locked_at => (described_class.db_time_now - 1.minutes)) | |
233 | - expect(described_class.reserve(worker)).to eq(job) | |
234 | - end | |
235 | - end | |
236 | - | |
237 | - context "#name" do | |
238 | - it "is the class name of the job that was enqueued" do | |
239 | - expect(described_class.create(:payload_object => ErrorJob.new ).name).to eq('ErrorJob') | |
240 | - end | |
241 | - | |
242 | - it "is the method that will be called if its a performable method object" do | |
243 | - job = described_class.new(:payload_object => NamedJob.new) | |
244 | - expect(job.name).to eq('named_job') | |
245 | - end | |
246 | - | |
247 | - it "is the instance method that will be called if its a performable method object" do | |
248 | - job = Story.create(:text => "...").delay.save | |
249 | - expect(job.name).to eq('Story#save') | |
250 | - end | |
251 | - | |
252 | - it "parses from handler on deserialization error" do | |
253 | - job = Story.create(:text => "...").delay.text | |
254 | - job.payload_object.object.destroy | |
255 | - expect(job.reload.name).to eq('Delayed::PerformableMethod') | |
256 | - end | |
257 | - end | |
258 | - | |
259 | - context "worker prioritization" do | |
260 | - after do | |
261 | - Delayed::Worker.max_priority = nil | |
262 | - Delayed::Worker.min_priority = nil | |
263 | - end | |
264 | - | |
265 | - it "fetches jobs ordered by priority" do | |
266 | - 10.times { described_class.enqueue SimpleJob.new, :priority => rand(10) } | |
267 | - jobs = [] | |
268 | - 10.times { jobs << described_class.reserve(worker) } | |
269 | - expect(jobs.size).to eq(10) | |
270 | - jobs.each_cons(2) do |a, b| | |
271 | - expect(a.priority).to be <= b.priority | |
272 | - end | |
273 | - end | |
274 | - | |
275 | - it "only finds jobs greater than or equal to min priority" do | |
276 | - min = 5 | |
277 | - Delayed::Worker.min_priority = min | |
278 | - [4,5,6].sort_by {|i| rand }.each {|i| create_job :priority => i } | |
279 | - 2.times do | |
280 | - job = described_class.reserve(worker) | |
281 | - expect(job.priority).to be >= min | |
282 | - job.destroy | |
283 | - end | |
284 | - expect(described_class.reserve(worker)).to be_nil | |
285 | - end | |
286 | - | |
287 | - it "only finds jobs less than or equal to max priority" do | |
288 | - max = 5 | |
289 | - Delayed::Worker.max_priority = max | |
290 | - [4,5,6].sort_by {|i| rand }.each {|i| create_job :priority => i } | |
291 | - 2.times do | |
292 | - job = described_class.reserve(worker) | |
293 | - expect(job.priority).to be <= max | |
294 | - job.destroy | |
295 | - end | |
296 | - expect(described_class.reserve(worker)).to be_nil | |
297 | - end | |
298 | - end | |
299 | - | |
300 | - context "clear_locks!" do | |
301 | - before do | |
302 | - @job = create_job(:locked_by => 'worker1', :locked_at => described_class.db_time_now) | |
303 | - end | |
304 | - | |
305 | - it "clears locks for the given worker" do | |
306 | - described_class.clear_locks!('worker1') | |
307 | - expect(described_class.reserve(worker)).to eq(@job) | |
308 | - end | |
309 | - | |
310 | - it "does not clear locks for other workers" do | |
311 | - described_class.clear_locks!('different_worker') | |
312 | - expect(described_class.reserve(worker)).not_to eq(@job) | |
313 | - end | |
314 | - end | |
315 | - | |
316 | - context "unlock" do | |
317 | - before do | |
318 | - @job = create_job(:locked_by => 'worker', :locked_at => described_class.db_time_now) | |
319 | - end | |
320 | - | |
321 | - it "clears locks" do | |
322 | - @job.unlock | |
323 | - expect(@job.locked_by).to be_nil | |
324 | - expect(@job.locked_at).to be_nil | |
325 | - end | |
326 | - end | |
327 | - | |
328 | - context "large handler" do | |
329 | - before do | |
330 | - text = "Lorem ipsum dolor sit amet. " * 1000 | |
331 | - @job = described_class.enqueue Delayed::PerformableMethod.new(text, :length, {}) | |
332 | - end | |
333 | - | |
334 | - it "has an id" do | |
335 | - expect(@job.id).not_to be_nil | |
336 | - end | |
337 | - end | |
338 | - | |
339 | - context "named queues" do | |
340 | - context "when worker has one queue set" do | |
341 | - before(:each) do | |
342 | - worker.queues = ['large'] | |
343 | - end | |
344 | - | |
345 | - it "only works off jobs which are from its queue" do | |
346 | - expect(SimpleJob.runs).to eq(0) | |
347 | - | |
348 | - create_job(:queue => "large") | |
349 | - create_job(:queue => "small") | |
350 | - worker.work_off | |
351 | - | |
352 | - expect(SimpleJob.runs).to eq(1) | |
353 | - end | |
354 | - end | |
355 | - | |
356 | - context "when worker has two queue set" do | |
357 | - before(:each) do | |
358 | - worker.queues = ['large', 'small'] | |
359 | - end | |
360 | - | |
361 | - it "only works off jobs which are from its queue" do | |
362 | - expect(SimpleJob.runs).to eq(0) | |
363 | - | |
364 | - create_job(:queue => "large") | |
365 | - create_job(:queue => "small") | |
366 | - create_job(:queue => "medium") | |
367 | - create_job | |
368 | - worker.work_off | |
369 | - | |
370 | - expect(SimpleJob.runs).to eq(2) | |
371 | - end | |
372 | - end | |
373 | - | |
374 | - context "when worker does not have queue set" do | |
375 | - before(:each) do | |
376 | - worker.queues = [] | |
377 | - end | |
378 | - | |
379 | - it "works off all jobs" do | |
380 | - expect(SimpleJob.runs).to eq(0) | |
381 | - | |
382 | - create_job(:queue => "one") | |
383 | - create_job(:queue => "two") | |
384 | - create_job | |
385 | - worker.work_off | |
386 | - | |
387 | - expect(SimpleJob.runs).to eq(3) | |
388 | - end | |
389 | - end | |
390 | - end | |
391 | - | |
392 | - context "max_attempts" do | |
393 | - before(:each) do | |
394 | - @job = described_class.enqueue SimpleJob.new | |
395 | - end | |
396 | - | |
397 | - it "is not defined" do | |
398 | - expect(@job.max_attempts).to be_nil | |
399 | - end | |
400 | - | |
401 | - it "uses the max_retries value on the payload when defined" do | |
402 | - @job.payload_object.stub(:max_attempts).and_return(99) | |
403 | - expect(@job.max_attempts).to eq(99) | |
404 | - end | |
405 | - end | |
406 | - | |
407 | - describe "yaml serialization" do | |
408 | - it "reloads changed attributes" do | |
409 | - story = Story.create(:text => 'hello') | |
410 | - job = story.delay.tell | |
411 | - story.update_attributes :text => 'goodbye' | |
412 | - expect(job.reload.payload_object.object.text).to eq('goodbye') | |
413 | - end | |
414 | - | |
415 | - it "raises error ArgumentError the record is not persisted" do | |
416 | - story = Story.new(:text => 'hello') | |
417 | - if story.respond_to?(:new_record?) | |
418 | - expect { | |
419 | - story.delay.tell | |
420 | - }.to raise_error(ArgumentError, "Jobs cannot be created for records before they've been persisted") | |
421 | - end | |
422 | - end | |
423 | - | |
424 | - it "raises deserialization error for destroyed records" do | |
425 | - story = Story.create(:text => 'hello') | |
426 | - job = story.delay.tell | |
427 | - story.destroy | |
428 | - expect { | |
429 | - job.reload.payload_object | |
430 | - }.to raise_error(Delayed::DeserializationError) | |
431 | - end | |
432 | - end | |
433 | - | |
434 | - describe "worker integration" do | |
435 | - before do | |
436 | - Delayed::Job.delete_all | |
437 | - SimpleJob.runs = 0 | |
438 | - end | |
439 | - | |
440 | - describe "running a job" do | |
441 | - it "fails after Worker.max_run_time" do | |
442 | - Delayed::Worker.max_run_time = 1.second | |
443 | - job = Delayed::Job.create :payload_object => LongRunningJob.new | |
444 | - worker.run(job) | |
445 | - expect(job.reload.last_error).to match(/expired/) | |
446 | - expect(job.reload.last_error).to match(/Delayed::Worker.max_run_time is only 1 second/) | |
447 | - expect(job.attempts).to eq(1) | |
448 | - end | |
449 | - | |
450 | - context "when the job raises a deserialization error" do | |
451 | - after do | |
452 | - Delayed::Worker.destroy_failed_jobs = true | |
453 | - end | |
454 | - | |
455 | - it "marks the job as failed" do | |
456 | - Delayed::Worker.destroy_failed_jobs = false | |
457 | - job = described_class.create! :handler => "--- !ruby/object:JobThatDoesNotExist {}" | |
458 | - worker.work_off | |
459 | - job.reload | |
460 | - expect(job).to be_failed | |
461 | - end | |
462 | - end | |
463 | - end | |
464 | - | |
465 | - describe "failed jobs" do | |
466 | - before do | |
467 | - @job = Delayed::Job.enqueue(ErrorJob.new, :run_at => described_class.db_time_now - 1) | |
468 | - end | |
469 | - | |
470 | - after do | |
471 | - # reset default | |
472 | - Delayed::Worker.destroy_failed_jobs = true | |
473 | - end | |
474 | - | |
475 | - it "records last_error when destroy_failed_jobs = false, max_attempts = 1" do | |
476 | - Delayed::Worker.destroy_failed_jobs = false | |
477 | - Delayed::Worker.max_attempts = 1 | |
478 | - worker.run(@job) | |
479 | - @job.reload | |
480 | - expect(@job.last_error).to match(/did not work/) | |
481 | - expect(@job.attempts).to eq(1) | |
482 | - expect(@job).to be_failed | |
483 | - end | |
484 | - | |
485 | - it "re-schedules jobs after failing" do | |
486 | - worker.work_off | |
487 | - @job.reload | |
488 | - expect(@job.last_error).to match(/did not work/) | |
489 | - expect(@job.last_error).to match(/sample_jobs.rb:\d+:in `perform'/) | |
490 | - expect(@job.attempts).to eq(1) | |
491 | - expect(@job.run_at).to be > Delayed::Job.db_time_now - 10.minutes | |
492 | - expect(@job.run_at).to be < Delayed::Job.db_time_now + 10.minutes | |
493 | - expect(@job.locked_by).to be_nil | |
494 | - expect(@job.locked_at).to be_nil | |
495 | - end | |
496 | - | |
497 | - it "re-schedules jobs with handler provided time if present" do | |
498 | - job = Delayed::Job.enqueue(CustomRescheduleJob.new(99.minutes)) | |
499 | - worker.run(job) | |
500 | - job.reload | |
501 | - | |
502 | - expect((Delayed::Job.db_time_now + 99.minutes - job.run_at).abs).to be < 1 | |
503 | - end | |
504 | - | |
505 | - it "does not fail when the triggered error doesn't have a message" do | |
506 | - error_with_nil_message = StandardError.new | |
507 | - error_with_nil_message.stub(:message).and_return nil | |
508 | - @job.stub(:invoke_job).and_raise error_with_nil_message | |
509 | - expect{worker.run(@job)}.not_to raise_error | |
510 | - end | |
511 | - end | |
512 | - | |
513 | - context "reschedule" do | |
514 | - before do | |
515 | - @job = Delayed::Job.create :payload_object => SimpleJob.new | |
516 | - end | |
517 | - | |
518 | - share_examples_for "any failure more than Worker.max_attempts times" do | |
519 | - context "when the job's payload has a #failure hook" do | |
520 | - before do | |
521 | - @job = Delayed::Job.create :payload_object => OnPermanentFailureJob.new | |
522 | - expect(@job.payload_object).to respond_to :failure | |
523 | - end | |
524 | - | |
525 | - it "runs that hook" do | |
526 | - @job.payload_object.should_receive :failure | |
527 | - worker.reschedule(@job) | |
528 | - end | |
529 | - end | |
530 | - | |
531 | - context "when the job's payload has no #failure hook" do | |
532 | - # It's a little tricky to test this in a straightforward way, | |
533 | - # because putting a should_not_receive expectation on | |
534 | - # @job.payload_object.failure makes that object | |
535 | - # incorrectly return true to | |
536 | - # payload_object.respond_to? :failure, which is what | |
537 | - # reschedule uses to decide whether to call failure. | |
538 | - # So instead, we just make sure that the payload_object as it | |
539 | - # already stands doesn't respond_to? failure, then | |
540 | - # shove it through the iterated reschedule loop and make sure we | |
541 | - # don't get a NoMethodError (caused by calling that nonexistent | |
542 | - # failure method). | |
543 | - | |
544 | - before do | |
545 | - expect(@job.payload_object).not_to respond_to(:failure) | |
546 | - end | |
547 | - | |
548 | - it "does not try to run that hook" do | |
549 | - expect { | |
550 | - Delayed::Worker.max_attempts.times { worker.reschedule(@job) } | |
551 | - }.not_to raise_exception | |
552 | - end | |
553 | - end | |
554 | - end | |
555 | - | |
556 | - context "and we want to destroy jobs" do | |
557 | - it_should_behave_like "any failure more than Worker.max_attempts times" | |
558 | - | |
559 | - it "is destroyed if it failed more than Worker.max_attempts times" do | |
560 | - @job.should_receive(:destroy) | |
561 | - Delayed::Worker.max_attempts.times { worker.reschedule(@job) } | |
562 | - end | |
563 | - | |
564 | - it "is not destroyed if failed fewer than Worker.max_attempts times" do | |
565 | - @job.should_not_receive(:destroy) | |
566 | - (Delayed::Worker.max_attempts - 1).times { worker.reschedule(@job) } | |
567 | - end | |
568 | - end | |
569 | - | |
570 | - context "and we don't want to destroy jobs" do | |
571 | - before do | |
572 | - Delayed::Worker.destroy_failed_jobs = false | |
573 | - end | |
574 | - | |
575 | - after do | |
576 | - Delayed::Worker.destroy_failed_jobs = true | |
577 | - end | |
578 | - | |
579 | - it_should_behave_like "any failure more than Worker.max_attempts times" | |
580 | - | |
581 | - it "is failed if it failed more than Worker.max_attempts times" do | |
582 | - expect(@job.reload).not_to be_failed | |
583 | - Delayed::Worker.max_attempts.times { worker.reschedule(@job) } | |
584 | - expect(@job.reload).to be_failed | |
585 | - end | |
586 | - | |
587 | - it "is not failed if it failed fewer than Worker.max_attempts times" do | |
588 | - (Delayed::Worker.max_attempts - 1).times { worker.reschedule(@job) } | |
589 | - expect(@job.reload).not_to be_failed | |
590 | - end | |
591 | - end | |
592 | - end | |
593 | - end | |
594 | -end |
vendor/plugins/delayed_job/lib/delayed/command.rb
... | ... | @@ -1,111 +0,0 @@ |
1 | -begin | |
2 | - require 'daemons' | |
3 | -rescue LoadError | |
4 | - raise "You need to add gem 'daemons' to your Gemfile if you wish to use it." | |
5 | -end | |
6 | -require 'optparse' | |
7 | - | |
8 | -module Delayed | |
9 | - class Command | |
10 | - attr_accessor :worker_count | |
11 | - | |
12 | - def initialize(args) | |
13 | - @options = { | |
14 | - :quiet => true, | |
15 | - :pid_dir => "#{Rails.root}/tmp/pids" | |
16 | - } | |
17 | - | |
18 | - @worker_count = 1 | |
19 | - @monitor = false | |
20 | - | |
21 | - opts = OptionParser.new do |opts| | |
22 | - opts.banner = "Usage: #{File.basename($0)} [options] start|stop|restart|run" | |
23 | - | |
24 | - opts.on('-h', '--help', 'Show this message') do | |
25 | - puts opts | |
26 | - exit 1 | |
27 | - end | |
28 | - opts.on('-e', '--environment=NAME', 'Specifies the environment to run this delayed jobs under (test/development/production).') do |e| | |
29 | - STDERR.puts "The -e/--environment option has been deprecated and has no effect. Use RAILS_ENV and see http://github.com/collectiveidea/delayed_job/issues/#issue/7" | |
30 | - end | |
31 | - opts.on('--min-priority N', 'Minimum priority of jobs to run.') do |n| | |
32 | - @options[:min_priority] = n | |
33 | - end | |
34 | - opts.on('--max-priority N', 'Maximum priority of jobs to run.') do |n| | |
35 | - @options[:max_priority] = n | |
36 | - end | |
37 | - opts.on('-n', '--number_of_workers=workers', "Number of unique workers to spawn") do |worker_count| | |
38 | - @worker_count = worker_count.to_i rescue 1 | |
39 | - end | |
40 | - opts.on('--pid-dir=DIR', 'Specifies an alternate directory in which to store the process ids.') do |dir| | |
41 | - @options[:pid_dir] = dir | |
42 | - end | |
43 | - opts.on('-i', '--identifier=n', 'A numeric identifier for the worker.') do |n| | |
44 | - @options[:identifier] = n | |
45 | - end | |
46 | - opts.on('-m', '--monitor', 'Start monitor process.') do | |
47 | - @monitor = true | |
48 | - end | |
49 | - opts.on('--sleep-delay N', "Amount of time to sleep when no jobs are found") do |n| | |
50 | - @options[:sleep_delay] = n.to_i | |
51 | - end | |
52 | - opts.on('--read-ahead N', "Number of jobs from the queue to consider") do |n| | |
53 | - @options[:read_ahead] = n | |
54 | - end | |
55 | - opts.on('-p', '--prefix NAME', "String to be prefixed to worker process names") do |prefix| | |
56 | - @options[:prefix] = prefix | |
57 | - end | |
58 | - opts.on('--queues=queues', "Specify which queue DJ must look up for jobs") do |queues| | |
59 | - @options[:queues] = queues.split(',') | |
60 | - end | |
61 | - opts.on('--queue=queue', "Specify which queue DJ must look up for jobs") do |queue| | |
62 | - @options[:queues] = queue.split(',') | |
63 | - end | |
64 | - opts.on('--exit-on-complete', "Exit when no more jobs are available to run. This will exit if all jobs are scheduled to run in the future.") do | |
65 | - @options[:exit_on_complete] = true | |
66 | - end | |
67 | - end | |
68 | - @args = opts.parse!(args) | |
69 | - end | |
70 | - | |
71 | - def daemonize | |
72 | - dir = @options[:pid_dir] | |
73 | - Dir.mkdir(dir) unless File.exists?(dir) | |
74 | - | |
75 | - if @worker_count > 1 && @options[:identifier] | |
76 | - raise ArgumentError, 'Cannot specify both --number-of-workers and --identifier' | |
77 | - elsif @worker_count == 1 && @options[:identifier] | |
78 | - process_name = "delayed_job.#{@options[:identifier]}" | |
79 | - run_process(process_name, dir) | |
80 | - else | |
81 | - worker_count.times do |worker_index| | |
82 | - process_name = worker_count == 1 ? "delayed_job" : "delayed_job.#{worker_index}" | |
83 | - run_process(process_name, dir) | |
84 | - end | |
85 | - end | |
86 | - end | |
87 | - | |
88 | - def run_process(process_name, dir) | |
89 | - Delayed::Worker.before_fork | |
90 | - Daemons.run_proc(process_name, :dir => dir, :dir_mode => :normal, :monitor => @monitor, :ARGV => @args) do |*args| | |
91 | - $0 = File.join(@options[:prefix], process_name) if @options[:prefix] | |
92 | - run process_name | |
93 | - end | |
94 | - end | |
95 | - | |
96 | - def run(worker_name = nil) | |
97 | - Dir.chdir(Rails.root) | |
98 | - | |
99 | - Delayed::Worker.after_fork | |
100 | - Delayed::Worker.logger = Logger.new(File.join(Rails.root, 'log', "#{Rails.env}_delayed_job.log")) | |
101 | - | |
102 | - worker = Delayed::Worker.new(@options) | |
103 | - worker.name_prefix = "#{worker_name} " | |
104 | - worker.start | |
105 | - rescue => e | |
106 | - Rails.logger.fatal e | |
107 | - STDERR.puts e.message | |
108 | - exit 1 | |
109 | - end | |
110 | - end | |
111 | -end |
vendor/plugins/delayed_job/lib/delayed/compatibility.rb
... | ... | @@ -1,27 +0,0 @@ |
1 | -require 'active_support/version' | |
2 | - | |
3 | -module Delayed | |
4 | - module Compatibility | |
5 | - if ActiveSupport::VERSION::MAJOR >= 4 | |
6 | - require 'active_support/proxy_object' | |
7 | - | |
8 | - def self.executable_prefix | |
9 | - 'bin' | |
10 | - end | |
11 | - | |
12 | - def self.proxy_object_class | |
13 | - ActiveSupport::ProxyObject | |
14 | - end | |
15 | - else | |
16 | - require 'active_support/basic_object' | |
17 | - | |
18 | - def self.executable_prefix | |
19 | - 'script' | |
20 | - end | |
21 | - | |
22 | - def self.proxy_object_class | |
23 | - ActiveSupport::BasicObject | |
24 | - end | |
25 | - end | |
26 | - end | |
27 | -end |
vendor/plugins/delayed_job/lib/delayed/deserialization_error.rb
vendor/plugins/delayed_job/lib/delayed/exceptions.rb
vendor/plugins/delayed_job/lib/delayed/lifecycle.rb
... | ... | @@ -1,84 +0,0 @@ |
1 | -module Delayed | |
2 | - class InvalidCallback < Exception; end | |
3 | - | |
4 | - class Lifecycle | |
5 | - EVENTS = { | |
6 | - :enqueue => [:job], | |
7 | - :execute => [:worker], | |
8 | - :loop => [:worker], | |
9 | - :perform => [:worker, :job], | |
10 | - :error => [:worker, :job], | |
11 | - :failure => [:worker, :job], | |
12 | - :invoke_job => [:job] | |
13 | - } | |
14 | - | |
15 | - def initialize | |
16 | - @callbacks = EVENTS.keys.inject({}) { |hash, e| hash[e] = Callback.new; hash } | |
17 | - end | |
18 | - | |
19 | - def before(event, &block) | |
20 | - add(:before, event, &block) | |
21 | - end | |
22 | - | |
23 | - def after(event, &block) | |
24 | - add(:after, event, &block) | |
25 | - end | |
26 | - | |
27 | - def around(event, &block) | |
28 | - add(:around, event, &block) | |
29 | - end | |
30 | - | |
31 | - def run_callbacks(event, *args, &block) | |
32 | - missing_callback(event) unless @callbacks.has_key?(event) | |
33 | - | |
34 | - unless EVENTS[event].size == args.size | |
35 | - raise ArgumentError, "Callback #{event} expects #{EVENTS[event].size} parameter(s): #{EVENTS[event].join(', ')}" | |
36 | - end | |
37 | - | |
38 | - @callbacks[event].execute(*args, &block) | |
39 | - end | |
40 | - | |
41 | - private | |
42 | - | |
43 | - def add(type, event, &block) | |
44 | - missing_callback(event) unless @callbacks.has_key?(event) | |
45 | - | |
46 | - @callbacks[event].add(type, &block) | |
47 | - end | |
48 | - | |
49 | - def missing_callback(event) | |
50 | - raise InvalidCallback, "Unknown callback event: #{event}" | |
51 | - end | |
52 | - end | |
53 | - | |
54 | - class Callback | |
55 | - def initialize | |
56 | - @before = [] | |
57 | - @after = [] | |
58 | - | |
59 | - # Identity proc. Avoids special cases when there is no existing around chain. | |
60 | - @around = lambda { |*args, &block| block.call(*args) } | |
61 | - end | |
62 | - | |
63 | - def execute(*args, &block) | |
64 | - @before.each { |c| c.call(*args) } | |
65 | - result = @around.call(*args, &block) | |
66 | - @after.each { |c| c.call(*args) } | |
67 | - result | |
68 | - end | |
69 | - | |
70 | - def add(type, &callback) | |
71 | - case type | |
72 | - when :before | |
73 | - @before << callback | |
74 | - when :after | |
75 | - @after << callback | |
76 | - when :around | |
77 | - chain = @around # use a local variable so that the current chain is closed over in the following lambda | |
78 | - @around = lambda { |*a, &block| chain.call(*a) { |*b| callback.call(*b, &block) } } | |
79 | - else | |
80 | - raise InvalidCallback, "Invalid callback type: #{type}" | |
81 | - end | |
82 | - end | |
83 | - end | |
84 | -end |
vendor/plugins/delayed_job/lib/delayed/message_sending.rb
... | ... | @@ -1,53 +0,0 @@ |
1 | -require 'active_support/core_ext/module/aliasing' | |
2 | - | |
3 | -module Delayed | |
4 | - class DelayProxy < Delayed::Compatibility.proxy_object_class | |
5 | - def initialize(payload_class, target, options) | |
6 | - @payload_class = payload_class | |
7 | - @target = target | |
8 | - @options = options | |
9 | - end | |
10 | - | |
11 | - def method_missing(method, *args) | |
12 | - Job.enqueue({:payload_object => @payload_class.new(@target, method.to_sym, args)}.merge(@options)) | |
13 | - end | |
14 | - end | |
15 | - | |
16 | - module MessageSending | |
17 | - def delay(options = {}) | |
18 | - DelayProxy.new(PerformableMethod, self, options) | |
19 | - end | |
20 | - alias __delay__ delay | |
21 | - | |
22 | - def send_later(method, *args) | |
23 | - warn "[DEPRECATION] `object.send_later(:method)` is deprecated. Use `object.delay.method" | |
24 | - __delay__.__send__(method, *args) | |
25 | - end | |
26 | - | |
27 | - def send_at(time, method, *args) | |
28 | - warn "[DEPRECATION] `object.send_at(time, :method)` is deprecated. Use `object.delay(:run_at => time).method" | |
29 | - __delay__(:run_at => time).__send__(method, *args) | |
30 | - end | |
31 | - | |
32 | - module ClassMethods | |
33 | - def handle_asynchronously(method, opts = {}) | |
34 | - aliased_method, punctuation = method.to_s.sub(/([?!=])$/, ''), $1 | |
35 | - with_method, without_method = "#{aliased_method}_with_delay#{punctuation}", "#{aliased_method}_without_delay#{punctuation}" | |
36 | - define_method(with_method) do |*args| | |
37 | - curr_opts = opts.clone | |
38 | - curr_opts.each_key do |key| | |
39 | - if (val = curr_opts[key]).is_a?(Proc) | |
40 | - curr_opts[key] = if val.arity == 1 | |
41 | - val.call(self) | |
42 | - else | |
43 | - val.call | |
44 | - end | |
45 | - end | |
46 | - end | |
47 | - delay(curr_opts).__send__(without_method, *args) | |
48 | - end | |
49 | - alias_method_chain method, :delay | |
50 | - end | |
51 | - end | |
52 | - end | |
53 | -end |
vendor/plugins/delayed_job/lib/delayed/performable_mailer.rb
... | ... | @@ -1,21 +0,0 @@ |
1 | -require 'mail' | |
2 | - | |
3 | -module Delayed | |
4 | - class PerformableMailer < PerformableMethod | |
5 | - def perform | |
6 | - object.send(method_name, *args).deliver | |
7 | - end | |
8 | - end | |
9 | - | |
10 | - module DelayMail | |
11 | - def delay(options = {}) | |
12 | - DelayProxy.new(PerformableMailer, self, options) | |
13 | - end | |
14 | - end | |
15 | -end | |
16 | - | |
17 | -Mail::Message.class_eval do | |
18 | - def delay(*args) | |
19 | - raise RuntimeError, "Use MyMailer.delay.mailer_action(args) to delay sending of emails." | |
20 | - end | |
21 | -end |
vendor/plugins/delayed_job/lib/delayed/performable_method.rb
... | ... | @@ -1,37 +0,0 @@ |
1 | -require 'active_support/core_ext/module/delegation' | |
2 | - | |
3 | -module Delayed | |
4 | - class PerformableMethod | |
5 | - attr_accessor :object, :method_name, :args | |
6 | - | |
7 | - delegate :method, :to => :object | |
8 | - | |
9 | - def initialize(object, method_name, args) | |
10 | - raise NoMethodError, "undefined method `#{method_name}' for #{object.inspect}" unless object.respond_to?(method_name, true) | |
11 | - | |
12 | - if object.respond_to?(:new_record?) && object.new_record? | |
13 | - raise(ArgumentError, 'Jobs cannot be created for records before they\'ve been persisted') | |
14 | - end | |
15 | - | |
16 | - self.object = object | |
17 | - self.args = args | |
18 | - self.method_name = method_name.to_sym | |
19 | - end | |
20 | - | |
21 | - def display_name | |
22 | - "#{object.class}##{method_name}" | |
23 | - end | |
24 | - | |
25 | - def perform | |
26 | - object.send(method_name, *args) if object | |
27 | - end | |
28 | - | |
29 | - def method_missing(symbol, *args) | |
30 | - object.send(symbol, *args) | |
31 | - end | |
32 | - | |
33 | - def respond_to?(symbol, include_private=false) | |
34 | - super || object.respond_to?(symbol, include_private) | |
35 | - end | |
36 | - end | |
37 | -end |
vendor/plugins/delayed_job/lib/delayed/plugin.rb
... | ... | @@ -1,15 +0,0 @@ |
1 | -require 'active_support/core_ext/class/attribute' | |
2 | - | |
3 | -module Delayed | |
4 | - class Plugin | |
5 | - class_attribute :callback_block | |
6 | - | |
7 | - def self.callbacks(&block) | |
8 | - self.callback_block = block | |
9 | - end | |
10 | - | |
11 | - def initialize | |
12 | - self.class.callback_block.call(Delayed::Worker.lifecycle) if self.class.callback_block | |
13 | - end | |
14 | - end | |
15 | -end |
vendor/plugins/delayed_job/lib/delayed/plugins/clear_locks.rb
... | ... | @@ -1,15 +0,0 @@ |
1 | -module Delayed | |
2 | - module Plugins | |
3 | - class ClearLocks < Plugin | |
4 | - callbacks do |lifecycle| | |
5 | - lifecycle.around(:execute) do |worker, &block| | |
6 | - begin | |
7 | - block.call(worker) | |
8 | - ensure | |
9 | - Delayed::Job.clear_locks!(worker.name) | |
10 | - end | |
11 | - end | |
12 | - end | |
13 | - end | |
14 | - end | |
15 | -end |
vendor/plugins/delayed_job/lib/delayed/psych_ext.rb
... | ... | @@ -1,146 +0,0 @@ |
1 | -if defined?(ActiveRecord) | |
2 | - ActiveRecord::Base.class_eval do | |
3 | - if instance_methods.include?(:encode_with) | |
4 | - def encode_with_override(coder) | |
5 | - encode_with_without_override(coder) | |
6 | - coder.tag = "!ruby/ActiveRecord:#{self.class.name}" | |
7 | - end | |
8 | - alias_method :encode_with_without_override, :encode_with | |
9 | - alias_method :encode_with, :encode_with_override | |
10 | - else | |
11 | - def encode_with(coder) | |
12 | - coder["attributes"] = attributes | |
13 | - coder.tag = "!ruby/ActiveRecord:#{self.class.name}" | |
14 | - end | |
15 | - end | |
16 | - end | |
17 | -end | |
18 | - | |
19 | -class Delayed::PerformableMethod | |
20 | - # serialize to YAML | |
21 | - def encode_with(coder) | |
22 | - coder.map = { | |
23 | - "object" => object, | |
24 | - "method_name" => method_name, | |
25 | - "args" => args | |
26 | - } | |
27 | - end | |
28 | -end | |
29 | - | |
30 | -module Psych | |
31 | - module Visitors | |
32 | - class YAMLTree | |
33 | - def visit_Class(klass) | |
34 | - @emitter.scalar klass.name, nil, '!ruby/class', false, false, Nodes::Scalar::SINGLE_QUOTED | |
35 | - end | |
36 | - end | |
37 | - | |
38 | - class ToRuby | |
39 | - def visit_Psych_Nodes_Scalar(o) | |
40 | - @st[o.anchor] = o.value if o.anchor | |
41 | - | |
42 | - if klass = Psych.load_tags[o.tag] | |
43 | - instance = klass.allocate | |
44 | - | |
45 | - if instance.respond_to?(:init_with) | |
46 | - coder = Psych::Coder.new(o.tag) | |
47 | - coder.scalar = o.value | |
48 | - instance.init_with coder | |
49 | - end | |
50 | - | |
51 | - return instance | |
52 | - end | |
53 | - | |
54 | - return o.value if o.quoted | |
55 | - return @ss.tokenize(o.value) unless o.tag | |
56 | - | |
57 | - case o.tag | |
58 | - when '!binary', 'tag:yaml.org,2002:binary' | |
59 | - o.value.unpack('m').first | |
60 | - when '!str', 'tag:yaml.org,2002:str' | |
61 | - o.value | |
62 | - when "!ruby/object:DateTime" | |
63 | - require 'date' | |
64 | - @ss.parse_time(o.value).to_datetime | |
65 | - when "!ruby/object:Complex" | |
66 | - Complex(o.value) | |
67 | - when "!ruby/object:Rational" | |
68 | - Rational(o.value) | |
69 | - when "!ruby/class", "!ruby/module" | |
70 | - resolve_class o.value | |
71 | - when "tag:yaml.org,2002:float", "!float" | |
72 | - Float(@ss.tokenize(o.value)) | |
73 | - when "!ruby/regexp" | |
74 | - o.value =~ /^\/(.*)\/([mixn]*)$/ | |
75 | - source = $1 | |
76 | - options = 0 | |
77 | - lang = nil | |
78 | - ($2 || '').split('').each do |option| | |
79 | - case option | |
80 | - when 'x' then options |= Regexp::EXTENDED | |
81 | - when 'i' then options |= Regexp::IGNORECASE | |
82 | - when 'm' then options |= Regexp::MULTILINE | |
83 | - when 'n' then options |= Regexp::NOENCODING | |
84 | - else lang = option | |
85 | - end | |
86 | - end | |
87 | - Regexp.new(*[source, options, lang].compact) | |
88 | - when "!ruby/range" | |
89 | - args = o.value.split(/([.]{2,3})/, 2).map { |s| | |
90 | - accept Nodes::Scalar.new(s) | |
91 | - } | |
92 | - args.push(args.delete_at(1) == '...') | |
93 | - Range.new(*args) | |
94 | - when /^!ruby\/sym(bol)?:?(.*)?$/ | |
95 | - o.value.to_sym | |
96 | - else | |
97 | - @ss.tokenize o.value | |
98 | - end | |
99 | - end | |
100 | - | |
101 | - def visit_Psych_Nodes_Mapping_with_class(object) | |
102 | - return revive(Psych.load_tags[object.tag], object) if Psych.load_tags[object.tag] | |
103 | - | |
104 | - case object.tag | |
105 | - when /^!ruby\/ActiveRecord:(.+)$/ | |
106 | - klass = resolve_class($1) | |
107 | - payload = Hash[*object.children.map { |c| accept c }] | |
108 | - id = payload["attributes"][klass.primary_key] | |
109 | - begin | |
110 | - klass.unscoped.find(id) | |
111 | - rescue ActiveRecord::RecordNotFound | |
112 | - raise Delayed::DeserializationError | |
113 | - end | |
114 | - when /^!ruby\/Mongoid:(.+)$/ | |
115 | - klass = resolve_class($1) | |
116 | - payload = Hash[*object.children.map { |c| accept c }] | |
117 | - begin | |
118 | - klass.find(payload["attributes"]["_id"]) | |
119 | - rescue Mongoid::Errors::DocumentNotFound | |
120 | - raise Delayed::DeserializationError | |
121 | - end | |
122 | - when /^!ruby\/DataMapper:(.+)$/ | |
123 | - klass = resolve_class($1) | |
124 | - payload = Hash[*object.children.map { |c| accept c }] | |
125 | - begin | |
126 | - primary_keys = klass.properties.select { |p| p.key? } | |
127 | - key_names = primary_keys.map { |p| p.name.to_s } | |
128 | - klass.get!(*key_names.map { |k| payload["attributes"][k] }) | |
129 | - rescue DataMapper::ObjectNotFoundError | |
130 | - raise Delayed::DeserializationError | |
131 | - end | |
132 | - else | |
133 | - visit_Psych_Nodes_Mapping_without_class(object) | |
134 | - end | |
135 | - end | |
136 | - alias_method_chain :visit_Psych_Nodes_Mapping, :class | |
137 | - | |
138 | - def resolve_class_with_constantize(klass_name) | |
139 | - klass_name.constantize | |
140 | - rescue | |
141 | - resolve_class_without_constantize(klass_name) | |
142 | - end | |
143 | - alias_method_chain :resolve_class, :constantize | |
144 | - end | |
145 | - end | |
146 | -end |
vendor/plugins/delayed_job/lib/delayed/railtie.rb
... | ... | @@ -1,16 +0,0 @@ |
1 | -require 'delayed_job' | |
2 | -require 'rails' | |
3 | - | |
4 | -module Delayed | |
5 | - class Railtie < Rails::Railtie | |
6 | - initializer :after_initialize do | |
7 | - ActiveSupport.on_load(:action_mailer) do | |
8 | - ActionMailer::Base.send(:extend, Delayed::DelayMail) | |
9 | - end | |
10 | - end | |
11 | - | |
12 | - rake_tasks do | |
13 | - load 'delayed/tasks.rb' | |
14 | - end | |
15 | - end | |
16 | -end |
vendor/plugins/delayed_job/lib/delayed/recipes.rb
... | ... | @@ -1,54 +0,0 @@ |
1 | -# Capistrano Recipes for managing delayed_job | |
2 | -# | |
3 | -# Add these callbacks to have the delayed_job process restart when the server | |
4 | -# is restarted: | |
5 | -# | |
6 | -# after "deploy:stop", "delayed_job:stop" | |
7 | -# after "deploy:start", "delayed_job:start" | |
8 | -# after "deploy:restart", "delayed_job:restart" | |
9 | -# | |
10 | -# If you want to use command line options, for example to start multiple workers, | |
11 | -# define a Capistrano variable delayed_job_args: | |
12 | -# | |
13 | -# set :delayed_job_args, "-n 2" | |
14 | -# | |
15 | -# If you've got delayed_job workers running on a servers, you can also specify | |
16 | -# which servers have delayed_job running and should be restarted after deploy. | |
17 | -# | |
18 | -# set :delayed_job_server_role, :worker | |
19 | -# | |
20 | - | |
21 | -Capistrano::Configuration.instance.load do | |
22 | - namespace :delayed_job do | |
23 | - def rails_env | |
24 | - fetch(:rails_env, false) ? "RAILS_ENV=#{fetch(:rails_env)}" : '' | |
25 | - end | |
26 | - | |
27 | - def args | |
28 | - fetch(:delayed_job_args, "") | |
29 | - end | |
30 | - | |
31 | - def roles | |
32 | - fetch(:delayed_job_server_role, :app) | |
33 | - end | |
34 | - | |
35 | - def delayed_job_command | |
36 | - fetch(:delayed_job_command, "script/delayed_job") | |
37 | - end | |
38 | - | |
39 | - desc "Stop the delayed_job process" | |
40 | - task :stop, :roles => lambda { roles } do | |
41 | - run "cd #{current_path};#{rails_env} #{delayed_job_command} stop" | |
42 | - end | |
43 | - | |
44 | - desc "Start the delayed_job process" | |
45 | - task :start, :roles => lambda { roles } do | |
46 | - run "cd #{current_path};#{rails_env} #{delayed_job_command} start #{args}" | |
47 | - end | |
48 | - | |
49 | - desc "Restart the delayed_job process" | |
50 | - task :restart, :roles => lambda { roles } do | |
51 | - run "cd #{current_path};#{rails_env} #{delayed_job_command} restart #{args}" | |
52 | - end | |
53 | - end | |
54 | -end |
vendor/plugins/delayed_job/lib/delayed/serialization/active_record.rb
... | ... | @@ -1,15 +0,0 @@ |
1 | -if defined?(ActiveRecord) | |
2 | - class ActiveRecord::Base | |
3 | - yaml_as "tag:ruby.yaml.org,2002:ActiveRecord" | |
4 | - | |
5 | - def self.yaml_new(klass, tag, val) | |
6 | - klass.unscoped.find(val['attributes'][klass.primary_key]) | |
7 | - rescue ActiveRecord::RecordNotFound | |
8 | - raise Delayed::DeserializationError, "ActiveRecord::RecordNotFound, class: #{klass} , primary key: #{val['attributes'][klass.primary_key]} " | |
9 | - end | |
10 | - | |
11 | - def to_yaml_properties | |
12 | - ['@attributes'] | |
13 | - end | |
14 | - end | |
15 | -end |
vendor/plugins/delayed_job/lib/delayed/syck_ext.rb
... | ... | @@ -1,34 +0,0 @@ |
1 | -class Module | |
2 | - yaml_as "tag:ruby.yaml.org,2002:module" | |
3 | - | |
4 | - def self.yaml_new(klass, tag, val) | |
5 | - val.constantize | |
6 | - end | |
7 | - | |
8 | - def to_yaml(options = {}) | |
9 | - YAML.quick_emit(nil, options) do |out| | |
10 | - out.scalar(taguri, name, :plain) | |
11 | - end | |
12 | - end | |
13 | - | |
14 | - def yaml_tag_read_class(name) | |
15 | - # Constantize the object so that ActiveSupport can attempt | |
16 | - # its auto loading magic. Will raise LoadError if not successful. | |
17 | - name.constantize | |
18 | - name | |
19 | - end | |
20 | -end | |
21 | - | |
22 | -class Class | |
23 | - yaml_as "tag:ruby.yaml.org,2002:class" | |
24 | - remove_method :to_yaml if respond_to?(:to_yaml) && method(:to_yaml).owner == Class # use Module's to_yaml | |
25 | -end | |
26 | - | |
27 | -class Struct | |
28 | - def self.yaml_tag_read_class(name) | |
29 | - # Constantize the object so that ActiveSupport can attempt | |
30 | - # its auto loading magic. Will raise LoadError if not successful. | |
31 | - name.constantize | |
32 | - "Struct::#{ name }" | |
33 | - end | |
34 | -end |
vendor/plugins/delayed_job/lib/delayed/tasks.rb
... | ... | @@ -1,38 +0,0 @@ |
1 | -namespace :jobs do | |
2 | - desc "Clear the delayed_job queue." | |
3 | - task :clear => :environment do | |
4 | - Delayed::Job.delete_all | |
5 | - end | |
6 | - | |
7 | - desc "Start a delayed_job worker." | |
8 | - task :work => :environment_options do | |
9 | - Delayed::Worker.new(@worker_options).start | |
10 | - end | |
11 | - | |
12 | - desc "Start a delayed_job worker and exit when all available jobs are complete." | |
13 | - task :workoff => :environment_options do | |
14 | - Delayed::Worker.new(@worker_options.merge({:exit_on_complete => true})).start | |
15 | - end | |
16 | - | |
17 | - task :environment_options => :environment do | |
18 | - @worker_options = { | |
19 | - :min_priority => ENV['MIN_PRIORITY'], | |
20 | - :max_priority => ENV['MAX_PRIORITY'], | |
21 | - :queues => (ENV['QUEUES'] || ENV['QUEUE'] || '').split(','), | |
22 | - :quiet => false | |
23 | - } | |
24 | - end | |
25 | - | |
26 | - desc "Exit with error status if any jobs older than max_age seconds haven't been attempted yet." | |
27 | - task :check, [:max_age] => :environment do |_, args| | |
28 | - args.with_defaults(:max_age => 300) | |
29 | - | |
30 | - unprocessed_jobs = Delayed::Job.where('attempts = 0 AND created_at < ?', Time.now - args[:max_age].to_i).count | |
31 | - | |
32 | - if unprocessed_jobs > 0 | |
33 | - fail "#{unprocessed_jobs} jobs older than #{args[:max_age]} seconds have not been processed yet" | |
34 | - end | |
35 | - | |
36 | - end | |
37 | - | |
38 | -end |
vendor/plugins/delayed_job/lib/delayed/worker.rb
... | ... | @@ -1,283 +0,0 @@ |
1 | -require 'timeout' | |
2 | -require 'active_support/core_ext/numeric/time' | |
3 | -require 'active_support/core_ext/class/attribute_accessors' | |
4 | -require 'active_support/core_ext/kernel' | |
5 | -require 'active_support/core_ext/enumerable' | |
6 | -require 'logger' | |
7 | -require 'benchmark' | |
8 | - | |
9 | -module Delayed | |
10 | - class Worker | |
11 | - DEFAULT_LOG_LEVEL = Logger::INFO | |
12 | - DEFAULT_SLEEP_DELAY = 5 | |
13 | - DEFAULT_MAX_ATTEMPTS = 25 | |
14 | - DEFAULT_MAX_RUN_TIME = 4.hours | |
15 | - DEFAULT_DEFAULT_PRIORITY = 0 | |
16 | - DEFAULT_DELAY_JOBS = true | |
17 | - DEFAULT_QUEUES = [] | |
18 | - DEFAULT_READ_AHEAD = 5 | |
19 | - | |
20 | - cattr_accessor :min_priority, :max_priority, :max_attempts, :max_run_time, | |
21 | - :default_priority, :sleep_delay, :logger, :delay_jobs, :queues, | |
22 | - :read_ahead, :plugins, :destroy_failed_jobs, :exit_on_complete | |
23 | - | |
24 | - # Named queue into which jobs are enqueued by default | |
25 | - cattr_accessor :default_queue_name | |
26 | - | |
27 | - cattr_reader :backend | |
28 | - | |
29 | - # name_prefix is ignored if name is set directly | |
30 | - attr_accessor :name_prefix | |
31 | - | |
32 | - def self.reset | |
33 | - self.sleep_delay = DEFAULT_SLEEP_DELAY | |
34 | - self.max_attempts = DEFAULT_MAX_ATTEMPTS | |
35 | - self.max_run_time = DEFAULT_MAX_RUN_TIME | |
36 | - self.default_priority = DEFAULT_DEFAULT_PRIORITY | |
37 | - self.delay_jobs = DEFAULT_DELAY_JOBS | |
38 | - self.queues = DEFAULT_QUEUES | |
39 | - self.read_ahead = DEFAULT_READ_AHEAD | |
40 | - end | |
41 | - | |
42 | - reset | |
43 | - | |
44 | - # Add or remove plugins in this list before the worker is instantiated | |
45 | - self.plugins = [Delayed::Plugins::ClearLocks] | |
46 | - | |
47 | - # By default failed jobs are destroyed after too many attempts. If you want to keep them around | |
48 | - # (perhaps to inspect the reason for the failure), set this to false. | |
49 | - self.destroy_failed_jobs = true | |
50 | - | |
51 | - # By default, Signals INT and TERM set @exit, and the worker exits upon completion of the current job. | |
52 | - # If you would prefer to raise a SignalException and exit immediately you can use this. | |
53 | - # Be aware daemons uses TERM to stop and restart | |
54 | - # false - No exceptions will be raised | |
55 | - # :term - Will only raise an exception on TERM signals but INT will wait for the current job to finish | |
56 | - # true - Will raise an exception on TERM and INT | |
57 | - cattr_accessor :raise_signal_exceptions | |
58 | - self.raise_signal_exceptions = false | |
59 | - | |
60 | - self.logger = if defined?(Rails) | |
61 | - Rails.logger | |
62 | - elsif defined?(RAILS_DEFAULT_LOGGER) | |
63 | - RAILS_DEFAULT_LOGGER | |
64 | - end | |
65 | - | |
66 | - def self.backend=(backend) | |
67 | - if backend.is_a? Symbol | |
68 | - require "delayed/serialization/#{backend}" | |
69 | - require "delayed/backend/#{backend}" | |
70 | - backend = "Delayed::Backend::#{backend.to_s.classify}::Job".constantize | |
71 | - end | |
72 | - @@backend = backend | |
73 | - silence_warnings { ::Delayed.const_set(:Job, backend) } | |
74 | - end | |
75 | - | |
76 | - def self.guess_backend | |
77 | - warn "[DEPRECATION] guess_backend is deprecated. Please remove it from your code." | |
78 | - end | |
79 | - | |
80 | - def self.before_fork | |
81 | - unless @files_to_reopen | |
82 | - @files_to_reopen = [] | |
83 | - ObjectSpace.each_object(File) do |file| | |
84 | - @files_to_reopen << file unless file.closed? | |
85 | - end | |
86 | - end | |
87 | - | |
88 | - backend.before_fork | |
89 | - end | |
90 | - | |
91 | - def self.after_fork | |
92 | - # Re-open file handles | |
93 | - @files_to_reopen.each do |file| | |
94 | - begin | |
95 | - file.reopen file.path, "a+" | |
96 | - file.sync = true | |
97 | - rescue ::Exception | |
98 | - end | |
99 | - end | |
100 | - | |
101 | - backend.after_fork | |
102 | - end | |
103 | - | |
104 | - def self.lifecycle | |
105 | - @lifecycle ||= Delayed::Lifecycle.new | |
106 | - end | |
107 | - | |
108 | - def initialize(options={}) | |
109 | - @quiet = options.has_key?(:quiet) ? options[:quiet] : true | |
110 | - @failed_reserve_count = 0 | |
111 | - | |
112 | - [:min_priority, :max_priority, :sleep_delay, :read_ahead, :queues, :exit_on_complete].each do |option| | |
113 | - self.class.send("#{option}=", options[option]) if options.has_key?(option) | |
114 | - end | |
115 | - | |
116 | - self.plugins.each { |klass| klass.new } | |
117 | - end | |
118 | - | |
119 | - # Every worker has a unique name which by default is the pid of the process. There are some | |
120 | - # advantages to overriding this with something which survives worker restarts: Workers can | |
121 | - # safely resume working on tasks which are locked by themselves. The worker will assume that | |
122 | - # it crashed before. | |
123 | - def name | |
124 | - return @name unless @name.nil? | |
125 | - "#{@name_prefix}host:#{Socket.gethostname} pid:#{Process.pid}" rescue "#{@name_prefix}pid:#{Process.pid}" | |
126 | - end | |
127 | - | |
128 | - # Sets the name of the worker. | |
129 | - # Setting the name to nil will reset the default worker name | |
130 | - def name=(val) | |
131 | - @name = val | |
132 | - end | |
133 | - | |
134 | - def start | |
135 | - trap('TERM') do | |
136 | - say 'Exiting...' | |
137 | - stop | |
138 | - raise SignalException.new('TERM') if self.class.raise_signal_exceptions | |
139 | - end | |
140 | - | |
141 | - trap('INT') do | |
142 | - say 'Exiting...' | |
143 | - stop | |
144 | - raise SignalException.new('INT') if self.class.raise_signal_exceptions && self.class.raise_signal_exceptions != :term | |
145 | - end | |
146 | - | |
147 | - say "Starting job worker" | |
148 | - | |
149 | - self.class.lifecycle.run_callbacks(:execute, self) do | |
150 | - loop do | |
151 | - self.class.lifecycle.run_callbacks(:loop, self) do | |
152 | - @realtime = Benchmark.realtime do | |
153 | - @result = work_off | |
154 | - end | |
155 | - end | |
156 | - | |
157 | - count = @result.sum | |
158 | - | |
159 | - if count.zero? | |
160 | - if self.class.exit_on_complete | |
161 | - say "No more jobs available. Exiting" | |
162 | - break | |
163 | - else | |
164 | - sleep(self.class.sleep_delay) unless stop? | |
165 | - end | |
166 | - else | |
167 | - say "#{count} jobs processed at %.4f j/s, %d failed" % [count / @realtime, @result.last] | |
168 | - end | |
169 | - | |
170 | - break if stop? | |
171 | - end | |
172 | - end | |
173 | - end | |
174 | - | |
175 | - def stop | |
176 | - @exit = true | |
177 | - end | |
178 | - | |
179 | - def stop? | |
180 | - !!@exit | |
181 | - end | |
182 | - | |
183 | - # Do num jobs and return stats on success/failure. | |
184 | - # Exit early if interrupted. | |
185 | - def work_off(num = 100) | |
186 | - success, failure = 0, 0 | |
187 | - | |
188 | - num.times do | |
189 | - case reserve_and_run_one_job | |
190 | - when true | |
191 | - success += 1 | |
192 | - when false | |
193 | - failure += 1 | |
194 | - else | |
195 | - break # leave if no work could be done | |
196 | - end | |
197 | - break if stop? # leave if we're exiting | |
198 | - end | |
199 | - | |
200 | - return [success, failure] | |
201 | - end | |
202 | - | |
203 | - def run(job) | |
204 | - job_say job, 'RUNNING' | |
205 | - runtime = Benchmark.realtime do | |
206 | - Timeout.timeout(self.class.max_run_time.to_i, WorkerTimeout) { job.invoke_job } | |
207 | - job.destroy | |
208 | - end | |
209 | - job_say job, 'COMPLETED after %.4f' % runtime | |
210 | - return true # did work | |
211 | - rescue DeserializationError => error | |
212 | - job.last_error = "#{error.message}\n#{error.backtrace.join("\n")}" | |
213 | - failed(job) | |
214 | - rescue Exception => error | |
215 | - self.class.lifecycle.run_callbacks(:error, self, job){ handle_failed_job(job, error) } | |
216 | - return false # work failed | |
217 | - end | |
218 | - | |
219 | - # Reschedule the job in the future (when a job fails). | |
220 | - # Uses an exponential scale depending on the number of failed attempts. | |
221 | - def reschedule(job, time = nil) | |
222 | - if (job.attempts += 1) < max_attempts(job) | |
223 | - time ||= job.reschedule_at | |
224 | - job.run_at = time | |
225 | - job.unlock | |
226 | - job.save! | |
227 | - else | |
228 | - job_say job, "REMOVED permanently because of #{job.attempts} consecutive failures", Logger::ERROR | |
229 | - failed(job) | |
230 | - end | |
231 | - end | |
232 | - | |
233 | - def failed(job) | |
234 | - self.class.lifecycle.run_callbacks(:failure, self, job) do | |
235 | - job.hook(:failure) | |
236 | - self.class.destroy_failed_jobs ? job.destroy : job.fail! | |
237 | - end | |
238 | - end | |
239 | - | |
240 | - def job_say(job, text, level = DEFAULT_LOG_LEVEL) | |
241 | - text = "Job #{job.name} (id=#{job.id}) #{text}" | |
242 | - say text, level | |
243 | - end | |
244 | - | |
245 | - def say(text, level = DEFAULT_LOG_LEVEL) | |
246 | - text = "[Worker(#{name})] #{text}" | |
247 | - puts text unless @quiet | |
248 | - logger.add level, "#{Time.now.strftime('%FT%T%z')}: #{text}" if logger | |
249 | - end | |
250 | - | |
251 | - def max_attempts(job) | |
252 | - job.max_attempts || self.class.max_attempts | |
253 | - end | |
254 | - | |
255 | - protected | |
256 | - | |
257 | - def handle_failed_job(job, error) | |
258 | - job.last_error = "#{error.message}\n#{error.backtrace.join("\n")}" | |
259 | - job_say job, "FAILED (#{job.attempts} prior attempts) with #{error.class.name}: #{error.message}", Logger::ERROR | |
260 | - reschedule(job) | |
261 | - end | |
262 | - | |
263 | - # Run the next job we can get an exclusive lock on. | |
264 | - # If no jobs are left we return nil | |
265 | - def reserve_and_run_one_job | |
266 | - job = reserve_job | |
267 | - self.class.lifecycle.run_callbacks(:perform, self, job){ run(job) } if job | |
268 | - end | |
269 | - | |
270 | - def reserve_job | |
271 | - job = Delayed::Job.reserve(self) | |
272 | - @failed_reserve_count = 0 | |
273 | - job | |
274 | - rescue Exception => error | |
275 | - say "Error while reserving job: #{error}" | |
276 | - Delayed::Job.recover_from(error) | |
277 | - @failed_reserve_count += 1 | |
278 | - raise FatalBackendError if @failed_reserve_count >= 10 | |
279 | - nil | |
280 | - end | |
281 | - end | |
282 | - | |
283 | -end |
vendor/plugins/delayed_job/lib/delayed/yaml_ext.rb
... | ... | @@ -1,10 +0,0 @@ |
1 | -# These extensions allow properly serializing and autoloading of | |
2 | -# Classes, Modules and Structs | |
3 | - | |
4 | -require 'yaml' | |
5 | -if YAML.parser.class.name =~ /syck|yecht/i | |
6 | - require File.expand_path('../syck_ext', __FILE__) | |
7 | - require File.expand_path('../serialization/active_record', __FILE__) | |
8 | -else | |
9 | - require File.expand_path('../psych_ext', __FILE__) | |
10 | -end |
vendor/plugins/delayed_job/lib/delayed_job.rb
... | ... | @@ -1,22 +0,0 @@ |
1 | -require 'active_support' | |
2 | -require 'delayed/compatibility' | |
3 | -require 'delayed/exceptions' | |
4 | -require 'delayed/message_sending' | |
5 | -require 'delayed/performable_method' | |
6 | - | |
7 | -if defined?(ActionMailer) | |
8 | - require 'action_mailer/version' | |
9 | - require 'delayed/performable_mailer' | |
10 | -end | |
11 | - | |
12 | -require 'delayed/yaml_ext' | |
13 | -require 'delayed/lifecycle' | |
14 | -require 'delayed/plugin' | |
15 | -require 'delayed/plugins/clear_locks' | |
16 | -require 'delayed/backend/base' | |
17 | -require 'delayed/worker' | |
18 | -require 'delayed/deserialization_error' | |
19 | -require 'delayed/railtie' if defined?(Rails::Railtie) | |
20 | - | |
21 | -Object.send(:include, Delayed::MessageSending) | |
22 | -Module.send(:include, Delayed::MessageSending::ClassMethods) |
vendor/plugins/delayed_job/lib/generators/delayed_job/delayed_job_generator.rb
... | ... | @@ -1,12 +0,0 @@ |
1 | -require 'rails/generators' | |
2 | -require 'delayed/compatibility' | |
3 | - | |
4 | -class DelayedJobGenerator < Rails::Generators::Base | |
5 | - | |
6 | - self.source_paths << File.join(File.dirname(__FILE__), 'templates') | |
7 | - | |
8 | - def create_executable_file | |
9 | - template "script", "#{Delayed::Compatibility.executable_prefix}/delayed_job" | |
10 | - chmod "#{Delayed::Compatibility.executable_prefix}/delayed_job", 0755 | |
11 | - end | |
12 | -end |
vendor/plugins/delayed_job/lib/generators/delayed_job/templates/script
vendor/plugins/delayed_job/recipes/delayed_job.rb
... | ... | @@ -1 +0,0 @@ |
1 | -require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'delayed', 'recipes')) |
vendor/plugins/delayed_job/spec/autoloaded/clazz.rb
vendor/plugins/delayed_job/spec/autoloaded/instance_clazz.rb
vendor/plugins/delayed_job/spec/autoloaded/instance_struct.rb
vendor/plugins/delayed_job/spec/autoloaded/struct.rb
vendor/plugins/delayed_job/spec/delayed/backend/test.rb
... | ... | @@ -1,112 +0,0 @@ |
1 | -require 'ostruct' | |
2 | - | |
3 | -# An in-memory backend suitable only for testing. Tries to behave as if it were an ORM. | |
4 | -module Delayed | |
5 | - module Backend | |
6 | - module Test | |
7 | - class Job | |
8 | - attr_accessor :id | |
9 | - attr_accessor :priority | |
10 | - attr_accessor :attempts | |
11 | - attr_accessor :handler | |
12 | - attr_accessor :last_error | |
13 | - attr_accessor :run_at | |
14 | - attr_accessor :locked_at | |
15 | - attr_accessor :locked_by | |
16 | - attr_accessor :failed_at | |
17 | - attr_accessor :queue | |
18 | - | |
19 | - include Delayed::Backend::Base | |
20 | - | |
21 | - cattr_accessor :id | |
22 | - self.id = 0 | |
23 | - | |
24 | - def initialize(hash = {}) | |
25 | - self.attempts = 0 | |
26 | - self.priority = 0 | |
27 | - self.id = (self.class.id += 1) | |
28 | - hash.each{|k,v| send(:"#{k}=", v)} | |
29 | - end | |
30 | - | |
31 | - @jobs = [] | |
32 | - def self.all | |
33 | - @jobs | |
34 | - end | |
35 | - | |
36 | - def self.count | |
37 | - all.size | |
38 | - end | |
39 | - | |
40 | - def self.delete_all | |
41 | - all.clear | |
42 | - end | |
43 | - | |
44 | - def self.create(attrs = {}) | |
45 | - new(attrs).tap do |o| | |
46 | - o.save | |
47 | - end | |
48 | - end | |
49 | - | |
50 | - def self.create!(*args); create(*args); end | |
51 | - | |
52 | - def self.clear_locks!(worker_name) | |
53 | - all.select{|j| j.locked_by == worker_name}.each {|j| j.locked_by = nil; j.locked_at = nil} | |
54 | - end | |
55 | - | |
56 | - # Find a few candidate jobs to run (in case some immediately get locked by others). | |
57 | - def self.find_available(worker_name, limit = 5, max_run_time = Worker.max_run_time) | |
58 | - jobs = all.select do |j| | |
59 | - j.run_at <= db_time_now && | |
60 | - (j.locked_at.nil? || j.locked_at < db_time_now - max_run_time || j.locked_by == worker_name) && | |
61 | - !j.failed? | |
62 | - end | |
63 | - | |
64 | - jobs = jobs.select{|j| Worker.queues.include?(j.queue)} if Worker.queues.any? | |
65 | - jobs = jobs.select{|j| j.priority >= Worker.min_priority} if Worker.min_priority | |
66 | - jobs = jobs.select{|j| j.priority <= Worker.max_priority} if Worker.max_priority | |
67 | - jobs.sort_by{|j| [j.priority, j.run_at]}[0..limit-1] | |
68 | - end | |
69 | - | |
70 | - # Lock this job for this worker. | |
71 | - # Returns true if we have the lock, false otherwise. | |
72 | - def lock_exclusively!(max_run_time, worker) | |
73 | - now = self.class.db_time_now | |
74 | - if locked_by != worker | |
75 | - # We don't own this job so we will update the locked_by name and the locked_at | |
76 | - self.locked_at = now | |
77 | - self.locked_by = worker | |
78 | - end | |
79 | - | |
80 | - return true | |
81 | - end | |
82 | - | |
83 | - def self.db_time_now | |
84 | - Time.current | |
85 | - end | |
86 | - | |
87 | - def update_attributes(attrs = {}) | |
88 | - attrs.each{|k,v| send(:"#{k}=", v)} | |
89 | - save | |
90 | - end | |
91 | - | |
92 | - def destroy | |
93 | - self.class.all.delete(self) | |
94 | - end | |
95 | - | |
96 | - def save | |
97 | - self.run_at ||= Time.current | |
98 | - | |
99 | - self.class.all << self unless self.class.all.include?(self) | |
100 | - true | |
101 | - end | |
102 | - | |
103 | - def save!; save; end | |
104 | - | |
105 | - def reload | |
106 | - reset | |
107 | - self | |
108 | - end | |
109 | - end | |
110 | - end | |
111 | - end | |
112 | -end |
vendor/plugins/delayed_job/spec/delayed/serialization/test.rb
vendor/plugins/delayed_job/spec/helper.rb
... | ... | @@ -1,61 +0,0 @@ |
1 | -require 'logger' | |
2 | -require 'rspec' | |
3 | - | |
4 | -require 'action_mailer' | |
5 | -require 'active_support/dependencies' | |
6 | -require 'active_record' | |
7 | - | |
8 | -require 'delayed_job' | |
9 | -require 'delayed/backend/shared_spec' | |
10 | - | |
11 | -require 'simplecov' | |
12 | -require 'coveralls' | |
13 | - | |
14 | -SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[ | |
15 | - SimpleCov::Formatter::HTMLFormatter, | |
16 | - Coveralls::SimpleCov::Formatter | |
17 | -] | |
18 | -SimpleCov.start | |
19 | - | |
20 | -Delayed::Worker.logger = Logger.new('/tmp/dj.log') | |
21 | -ENV['RAILS_ENV'] = 'test' | |
22 | - | |
23 | -Delayed::Worker.backend = :test | |
24 | - | |
25 | -# Add this directory so the ActiveSupport autoloading works | |
26 | -ActiveSupport::Dependencies.autoload_paths << File.dirname(__FILE__) | |
27 | - | |
28 | -# Add this to simulate Railtie initializer being executed | |
29 | -ActionMailer::Base.send(:extend, Delayed::DelayMail) | |
30 | - | |
31 | - | |
32 | -# Used to test interactions between DJ and an ORM | |
33 | -ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :database => ':memory:' | |
34 | -ActiveRecord::Base.logger = Delayed::Worker.logger | |
35 | -ActiveRecord::Migration.verbose = false | |
36 | - | |
37 | -ActiveRecord::Schema.define do | |
38 | - create_table :stories, :primary_key => :story_id, :force => true do |table| | |
39 | - table.string :text | |
40 | - table.boolean :scoped, :default => true | |
41 | - end | |
42 | -end | |
43 | - | |
44 | -class Story < ActiveRecord::Base | |
45 | - self.primary_key = 'story_id' | |
46 | - def tell; text; end | |
47 | - def whatever(n, _); tell*n; end | |
48 | - default_scope { where(:scoped => true) } | |
49 | - | |
50 | - handle_asynchronously :whatever | |
51 | -end | |
52 | - | |
53 | -RSpec.configure do |config| | |
54 | - config.after(:each) do | |
55 | - Delayed::Worker.reset | |
56 | - end | |
57 | - | |
58 | - config.expect_with :rspec do |c| | |
59 | - c.syntax = :expect | |
60 | - end | |
61 | -end |
vendor/plugins/delayed_job/spec/lifecycle_spec.rb
... | ... | @@ -1,67 +0,0 @@ |
1 | -require 'helper' | |
2 | - | |
3 | -describe Delayed::Lifecycle do | |
4 | - let(:lifecycle) { Delayed::Lifecycle.new } | |
5 | - let(:callback) { lambda {|*args|} } | |
6 | - let(:arguments) { [1] } | |
7 | - let(:behavior) { double(Object, :before! => nil, :after! => nil, :inside! => nil) } | |
8 | - let(:wrapped_block) { Proc.new { behavior.inside! } } | |
9 | - | |
10 | - describe "before callbacks" do | |
11 | - before(:each) do | |
12 | - lifecycle.before(:execute, &callback) | |
13 | - end | |
14 | - | |
15 | - it "executes before wrapped block" do | |
16 | - callback.should_receive(:call).with(*arguments).ordered | |
17 | - behavior.should_receive(:inside!).ordered | |
18 | - lifecycle.run_callbacks :execute, *arguments, &wrapped_block | |
19 | - end | |
20 | - end | |
21 | - | |
22 | - describe "after callbacks" do | |
23 | - before(:each) do | |
24 | - lifecycle.after(:execute, &callback) | |
25 | - end | |
26 | - | |
27 | - it "executes after wrapped block" do | |
28 | - behavior.should_receive(:inside!).ordered | |
29 | - callback.should_receive(:call).with(*arguments).ordered | |
30 | - lifecycle.run_callbacks :execute, *arguments, &wrapped_block | |
31 | - end | |
32 | - end | |
33 | - | |
34 | - describe "around callbacks" do | |
35 | - before(:each) do | |
36 | - lifecycle.around(:execute) do |*args, &block| | |
37 | - behavior.before! | |
38 | - block.call(*args) | |
39 | - behavior.after! | |
40 | - end | |
41 | - end | |
42 | - | |
43 | - it "wraps a block" do | |
44 | - behavior.should_receive(:before!).ordered | |
45 | - behavior.should_receive(:inside!).ordered | |
46 | - behavior.should_receive(:after!).ordered | |
47 | - lifecycle.run_callbacks :execute, *arguments, &wrapped_block | |
48 | - end | |
49 | - | |
50 | - it "executes multiple callbacks in order" do | |
51 | - behavior.should_receive(:one).ordered | |
52 | - behavior.should_receive(:two).ordered | |
53 | - behavior.should_receive(:three).ordered | |
54 | - | |
55 | - lifecycle.around(:execute) { |*args, &block| behavior.one; block.call(*args) } | |
56 | - lifecycle.around(:execute) { |*args, &block| behavior.two; block.call(*args) } | |
57 | - lifecycle.around(:execute) { |*args, &block| behavior.three; block.call(*args) } | |
58 | - | |
59 | - lifecycle.run_callbacks(:execute, *arguments, &wrapped_block) | |
60 | - end | |
61 | - end | |
62 | - | |
63 | - it "raises if callback is executed with wrong number of parameters" do | |
64 | - lifecycle.before(:execute, &callback) | |
65 | - expect { lifecycle.run_callbacks(:execute, 1,2,3) {} }.to raise_error(ArgumentError, /1 parameter/) | |
66 | - end | |
67 | -end |
vendor/plugins/delayed_job/spec/message_sending_spec.rb
... | ... | @@ -1,122 +0,0 @@ |
1 | -require 'helper' | |
2 | - | |
3 | -describe Delayed::MessageSending do | |
4 | - describe "handle_asynchronously" do | |
5 | - class Story | |
6 | - def tell!(arg);end | |
7 | - handle_asynchronously :tell! | |
8 | - end | |
9 | - | |
10 | - it "aliases original method" do | |
11 | - expect(Story.new).to respond_to(:tell_without_delay!) | |
12 | - expect(Story.new).to respond_to(:tell_with_delay!) | |
13 | - end | |
14 | - | |
15 | - it "creates a PerformableMethod" do | |
16 | - story = Story.create | |
17 | - expect { | |
18 | - job = story.tell!(1) | |
19 | - expect(job.payload_object.class).to eq(Delayed::PerformableMethod) | |
20 | - expect(job.payload_object.method_name).to eq(:tell_without_delay!) | |
21 | - expect(job.payload_object.args).to eq([1]) | |
22 | - }.to change { Delayed::Job.count } | |
23 | - end | |
24 | - | |
25 | - describe "with options" do | |
26 | - class Fable | |
27 | - cattr_accessor :importance | |
28 | - def tell;end | |
29 | - handle_asynchronously :tell, :priority => Proc.new { self.importance } | |
30 | - end | |
31 | - | |
32 | - it "sets the priority based on the Fable importance" do | |
33 | - Fable.importance = 10 | |
34 | - job = Fable.new.tell | |
35 | - expect(job.priority).to eq(10) | |
36 | - | |
37 | - Fable.importance = 20 | |
38 | - job = Fable.new.tell | |
39 | - expect(job.priority).to eq(20) | |
40 | - end | |
41 | - | |
42 | - describe "using a proc with parameters" do | |
43 | - class Yarn | |
44 | - attr_accessor :importance | |
45 | - def spin | |
46 | - end | |
47 | - handle_asynchronously :spin, :priority => Proc.new {|y| y.importance } | |
48 | - end | |
49 | - | |
50 | - it "sets the priority based on the Fable importance" do | |
51 | - job = Yarn.new.tap {|y| y.importance = 10 }.spin | |
52 | - expect(job.priority).to eq(10) | |
53 | - | |
54 | - job = Yarn.new.tap {|y| y.importance = 20 }.spin | |
55 | - expect(job.priority).to eq(20) | |
56 | - end | |
57 | - end | |
58 | - end | |
59 | - end | |
60 | - | |
61 | - context "delay" do | |
62 | - class FairyTail | |
63 | - attr_accessor :happy_ending | |
64 | - def self.princesses;end | |
65 | - def tell | |
66 | - @happy_ending = true | |
67 | - end | |
68 | - end | |
69 | - | |
70 | - after do | |
71 | - Delayed::Worker.default_queue_name = nil | |
72 | - end | |
73 | - | |
74 | - it "creates a new PerformableMethod job" do | |
75 | - expect { | |
76 | - job = "hello".delay.count('l') | |
77 | - expect(job.payload_object.class).to eq(Delayed::PerformableMethod) | |
78 | - expect(job.payload_object.method_name).to eq(:count) | |
79 | - expect(job.payload_object.args).to eq(['l']) | |
80 | - }.to change { Delayed::Job.count }.by(1) | |
81 | - end | |
82 | - | |
83 | - it "sets default priority" do | |
84 | - Delayed::Worker.default_priority = 99 | |
85 | - job = FairyTail.delay.to_s | |
86 | - expect(job.priority).to eq(99) | |
87 | - end | |
88 | - | |
89 | - it "sets default queue name" do | |
90 | - Delayed::Worker.default_queue_name = 'abbazabba' | |
91 | - job = FairyTail.delay.to_s | |
92 | - expect(job.queue).to eq('abbazabba') | |
93 | - end | |
94 | - | |
95 | - it "sets job options" do | |
96 | - run_at = Time.parse('2010-05-03 12:55 AM') | |
97 | - job = FairyTail.delay(:priority => 20, :run_at => run_at).to_s | |
98 | - expect(job.run_at).to eq(run_at) | |
99 | - expect(job.priority).to eq(20) | |
100 | - end | |
101 | - | |
102 | - it "does not delay the job when delay_jobs is false" do | |
103 | - Delayed::Worker.delay_jobs = false | |
104 | - fairy_tail = FairyTail.new | |
105 | - expect { | |
106 | - expect { | |
107 | - fairy_tail.delay.tell | |
108 | - }.to change(fairy_tail, :happy_ending).from(nil).to(true) | |
109 | - }.not_to change { Delayed::Job.count } | |
110 | - end | |
111 | - | |
112 | - it "does delay the job when delay_jobs is true" do | |
113 | - Delayed::Worker.delay_jobs = true | |
114 | - fairy_tail = FairyTail.new | |
115 | - expect { | |
116 | - expect { | |
117 | - fairy_tail.delay.tell | |
118 | - }.not_to change(fairy_tail, :happy_ending) | |
119 | - }.to change { Delayed::Job.count }.by(1) | |
120 | - end | |
121 | - end | |
122 | -end |
vendor/plugins/delayed_job/spec/performable_mailer_spec.rb
... | ... | @@ -1,44 +0,0 @@ |
1 | -require 'helper' | |
2 | - | |
3 | -require 'action_mailer' | |
4 | -class MyMailer < ActionMailer::Base | |
5 | - def signup(email) | |
6 | - mail :to => email, :subject => "Delaying Emails", :from => "delayedjob@example.com",:body => 'Delaying Emails Body' | |
7 | - end | |
8 | -end | |
9 | - | |
10 | -describe ActionMailer::Base do | |
11 | - describe "delay" do | |
12 | - it "enqueues a PerformableEmail job" do | |
13 | - expect { | |
14 | - job = MyMailer.delay.signup('john@example.com') | |
15 | - expect(job.payload_object.class).to eq(Delayed::PerformableMailer) | |
16 | - expect(job.payload_object.method_name).to eq(:signup) | |
17 | - expect(job.payload_object.args).to eq(['john@example.com']) | |
18 | - }.to change { Delayed::Job.count }.by(1) | |
19 | - end | |
20 | - end | |
21 | - | |
22 | - describe "delay on a mail object" do | |
23 | - it "raises an exception" do | |
24 | - expect { | |
25 | - MyMailer.signup('john@example.com').delay | |
26 | - }.to raise_error(RuntimeError) | |
27 | - end | |
28 | - end | |
29 | - | |
30 | - describe Delayed::PerformableMailer do | |
31 | - describe "perform" do | |
32 | - it "calls the method and #deliver on the mailer" do | |
33 | - email = double('email', :deliver => true) | |
34 | - mailer_class = double('MailerClass', :signup => email) | |
35 | - mailer = Delayed::PerformableMailer.new(mailer_class, :signup, ['john@example.com']) | |
36 | - | |
37 | - mailer_class.should_receive(:signup).with('john@example.com') | |
38 | - email.should_receive(:deliver) | |
39 | - mailer.perform | |
40 | - end | |
41 | - end | |
42 | - end | |
43 | - | |
44 | -end |
vendor/plugins/delayed_job/spec/performable_method_spec.rb
... | ... | @@ -1,136 +0,0 @@ |
1 | -require 'helper' | |
2 | - | |
3 | -describe Delayed::PerformableMethod do | |
4 | - describe "perform" do | |
5 | - before do | |
6 | - @method = Delayed::PerformableMethod.new("foo", :count, ['o']) | |
7 | - end | |
8 | - | |
9 | - context "with the persisted record cannot be found" do | |
10 | - before do | |
11 | - @method.object = nil | |
12 | - end | |
13 | - | |
14 | - it "does nothing if object is nil" do | |
15 | - expect{@method.perform}.not_to raise_error | |
16 | - end | |
17 | - end | |
18 | - | |
19 | - it "calls the method on the object" do | |
20 | - @method.object.should_receive(:count).with('o') | |
21 | - @method.perform | |
22 | - end | |
23 | - end | |
24 | - | |
25 | - it "raises a NoMethodError if target method doesn't exist" do | |
26 | - expect { | |
27 | - Delayed::PerformableMethod.new(Object, :method_that_does_not_exist, []) | |
28 | - }.to raise_error(NoMethodError) | |
29 | - end | |
30 | - | |
31 | - it "does not raise NoMethodError if target method is private" do | |
32 | - clazz = Class.new do | |
33 | - def private_method | |
34 | - end | |
35 | - private :private_method | |
36 | - end | |
37 | - expect { | |
38 | - Delayed::PerformableMethod.new(clazz.new, :private_method, []) | |
39 | - }.not_to raise_error | |
40 | - end | |
41 | - | |
42 | - describe "hooks" do | |
43 | - %w(before after success).each do |hook| | |
44 | - it "delegates #{hook} hook to object" do | |
45 | - story = Story.create | |
46 | - job = story.delay.tell | |
47 | - | |
48 | - story.should_receive(hook).with(job) | |
49 | - job.invoke_job | |
50 | - end | |
51 | - end | |
52 | - | |
53 | - %w(before after success).each do |hook| | |
54 | - it "delegates #{hook} hook to object" do | |
55 | - story = Story.create | |
56 | - job = story.delay.tell | |
57 | - | |
58 | - story.should_receive(hook).with(job) | |
59 | - job.invoke_job | |
60 | - end | |
61 | - end | |
62 | - | |
63 | - it "delegates enqueue hook to object" do | |
64 | - story = Story.create | |
65 | - story.should_receive(:enqueue).with(an_instance_of(Delayed::Job)) | |
66 | - story.delay.tell | |
67 | - end | |
68 | - | |
69 | - it "delegates error hook to object" do | |
70 | - story = Story.create | |
71 | - story.should_receive(:error).with(an_instance_of(Delayed::Job), an_instance_of(RuntimeError)) | |
72 | - story.should_receive(:tell).and_raise(RuntimeError) | |
73 | - expect { story.delay.tell.invoke_job }.to raise_error | |
74 | - end | |
75 | - | |
76 | - it "delegates error hook to object when delay_jobs = false" do | |
77 | - story = Story.create | |
78 | - story.should_receive(:error).with(an_instance_of(Delayed::Job), an_instance_of(RuntimeError)) | |
79 | - story.should_receive(:tell).and_raise(RuntimeError) | |
80 | - expect { story.delay.tell.invoke_job }.to raise_error | |
81 | - end | |
82 | - | |
83 | - it "delegates failure hook to object" do | |
84 | - method = Delayed::PerformableMethod.new("object", :size, []) | |
85 | - method.object.should_receive(:failure) | |
86 | - method.failure | |
87 | - end | |
88 | - | |
89 | - context 'with delay_job == false' do | |
90 | - before do | |
91 | - Delayed::Worker.delay_jobs = false | |
92 | - end | |
93 | - | |
94 | - after do | |
95 | - Delayed::Worker.delay_jobs = true | |
96 | - end | |
97 | - | |
98 | - %w(before after success).each do |hook| | |
99 | - it "delegates #{hook} hook to object" do | |
100 | - story = Story.create | |
101 | - story.should_receive(hook).with(an_instance_of(Delayed::Job)) | |
102 | - story.delay.tell | |
103 | - end | |
104 | - end | |
105 | - | |
106 | - %w(before after success).each do |hook| | |
107 | - it "delegates #{hook} hook to object" do | |
108 | - story = Story.create | |
109 | - story.should_receive(hook).with(an_instance_of(Delayed::Job)) | |
110 | - story.delay.tell | |
111 | - end | |
112 | - end | |
113 | - | |
114 | - it "delegates error hook to object" do | |
115 | - story = Story.create | |
116 | - story.should_receive(:error).with(an_instance_of(Delayed::Job), an_instance_of(RuntimeError)) | |
117 | - story.should_receive(:tell).and_raise(RuntimeError) | |
118 | - expect { story.delay.tell }.to raise_error | |
119 | - end | |
120 | - | |
121 | - it "delegates error hook to object when delay_jobs = false" do | |
122 | - story = Story.create | |
123 | - story.should_receive(:error).with(an_instance_of(Delayed::Job), an_instance_of(RuntimeError)) | |
124 | - story.should_receive(:tell).and_raise(RuntimeError) | |
125 | - expect { story.delay.tell }.to raise_error | |
126 | - end | |
127 | - | |
128 | - it "delegates failure hook to object when delay_jobs = false" do | |
129 | - Delayed::Worker.delay_jobs = false | |
130 | - method = Delayed::PerformableMethod.new("object", :size, []) | |
131 | - method.object.should_receive(:failure) | |
132 | - method.failure | |
133 | - end | |
134 | - end | |
135 | - end | |
136 | -end |
vendor/plugins/delayed_job/spec/sample_jobs.rb
... | ... | @@ -1,75 +0,0 @@ |
1 | -class NamedJob < Struct.new(:perform) | |
2 | - def display_name | |
3 | - 'named_job' | |
4 | - end | |
5 | -end | |
6 | - | |
7 | -class SimpleJob | |
8 | - cattr_accessor :runs; self.runs = 0 | |
9 | - def perform; @@runs += 1; end | |
10 | -end | |
11 | - | |
12 | -class ErrorJob | |
13 | - cattr_accessor :runs; self.runs = 0 | |
14 | - def perform; raise 'did not work'; end | |
15 | -end | |
16 | - | |
17 | -class CustomRescheduleJob < Struct.new(:offset) | |
18 | - cattr_accessor :runs; self.runs = 0 | |
19 | - def perform; raise 'did not work'; end | |
20 | - def reschedule_at(time, attempts); time + offset; end | |
21 | -end | |
22 | - | |
23 | -class LongRunningJob | |
24 | - def perform; sleep 250; end | |
25 | -end | |
26 | - | |
27 | -class OnPermanentFailureJob < SimpleJob | |
28 | - def failure; end | |
29 | - def max_attempts; 1; end | |
30 | -end | |
31 | - | |
32 | -module M | |
33 | - class ModuleJob | |
34 | - cattr_accessor :runs; self.runs = 0 | |
35 | - def perform; @@runs += 1; end | |
36 | - end | |
37 | -end | |
38 | - | |
39 | -class CallbackJob | |
40 | - cattr_accessor :messages | |
41 | - | |
42 | - def enqueue(job) | |
43 | - self.class.messages << 'enqueue' | |
44 | - end | |
45 | - | |
46 | - def before(job) | |
47 | - self.class.messages << 'before' | |
48 | - end | |
49 | - | |
50 | - def perform | |
51 | - self.class.messages << 'perform' | |
52 | - end | |
53 | - | |
54 | - def after(job) | |
55 | - self.class.messages << 'after' | |
56 | - end | |
57 | - | |
58 | - def success(job) | |
59 | - self.class.messages << 'success' | |
60 | - end | |
61 | - | |
62 | - def error(job, error) | |
63 | - self.class.messages << "error: #{error.class}" | |
64 | - end | |
65 | - | |
66 | - def failure(job) | |
67 | - self.class.messages << 'failure' | |
68 | - end | |
69 | -end | |
70 | - | |
71 | -class EnqueueJobMod < SimpleJob | |
72 | - def enqueue(job) | |
73 | - job.run_at = 20.minutes.from_now | |
74 | - end | |
75 | -end |
vendor/plugins/delayed_job/spec/test_backend_spec.rb
... | ... | @@ -1,13 +0,0 @@ |
1 | -require 'helper' | |
2 | - | |
3 | -describe Delayed::Backend::Test::Job do | |
4 | - it_should_behave_like 'a delayed_job backend' | |
5 | - | |
6 | - describe "#reload" do | |
7 | - it "causes the payload object to be reloaded" do | |
8 | - job = "foo".delay.length | |
9 | - o = job.payload_object | |
10 | - expect(o.object_id).not_to eq(job.reload.payload_object.object_id) | |
11 | - end | |
12 | - end | |
13 | -end |
vendor/plugins/delayed_job/spec/worker_spec.rb
... | ... | @@ -1,102 +0,0 @@ |
1 | -require 'helper' | |
2 | - | |
3 | -describe Delayed::Worker do | |
4 | - describe "backend=" do | |
5 | - before do | |
6 | - @clazz = Class.new | |
7 | - Delayed::Worker.backend = @clazz | |
8 | - end | |
9 | - | |
10 | - after do | |
11 | - Delayed::Worker.backend = :test | |
12 | - end | |
13 | - | |
14 | - it "sets the Delayed::Job constant to the backend" do | |
15 | - expect(Delayed::Job).to eq(@clazz) | |
16 | - end | |
17 | - | |
18 | - it "sets backend with a symbol" do | |
19 | - Delayed::Worker.backend = :test | |
20 | - expect(Delayed::Worker.backend).to eq(Delayed::Backend::Test::Job) | |
21 | - end | |
22 | - end | |
23 | - | |
24 | - describe "job_say" do | |
25 | - before do | |
26 | - @worker = Delayed::Worker.new | |
27 | - @job = double('job', :id => 123, :name => 'ExampleJob') | |
28 | - end | |
29 | - | |
30 | - it "logs with job name and id" do | |
31 | - @worker.should_receive(:say). | |
32 | - with('Job ExampleJob (id=123) message', Delayed::Worker::DEFAULT_LOG_LEVEL) | |
33 | - @worker.job_say(@job, 'message') | |
34 | - end | |
35 | - end | |
36 | - | |
37 | - context "worker read-ahead" do | |
38 | - before do | |
39 | - @read_ahead = Delayed::Worker.read_ahead | |
40 | - end | |
41 | - | |
42 | - after do | |
43 | - Delayed::Worker.read_ahead = @read_ahead | |
44 | - end | |
45 | - | |
46 | - it "reads five jobs" do | |
47 | - Delayed::Job.should_receive(:find_available).with(anything, 5, anything).and_return([]) | |
48 | - Delayed::Job.reserve(Delayed::Worker.new) | |
49 | - end | |
50 | - | |
51 | - it "reads a configurable number of jobs" do | |
52 | - Delayed::Worker.read_ahead = 15 | |
53 | - Delayed::Job.should_receive(:find_available).with(anything, Delayed::Worker.read_ahead, anything).and_return([]) | |
54 | - Delayed::Job.reserve(Delayed::Worker.new) | |
55 | - end | |
56 | - end | |
57 | - | |
58 | - context "worker exit on complete" do | |
59 | - before do | |
60 | - Delayed::Worker.exit_on_complete = true | |
61 | - end | |
62 | - | |
63 | - after do | |
64 | - Delayed::Worker.exit_on_complete = false | |
65 | - end | |
66 | - | |
67 | - it "exits the loop when no jobs are available" do | |
68 | - worker = Delayed::Worker.new | |
69 | - Timeout::timeout(2) do | |
70 | - worker.start | |
71 | - end | |
72 | - end | |
73 | - end | |
74 | - | |
75 | - context "worker job reservation" do | |
76 | - before do | |
77 | - Delayed::Worker.exit_on_complete = true | |
78 | - end | |
79 | - | |
80 | - after do | |
81 | - Delayed::Worker.exit_on_complete = false | |
82 | - end | |
83 | - | |
84 | - it "handles error during job reservation" do | |
85 | - Delayed::Job.should_receive(:reserve).and_raise(Exception) | |
86 | - Delayed::Worker.new.work_off | |
87 | - end | |
88 | - | |
89 | - it "gives up after 10 backend failures" do | |
90 | - Delayed::Job.stub(:reserve).and_raise(Exception) | |
91 | - worker = Delayed::Worker.new | |
92 | - 9.times { worker.work_off } | |
93 | - expect(lambda { worker.work_off }).to raise_exception | |
94 | - end | |
95 | - | |
96 | - it "allows the backend to attempt recovery from reservation errors" do | |
97 | - Delayed::Job.should_receive(:reserve).and_raise(Exception) | |
98 | - Delayed::Job.should_receive(:recover_from).with(instance_of(Exception)) | |
99 | - Delayed::Worker.new.work_off | |
100 | - end | |
101 | - end | |
102 | -end |
vendor/plugins/delayed_job/spec/yaml_ext_spec.rb
... | ... | @@ -1,35 +0,0 @@ |
1 | -require 'helper' | |
2 | - | |
3 | -describe "YAML" do | |
4 | - it "autoloads classes" do | |
5 | - expect { | |
6 | - yaml = "--- !ruby/class Autoloaded::Clazz\n" | |
7 | - expect(YAML.load(yaml)).to eq(Autoloaded::Clazz) | |
8 | - }.not_to raise_error | |
9 | - end | |
10 | - | |
11 | - it "autoloads the class of a struct" do | |
12 | - expect { | |
13 | - yaml = "--- !ruby/class Autoloaded::Struct\n" | |
14 | - expect(YAML.load(yaml)).to eq(Autoloaded::Struct) | |
15 | - }.not_to raise_error | |
16 | - end | |
17 | - | |
18 | - it "autoloads the class for the instance of a struct" do | |
19 | - expect { | |
20 | - yaml = "--- !ruby/struct:Autoloaded::InstanceStruct {}" | |
21 | - expect(YAML.load(yaml).class).to eq(Autoloaded::InstanceStruct) | |
22 | - }.not_to raise_error | |
23 | - end | |
24 | - | |
25 | - it "autoloads the class for the instance" do | |
26 | - expect { | |
27 | - yaml = "--- !ruby/object:Autoloaded::InstanceClazz {}\n" | |
28 | - expect(YAML.load(yaml).class).to eq(Autoloaded::InstanceClazz) | |
29 | - }.not_to raise_error | |
30 | - end | |
31 | - | |
32 | - it "does not throw an uninitialized constant Syck::Syck when using YAML.load with poorly formed yaml" do | |
33 | - expect{ YAML.load(YAML.dump("foo: *bar"))}.not_to raise_error | |
34 | - end | |
35 | -end |
vendor/plugins/delayed_job_active_record/.rspec
vendor/plugins/delayed_job_active_record/.travis.yml
... | ... | @@ -1,28 +0,0 @@ |
1 | -language: ruby | |
2 | -before_script: | |
3 | - - mysql -e 'create database delayed_job_test;' | |
4 | - - psql -c 'create database delayed_job_test;' -U postgres | |
5 | -script: bundle exec rspec | |
6 | -gemfile: | |
7 | - - gemfiles/mysql/3-0.gemfile | |
8 | - - gemfiles/mysql/3-1.gemfile | |
9 | - - gemfiles/mysql/3-2.gemfile | |
10 | - - gemfiles/mysql/4-0.gemfile | |
11 | - - gemfiles/postgresql/3-0.gemfile | |
12 | - - gemfiles/postgresql/3-1.gemfile | |
13 | - - gemfiles/postgresql/3-2.gemfile | |
14 | - - gemfiles/postgresql/4-0.gemfile | |
15 | - - gemfiles/sqlite3/3-0.gemfile | |
16 | - - gemfiles/sqlite3/3-1.gemfile | |
17 | - - gemfiles/sqlite3/3-2.gemfile | |
18 | - - gemfiles/sqlite3/4-0.gemfile | |
19 | - - gemfiles/sqlite3/4-0-protected_attributes.gemfile | |
20 | -rvm: | |
21 | - - rbx-19mode | |
22 | - - jruby-19mode | |
23 | - - 1.9.3 | |
24 | - - 2.0.0 | |
25 | -matrix: | |
26 | - allow_failures: | |
27 | - - rvm: rbx-19mode | |
28 | - - rvm: jruby-19mode |
vendor/plugins/delayed_job_active_record/CONTRIBUTING.md
... | ... | @@ -1,14 +0,0 @@ |
1 | -## How to contribute | |
2 | - | |
3 | -If you find what looks like a bug: | |
4 | - | |
5 | -* Search the [mailing list](http://groups.google.com/group/delayed_job) to see if anyone else had the same issue. | |
6 | -* Check the [GitHub issue tracker](http://github.com/collectiveidea/delayed_job_active_record/issues/) to see if anyone else has reported issue. | |
7 | -* If you don't see anything, create an issue with information on how to reproduce it. | |
8 | - | |
9 | -If you want to contribute an enhancement or a fix: | |
10 | - | |
11 | -* Fork the project on github. | |
12 | -* Make your changes with tests. | |
13 | -* Commit the changes without making changes to the Rakefile or any other files that aren't related to your enhancement or fix | |
14 | -* Send a pull request. |
vendor/plugins/delayed_job_active_record/Gemfile
... | ... | @@ -1,28 +0,0 @@ |
1 | -source 'https://rubygems.org' | |
2 | - | |
3 | -gem 'rake' | |
4 | - | |
5 | -group :test do | |
6 | - platforms :jruby do | |
7 | - gem 'activerecord-jdbcmysql-adapter' | |
8 | - gem 'jdbc-mysql' | |
9 | - | |
10 | - gem 'activerecord-jdbcpostgresql-adapter' | |
11 | - gem 'jdbc-postgres' | |
12 | - | |
13 | - gem 'activerecord-jdbcsqlite3-adapter' | |
14 | - gem 'jdbc-sqlite3' | |
15 | - end | |
16 | - | |
17 | - platforms :ruby, :mswin, :mingw do | |
18 | - gem 'mysql', '~> 2.8.1' | |
19 | - gem 'pg' | |
20 | - gem 'sqlite3' | |
21 | - end | |
22 | - | |
23 | - gem 'coveralls', :require => false | |
24 | - gem 'rspec', '>= 2.11' | |
25 | - gem 'simplecov', :require => false | |
26 | -end | |
27 | - | |
28 | -gemspec |
vendor/plugins/delayed_job_active_record/LICENSE.md
... | ... | @@ -1,20 +0,0 @@ |
1 | -Copyright (c) 2005 Tobias Lütke | |
2 | - | |
3 | -Permission is hereby granted, free of charge, to any person obtaining | |
4 | -a copy of this software and associated documentation files (the | |
5 | -"Software"), to deal in the Software without restriction, including | |
6 | -without limitation the rights to use, copy, modify, merge, publish, | |
7 | -distribute, sublicense, and/or sell copies of the Software, and to | |
8 | -permit persons to whom the Software is furnished to do so, subject to | |
9 | -the following conditions: | |
10 | - | |
11 | -The above copyright notice and this permission notice shall be | |
12 | -included in all copies or substantial portions of the Software. | |
13 | - | |
14 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
15 | -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
16 | -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOa AND | |
17 | -NONINFRINGEMENT. IN NO EVENT SaALL THE AUTHORS OR COPYRIGHT HOLDERS BE | |
18 | -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | |
19 | -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |
20 | -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
vendor/plugins/delayed_job_active_record/README.md
... | ... | @@ -1,31 +0,0 @@ |
1 | -# DelayedJob ActiveRecord Backend | |
2 | - | |
3 | -[](https://rubygems.org/gems/delayed_job_active_record) | |
4 | -[](https://travis-ci.org/collectiveidea/delayed_job_active_record) | |
5 | -[](https://gemnasium.com/collectiveidea/delayed_job_active_record) | |
6 | -[](https://codeclimate.com/github/collectiveidea/delayed_job_active_record) | |
7 | -[](https://coveralls.io/r/collectiveidea/delayed_job_active_record) | |
8 | - | |
9 | -## Installation | |
10 | - | |
11 | -Add the gem to your Gemfile: | |
12 | - | |
13 | - gem 'delayed_job_active_record' | |
14 | - | |
15 | -Run `bundle install`. | |
16 | - | |
17 | -If you're using Rails, run the generator to create the migration for the | |
18 | -delayed_job table. | |
19 | - | |
20 | - rails g delayed_job:active_record | |
21 | - rake db:migrate | |
22 | - | |
23 | -## Upgrading from 2.x to 3.0.0 | |
24 | - | |
25 | -If you're upgrading from Delayed Job 2.x, run the upgrade generator to create a | |
26 | -migration to add a column to your delayed_jobs table. | |
27 | - | |
28 | - rails g delayed_job:upgrade | |
29 | - rake db:migrate | |
30 | - | |
31 | -That's it. Use [delayed_job as normal](http://github.com/collectiveidea/delayed_job). |
vendor/plugins/delayed_job_active_record/Rakefile
... | ... | @@ -1,35 +0,0 @@ |
1 | -# -*- encoding: utf-8 -*- | |
2 | -require "bundler/gem_helper" | |
3 | -Bundler::GemHelper.install_tasks | |
4 | - | |
5 | -require "rspec/core/rake_task" | |
6 | - | |
7 | -ADAPTERS = %w(mysql postgresql sqlite3) | |
8 | - | |
9 | -ADAPTERS.each do |adapter| | |
10 | - desc "Run RSpec code examples for #{adapter} adapter" | |
11 | - RSpec::Core::RakeTask.new(adapter => "#{adapter}:adapter") | |
12 | - | |
13 | - namespace adapter do | |
14 | - task :adapter do | |
15 | - ENV["ADAPTER"] = adapter | |
16 | - end | |
17 | - end | |
18 | -end | |
19 | - | |
20 | -task :coverage do | |
21 | - ENV["COVERAGE"] = "true" | |
22 | -end | |
23 | - | |
24 | -task :adapter do | |
25 | - ENV["ADAPTER"] = nil | |
26 | -end | |
27 | - | |
28 | -Rake::Task[:spec].enhance do | |
29 | - require "simplecov" | |
30 | - require "coveralls" | |
31 | - | |
32 | - Coveralls::SimpleCov::Formatter.new.format(SimpleCov.result) | |
33 | -end | |
34 | - | |
35 | -task default: ([:coverage] + ADAPTERS + [:adapter]) |
vendor/plugins/delayed_job_active_record/delayed_job_active_record.gemspec
... | ... | @@ -1,19 +0,0 @@ |
1 | -# coding: utf-8 | |
2 | - | |
3 | -Gem::Specification.new do |spec| | |
4 | - spec.add_dependency 'activerecord', ['>= 3.0', '< 4.1'] | |
5 | - spec.add_dependency 'delayed_job', ['>= 3.0', '< 4.1'] | |
6 | - spec.authors = ["Brian Ryckbost", "Matt Griffin", "Erik Michaels-Ober"] | |
7 | - spec.description = 'ActiveRecord backend for Delayed::Job, originally authored by Tobias Lütke' | |
8 | - spec.email = ['bryckbost@gmail.com', 'matt@griffinonline.org', 'sferik@gmail.com'] | |
9 | - spec.files = %w(CONTRIBUTING.md LICENSE.md README.md Rakefile delayed_job_active_record.gemspec) | |
10 | - spec.files += Dir.glob("lib/**/*.rb") | |
11 | - spec.files += Dir.glob("spec/**/*") | |
12 | - spec.homepage = 'http://github.com/collectiveidea/delayed_job_active_record' | |
13 | - spec.licenses = ['MIT'] | |
14 | - spec.name = 'delayed_job_active_record' | |
15 | - spec.require_paths = ['lib'] | |
16 | - spec.summary = 'ActiveRecord backend for DelayedJob' | |
17 | - spec.test_files = Dir.glob("spec/**/*") | |
18 | - spec.version = '4.0.0' | |
19 | -end |
vendor/plugins/delayed_job_active_record/gemfiles/mysql/3-0.gemfile
... | ... | @@ -1,23 +0,0 @@ |
1 | -source 'https://rubygems.org' | |
2 | - | |
3 | -gem 'rake' | |
4 | - | |
5 | -group :test do | |
6 | - platforms :jruby do | |
7 | - gem 'activerecord-jdbc-adapter' | |
8 | - gem 'activerecord-jdbcmysql-adapter' | |
9 | - gem 'jdbc-mysql' | |
10 | - end | |
11 | - | |
12 | - platforms :ruby, :mswin, :mingw do | |
13 | - gem 'mysql', '~> 2.8.1' | |
14 | - end | |
15 | - | |
16 | - gem 'coveralls', :require => false | |
17 | - gem 'rspec', '>= 2.11' | |
18 | - gem 'simplecov', :require => false | |
19 | - | |
20 | - gem 'activerecord', "~> 3.0.0" | |
21 | -end | |
22 | - | |
23 | -gemspec :path => "../../" |
vendor/plugins/delayed_job_active_record/gemfiles/mysql/3-1.gemfile
... | ... | @@ -1,23 +0,0 @@ |
1 | -source 'https://rubygems.org' | |
2 | - | |
3 | -gem 'rake' | |
4 | - | |
5 | -group :test do | |
6 | - platforms :jruby do | |
7 | - gem 'activerecord-jdbc-adapter' | |
8 | - gem 'activerecord-jdbcmysql-adapter' | |
9 | - gem 'jdbc-mysql' | |
10 | - end | |
11 | - | |
12 | - platforms :ruby, :mswin, :mingw do | |
13 | - gem 'mysql', '~> 2.8.1' | |
14 | - end | |
15 | - | |
16 | - gem 'coveralls', :require => false | |
17 | - gem 'rspec', '>= 2.11' | |
18 | - gem 'simplecov', :require => false | |
19 | - | |
20 | - gem 'activerecord', "~> 3.1.0" | |
21 | -end | |
22 | - | |
23 | -gemspec :path => "../../" |
vendor/plugins/delayed_job_active_record/gemfiles/mysql/3-2.gemfile
... | ... | @@ -1,23 +0,0 @@ |
1 | -source 'https://rubygems.org' | |
2 | - | |
3 | -gem 'rake' | |
4 | - | |
5 | -group :test do | |
6 | - platforms :jruby do | |
7 | - gem 'activerecord-jdbc-adapter' | |
8 | - gem 'activerecord-jdbcmysql-adapter' | |
9 | - gem 'jdbc-mysql' | |
10 | - end | |
11 | - | |
12 | - platforms :ruby, :mswin, :mingw do | |
13 | - gem 'mysql', '~> 2.8.1' | |
14 | - end | |
15 | - | |
16 | - gem 'coveralls', :require => false | |
17 | - gem 'rspec', '>= 2.11' | |
18 | - gem 'simplecov', :require => false | |
19 | - | |
20 | - gem 'activerecord', "~> 3.2.0" | |
21 | -end | |
22 | - | |
23 | -gemspec :path => "../../" |
vendor/plugins/delayed_job_active_record/gemfiles/mysql/4-0.gemfile
... | ... | @@ -1,25 +0,0 @@ |
1 | -source 'https://rubygems.org' | |
2 | - | |
3 | -gem 'rake' | |
4 | - | |
5 | -group :test do | |
6 | - platforms :jruby do | |
7 | - gem 'activerecord-jdbc-adapter' | |
8 | - gem 'activerecord-jdbcmysql-adapter' | |
9 | - gem 'jdbc-mysql' | |
10 | - end | |
11 | - | |
12 | - platforms :ruby, :mswin, :mingw do | |
13 | - gem 'mysql', '~> 2.9' | |
14 | - end | |
15 | - | |
16 | - gem 'coveralls', :require => false | |
17 | - gem 'rspec', '>= 2.11' | |
18 | - gem 'simplecov', :require => false | |
19 | - | |
20 | - gem 'activerecord', "~> 4.0.0.beta" | |
21 | - | |
22 | - gem 'delayed_job', "~> 4.0.0.beta" | |
23 | -end | |
24 | - | |
25 | -gemspec :path => "../../" |
vendor/plugins/delayed_job_active_record/gemfiles/postgresql/3-0.gemfile
... | ... | @@ -1,23 +0,0 @@ |
1 | -source 'https://rubygems.org' | |
2 | - | |
3 | -gem 'rake' | |
4 | - | |
5 | -group :test do | |
6 | - platforms :jruby do | |
7 | - gem 'activerecord-jdbc-adapter' | |
8 | - gem 'activerecord-jdbcpostgresql-adapter' | |
9 | - gem 'jdbc-postgres' | |
10 | - end | |
11 | - | |
12 | - platforms :ruby, :mswin, :mingw do | |
13 | - gem 'pg' | |
14 | - end | |
15 | - | |
16 | - gem 'coveralls', :require => false | |
17 | - gem 'rspec', '>= 2.11' | |
18 | - gem 'simplecov', :require => false | |
19 | - | |
20 | - gem 'activerecord', "~> 3.0.0" | |
21 | -end | |
22 | - | |
23 | -gemspec :path => "../../" |
vendor/plugins/delayed_job_active_record/gemfiles/postgresql/3-1.gemfile
... | ... | @@ -1,23 +0,0 @@ |
1 | -source 'https://rubygems.org' | |
2 | - | |
3 | -gem 'rake' | |
4 | - | |
5 | -group :test do | |
6 | - platforms :jruby do | |
7 | - gem 'activerecord-jdbc-adapter' | |
8 | - gem 'activerecord-jdbcpostgresql-adapter' | |
9 | - gem 'jdbc-postgres' | |
10 | - end | |
11 | - | |
12 | - platforms :ruby, :mswin, :mingw do | |
13 | - gem 'pg' | |
14 | - end | |
15 | - | |
16 | - gem 'coveralls', :require => false | |
17 | - gem 'rspec', '>= 2.11' | |
18 | - gem 'simplecov', :require => false | |
19 | - | |
20 | - gem 'activerecord', "~> 3.1.0" | |
21 | -end | |
22 | - | |
23 | -gemspec :path => "../../" |
vendor/plugins/delayed_job_active_record/gemfiles/postgresql/3-2.gemfile
... | ... | @@ -1,23 +0,0 @@ |
1 | -source 'https://rubygems.org' | |
2 | - | |
3 | -gem 'rake' | |
4 | - | |
5 | -group :test do | |
6 | - platforms :jruby do | |
7 | - gem 'activerecord-jdbc-adapter' | |
8 | - gem 'activerecord-jdbcpostgresql-adapter' | |
9 | - gem 'jdbc-postgres' | |
10 | - end | |
11 | - | |
12 | - platforms :ruby, :mswin, :mingw do | |
13 | - gem 'pg' | |
14 | - end | |
15 | - | |
16 | - gem 'coveralls', :require => false | |
17 | - gem 'rspec', '>= 2.11' | |
18 | - gem 'simplecov', :require => false | |
19 | - | |
20 | - gem 'activerecord', "~> 3.2.0" | |
21 | -end | |
22 | - | |
23 | -gemspec :path => "../../" |
vendor/plugins/delayed_job_active_record/gemfiles/postgresql/4-0.gemfile
... | ... | @@ -1,25 +0,0 @@ |
1 | -source 'https://rubygems.org' | |
2 | - | |
3 | -gem 'rake' | |
4 | - | |
5 | -group :test do | |
6 | - platforms :jruby do | |
7 | - gem 'activerecord-jdbc-adapter' | |
8 | - gem 'activerecord-jdbcpostgresql-adapter' | |
9 | - gem 'jdbc-postgres' | |
10 | - end | |
11 | - | |
12 | - platforms :ruby, :mswin, :mingw do | |
13 | - gem 'pg' | |
14 | - end | |
15 | - | |
16 | - gem 'coveralls', :require => false | |
17 | - gem 'rspec', '>= 2.11' | |
18 | - gem 'simplecov', :require => false | |
19 | - | |
20 | - gem 'activerecord', "~> 4.0.0.beta" | |
21 | - | |
22 | - gem 'delayed_job', "~> 4.0.0.beta" | |
23 | -end | |
24 | - | |
25 | -gemspec :path => "../../" |
vendor/plugins/delayed_job_active_record/gemfiles/sqlite3/3-0.gemfile
... | ... | @@ -1,23 +0,0 @@ |
1 | -source 'https://rubygems.org' | |
2 | - | |
3 | -gem 'rake' | |
4 | - | |
5 | -group :test do | |
6 | - platforms :jruby do | |
7 | - gem 'jruby-openssl' | |
8 | - gem 'activerecord-jdbc-adapter' | |
9 | - gem 'activerecord-jdbcsqlite3-adapter' | |
10 | - end | |
11 | - | |
12 | - platforms :ruby, :mswin, :mingw do | |
13 | - gem 'sqlite3' | |
14 | - end | |
15 | - | |
16 | - gem 'coveralls', :require => false | |
17 | - gem 'rspec', '>= 2.11' | |
18 | - gem 'simplecov', :require => false | |
19 | - | |
20 | - gem 'activerecord', "~> 3.0.0" | |
21 | -end | |
22 | - | |
23 | -gemspec :path => "../../" |
vendor/plugins/delayed_job_active_record/gemfiles/sqlite3/3-1.gemfile
... | ... | @@ -1,23 +0,0 @@ |
1 | -source 'https://rubygems.org' | |
2 | - | |
3 | -gem 'rake' | |
4 | - | |
5 | -group :test do | |
6 | - platforms :jruby do | |
7 | - gem 'jruby-openssl' | |
8 | - gem 'activerecord-jdbc-adapter' | |
9 | - gem 'activerecord-jdbcsqlite3-adapter' | |
10 | - end | |
11 | - | |
12 | - platforms :ruby, :mswin, :mingw do | |
13 | - gem 'sqlite3' | |
14 | - end | |
15 | - | |
16 | - gem 'coveralls', :require => false | |
17 | - gem 'rspec', '>= 2.11' | |
18 | - gem 'simplecov', :require => false | |
19 | - | |
20 | - gem 'activerecord', "~> 3.1.0" | |
21 | -end | |
22 | - | |
23 | -gemspec :path => "../../" |
vendor/plugins/delayed_job_active_record/gemfiles/sqlite3/3-2.gemfile
... | ... | @@ -1,23 +0,0 @@ |
1 | -source 'https://rubygems.org' | |
2 | - | |
3 | -gem 'rake' | |
4 | - | |
5 | -group :test do | |
6 | - platforms :jruby do | |
7 | - gem 'jruby-openssl' | |
8 | - gem 'activerecord-jdbc-adapter' | |
9 | - gem 'activerecord-jdbcsqlite3-adapter' | |
10 | - end | |
11 | - | |
12 | - platforms :ruby, :mswin, :mingw do | |
13 | - gem 'sqlite3' | |
14 | - end | |
15 | - | |
16 | - gem 'coveralls', :require => false | |
17 | - gem 'rspec', '>= 2.11' | |
18 | - gem 'simplecov', :require => false | |
19 | - | |
20 | - gem 'activerecord', "~> 3.2.0" | |
21 | -end | |
22 | - | |
23 | -gemspec :path => "../../" |
vendor/plugins/delayed_job_active_record/gemfiles/sqlite3/4-0-protected_attributes.gemfile
... | ... | @@ -1,26 +0,0 @@ |
1 | -source 'https://rubygems.org' | |
2 | - | |
3 | -gem 'rake' | |
4 | - | |
5 | -group :test do | |
6 | - platforms :jruby do | |
7 | - gem 'jruby-openssl' | |
8 | - gem 'activerecord-jdbc-adapter' | |
9 | - gem 'activerecord-jdbcsqlite3-adapter' | |
10 | - end | |
11 | - | |
12 | - platforms :ruby, :mswin, :mingw do | |
13 | - gem 'sqlite3' | |
14 | - end | |
15 | - | |
16 | - gem 'coveralls', :require => false | |
17 | - gem 'rspec', '>= 2.11', :require => false | |
18 | - gem 'simplecov', :require => false | |
19 | - | |
20 | - gem 'activerecord', "~> 4.0.0.beta" | |
21 | - gem 'protected_attributes' | |
22 | - | |
23 | - gem 'delayed_job', "~> 4.0.0.beta", :require => false | |
24 | -end | |
25 | - | |
26 | -gemspec :path => "../../" |
vendor/plugins/delayed_job_active_record/gemfiles/sqlite3/4-0.gemfile
... | ... | @@ -1,25 +0,0 @@ |
1 | -source 'https://rubygems.org' | |
2 | - | |
3 | -gem 'rake' | |
4 | - | |
5 | -group :test do | |
6 | - platforms :jruby do | |
7 | - gem 'jruby-openssl' | |
8 | - gem 'activerecord-jdbc-adapter' | |
9 | - gem 'activerecord-jdbcsqlite3-adapter' | |
10 | - end | |
11 | - | |
12 | - platforms :ruby, :mswin, :mingw do | |
13 | - gem 'sqlite3' | |
14 | - end | |
15 | - | |
16 | - gem 'coveralls', :require => false | |
17 | - gem 'rspec', '>= 2.11' | |
18 | - gem 'simplecov', :require => false | |
19 | - | |
20 | - gem 'activerecord', "~> 4.0.0.beta" | |
21 | - | |
22 | - gem 'delayed_job', "~> 4.0.0.beta" | |
23 | -end | |
24 | - | |
25 | -gemspec :path => "../../" |
vendor/plugins/delayed_job_active_record/lib/delayed/backend/active_record.rb
... | ... | @@ -1,111 +0,0 @@ |
1 | -require 'active_record/version' | |
2 | -module Delayed | |
3 | - module Backend | |
4 | - module ActiveRecord | |
5 | - # A job object that is persisted to the database. | |
6 | - # Contains the work object as a YAML field. | |
7 | - class Job < ::ActiveRecord::Base | |
8 | - include Delayed::Backend::Base | |
9 | - | |
10 | - if ::ActiveRecord::VERSION::MAJOR < 4 || defined?(::ActiveRecord::MassAssignmentSecurity) | |
11 | - attr_accessible :priority, :run_at, :queue, :payload_object, | |
12 | - :failed_at, :locked_at, :locked_by, :handler | |
13 | - end | |
14 | - | |
15 | - scope :by_priority, lambda { order('priority ASC, run_at ASC') } | |
16 | - | |
17 | - before_save :set_default_run_at | |
18 | - | |
19 | - def self.set_delayed_job_table_name | |
20 | - delayed_job_table_name = "#{::ActiveRecord::Base.table_name_prefix}delayed_jobs" | |
21 | - self.table_name = delayed_job_table_name | |
22 | - end | |
23 | - | |
24 | - self.set_delayed_job_table_name | |
25 | - | |
26 | - def self.ready_to_run(worker_name, max_run_time) | |
27 | - where('(run_at <= ? AND (locked_at IS NULL OR locked_at < ?) OR locked_by = ?) AND failed_at IS NULL', db_time_now, db_time_now - max_run_time, worker_name) | |
28 | - end | |
29 | - | |
30 | - def self.before_fork | |
31 | - ::ActiveRecord::Base.clear_all_connections! | |
32 | - end | |
33 | - | |
34 | - def self.after_fork | |
35 | - ::ActiveRecord::Base.establish_connection | |
36 | - end | |
37 | - | |
38 | - # When a worker is exiting, make sure we don't have any locked jobs. | |
39 | - def self.clear_locks!(worker_name) | |
40 | - where(:locked_by => worker_name).update_all(:locked_by => nil, :locked_at => nil) | |
41 | - end | |
42 | - | |
43 | - def self.reserve(worker, max_run_time = Worker.max_run_time) | |
44 | - # scope to filter to records that are "ready to run" | |
45 | - ready_scope = self.ready_to_run(worker.name, max_run_time) | |
46 | - | |
47 | - # scope to filter to the single next eligible job | |
48 | - ready_scope = ready_scope.where('priority >= ?', Worker.min_priority) if Worker.min_priority | |
49 | - ready_scope = ready_scope.where('priority <= ?', Worker.max_priority) if Worker.max_priority | |
50 | - ready_scope = ready_scope.where(:queue => Worker.queues) if Worker.queues.any? | |
51 | - ready_scope = ready_scope.by_priority | |
52 | - | |
53 | - now = self.db_time_now | |
54 | - | |
55 | - # Optimizations for faster lookups on some common databases | |
56 | - case self.connection.adapter_name | |
57 | - when "PostgreSQL" | |
58 | - # Custom SQL required for PostgreSQL because postgres does not support UPDATE...LIMIT | |
59 | - # This locks the single record 'FOR UPDATE' in the subquery (http://www.postgresql.org/docs/9.0/static/sql-select.html#SQL-FOR-UPDATE-SHARE) | |
60 | - # Note: active_record would attempt to generate UPDATE...LIMIT like sql for postgres if we use a .limit() filter, but it would not use | |
61 | - # 'FOR UPDATE' and we would have many locking conflicts | |
62 | - quoted_table_name = self.connection.quote_table_name(self.table_name) | |
63 | - subquery_sql = ready_scope.limit(1).lock(true).select('id').to_sql | |
64 | - reserved = self.find_by_sql(["UPDATE #{quoted_table_name} SET locked_at = ?, locked_by = ? WHERE id IN (#{subquery_sql}) RETURNING *", now, worker.name]) | |
65 | - reserved[0] | |
66 | - when "MySQL", "Mysql2" | |
67 | - # This works on MySQL and possibly some other DBs that support UPDATE...LIMIT. It uses separate queries to lock and return the job | |
68 | - count = ready_scope.limit(1).update_all(:locked_at => now, :locked_by => worker.name) | |
69 | - return nil if count == 0 | |
70 | - self.where(:locked_at => now, :locked_by => worker.name, :failed_at => nil).first | |
71 | - when "MSSQL", "Teradata" | |
72 | - # The MSSQL driver doesn't generate a limit clause when update_all is called directly | |
73 | - subsubquery_sql = ready_scope.limit(1).to_sql | |
74 | - # select("id") doesn't generate a subquery, so force a subquery | |
75 | - subquery_sql = "SELECT id FROM (#{subsubquery_sql}) AS x" | |
76 | - quoted_table_name = self.connection.quote_table_name(self.table_name) | |
77 | - sql = ["UPDATE #{quoted_table_name} SET locked_at = ?, locked_by = ? WHERE id IN (#{subquery_sql})", now, worker.name] | |
78 | - count = self.connection.execute(sanitize_sql(sql)) | |
79 | - return nil if count == 0 | |
80 | - # MSSQL JDBC doesn't support OUTPUT INSERTED.* for returning a result set, so query locked row | |
81 | - self.where(:locked_at => now, :locked_by => worker.name, :failed_at => nil).first | |
82 | - else | |
83 | - # This is our old fashion, tried and true, but slower lookup | |
84 | - ready_scope.limit(worker.read_ahead).detect do |job| | |
85 | - count = ready_scope.where(:id => job.id).update_all(:locked_at => now, :locked_by => worker.name) | |
86 | - count == 1 && job.reload | |
87 | - end | |
88 | - end | |
89 | - end | |
90 | - | |
91 | - # Get the current time (GMT or local depending on DB) | |
92 | - # Note: This does not ping the DB to get the time, so all your clients | |
93 | - # must have syncronized clocks. | |
94 | - def self.db_time_now | |
95 | - if Time.zone | |
96 | - Time.zone.now | |
97 | - elsif ::ActiveRecord::Base.default_timezone == :utc | |
98 | - Time.now.utc | |
99 | - else | |
100 | - Time.now | |
101 | - end | |
102 | - end | |
103 | - | |
104 | - def reload(*args) | |
105 | - reset | |
106 | - super | |
107 | - end | |
108 | - end | |
109 | - end | |
110 | - end | |
111 | -end |
vendor/plugins/delayed_job_active_record/lib/delayed_job_active_record.rb
vendor/plugins/delayed_job_active_record/lib/generators/delayed_job/active_record_generator.rb
... | ... | @@ -1,22 +0,0 @@ |
1 | -require 'generators/delayed_job/delayed_job_generator' | |
2 | -require 'generators/delayed_job/next_migration_version' | |
3 | -require 'rails/generators/migration' | |
4 | -require 'rails/generators/active_record' | |
5 | - | |
6 | -# Extend the DelayedJobGenerator so that it creates an AR migration | |
7 | -module DelayedJob | |
8 | - class ActiveRecordGenerator < ::DelayedJobGenerator | |
9 | - include Rails::Generators::Migration | |
10 | - extend NextMigrationVersion | |
11 | - | |
12 | - self.source_paths << File.join(File.dirname(__FILE__), 'templates') | |
13 | - | |
14 | - def create_migration_file | |
15 | - migration_template 'migration.rb', 'db/migrate/create_delayed_jobs.rb' | |
16 | - end | |
17 | - | |
18 | - def self.next_migration_number dirname | |
19 | - ActiveRecord::Generators::Base.next_migration_number dirname | |
20 | - end | |
21 | - end | |
22 | -end |
vendor/plugins/delayed_job_active_record/lib/generators/delayed_job/next_migration_version.rb
... | ... | @@ -1,14 +0,0 @@ |
1 | -module DelayedJob | |
2 | - module NextMigrationVersion | |
3 | - # while methods have moved around this has been the implementation | |
4 | - # since ActiveRecord 3.0 | |
5 | - def next_migration_number(dirname) | |
6 | - next_migration_number = current_migration_number(dirname) + 1 | |
7 | - if ActiveRecord::Base.timestamped_migrations | |
8 | - [Time.now.utc.strftime("%Y%m%d%H%M%S"), "%.14d" % next_migration_number].max | |
9 | - else | |
10 | - "%.3d" % next_migration_number | |
11 | - end | |
12 | - end | |
13 | - end | |
14 | -end |
vendor/plugins/delayed_job_active_record/lib/generators/delayed_job/templates/migration.rb
... | ... | @@ -1,22 +0,0 @@ |
1 | -class CreateDelayedJobs < ActiveRecord::Migration | |
2 | - def self.up | |
3 | - create_table :delayed_jobs, :force => true do |table| | |
4 | - table.integer :priority, :default => 0, :null => false # Allows some jobs to jump to the front of the queue | |
5 | - table.integer :attempts, :default => 0, :null => false # Provides for retries, but still fail eventually. | |
6 | - table.text :handler, :null => false # YAML-encoded string of the object that will do work | |
7 | - table.text :last_error # reason for last failure (See Note below) | |
8 | - table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future. | |
9 | - table.datetime :locked_at # Set when a client is working on this object | |
10 | - table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead) | |
11 | - table.string :locked_by # Who is working on this object (if locked) | |
12 | - table.string :queue # The name of the queue this job is in | |
13 | - table.timestamps | |
14 | - end | |
15 | - | |
16 | - add_index :delayed_jobs, [:priority, :run_at], :name => 'delayed_jobs_priority' | |
17 | - end | |
18 | - | |
19 | - def self.down | |
20 | - drop_table :delayed_jobs | |
21 | - end | |
22 | -end |
vendor/plugins/delayed_job_active_record/lib/generators/delayed_job/templates/upgrade_migration.rb
vendor/plugins/delayed_job_active_record/lib/generators/delayed_job/upgrade_generator.rb
... | ... | @@ -1,22 +0,0 @@ |
1 | -require 'generators/delayed_job/delayed_job_generator' | |
2 | -require 'generators/delayed_job/next_migration_version' | |
3 | -require 'rails/generators/migration' | |
4 | -require 'rails/generators/active_record' | |
5 | - | |
6 | -# Extend the DelayedJobGenerator so that it creates an AR migration | |
7 | -module DelayedJob | |
8 | - class UpgradeGenerator < ::DelayedJobGenerator | |
9 | - include Rails::Generators::Migration | |
10 | - extend NextMigrationVersion | |
11 | - | |
12 | - self.source_paths << File.join(File.dirname(__FILE__), 'templates') | |
13 | - | |
14 | - def create_migration_file | |
15 | - migration_template 'upgrade_migration.rb', 'db/migrate/add_queue_to_delayed_jobs.rb' | |
16 | - end | |
17 | - | |
18 | - def self.next_migration_number dirname | |
19 | - ActiveRecord::Generators::Base.next_migration_number dirname | |
20 | - end | |
21 | - end | |
22 | -end |
vendor/plugins/delayed_job_active_record/spec/database.yml
vendor/plugins/delayed_job_active_record/spec/delayed/backend/active_record_spec.rb
... | ... | @@ -1,81 +0,0 @@ |
1 | -require 'helper' | |
2 | -require 'delayed/backend/active_record' | |
3 | - | |
4 | -describe Delayed::Backend::ActiveRecord::Job do | |
5 | - it_behaves_like 'a delayed_job backend' | |
6 | - | |
7 | - context "db_time_now" do | |
8 | - after do | |
9 | - Time.zone = nil | |
10 | - ActiveRecord::Base.default_timezone = :local | |
11 | - end | |
12 | - | |
13 | - it "returns time in current time zone if set" do | |
14 | - Time.zone = 'Eastern Time (US & Canada)' | |
15 | - expect(%(EST EDT)).to include(Delayed::Job.db_time_now.zone) | |
16 | - end | |
17 | - | |
18 | - it "returns UTC time if that is the AR default" do | |
19 | - Time.zone = nil | |
20 | - ActiveRecord::Base.default_timezone = :utc | |
21 | - expect(Delayed::Backend::ActiveRecord::Job.db_time_now.zone).to eq 'UTC' | |
22 | - end | |
23 | - | |
24 | - it "returns local time if that is the AR default" do | |
25 | - Time.zone = 'Central Time (US & Canada)' | |
26 | - ActiveRecord::Base.default_timezone = :local | |
27 | - expect(%w(CST CDT)).to include(Delayed::Backend::ActiveRecord::Job.db_time_now.zone) | |
28 | - end | |
29 | - end | |
30 | - | |
31 | - describe "after_fork" do | |
32 | - it "calls reconnect on the connection" do | |
33 | - ActiveRecord::Base.should_receive(:establish_connection) | |
34 | - Delayed::Backend::ActiveRecord::Job.after_fork | |
35 | - end | |
36 | - end | |
37 | - | |
38 | - describe "enqueue" do | |
39 | - it "allows enqueue hook to modify job at DB level" do | |
40 | - later = described_class.db_time_now + 20.minutes | |
41 | - job = Delayed::Backend::ActiveRecord::Job.enqueue :payload_object => EnqueueJobMod.new | |
42 | - expect(Delayed::Backend::ActiveRecord::Job.find(job.id).run_at).to be_within(1).of(later) | |
43 | - end | |
44 | - end | |
45 | - | |
46 | - if ::ActiveRecord::VERSION::MAJOR < 4 || defined?(::ActiveRecord::MassAssignmentSecurity) | |
47 | - context "ActiveRecord::Base.send(:attr_accessible, nil)" do | |
48 | - before do | |
49 | - Delayed::Backend::ActiveRecord::Job.send(:attr_accessible, nil) | |
50 | - end | |
51 | - | |
52 | - after do | |
53 | - Delayed::Backend::ActiveRecord::Job.send(:attr_accessible, *Delayed::Backend::ActiveRecord::Job.new.attributes.keys) | |
54 | - end | |
55 | - | |
56 | - it "is still accessible" do | |
57 | - job = Delayed::Backend::ActiveRecord::Job.enqueue :payload_object => EnqueueJobMod.new | |
58 | - expect(Delayed::Backend::ActiveRecord::Job.find(job.id).handler).to_not be_blank | |
59 | - end | |
60 | - end | |
61 | - end | |
62 | - | |
63 | - context "ActiveRecord::Base.table_name_prefix" do | |
64 | - it "when prefix is not set, use 'delayed_jobs' as table name" do | |
65 | - ::ActiveRecord::Base.table_name_prefix = nil | |
66 | - Delayed::Backend::ActiveRecord::Job.set_delayed_job_table_name | |
67 | - | |
68 | - expect(Delayed::Backend::ActiveRecord::Job.table_name).to eq 'delayed_jobs' | |
69 | - end | |
70 | - | |
71 | - it "when prefix is set, prepend it before default table name" do | |
72 | - ::ActiveRecord::Base.table_name_prefix = 'custom_' | |
73 | - Delayed::Backend::ActiveRecord::Job.set_delayed_job_table_name | |
74 | - | |
75 | - expect(Delayed::Backend::ActiveRecord::Job.table_name).to eq 'custom_delayed_jobs' | |
76 | - | |
77 | - ::ActiveRecord::Base.table_name_prefix = nil | |
78 | - Delayed::Backend::ActiveRecord::Job.set_delayed_job_table_name | |
79 | - end | |
80 | - end | |
81 | -end |
vendor/plugins/delayed_job_active_record/spec/delayed/serialization/active_record_spec.rb
... | ... | @@ -1,15 +0,0 @@ |
1 | -require 'helper' | |
2 | - | |
3 | -describe ActiveRecord do | |
4 | - it "loads classes with non-default primary key" do | |
5 | - expect { | |
6 | - YAML.load(Story.create.to_yaml) | |
7 | - }.not_to raise_error | |
8 | - end | |
9 | - | |
10 | - it "loads classes even if not in default scope" do | |
11 | - expect { | |
12 | - YAML.load(Story.create(:scoped => false).to_yaml) | |
13 | - }.not_to raise_error | |
14 | - end | |
15 | -end |
vendor/plugins/delayed_job_active_record/spec/helper.rb
... | ... | @@ -1,69 +0,0 @@ |
1 | -require 'simplecov' | |
2 | -require 'coveralls' | |
3 | - | |
4 | -SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[ | |
5 | - SimpleCov::Formatter::HTMLFormatter, | |
6 | - Coveralls::SimpleCov::Formatter | |
7 | -] | |
8 | -SimpleCov.start | |
9 | - | |
10 | -require 'logger' | |
11 | -require 'rspec' | |
12 | - | |
13 | -begin | |
14 | - require 'protected_attributes' | |
15 | -rescue LoadError | |
16 | -end | |
17 | -require 'delayed_job_active_record' | |
18 | -require 'delayed/backend/shared_spec' | |
19 | - | |
20 | -Delayed::Worker.logger = Logger.new('/tmp/dj.log') | |
21 | -ENV['RAILS_ENV'] = 'test' | |
22 | - | |
23 | -db_adapter, gemfile = ENV["ADAPTER"], ENV["BUNDLE_GEMFILE"] | |
24 | -db_adapter ||= gemfile && gemfile[%r(gemfiles/(.*?)/)] && $1 | |
25 | -db_adapter ||= 'sqlite3' | |
26 | - | |
27 | -config = YAML.load(File.read('spec/database.yml')) | |
28 | -ActiveRecord::Base.establish_connection config[db_adapter] | |
29 | -ActiveRecord::Base.logger = Delayed::Worker.logger | |
30 | -ActiveRecord::Migration.verbose = false | |
31 | - | |
32 | -ActiveRecord::Schema.define do | |
33 | - create_table :delayed_jobs, :force => true do |table| | |
34 | - table.integer :priority, :default => 0 | |
35 | - table.integer :attempts, :default => 0 | |
36 | - table.text :handler | |
37 | - table.text :last_error | |
38 | - table.datetime :run_at | |
39 | - table.datetime :locked_at | |
40 | - table.datetime :failed_at | |
41 | - table.string :locked_by | |
42 | - table.string :queue | |
43 | - table.timestamps | |
44 | - end | |
45 | - | |
46 | - add_index :delayed_jobs, [:priority, :run_at], :name => 'delayed_jobs_priority' | |
47 | - | |
48 | - create_table :stories, :primary_key => :story_id, :force => true do |table| | |
49 | - table.string :text | |
50 | - table.boolean :scoped, :default => true | |
51 | - end | |
52 | -end | |
53 | - | |
54 | -# Purely useful for test cases... | |
55 | -class Story < ActiveRecord::Base | |
56 | - if ::ActiveRecord::VERSION::MAJOR < 4 && ActiveRecord::VERSION::MINOR < 2 | |
57 | - set_primary_key :story_id | |
58 | - else | |
59 | - self.primary_key = :story_id | |
60 | - end | |
61 | - def tell; text; end | |
62 | - def whatever(n, _); tell*n; end | |
63 | - default_scope { where(:scoped => true) } | |
64 | - | |
65 | - handle_asynchronously :whatever | |
66 | -end | |
67 | - | |
68 | -# Add this directory so the ActiveSupport autoloading works | |
69 | -ActiveSupport::Dependencies.autoload_paths << File.dirname(__FILE__) |
vendor/plugins/monkey_patches/will_paginate_check_finder_sql/init.rb
... | ... | @@ -1,18 +0,0 @@ |
1 | -# monkey patch to fix WillPaginate bug | |
2 | -# this was solved in will_paginate 3.x.pre, then remove this patch when upgrade to it | |
3 | -# | |
4 | -# http://sod.lighthouseapp.com/projects/17958/tickets/120-paginate-association-with-finder_sql-raises-typeerror | |
5 | -require 'will_paginate' | |
6 | - | |
7 | -WillPaginate::Finder::ClassMethods.module_eval do | |
8 | - def paginate_with_finder_sql(*args) | |
9 | - if respond_to?(:proxy_reflection) && !proxy_reflection.options[:finder_sql].nil? | |
10 | - # note: paginate_by_sql ignores the blocks. So don't pass the block | |
11 | - paginate_by_sql(@finder_sql, args.extract_options!) | |
12 | - else | |
13 | - paginate_without_finder_sql(*args) | |
14 | - end | |
15 | - end | |
16 | - # patch to deal with the custom_sql scenario | |
17 | - alias_method_chain :paginate, :finder_sql | |
18 | -end |
vendor/plugins/pothoven-attachment_fu/CHANGELOG
... | ... | @@ -1,84 +0,0 @@ |
1 | -* Aug 22, 2013 * | |
2 | -* Added cache-control header option and Ruby 1.9 fix for S3 from tricycle | |
3 | - | |
4 | -* Aug 21, 2013 * | |
5 | -* Added S3 :encrypted_storage option support from cschulte22 | |
6 | - | |
7 | -* Jul 5, 2013 | |
8 | -* Pull in changes from lchimonji10 to reformat README to RDoc format | |
9 | - | |
10 | -* Apr 10, 2013 * | |
11 | -* Ruby 2 compatibility fix | |
12 | -* Removed some lingering occurrences of RAILS_ROOT and RAILS_ENV | |
13 | -* clean up of gemspec file | |
14 | -* no longer package unnecessary files like the test files | |
15 | - | |
16 | -* Mar 12, 2013 * | |
17 | -* Pull in changes from https://github.com/aalong/attachment_fu to use Ruby 1.9.2 Tempfile naming strategy to fix conflicts with Sprockets (see https://github.com/aalong/attachment_fu/commit/938ec3b8597fbf82b1de8c98de12c4688463450a) | |
18 | - | |
19 | -* Feb 19, 2013 * | |
20 | -* Pull in changes from https://github.com/itkin/attachment_fu fork to fix mini magick | |
21 | - | |
22 | -* Nov 15, 2012 * | |
23 | -* Removed 'crop:' option as already included when prefixing geometry with a 'c'. Add note to docs. | |
24 | -* Added option to sharpen resized images ':sharpen_on_resize' | |
25 | - | |
26 | -* Oct 26, 2012 * | |
27 | -* Merged with https://github.com/tdd/attachment_fu fork to include GEM support for use in Rails 3.2, and bumped version to 3.2.x to indicate Rails 3.2 support. | |
28 | - | |
29 | -* Oct 25, 2012 * | |
30 | -* Fix to support Ruby 1.9.3 | |
31 | -* Image cropping support (append 'crop:' to desired file size when resizing) | |
32 | - | |
33 | -* Mar 15, 2010 * | |
34 | -* Added a symbol syntax for parent-type-based size spec: calls the corresponding method on the current asset instance to | |
35 | - get a Hash of required thumbnails. Lets us dynamically specify what would otherwise be hard-coded, which is useful | |
36 | - when the set of thumbnails for a given parent type varies depending on the usage context. | |
37 | - | |
38 | -* Aug 6, 2009 * | |
39 | -* JPEG quality control finalized across processors (although CoreImage applies it in a rather fuzzy-logic way), with tests. | |
40 | - | |
41 | -* Aug 4, 2009 * | |
42 | -* Supports the :aspect/'!' geometry flag in all processors | |
43 | - (thanks to http://www.deepcalm.com/writing/cropped-thumbnails-in-attachment_fu-using-imagescience) | |
44 | -* JPEG quality control on thumbnailing/resizing (still buggy on Rmagick/MiniMagick though). | |
45 | -* Moves from GIF to PNG regardless of the source file extension's case (used to require lowercase) | |
46 | -* Auto-orients image (if EXIF suggests it) prior to processing with RMagickProcessor | |
47 | -* Fixes non-image upload tests (both regular files and Merb files) | |
48 | -* Fixes obsolete failures on RMagick tests (aspect_ratio tested but not initialized anymore due to new callback architecture | |
49 | - | |
50 | -* Apr 17 2008 * | |
51 | -* amazon_s3.yml is now passed through ERB before being passed to AWS::S3 [François Beausoleil] | |
52 | - | |
53 | -* Mar 22 2008 * | |
54 | -* Some tweaks to support Rails 2.0 and Rails 2.1 due to ActiveSupport::Callback changes. | |
55 | - Thanks to http://blog.methodmissing.com/2008/1/19/edge-callback-refactorings-attachment_fu/ | |
56 | - | |
57 | -* Feb. 26, 2008 * | |
58 | -* remove breakpoint from test_helper, makes test suite crazy (at least Rails 2+) [Rob Sanheim] | |
59 | -* make S3 test really optional [Rob Sanheim] | |
60 | - | |
61 | -* Nov 27, 2007 * | |
62 | -* Handle properly ImageScience thumbnails resized from a gif file [Matt Aimonetti] | |
63 | -* Save thumbnails file size properly when using ImageScience [Matt Aimonetti] | |
64 | -* fixed s3 config file loading with latest versions of Rails [Matt Aimonetti] | |
65 | - | |
66 | -* April 2, 2007 * | |
67 | - | |
68 | -* don't copy the #full_filename to the default #temp_paths array if it doesn't exist | |
69 | -* add default ID partitioning for attachments | |
70 | -* add #binmode call to Tempfile (note: ruby should be doing this!) [Eric Beland] | |
71 | -* Check for current type of :thumbnails option. | |
72 | -* allow customization of the S3 configuration file path with the :s3_config_path option. | |
73 | -* Don't try to remove thumbnails if there aren't any. Closes #3 [ben stiglitz] | |
74 | - | |
75 | -* BC * (before changelog) | |
76 | - | |
77 | -* add default #temp_paths entry [mattly] | |
78 | -* add MiniMagick support to attachment_fu [Isacc] | |
79 | -* update #destroy_file to clear out any empty directories too [carlivar] | |
80 | -* fix references to S3Backend module [Hunter Hillegas] | |
81 | -* make #current_data public with db_file and s3 backends [ebryn] | |
82 | -* oops, actually svn add the files for s3 backend. [Jeffrey Hardy] | |
83 | -* experimental s3 support, egad, no tests.... [Jeffrey Hardy] | |
84 | -* doh, fix a few bad references to ActsAsAttachment [sixty4bit] |
vendor/plugins/pothoven-attachment_fu/Gemfile
... | ... | @@ -1,13 +0,0 @@ |
1 | -source 'http://rubygems.org' | |
2 | - | |
3 | - | |
4 | -group :test, :development do | |
5 | - gem 'rails', '~> 3.2' | |
6 | - gem 'sqlite3' | |
7 | - gem 'pothoven-attachment_fu', :path => '.' | |
8 | - gem 'rmagick' | |
9 | - gem 'core_image' | |
10 | - gem 'mini_magick' | |
11 | - gem 'aws-s3', :require => 'aws/s3' | |
12 | - gem 'test-unit' | |
13 | -end |
vendor/plugins/pothoven-attachment_fu/Gemfile.lock
... | ... | @@ -1,109 +0,0 @@ |
1 | -PATH | |
2 | - remote: . | |
3 | - specs: | |
4 | - pothoven-attachment_fu (3.2.10) | |
5 | - | |
6 | -GEM | |
7 | - remote: http://rubygems.org/ | |
8 | - specs: | |
9 | - actionmailer (3.2.14) | |
10 | - actionpack (= 3.2.14) | |
11 | - mail (~> 2.5.4) | |
12 | - actionpack (3.2.14) | |
13 | - activemodel (= 3.2.14) | |
14 | - activesupport (= 3.2.14) | |
15 | - builder (~> 3.0.0) | |
16 | - erubis (~> 2.7.0) | |
17 | - journey (~> 1.0.4) | |
18 | - rack (~> 1.4.5) | |
19 | - rack-cache (~> 1.2) | |
20 | - rack-test (~> 0.6.1) | |
21 | - sprockets (~> 2.2.1) | |
22 | - activemodel (3.2.14) | |
23 | - activesupport (= 3.2.14) | |
24 | - builder (~> 3.0.0) | |
25 | - activerecord (3.2.14) | |
26 | - activemodel (= 3.2.14) | |
27 | - activesupport (= 3.2.14) | |
28 | - arel (~> 3.0.2) | |
29 | - tzinfo (~> 0.3.29) | |
30 | - activeresource (3.2.14) | |
31 | - activemodel (= 3.2.14) | |
32 | - activesupport (= 3.2.14) | |
33 | - activesupport (3.2.14) | |
34 | - i18n (~> 0.6, >= 0.6.4) | |
35 | - multi_json (~> 1.0) | |
36 | - arel (3.0.2) | |
37 | - aws-s3 (0.6.3) | |
38 | - builder | |
39 | - mime-types | |
40 | - xml-simple | |
41 | - builder (3.0.4) | |
42 | - core_image (0.0.3.5) | |
43 | - erubis (2.7.0) | |
44 | - hike (1.2.3) | |
45 | - i18n (0.6.5) | |
46 | - journey (1.0.4) | |
47 | - json (1.8.0) | |
48 | - mail (2.5.4) | |
49 | - mime-types (~> 1.16) | |
50 | - treetop (~> 1.4.8) | |
51 | - mime-types (1.24) | |
52 | - mini_magick (3.6.0) | |
53 | - subexec (~> 0.2.1) | |
54 | - multi_json (1.7.9) | |
55 | - polyglot (0.3.3) | |
56 | - rack (1.4.5) | |
57 | - rack-cache (1.2) | |
58 | - rack (>= 0.4) | |
59 | - rack-ssl (1.3.3) | |
60 | - rack | |
61 | - rack-test (0.6.2) | |
62 | - rack (>= 1.0) | |
63 | - rails (3.2.14) | |
64 | - actionmailer (= 3.2.14) | |
65 | - actionpack (= 3.2.14) | |
66 | - activerecord (= 3.2.14) | |
67 | - activeresource (= 3.2.14) | |
68 | - activesupport (= 3.2.14) | |
69 | - bundler (~> 1.0) | |
70 | - railties (= 3.2.14) | |
71 | - railties (3.2.14) | |
72 | - actionpack (= 3.2.14) | |
73 | - activesupport (= 3.2.14) | |
74 | - rack-ssl (~> 1.3.2) | |
75 | - rake (>= 0.8.7) | |
76 | - rdoc (~> 3.4) | |
77 | - thor (>= 0.14.6, < 2.0) | |
78 | - rake (10.1.0) | |
79 | - rdoc (3.12.2) | |
80 | - json (~> 1.4) | |
81 | - rmagick (2.13.2) | |
82 | - sprockets (2.2.2) | |
83 | - hike (~> 1.2) | |
84 | - multi_json (~> 1.0) | |
85 | - rack (~> 1.0) | |
86 | - tilt (~> 1.1, != 1.3.0) | |
87 | - sqlite3 (1.3.8) | |
88 | - subexec (0.2.3) | |
89 | - test-unit (2.5.5) | |
90 | - thor (0.18.1) | |
91 | - tilt (1.4.1) | |
92 | - treetop (1.4.15) | |
93 | - polyglot | |
94 | - polyglot (>= 0.3.1) | |
95 | - tzinfo (0.3.37) | |
96 | - xml-simple (1.1.2) | |
97 | - | |
98 | -PLATFORMS | |
99 | - ruby | |
100 | - | |
101 | -DEPENDENCIES | |
102 | - aws-s3 | |
103 | - core_image | |
104 | - mini_magick | |
105 | - pothoven-attachment_fu! | |
106 | - rails (~> 3.2) | |
107 | - rmagick | |
108 | - sqlite3 | |
109 | - test-unit |
vendor/plugins/pothoven-attachment_fu/LICENSE
... | ... | @@ -1,20 +0,0 @@ |
1 | -Copyright (c) 2009 rick olson | |
2 | - | |
3 | -Permission is hereby granted, free of charge, to any person obtaining | |
4 | -a copy of this software and associated documentation files (the | |
5 | -"Software"), to deal in the Software without restriction, including | |
6 | -without limitation the rights to use, copy, modify, merge, publish, | |
7 | -distribute, sublicense, and/or sell copies of the Software, and to | |
8 | -permit persons to whom the Software is furnished to do so, subject to | |
9 | -the following conditions: | |
10 | - | |
11 | -The above copyright notice and this permission notice shall be | |
12 | -included in all copies or substantial portions of the Software. | |
13 | - | |
14 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
15 | -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
16 | -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
17 | -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | |
18 | -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | |
19 | -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |
20 | -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
vendor/plugins/pothoven-attachment_fu/README
... | ... | @@ -1,193 +0,0 @@ |
1 | -attachment-fu | |
2 | -============= | |
3 | - | |
4 | -attachment_fu is a plugin by Rick Olson (aka technoweenie <http://techno-weenie.net>) and is the successor to acts_as_attachment. To get a basic run-through of its capabilities, check out Mike Clark's tutorial <http://clarkware.com/cgi/blosxom/2007/02/24#FileUploadFu>. | |
5 | - | |
6 | - | |
7 | -attachment_fu functionality | |
8 | -=========================== | |
9 | - | |
10 | -attachment_fu facilitates file uploads in Ruby on Rails. There are a few storage options for the actual file data, but the plugin always at a minimum stores metadata for each file in the database. | |
11 | - | |
12 | -There are four storage options for files uploaded through attachment_fu: | |
13 | - File system | |
14 | - Database file | |
15 | - Amazon S3 | |
16 | - Rackspace (Mosso) Cloud Files | |
17 | - | |
18 | -Each method of storage many options associated with it that will be covered in the following section. Something to note, however, is that the Amazon S3 storage requires you to modify config/amazon_s3.yml, the Rackspace Cloud Files storage requires you to modify config/rackspace_cloudfiles.yml, and the Database file storage requires an extra table. | |
19 | - | |
20 | - | |
21 | -attachment_fu models | |
22 | -==================== | |
23 | - | |
24 | -For all three of these storage options a table of metadata is required. This table will contain information about the file (hence the 'meta') and its location. This table has no restrictions on naming, unlike the extra table required for database storage, which must have a table name of db_files (and by convention a model of DbFile). | |
25 | - | |
26 | -In the model there are two methods made available by this plugins: has_attachment and validates_as_attachment. | |
27 | - | |
28 | -has_attachment(options = {}) | |
29 | - This method accepts the options in a hash: | |
30 | - :content_type # Allowed content types. | |
31 | - # Allows all by default. Use :image to allow all standard image types. | |
32 | - :min_size # Minimum size allowed. | |
33 | - # 1 byte is the default. | |
34 | - :max_size # Maximum size allowed. | |
35 | - # 1.megabyte is the default. | |
36 | - :size # Range of sizes allowed. | |
37 | - # (1..1.megabyte) is the default. This overrides the :min_size and :max_size options. | |
38 | - :resize_to # Used by RMagick to resize images. | |
39 | - # Pass either an array of width/height, or a geometry string. | |
40 | - :thumbnails # Specifies a set of thumbnails to generate. | |
41 | - # This accepts a hash of filename suffixes and RMagick resizing options. | |
42 | - # This option need only be included if you want thumbnailing. | |
43 | - :thumbnail_class # Set which model class to use for thumbnails. | |
44 | - # This current attachment class is used by default. | |
45 | - :path_prefix # Path to store the uploaded files in. | |
46 | - # Uses public/#{table_name} by default for the filesystem, and just #{table_name} for the S3 and Cloud Files backend. | |
47 | - # Setting this sets the :storage to :file_system. | |
48 | - :partition # Whether to partiton files in directories like /0000/0001/image.jpg. Default is true. Only applicable to the :file_system backend. | |
49 | - :storage # Specifies the storage system to use.. | |
50 | - # Defaults to :db_file. Options are :file_system, :db_file, :s3, and :cloud_files. | |
51 | - :cloudfront # If using S3 for storage, this option allows for serving the files via Amazon CloudFront. | |
52 | - # Defaults to false. | |
53 | - :processor # Sets the image processor to use for resizing of the attached image. | |
54 | - # Options include ImageScience, Rmagick, and MiniMagick. Default is whatever is installed. | |
55 | - :uuid_primary_key # If your model's primary key is a 128-bit UUID in hexadecimal format, then set this to true. | |
56 | - :association_options # attachment_fu automatically defines associations with thumbnails with has_many and belongs_to. If there are any additional options that you want to pass to these methods, then specify them here. | |
57 | - | |
58 | - | |
59 | - Examples: | |
60 | - has_attachment :max_size => 1.kilobyte | |
61 | - has_attachment :size => 1.megabyte..2.megabytes | |
62 | - has_attachment :content_type => 'application/pdf' | |
63 | - has_attachment :content_type => ['application/pdf', 'application/msword', 'text/plain'] | |
64 | - has_attachment :content_type => :image, :resize_to => [50,50] | |
65 | - has_attachment :content_type => ['application/pdf', :image], :resize_to => 'x50' | |
66 | - has_attachment :thumbnails => { :thumb => [50, 50], :geometry => 'x50' } | |
67 | - has_attachment :storage => :file_system, :path_prefix => 'public/files' | |
68 | - has_attachment :storage => :file_system, :path_prefix => 'public/files', | |
69 | - :content_type => :image, :resize_to => [50,50], :partition => false | |
70 | - has_attachment :storage => :file_system, :path_prefix => 'public/files', | |
71 | - :thumbnails => { :thumb => [50, 50], :geometry => 'x50' } | |
72 | - has_attachment :storage => :s3 | |
73 | - has_attachment :store => :s3, :cloudfront => true | |
74 | - has_attachment :storage => :cloud_files | |
75 | - | |
76 | -validates_as_attachment | |
77 | - This method prevents files outside of the valid range (:min_size to :max_size, or the :size range) from being saved. It does not however, halt the upload of such files. They will be uploaded into memory regardless of size before validation. | |
78 | - | |
79 | - Example: | |
80 | - validates_as_attachment | |
81 | - | |
82 | - | |
83 | -attachment_fu migrations | |
84 | -======================== | |
85 | - | |
86 | -Fields for attachment_fu metadata tables... | |
87 | - in general: | |
88 | - size, :integer # file size in bytes | |
89 | - content_type, :string # mime type, ex: application/mp3 | |
90 | - filename, :string # sanitized filename | |
91 | - that reference images: | |
92 | - height, :integer # in pixels | |
93 | - width, :integer # in pixels | |
94 | - that reference images that will be thumbnailed: | |
95 | - parent_id, :integer # id of parent image (on the same table, a self-referencing foreign-key). | |
96 | - # Only populated if the current object is a thumbnail. | |
97 | - thumbnail, :string # the 'type' of thumbnail this attachment record describes. | |
98 | - # Only populated if the current object is a thumbnail. | |
99 | - # Usage: | |
100 | - # [ In Model 'Avatar' ] | |
101 | - # has_attachment :content_type => :image, | |
102 | - # :storage => :file_system, | |
103 | - # :max_size => 500.kilobytes, | |
104 | - # :resize_to => '320x200>', | |
105 | - # :thumbnails => { :small => '10x10>', | |
106 | - # :thumb => '100x100>' } | |
107 | - # [ Elsewhere ] | |
108 | - # @user.avatar.thumbnails.first.thumbnail #=> 'small' | |
109 | - that reference files stored in the database (:db_file): | |
110 | - db_file_id, :integer # id of the file in the database (foreign key) | |
111 | - | |
112 | -Field for attachment_fu db_files table: | |
113 | - data, :binary # binary file data, for use in database file storage | |
114 | - | |
115 | - | |
116 | -attachment_fu views | |
117 | -=================== | |
118 | - | |
119 | -There are two main views tasks that will be directly affected by attachment_fu: upload forms and displaying uploaded images. | |
120 | - | |
121 | -There are two parts of the upload form that differ from typical usage. | |
122 | - 1. Include ':multipart => true' in the html options of the form_for tag. | |
123 | - Example: | |
124 | - <% form_for(:attachment_metadata, :url => { :action => "create" }, :html => { :multipart => true }) do |form| %> | |
125 | - | |
126 | - 2. Use the file_field helper with :uploaded_data as the field name. | |
127 | - Example: | |
128 | - <%= form.file_field :uploaded_data %> | |
129 | - | |
130 | -Displaying uploaded images is made easy by the public_filename method of the ActiveRecord attachment objects using file system, s3, and Cloud Files storage. | |
131 | - | |
132 | -public_filename(thumbnail = nil) | |
133 | - Returns the public path to the file. If a thumbnail prefix is specified it will return the public file path to the corresponding thumbnail. | |
134 | - Examples: | |
135 | - attachment_obj.public_filename #=> /attachments/2/file.jpg | |
136 | - attachment_obj.public_filename(:thumb) #=> /attachments/2/file_thumb.jpg | |
137 | - attachment_obj.public_filename(:small) #=> /attachments/2/file_small.jpg | |
138 | - | |
139 | -When serving files from database storage, doing more than simply downloading the file is beyond the scope of this document. | |
140 | - | |
141 | - | |
142 | -attachment_fu controllers | |
143 | -========================= | |
144 | - | |
145 | -There are two considerations to take into account when using attachment_fu in controllers. | |
146 | - | |
147 | -The first is when the files have no publicly accessible path and need to be downloaded through an action. | |
148 | - | |
149 | -Example: | |
150 | - def readme | |
151 | - send_file '/path/to/readme.txt', :type => 'plain/text', :disposition => 'inline' | |
152 | - end | |
153 | - | |
154 | -See the possible values for send_file for reference. | |
155 | - | |
156 | - | |
157 | -The second is when saving the file when submitted from a form. | |
158 | -Example in view: | |
159 | - <%= form.file_field :attachable, :uploaded_data %> | |
160 | - | |
161 | -Example in controller: | |
162 | - def create | |
163 | - @attachable_file = AttachmentMetadataModel.new(params[:attachable]) | |
164 | - if @attachable_file.save | |
165 | - flash[:notice] = 'Attachment was successfully created.' | |
166 | - redirect_to attachable_url(@attachable_file) | |
167 | - else | |
168 | - render :action => :new | |
169 | - end | |
170 | - end | |
171 | - | |
172 | -attachement_fu scripting | |
173 | -==================================== | |
174 | - | |
175 | -You may wish to import a large number of images or attachments. | |
176 | -The following example shows how to upload a file from a script. | |
177 | - | |
178 | -#!/usr/bin/env ./script/runner | |
179 | - | |
180 | -# required to use ActionController::TestUploadedFile | |
181 | -require 'action_controller' | |
182 | -require 'action_controller/test_process.rb' | |
183 | - | |
184 | -path = "./public/images/x.jpg" | |
185 | - | |
186 | -# mimetype is a string like "image/jpeg". One way to get the mimetype for a given file on a UNIX system | |
187 | -# mimetype = `file -ib #{path}`.gsub(/\n/,"") | |
188 | - | |
189 | -mimetype = "image/jpeg" | |
190 | - | |
191 | -# This will "upload" the file at path and create the new model. | |
192 | -@attachable = AttachmentMetadataModel.new(:uploaded_data => ActionController::TestUploadedFile.new(path, mimetype)) | |
193 | -@attachable.save |
vendor/plugins/pothoven-attachment_fu/README.rdoc
... | ... | @@ -1,352 +0,0 @@ |
1 | -= attachment-fu | |
2 | - | |
3 | -attachment_fu is a plugin by Rick Olson (aka technoweenie | |
4 | -http://techno-weenie.net) and is the successor to acts_as_attachment. To get a | |
5 | -basic run-through of its capabilities, check out {Mike Clark's | |
6 | -tutorial}[http://clarkware.com/cgi/blosxom/2007/02/24#FileUploadFu]. | |
7 | - | |
8 | -= attachment_fu functionality | |
9 | - | |
10 | -attachment_fu facilitates file uploads in Ruby on Rails. There are a few | |
11 | -storage options for the actual file data, but the plugin always at a minimum | |
12 | -stores metadata for each file in the database. | |
13 | - | |
14 | -There are four storage options for files uploaded through attachment_fu: | |
15 | - | |
16 | -* File system | |
17 | -* Database file | |
18 | -* Amazon S3 | |
19 | -* Rackspace (Mosso) Cloud Files | |
20 | - | |
21 | -Each method of storage many options associated with it that will be covered in | |
22 | -the following section. Something to note, however, is that the Amazon S3 storage | |
23 | -requires you to modify +config/amazon_s3.yml+, the Rackspace Cloud Files storage | |
24 | -requires you to modify +config/rackspace_cloudfiles.yml+, and the Database file | |
25 | -storage requires an extra table. | |
26 | - | |
27 | -= attachment_fu models | |
28 | - | |
29 | -For all three of these storage options a table of metadata is required. This | |
30 | -table will contain information about the file (hence the 'meta') and its | |
31 | -location. This table has no restrictions on naming, unlike the extra table | |
32 | -required for database storage, which must have a table name of +db_files+ (and | |
33 | -by convention a model of +DbFile+). | |
34 | - | |
35 | -Two methods are available to models: +has_attachment+ and | |
36 | -+validates_as_attachment+. | |
37 | - | |
38 | -== has_attachment(options = {}) | |
39 | - | |
40 | -This method accepts the options in a hash: | |
41 | - | |
42 | -[:content_type] | |
43 | - Allowed content types. | |
44 | - | |
45 | - By default, all content types are allowed. Use +:image+ to allow all | |
46 | - standard image types. | |
47 | - | |
48 | -[:min_size] | |
49 | - Minimum file size. | |
50 | - | |
51 | - By default, set to +1.byte+. | |
52 | - | |
53 | -[:max_size] | |
54 | - Maximum file size. | |
55 | - | |
56 | - By default, set to +1.megabyte+. | |
57 | - | |
58 | -[:size] | |
59 | - Minimum and maximum file size. | |
60 | - | |
61 | - By default, set to +1..1.megabyte+. Overrides +:min_size+ and | |
62 | - +:max_size+. | |
63 | - | |
64 | -[:resize_to] | |
65 | - Used by RMagick. | |
66 | - | |
67 | - Tells RMagick how to resize images. Pass either an array specifying | |
68 | - width and height or a geometry string. Prefixing the geometry string | |
69 | - with a 'c' will crop the image to the specified size. | |
70 | - | |
71 | -[:sharpen_on_resize] | |
72 | - Used by RMagick. | |
73 | - | |
74 | - If set to true, images are sharpened after being resized. | |
75 | - | |
76 | -[:thumbnails] | |
77 | - A set of thumbnails to generate. | |
78 | - | |
79 | - This accepts a hash of filename suffixes and RMagick resizing options. This | |
80 | - option need only be included if you want thumbnailing. | |
81 | - | |
82 | - If you have a polymorphic parent relationship, you can provide | |
83 | - parent-type-specific thumbnail settings by using a pair with the type string | |
84 | - as key and a Hash of thumbnail definitions, or a method symbol, as value. | |
85 | - The method symbol will call the named method in order to get a | |
86 | - dynamically-built Hash of thumbnail definitions, which gives you full | |
87 | - flexibility. AttachmentFu automatically detects your first polymorphic | |
88 | - +belongs_to+ relationship. | |
89 | - | |
90 | -[:thumbnail_class] | |
91 | - Which model class to use for thumbnails. | |
92 | - | |
93 | - By default, the current attachment class is used. | |
94 | - | |
95 | -[:jpeg_quality] | |
96 | - JPEG quality settings for thumbnail resizes. | |
97 | - | |
98 | - Arguments can be in multiple formats: | |
99 | - | |
100 | - * Integer from 0 (basically crap) to 100 (basically lossless, fat files). | |
101 | - | |
102 | - * When relying on tdd-image_science, you can also use one of its +JPEG_xxx+ | |
103 | - constants for predefined ratios/settings. | |
104 | - | |
105 | - * You can also use a Hash, with keys being either thumbnail symbols (I | |
106 | - repeat: _symbols_) or surface boundaries. A surface boundary is a string | |
107 | - starting with either '<' or '>=', followed by a number of pixels. This | |
108 | - lets you specify per-thumbnail or per-general-thumbnail-"size" JPEG | |
109 | - qualities. (which can be useful when you have a _lot_ of thumbnail | |
110 | - options). Surface example: <code>{'<2000' => 90, '>=2000' => 75}</code>. | |
111 | - | |
112 | - Defaults vary depending on the processor (ImageScience: 100%, | |
113 | - Rmagick/MiniMagick/Gd2: 75%, CoreImage: auto-adjust). Note that only | |
114 | - tdd-image_science (available from GitHub) currently supports explicit JPEG | |
115 | - quality; the default image_science currently forces 100%. | |
116 | - | |
117 | -[:path_prefix] | |
118 | - Path to store the uploaded files in. Uses <code>public/#{table_name}</code> | |
119 | - by default for the filesystem, and just <code>#{table_name}</code> for the | |
120 | - S3 and Cloud Files backend. Setting this sets the +:storage+ to | |
121 | - +:file_system+. | |
122 | - | |
123 | -[:partition] | |
124 | - Whether to partiton files in directories like +/0000/0001/image.jpg+. | |
125 | - Default is true. Only applicable to the +:file_system+ backend. | |
126 | - | |
127 | -[:storage] | |
128 | - Specifies the storage system to use. Defaults to +:db_file+. Options are | |
129 | - +:file_system+, +:db_file+, +:s3+, and +:cloud_files+. | |
130 | - | |
131 | -[:cloudfront] | |
132 | - If using S3 for storage, this option allows for serving the files via Amazon | |
133 | - CloudFront. Defaults to false. | |
134 | - | |
135 | -[:processor] | |
136 | - Sets the image processor to use for resizing of the attached image. Options | |
137 | - include ImageScience, Rmagick, MiniMagick, Gd2 and CoreImage. Default is | |
138 | - whatever is installed. | |
139 | - | |
140 | -[:uuid_primary_key] | |
141 | - If your model's primary key is a 128-bit UUID in hexadecimal format, then | |
142 | - set this to true. | |
143 | - | |
144 | -[:association_options] | |
145 | - attachment_fu automatically defines associations with thumbnails with | |
146 | - +has_many+ and +belongs_to+. If there are any additional options that you | |
147 | - want to pass to these methods, then specify them here. | |
148 | - | |
149 | -Examples: | |
150 | - | |
151 | - has_attachment(content_type: 'application/pdf') | |
152 | - has_attachment( | |
153 | - content_type: ['application/pdf', 'application/msword', 'text/plain'] | |
154 | - ) | |
155 | - has_attachment(content_type: ['application/pdf', :image], resize_to: 'x50') | |
156 | - has_attachment(content_type: :image, resize_to: [50,50]) | |
157 | - has_attachment(max_size: 1.kilobyte) | |
158 | - has_attachment(size: 1.megabyte..2.megabytes) | |
159 | - has_attachment(storage: :cloud_files) | |
160 | - has_attachment(storage: :file_system, path_prefix: 'public/files') | |
161 | - has_attachment( | |
162 | - storage: :file_system, | |
163 | - path_prefix: 'public/files', | |
164 | - content_type: :image, | |
165 | - resize_to: [50, 50], | |
166 | - partition: false | |
167 | - ) | |
168 | - has_attachment( | |
169 | - storage: :file_system, | |
170 | - path_prefix: 'public/files', | |
171 | - thumbnails: {thumb: [50, 50], geometry: 'x50'} | |
172 | - ) | |
173 | - has_attachment(storage: :s3) | |
174 | - has_attachment(store: :s3, cloudfront: true) | |
175 | - has_attachment(thumbnails: {thumb: [50, 50], geometry: 'x50'}) | |
176 | - | |
177 | - # Let's say we have a polymorphic belongs_to, e.g. called 'imageable', where | |
178 | - # imageable_type (or whatever the :foreign_type option was set to) can be, | |
179 | - # among other things, 'Product', 'User' or 'Editorial', each of which should | |
180 | - # have extra thumbnails: | |
181 | - | |
182 | - has_attachment(thumbnails: { | |
183 | - editorials: {fullsize: '150x100>'}, | |
184 | - geometry: 'x50', | |
185 | - products: {large_thumb: '169x169!', zoomed: '500x500>'}, | |
186 | - thumb: [50, 50], | |
187 | - users: {avatar: '64x64!'} | |
188 | - }) | |
189 | - | |
190 | - # JPEG qualities… | |
191 | - | |
192 | - has_attachment(jpeg_quality: 75) | |
193 | - has_attachment(jpeg_quality: 80 | ImageScience::JPEG_PROGRESSIVE) | |
194 | - has_attachment( | |
195 | - thumbnails: {thumb: [50, 50], geometry: 'x50'}, | |
196 | - jpeg_quality: {'<2000' => 90, '>=2000' => 75} | |
197 | - ) | |
198 | - has_attachment( | |
199 | - thumbnails: {thumb: [50, 50], geometry: 'x50'}, | |
200 | - jpeg_quality: {nil => 75, thumb: 90, geometry: 90} | |
201 | - ) | |
202 | - | |
203 | -== validates_as_attachment | |
204 | - | |
205 | -This method prevents files outside of the valid range (+:min_size+ to | |
206 | -+:max_size+, or the +:size+ range) from being saved. It does not however, halt | |
207 | -the upload of such files. They will be uploaded into memory regardless of size | |
208 | -before validation. | |
209 | - | |
210 | -To perform this validation, simply add +validates_as_attachment+ to your model. | |
211 | - | |
212 | -= attachment_fu migrations | |
213 | - | |
214 | -Fields for attachment_fu metadata tables… | |
215 | - | |
216 | -In general: | |
217 | - | |
218 | - size, :integer # file size in bytes | |
219 | - content_type, :string # mime type, ex: application/mp3 | |
220 | - filename, :string # sanitized filename | |
221 | - | |
222 | -That reference images: | |
223 | - | |
224 | - height, :integer # in pixels | |
225 | - width, :integer # in pixels | |
226 | - | |
227 | -That reference images that will be thumbnailed: | |
228 | - | |
229 | - parent_id, :integer # id of parent image (on the same table, a | |
230 | - # self-referencing foreign-key). Only populated if | |
231 | - # the current object is a thumbnail. | |
232 | - thumbnail, :string # The type of thumbnail this attachment record | |
233 | - # describes. Only populated if the current object is | |
234 | - # a thumbnail. Example: | |
235 | - # | |
236 | - # (In Model 'Avatar') | |
237 | - # has_attachment( | |
238 | - # :content_type => :image, | |
239 | - # :storage => :file_system, | |
240 | - # :max_size => 500.kilobytes, | |
241 | - # :resize_to => '320x200>', | |
242 | - # :thumbnails => { | |
243 | - # :small => '10x10>', | |
244 | - # :thumb => '100x100>' | |
245 | - # } | |
246 | - # ) | |
247 | - # | |
248 | - # (Elsewhere) | |
249 | - # @user.avatar.thumbnails.first.thumbnail # => 'small' | |
250 | - # | |
251 | - db_file_id, :integer # ID of the file in the database (foreign key) that | |
252 | - # reference files stored in the database (:db_file). | |
253 | - | |
254 | -Field for attachment_fu +db_files+ table: | |
255 | - | |
256 | - data, :binary # binary file data, for use in database file storage | |
257 | - | |
258 | -= attachment_fu views | |
259 | - | |
260 | -There are two main views tasks that will be directly affected by attachment_fu: | |
261 | -upload forms and displaying uploaded images. | |
262 | - | |
263 | -There are two parts of the upload form that differ from typical usage. | |
264 | - | |
265 | -1. Include <code>multipart: true</code> in the html options of the +form_for+ | |
266 | - tag. Example: | |
267 | - | |
268 | - <%= | |
269 | - form_for( | |
270 | - :attachment_metadata, | |
271 | - url: {action: "create"}, | |
272 | - html: {multipart: true} | |
273 | - ) do |form| | |
274 | - %> | |
275 | - | |
276 | -2. Use the +file_field+ helper with +:uploaded_data+ as the field name. Example: | |
277 | - | |
278 | - <%= form.file_field(:uploaded_data) %> | |
279 | - | |
280 | -Displaying uploaded images is made easy by the +public_filename+ method of the | |
281 | -ActiveRecord attachment objects using file system, s3, and Cloud Files storage. | |
282 | - | |
283 | -== public_filename(thumbnail = nil) | |
284 | - | |
285 | -Returns the public path to the file. If a thumbnail prefix is specified it will | |
286 | -return the public file path to the corresponding thumbnail. Examples: | |
287 | - | |
288 | - attachment_obj.public_filename #=> /attachments/2/file.jpg | |
289 | - attachment_obj.public_filename(:thumb) #=> /attachments/2/file_thumb.jpg | |
290 | - attachment_obj.public_filename(:small) #=> /attachments/2/file_small.jpg | |
291 | - | |
292 | -When serving files from database storage, doing more than simply downloading the | |
293 | -file is beyond the scope of this document. | |
294 | - | |
295 | -= attachment_fu controllers | |
296 | - | |
297 | -There are two considerations to take into account when using attachment_fu in | |
298 | -controllers. | |
299 | - | |
300 | -The first is when the files have no publicly accessible path and need to be | |
301 | -downloaded through an action. Example: | |
302 | - | |
303 | - def readme | |
304 | - send_file( | |
305 | - '/path/to/readme.txt', | |
306 | - type: 'plain/text', | |
307 | - disposition: 'inline' | |
308 | - ) | |
309 | - end | |
310 | - | |
311 | -See the possible values for +send_file+ for reference. | |
312 | - | |
313 | -The second is when saving the file when submitted from a form. Example: | |
314 | - | |
315 | -In a view: | |
316 | - | |
317 | - <%= form.file_field(:attachable, :uploaded_data) %> | |
318 | - | |
319 | -In a controller: | |
320 | - | |
321 | - def create | |
322 | - @attachable_file = AttachmentMetadataModel.new(params[:attachable]) | |
323 | - if @attachable_file.save | |
324 | - flash[:notice] = 'Attachment was successfully created.' | |
325 | - redirect_to(attachable_url(@attachable_file)) | |
326 | - else | |
327 | - redirect_to(action: 'new') | |
328 | - end | |
329 | - end | |
330 | - | |
331 | -= attachment_fu scripting | |
332 | - | |
333 | -You may wish to import a large number of images or attachments. The following | |
334 | -example shows how to upload a file from a script. | |
335 | - | |
336 | - #!/usr/bin/env ./script/runner | |
337 | - | |
338 | - # required to use ActionController::TestUploadedFile | |
339 | - require 'action_controller' | |
340 | - require 'action_controller/test_process.rb' | |
341 | - | |
342 | - path = "./public/images/x.jpg" | |
343 | - | |
344 | - # `mimetype` is a string like "image/jpeg". One way to get the mimetype for | |
345 | - # a given file on a UNIX system: mimetype = `file -ib #{path}`.gsub(/\n/,"") | |
346 | - mimetype = "image/jpeg" | |
347 | - | |
348 | - # This will "upload" the file at path and create the new model. | |
349 | - @attachable = AttachmentMetadataModel.new( | |
350 | - uploaded_data: ActionController::TestUploadedFile.new(path, mimetype) | |
351 | - ) | |
352 | - @attachable.save |
vendor/plugins/pothoven-attachment_fu/Rakefile
... | ... | @@ -1,22 +0,0 @@ |
1 | -require 'rake' | |
2 | -require 'rake/testtask' | |
3 | -require 'rdoc/task' | |
4 | - | |
5 | -desc 'Default: run unit tests.' | |
6 | -task :default => :test | |
7 | - | |
8 | -desc 'Test the attachment_fu plugin.' | |
9 | -Rake::TestTask.new(:test) do |t| | |
10 | - t.libs << 'lib' | |
11 | - t.pattern = 'test/**/*_test.rb' | |
12 | - t.verbose = true | |
13 | -end | |
14 | - | |
15 | -desc 'Generate documentation for the attachment_fu plugin.' | |
16 | -Rake::RDocTask.new(:rdoc) do |rdoc| | |
17 | - rdoc.rdoc_dir = 'rdoc' | |
18 | - rdoc.title = 'ActsAsAttachment' | |
19 | - rdoc.options << '--line-numbers --inline-source' | |
20 | - rdoc.rdoc_files.include('README.rdoc') | |
21 | - rdoc.rdoc_files.include('lib/**/*.rb') | |
22 | -end |
vendor/plugins/pothoven-attachment_fu/amazon_s3.yml.tpl
... | ... | @@ -1,17 +0,0 @@ |
1 | -development: | |
2 | - bucket_name: appname_development | |
3 | - access_key_id: | |
4 | - secret_access_key: | |
5 | - distribution_domain: XXXX.cloudfront.net | |
6 | - | |
7 | -test: | |
8 | - bucket_name: appname_test | |
9 | - access_key_id: | |
10 | - secret_access_key: | |
11 | - distribution_domain: XXXX.cloudfront.net | |
12 | - | |
13 | -production: | |
14 | - bucket_name: appname | |
15 | - access_key_id: | |
16 | - secret_access_key: | |
17 | - distribution_domain: XXXX.cloudfront.net |
vendor/plugins/pothoven-attachment_fu/attachment_fu.gemspec
... | ... | @@ -1,23 +0,0 @@ |
1 | -# -*- encoding: utf-8 -*- | |
2 | - | |
3 | -Gem::Specification.new do |s| | |
4 | - s.name = %q{pothoven-attachment_fu} | |
5 | - s.authors = ["Rick Olson", "Steven Pothoven"] | |
6 | - s.summary = %q{attachment_fu as a gem} | |
7 | - s.description = %q{This is a fork of Rick Olson's attachment_fu adding Ruby 1.9 and Rails 3.2 support as well as some other enhancements.} | |
8 | - s.email = %q{steven@pothoven.net} | |
9 | - s.homepage = %q{http://github.com/pothoven/attachment_fu} | |
10 | - s.version = "3.2.10" | |
11 | - s.date = %q{2013-08-22} | |
12 | - | |
13 | - s.files = Dir.glob("{lib,vendor}/**/*") + %w( CHANGELOG LICENSE README.rdoc amazon_s3.yml.tpl rackspace_cloudfiles.yml.tpl ) | |
14 | - s.extra_rdoc_files = ["README.rdoc"] | |
15 | - s.rdoc_options = ["--inline-source", "--charset=UTF-8"] | |
16 | - s.require_paths = ["lib"] | |
17 | - s.rubyforge_project = "nowarning" | |
18 | - s.rubygems_version = %q{1.3.5} | |
19 | - | |
20 | - if s.respond_to? :specification_version then | |
21 | - s.specification_version = 2 | |
22 | - end | |
23 | -end |
vendor/plugins/pothoven-attachment_fu/config/database.yml
vendor/plugins/pothoven-attachment_fu/config/environment.rb
vendor/plugins/pothoven-attachment_fu/init.rb
... | ... | @@ -1,6 +0,0 @@ |
1 | -require 'geometry' | |
2 | -ActiveRecord::Base.send(:extend, Technoweenie::AttachmentFu::ActMethods) | |
3 | -Technoweenie::AttachmentFu.tempfile_path = ATTACHMENT_FU_TEMPFILE_PATH if Object.const_defined?(:ATTACHMENT_FU_TEMPFILE_PATH) | |
4 | -FileUtils.mkdir_p Technoweenie::AttachmentFu.tempfile_path | |
5 | - | |
6 | -$:.unshift(File.dirname(__FILE__) + '/vendor') |
vendor/plugins/pothoven-attachment_fu/install.rb
... | ... | @@ -1,7 +0,0 @@ |
1 | -require 'fileutils' | |
2 | - | |
3 | -s3_config = File.dirname(__FILE__) + '/../../../config/amazon_s3.yml' | |
4 | -FileUtils.cp File.dirname(__FILE__) + '/amazon_s3.yml.tpl', s3_config unless File.exist?(s3_config) | |
5 | -cloudfiles_config = File.dirname(__FILE__) + '/../../../config/rackspace_cloudfiles.yml' | |
6 | -FileUtils.cp File.dirname(__FILE__) + '/rackspace_cloudfiles.yml.tpl', cloudfiles_config unless File.exist?(cloudfiles_config) | |
7 | -puts IO.read(File.join(File.dirname(__FILE__), 'README.rdoc')) |