active_scheduler 0.2.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c723aa094616a7530ea528c8910f5abfe695d91b
4
- data.tar.gz: a8286d5ebc009739893d72912fc3534158161dbe
2
+ SHA256:
3
+ metadata.gz: 3073d561f9035ada866836665d88d99bb7a23badd33171706a7f84c7f0b97a58
4
+ data.tar.gz: 5b50684ed4c4882d05ebc42b44f09d6f252333884c01177cc379c335324d684f
5
5
  SHA512:
6
- metadata.gz: 42cc510cc65ff67895469f65ee436024faeaf4b064bf2e18e2264219ba89b55603c6f0f489008838db3e8c6bf107dcbc771d986d0e1599ab4e19b41e751ba4d3
7
- data.tar.gz: 71cba03ce129f5a22a5b948f71a3cc3428d0a09939c0df418c77ce364e43d3251a6f2aae43c3639c1c9a0c38425e6d44ce0e0e7d89c58cbc9d0e46a93b73ba2f
6
+ metadata.gz: 16df38caebab620ed732b88ae40b6296b05afb7d1d78ed62b116a9cfebc55e281908935f886447c1380f405f323e4848d1594815f5ba069b45f7f9187dd520b5
7
+ data.tar.gz: 3c72338f022ef31687ffd9085f32bbaf21c318cad169e1fc17feff73c55ee5445fe23e28cfbad2197da1d18c74e60b291fd5df2d5b48ce9faa95890515a6fc01
data/.gitignore CHANGED
@@ -22,3 +22,4 @@
22
22
  .DS_Store
23
23
  /.rvmrc
24
24
  /.yardoc
25
+ .idea/
@@ -1,15 +1,48 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.3
4
- - 2.0.0
5
- - 2.1.0
6
- - 2.1.5
7
- - 2.2.0
8
- matrix:
9
- allow_failures:
10
- - rvm: 1.9.3
3
+ - 2.0
4
+ - 2.1
5
+ - 2.2
6
+ - 2.3
7
+ - 2.4
8
+ - 2.5
9
+ - 2.6
10
+ - 2.7
11
11
  env:
12
12
  - "RAILS_VERSION=4.2.0"
13
+ - "RAILS_VERSION=5.0.0"
14
+ - "RAILS_VERSION=5.1.0"
15
+ - "RAILS_VERSION=5.2.0"
16
+ - "RAILS_VERSION=6.0.0"
17
+ matrix:
18
+ exclude:
19
+ - rvm: 2.0
20
+ env: "RAILS_VERSION=5.0.0"
21
+ - rvm: 2.0
22
+ env: "RAILS_VERSION=5.1.0"
23
+ - rvm: 2.0
24
+ env: "RAILS_VERSION=5.2.0"
25
+ - rvm: 2.0
26
+ env: "RAILS_VERSION=6.0.0"
27
+ - rvm: 2.1
28
+ env: "RAILS_VERSION=5.0.0"
29
+ - rvm: 2.1
30
+ env: "RAILS_VERSION=5.1.0"
31
+ - rvm: 2.1
32
+ env: "RAILS_VERSION=5.2.0"
33
+ - rvm: 2.1
34
+ env: "RAILS_VERSION=6.0.0"
35
+ - rvm: 2.2
36
+ env: "RAILS_VERSION=5.1.0"
37
+ - rvm: 2.2
38
+ env: "RAILS_VERSION=6.0.0"
39
+ - rvm: 2.3
40
+ env: "RAILS_VERSION=6.0.0"
41
+ - rvm: 2.4
42
+ env: "RAILS_VERSION=4.2.0"
43
+ - rvm: 2.4
44
+ env: "RAILS_VERSION=6.0.0"
45
+
13
46
  notifications:
14
47
  email:
15
48
  recipients:
@@ -1,9 +1,33 @@
1
+ # 0.7.0
2
+ - Remove deprecated Rubyforge reference [#19](https://github.com/JustinAiken/active_scheduler/pull/19) (Thanks @kensentor)
3
+ - Implement ActiveScheduler::ResqueWrapper.scheduled [#17](https://github.com/JustinAiken/active_scheduler/pull/17) (Thanks @AMHOL)
4
+
5
+ # 0.6.0
6
+
7
+ - Add `persist` option [#15](https://github.com/JustinAiken/active_scheduler/pull/15) (Thanks @SpiffyStores)
8
+ - Remove hardcoded class references [#16](https://github.com/JustinAiken/active_scheduler/pull/16) (Thanks @kensentor)
9
+
10
+ # 0.5.0
11
+ - Expand Travis matrix to include Rails 5 and more ruby versions
12
+ - Allow `rails_env` option since [resque-scheduler](https://github.com/resque/resque-scheduler) does [#10](https://github.com/JustinAiken/active_scheduler/pull/10) (Thanks @blahutka)
13
+
14
+ # 0.4.0
15
+ - Use job's queue instead of hardcoded `default` [#9](https://github.com/JustinAiken/active_scheduler/pull/9) (Thanks @r3trofitted)
16
+
17
+ # 0.3.0
18
+
19
+ - Remove explicit active_support dependency (it's pulled in by activejob)
20
+ - Updated testing matrix for more rubies 💎💎💎
21
+ - Support named args [#6](https://github.com/JustinAiken/active_scheduler/pull/6) (Thanks @jdguzman)
22
+
1
23
  # 0.2.0
2
24
 
3
- - Deprecate `arguments` in favor of `args` [#5](https://github.com/JustinAiken/active_scheduler/pull/5)
25
+ - Deprecate `arguments` in favor of `args` [#5](https://github.com/JustinAiken/active_scheduler/pull/5) (Thanks @ximus)
4
26
 
5
27
  # 0.1.0
6
28
 
7
- - Only wrap jobs that are descendants of `ActiveJob::Base` [#3](https://github.com/JustinAiken/active_scheduler/pull/3)
29
+ - Only wrap jobs that are descendants of `ActiveJob::Base` [#3](https://github.com/JustinAiken/active_scheduler/pull/3) (Thanks @ximus)
8
30
 
9
31
  # 0.0.3
32
+
33
+ - Use schedule name as class name if unspecified [#1](https://github.com/JustinAiken/active_scheduler/pull/1) (Thanks @jeremycrosbie)
data/Gemfile CHANGED
@@ -4,6 +4,10 @@ rails_version = ENV['RAILS_VERSION'] || '4.2.0'
4
4
  rails = "~> #{rails_version}"
5
5
 
6
6
  gem "activejob", rails
7
- gem "activesupport", rails
7
+
8
+ gem "guard-rspec", '~> 4.2' unless ENV['CI']
9
+
10
+ # Randomly grabbed 'tins' version doesn't like ancient rubies
11
+ gem "tins", '~> 1.6.0' if RUBY_VERSION == '1.9.3'
8
12
 
9
13
  gemspec
@@ -8,9 +8,10 @@ Currently only Resque is supported, but pull requests to add other queues (sidek
8
8
 
9
9
  ## Requirements/Support
10
10
 
11
- - Rails
12
- - ActiveJob 4.2+
13
- - ActiveSupport 4.2+
11
+ - Ruby 2.0+
12
+ - ActiveJob
13
+ - 4.2 is tested and used in production
14
+ - 5.0-6.0 is tested against CI, but I haven't tried it in production.
14
15
  - Resque
15
16
  - Resque Scheduler
16
17
 
@@ -57,11 +58,36 @@ ThisIsTheClass:
57
58
 
58
59
  Only classes that are descended from `ActiveJob::Base` will be wrapped
59
60
 
61
+ ### Job Classes With Named Args
62
+
63
+ If you have a job class that uses named arguments you can specify that. `args`
64
+ should be a hash nested in the array and you need to add the named_args key.
65
+
66
+ ```yaml
67
+ simple_job:
68
+ every: "30s"
69
+ queue: "simple"
70
+ class: "SimpleJob"
71
+ args:
72
+ - foo: 1
73
+ bar: 2
74
+ description: "It's a simple job."
75
+ named_args: true
76
+ ```
77
+
60
78
  ## Credits
61
79
 
62
80
  - Written by [@JustinAiken](https://www.github.com/JustinAiken)
63
81
  - Wrapper class idea by [@ryanwjackson](https://www.github.com/ryanwjackson)
64
- - Special thanks to [Rocketmade](http://www.rocketmade.com/) for development resources.
82
+ - Special thanks to [Rocketmade](https://www.rocketmade.com/) for development resources.
83
+ - Other Contributors:
84
+ - [@jeremycrosbie](https://github.com/jeremycrosbie)
85
+ - [@ximus](https://github.com/ximus)
86
+ - [@jdguzman](https://github.com/jdguzman)
87
+ - [@r3trofitted](https://github.com/r3trofitted)
88
+ - [@blahutka](https://github.com/blahutka)
89
+ - [@SpiffyStores](https://github.com/SpiffyStores)
90
+ - [@kensentor](https://github.com/kensentor)
65
91
 
66
92
  ## License
67
93
 
@@ -6,22 +6,18 @@ Gem::Specification.new do |s|
6
6
  s.name = "active_scheduler"
7
7
  s.version = ActiveScheduler::VERSION
8
8
  s.authors = ["Justin Aiken"]
9
- s.email = ["jaiken@rocketmade.com"]
9
+ s.email = ["60tonangel@gmail.com"]
10
10
  s.license = 'MIT'
11
11
  s.homepage = "https://github.com/JustinAiken/active_scheduler"
12
12
  s.summary = %q{Scheduling for ActiveJob}
13
13
  s.description = %q{A wrapper for scheduling jobs through ActiveJob}
14
14
 
15
- s.rubyforge_project = "active_scheduler"
16
-
17
15
  s.files = `git ls-files`.split("\n")
18
16
  s.test_files = `git ls-files -- {spec}/*`.split("\n")
19
17
  s.require_paths = ["lib"]
20
18
 
21
- s.add_dependency 'activejob', '>= 4.2.0'
22
- s.add_dependency 'activesupport', '>= 4.2.0'
23
-
24
- s.add_development_dependency 'rspec-rails', '~> 3.1'
25
- s.add_development_dependency 'guard-rspec', '~> 4.2'
19
+ s.add_dependency 'rake'
20
+ s.add_dependency 'activejob', '>= 4.2.0'
21
+ s.add_development_dependency 'rspec', '~> 3.5'
26
22
  s.add_development_dependency 'coveralls'
27
23
  end
@@ -1,4 +1,3 @@
1
- require 'active_support'
2
1
  require 'active_job'
3
2
  require 'active_scheduler/version'
4
3
  require 'active_scheduler/resque_wrapper'
@@ -3,24 +3,38 @@ module ActiveScheduler
3
3
 
4
4
  def self.perform(job_data)
5
5
  klass = Object.const_get job_data['job_class']
6
+ named_args = job_data.delete('named_args') || false
6
7
 
7
8
  if job_data.has_key? 'arguments'
8
- klass.perform_later *job_data['arguments']
9
+ if named_args
10
+ args = job_data['arguments'].first.symbolize_keys
11
+ else
12
+ args = job_data['arguments']
13
+ end
14
+
15
+ named_args ? klass.perform_later(**args) : klass.perform_later(*args)
9
16
  else
10
17
  klass.perform_later
11
18
  end
12
19
  end
13
20
 
21
+ def self.scheduled(_queue, _wrapper_klass, *args)
22
+ perform(*args)
23
+ end
24
+
14
25
  def self.wrap(schedule)
15
26
  schedule = HashWithIndifferentAccess.new(schedule)
16
27
 
17
28
  schedule.each do |job, opts|
18
29
  class_name = opts[:class] || job
19
- next if class_name =~ /ActiveScheduler::ResqueWrapper/
20
- next unless class_name.constantize <= ActiveJob::Base
30
+ next if class_name =~ /#{self.to_s}/
31
+
32
+ klass = class_name.constantize
33
+ next unless klass <= ActiveJob::Base
21
34
 
22
- queue = opts[:queue] || 'default'
35
+ queue = opts[:queue] || klass.queue_name
23
36
  args = opts[:args]
37
+ named_args = opts[:named_args] || false
24
38
 
25
39
  if !args && opts.has_key?(:arguments)
26
40
  warn 'active_scheduler: [DEPRECATION] using the `arguments` key in ' \
@@ -30,18 +44,22 @@ module ActiveScheduler
30
44
  end
31
45
 
32
46
  schedule[job] = {
33
- class: 'ActiveScheduler::ResqueWrapper',
47
+ class: self.to_s,
34
48
  queue: queue,
35
49
  args: [{
36
- job_class: class_name,
37
- queue_name: queue,
38
- arguments: args
39
- }]
50
+ job_class: class_name,
51
+ queue_name: queue,
52
+ arguments: args,
53
+ }]
40
54
  }
41
55
 
56
+ schedule[job][:args].first.merge!({ named_args: named_args }) if named_args
57
+
42
58
  schedule[job][:description] = opts.fetch(:description, nil) if opts.fetch(:description, nil)
43
59
  schedule[job][:every] = opts.fetch(:every, nil) if opts.fetch(:every, nil)
44
60
  schedule[job][:cron] = opts.fetch(:cron, nil) if opts.fetch(:cron, nil)
61
+ schedule[job][:rails_env] = opts.fetch(:rails_env, nil) if opts.fetch(:rails_env, nil)
62
+ schedule[job][:persist] = true if opts.fetch(:persist, nil)
45
63
  end
46
64
  end
47
65
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveScheduler
2
- VERSION = "0.2.0"
2
+ VERSION = "0.7.0"
3
3
  end
@@ -15,6 +15,7 @@ describe ActiveScheduler::ResqueWrapper do
15
15
  "queue" => "simple",
16
16
  "description" => "It's a simple job.",
17
17
  "every" => "30s",
18
+ "rails_env" => "test",
18
19
  "args" => [{
19
20
  "job_class" => "SimpleJob",
20
21
  "queue_name" => "simple",
@@ -31,10 +32,34 @@ describe ActiveScheduler::ResqueWrapper do
31
32
  "queue" => "simple",
32
33
  "description" => "It's a simple job.",
33
34
  "every" => "30s",
35
+ "rails_env" => "test",
34
36
  "args" => ['foo-arg-1', 'foo-arg-2'],
35
37
  )
36
38
  end
37
39
  end
40
+
41
+ context 'with a custom wrapper class' do
42
+ class CustomWrapper < ActiveScheduler::ResqueWrapper
43
+ end
44
+
45
+ let(:schedule) { YAML.load_file 'spec/fixtures/simple_job.yaml' }
46
+
47
+ it "queues up a simple job" do
48
+ stub_jobs("SimpleJob")
49
+ expect(CustomWrapper.wrap(schedule)['simple_job']).to eq(
50
+ "class" => "CustomWrapper",
51
+ "queue" => "simple",
52
+ "description" => "It's a simple job.",
53
+ "every" => "30s",
54
+ "rails_env" => "test",
55
+ "args" => [{
56
+ "job_class" => "SimpleJob",
57
+ "queue_name" => "simple",
58
+ "arguments" => ['foo-arg-1', 'foo-arg-2'],
59
+ }]
60
+ )
61
+ end
62
+ end
38
63
  end
39
64
 
40
65
  context "with a simple job json" do
@@ -56,6 +81,27 @@ describe ActiveScheduler::ResqueWrapper do
56
81
  end
57
82
  end
58
83
 
84
+ context "with a persist key" do
85
+ let(:schedule) { YAML.load_file 'spec/fixtures/persist_job.yaml' }
86
+
87
+ it "queues up a simple job" do
88
+ stub_jobs("SimpleJob")
89
+ expect(wrapped['persist_job']).to eq(
90
+ "class" => "ActiveScheduler::ResqueWrapper",
91
+ "queue" => "simple",
92
+ "description" => "It's a simple job. That persists.",
93
+ "every" => "30s",
94
+ "rails_env" => "test",
95
+ "persist" => true,
96
+ "args" => [{
97
+ "job_class" => "SimpleJob",
98
+ "queue_name" => "simple",
99
+ "arguments" => ['foo-arg-1', 'foo-arg-2'],
100
+ }]
101
+ )
102
+ end
103
+ end
104
+
59
105
  context "with a multiple jobs in the schedule" do
60
106
  let(:schedule) { YAML.load_file 'spec/fixtures/two_jobs.yaml' }
61
107
 
@@ -79,9 +125,14 @@ describe ActiveScheduler::ResqueWrapper do
79
125
  context "when the queue is blank" do
80
126
  let(:schedule) { YAML.load_file 'spec/fixtures/no_queue.yaml' }
81
127
 
82
- it "uses 'default'" do
83
- stub_jobs("SimpleJob")
84
- expect(wrapped['no_queue_job']['queue']).to eq 'default'
128
+ it "uses the job's queue" do
129
+ simple_job = Class.new(ActiveJob::Base) do
130
+ queue_as :myscheduledjobqueue
131
+ end
132
+
133
+ stub_const("SimpleJob", simple_job)
134
+
135
+ expect(wrapped['no_queue_job']['queue']).to eq 'myscheduledjobqueue'
85
136
  end
86
137
  end
87
138
 
@@ -103,6 +154,26 @@ describe ActiveScheduler::ResqueWrapper do
103
154
  )
104
155
  end
105
156
  end
157
+
158
+ context "when the schedule is for a job with named arguments" do
159
+ let(:schedule) { YAML.load_file 'spec/fixtures/named_args_job.yaml' }
160
+
161
+ it "queues up a job, specifing that there are named args in the job" do
162
+ stub_jobs("NamedArgsJob")
163
+ expect(wrapped['named_args_job']).to eq(
164
+ "class" => "ActiveScheduler::ResqueWrapper",
165
+ "queue" => "simple",
166
+ "description" => "It's a named args job.",
167
+ "every" => "30s",
168
+ "args" => [{
169
+ "job_class" => "NamedArgsJob",
170
+ "queue_name" => "simple",
171
+ "arguments" => [{'foo' => 1, 'bar' => 2}],
172
+ "named_args" => true
173
+ }]
174
+ )
175
+ end
176
+ end
106
177
  end
107
178
 
108
179
  describe ".perform" do
@@ -124,5 +195,36 @@ describe ActiveScheduler::ResqueWrapper do
124
195
  expect(TestKlass).to receive(:perform_later).with 1, 2
125
196
  end
126
197
  end
198
+
199
+ context "with named_arguments specified" do
200
+ let(:job_data) do
201
+ {
202
+ 'job_class' => 'TestKlass',
203
+ 'arguments' => [{ 'foo' => 1, 'bar' => 2 }],
204
+ 'named_args' => true
205
+ }
206
+ end
207
+
208
+ it "passed the arguments as Named args" do
209
+ expect(TestKlass).to receive(:perform_later).with(foo: 1, bar: 2)
210
+ end
211
+ end
212
+ end
213
+
214
+ describe '.scheduled' do
215
+ let(:queue_name) { 'test_queue' }
216
+ let(:job_data) { {'job_class' => 'TestKlass'} }
217
+
218
+ before do
219
+ allow(described_class).to receive(:perform)
220
+ end
221
+
222
+ after do
223
+ described_class.scheduled(queue_name, described_class, job_data)
224
+ end
225
+
226
+ it 'delegates to .perform with job_data' do
227
+ expect(described_class).to receive(:perform).with(job_data)
228
+ end
127
229
  end
128
230
  end
@@ -0,0 +1,9 @@
1
+ named_args_job:
2
+ every: "30s"
3
+ queue: "simple"
4
+ class: "NamedArgsJob"
5
+ args:
6
+ - foo: 1
7
+ bar: 2
8
+ description: "It's a named args job."
9
+ named_args: true
@@ -0,0 +1,10 @@
1
+ persist_job:
2
+ every: "30s"
3
+ queue: "simple"
4
+ class: "SimpleJob"
5
+ rails_env: "test"
6
+ args:
7
+ - foo-arg-1
8
+ - foo-arg-2
9
+ description: "It's a simple job. That persists."
10
+ persist: true
@@ -2,6 +2,7 @@ simple_job:
2
2
  every: "30s"
3
3
  queue: "simple"
4
4
  class: "SimpleJob"
5
+ rails_env: "test"
5
6
  args:
6
7
  - foo-arg-1
7
8
  - foo-arg-2
metadata CHANGED
@@ -1,31 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_scheduler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Aiken
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-08 00:00:00.000000000 Z
11
+ date: 2020-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: activejob
14
+ name: rake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.2.0
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 4.2.0
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: activesupport
28
+ name: activejob
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,33 +39,19 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: 4.2.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: rspec-rails
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '3.1'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '3.1'
55
- - !ruby/object:Gem::Dependency
56
- name: guard-rspec
42
+ name: rspec
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
45
  - - "~>"
60
46
  - !ruby/object:Gem::Version
61
- version: '4.2'
47
+ version: '3.5'
62
48
  type: :development
63
49
  prerelease: false
64
50
  version_requirements: !ruby/object:Gem::Requirement
65
51
  requirements:
66
52
  - - "~>"
67
53
  - !ruby/object:Gem::Version
68
- version: '4.2'
54
+ version: '3.5'
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: coveralls
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -82,7 +68,7 @@ dependencies:
82
68
  version: '0'
83
69
  description: A wrapper for scheduling jobs through ActiveJob
84
70
  email:
85
- - jaiken@rocketmade.com
71
+ - 60tonangel@gmail.com
86
72
  executables: []
87
73
  extensions: []
88
74
  extra_rdoc_files: []
@@ -102,7 +88,9 @@ files:
102
88
  - lib/active_scheduler/version.rb
103
89
  - spec/active_scheduler/resque_wrapper_spec.rb
104
90
  - spec/fixtures/cron_job.yaml
91
+ - spec/fixtures/named_args_job.yaml
105
92
  - spec/fixtures/no_queue.yaml
93
+ - spec/fixtures/persist_job.yaml
106
94
  - spec/fixtures/schedule_name_is_class_name.yaml
107
95
  - spec/fixtures/simple_job.json
108
96
  - spec/fixtures/simple_job.yaml
@@ -112,7 +100,7 @@ homepage: https://github.com/JustinAiken/active_scheduler
112
100
  licenses:
113
101
  - MIT
114
102
  metadata: {}
115
- post_install_message:
103
+ post_install_message:
116
104
  rdoc_options: []
117
105
  require_paths:
118
106
  - lib
@@ -127,10 +115,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
115
  - !ruby/object:Gem::Version
128
116
  version: '0'
129
117
  requirements: []
130
- rubyforge_project: active_scheduler
131
- rubygems_version: 2.4.8
132
- signing_key:
118
+ rubygems_version: 3.0.6
119
+ signing_key:
133
120
  specification_version: 4
134
121
  summary: Scheduling for ActiveJob
135
122
  test_files: []
136
- has_rdoc: