foreman_docker 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +8 -2
  3. data/Rakefile +13 -2
  4. data/app/assets/stylesheets/foreman_docker/terminal.css.scss +85 -0
  5. data/app/controllers/containers/steps_controller.rb +55 -0
  6. data/app/controllers/containers_controller.rb +62 -0
  7. data/app/helpers/container_steps_helper.rb +11 -0
  8. data/app/helpers/containers_helper.rb +54 -0
  9. data/app/models/concerns/fog_extensions/fogdocker/image.rb +1 -2
  10. data/app/models/concerns/fog_extensions/fogdocker/server.rb +18 -8
  11. data/app/models/container.rb +29 -0
  12. data/app/models/docker_image.rb +7 -0
  13. data/app/models/docker_tag.rb +7 -0
  14. data/app/models/foreman_docker/docker.rb +22 -16
  15. data/app/views/api/v1/compute_resources/docker.json +1 -0
  16. data/app/views/api/v2/compute_resources/docker.json +1 -0
  17. data/app/views/compute_resources/form/_docker.html.erb +8 -1
  18. data/app/views/compute_resources_vms/show/_docker.html.erb +4 -0
  19. data/app/views/containers/_list.html.erb +35 -0
  20. data/app/views/containers/index.html.erb +31 -0
  21. data/app/views/containers/show.html.erb +104 -0
  22. data/app/views/containers/steps/_form_buttons.html.erb +20 -0
  23. data/app/views/containers/steps/_title.html.erb +3 -0
  24. data/app/views/containers/steps/configuration.html.erb +14 -0
  25. data/app/views/containers/steps/environment.html.erb +9 -0
  26. data/app/views/containers/steps/image.html.erb +33 -0
  27. data/app/views/containers/steps/preliminary.html.erb +18 -0
  28. data/config/routes.rb +5 -0
  29. data/db/migrate/20140930175337_add_email_to_compute_resource.rb +5 -0
  30. data/db/migrate/20141005233312_create_containers.rb +11 -0
  31. data/db/migrate/20141007225130_add_compute_resource_id_to_container.rb +5 -0
  32. data/db/migrate/20141009001613_add_tag_to_container.rb +5 -0
  33. data/db/migrate/20141009011026_add_attributes_to_container.rb +12 -0
  34. data/db/migrate/20141010173220_create_docker_images.rb +36 -0
  35. data/db/migrate/20141018110810_add_uuid_to_containers.rb +6 -0
  36. data/lib/foreman_docker/engine.rb +38 -6
  37. data/lib/foreman_docker/tasks/test.rake +44 -0
  38. data/lib/foreman_docker/version.rb +1 -1
  39. data/test/factories/compute_resources.rb +15 -0
  40. data/test/factories/containers.rb +6 -0
  41. data/test/factories/docker_image.rb +5 -0
  42. data/test/factories/docker_tag.rb +6 -0
  43. data/test/functionals/container_controller_test.rb +27 -0
  44. data/test/functionals/containers_steps_controller_test.rb +39 -0
  45. data/test/models/container_test.rb +36 -0
  46. data/test/models/docker_image_test.rb +12 -0
  47. data/test/models/docker_tag_test.rb +17 -0
  48. data/test/test_plugin_helper.rb +14 -0
  49. metadata +95 -85
  50. data/lib/tasks/foreman_docker_tasks.rake +0 -4
  51. data/test/dummy/README.rdoc +0 -28
  52. data/test/dummy/Rakefile +0 -6
  53. data/test/dummy/app/assets/javascripts/application.js +0 -13
  54. data/test/dummy/app/assets/stylesheets/application.css +0 -13
  55. data/test/dummy/app/controllers/application_controller.rb +0 -5
  56. data/test/dummy/app/helpers/application_helper.rb +0 -2
  57. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  58. data/test/dummy/bin/bundle +0 -3
  59. data/test/dummy/bin/rails +0 -4
  60. data/test/dummy/bin/rake +0 -4
  61. data/test/dummy/config.ru +0 -4
  62. data/test/dummy/config/application.rb +0 -23
  63. data/test/dummy/config/boot.rb +0 -5
  64. data/test/dummy/config/database.yml +0 -25
  65. data/test/dummy/config/environment.rb +0 -5
  66. data/test/dummy/config/environments/development.rb +0 -29
  67. data/test/dummy/config/environments/production.rb +0 -80
  68. data/test/dummy/config/environments/test.rb +0 -36
  69. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  70. data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  71. data/test/dummy/config/initializers/inflections.rb +0 -16
  72. data/test/dummy/config/initializers/mime_types.rb +0 -5
  73. data/test/dummy/config/initializers/secret_token.rb +0 -12
  74. data/test/dummy/config/initializers/session_store.rb +0 -3
  75. data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  76. data/test/dummy/config/locales/en.yml +0 -23
  77. data/test/dummy/config/routes.rb +0 -56
  78. data/test/dummy/public/404.html +0 -58
  79. data/test/dummy/public/422.html +0 -58
  80. data/test/dummy/public/500.html +0 -57
  81. data/test/dummy/public/favicon.ico +0 -0
  82. data/test/foreman_docker_test.rb +0 -7
  83. data/test/test_helper.rb +0 -15
@@ -0,0 +1,44 @@
1
+ require File.expand_path("../engine", File.dirname(__FILE__))
2
+ namespace :test do
3
+ desc "Run the plugin unit test suite."
4
+ task :docker => ['db:test:prepare'] do
5
+ test_task = Rake::TestTask.new('docker_test_task') do |t|
6
+ t.libs << ["test", "#{ForemanDocker::Engine.root}/test"]
7
+ t.test_files = [
8
+ "#{ForemanDocker::Engine.root}/test/**/*_test.rb"
9
+ ]
10
+ t.verbose = true
11
+ end
12
+
13
+ Rake::Task[test_task.name].invoke
14
+ end
15
+ end
16
+
17
+ namespace :docker do
18
+ task :rubocop do
19
+ begin
20
+ require 'rubocop/rake_task'
21
+ RuboCop::RakeTask.new(:rubocop_docker) do |task|
22
+ task.patterns = ["#{ForemanDocker::Engine.root}/app/**/*.rb",
23
+ "#{ForemanDocker::Engine.root}/lib/**/*.rb",
24
+ "#{ForemanDocker::Engine.root}/test/**/*.rb"]
25
+ end
26
+ rescue
27
+ puts "Rubocop not loaded."
28
+ end
29
+
30
+ Rake::Task['rubocop_docker'].invoke
31
+ end
32
+ end
33
+
34
+ Rake::Task[:test].enhance do
35
+ Rake::Task['test:docker'].invoke
36
+ end
37
+
38
+ load 'tasks/jenkins.rake'
39
+ if Rake::Task.task_defined?(:'jenkins:unit')
40
+ Rake::Task["jenkins:unit"].enhance do
41
+ Rake::Task['test:docker'].invoke
42
+ Rake::Task['docker:rubocop'].invoke
43
+ end
44
+ end
@@ -1,3 +1,3 @@
1
1
  module ForemanDocker
2
- VERSION = "0.0.3"
2
+ VERSION = '0.1.0'
3
3
  end
@@ -0,0 +1,15 @@
1
+ FactoryGirl.define do
2
+ factory :container_resource, :class => ComputeResource do
3
+ sequence(:name) { |n| "compute_resource#{n}" }
4
+
5
+ trait :docker do
6
+ provider 'Docker'
7
+ user 'dockeruser'
8
+ password 'dockerpassword'
9
+ email 'container@containerization.com'
10
+ url 'unix:///var/run/docker.sock'
11
+ end
12
+
13
+ factory :docker_cr, :class => ForemanDocker::Docker, :traits => [:docker]
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ FactoryGirl.define do
2
+ factory :container do
3
+ sequence(:name) { |n| "container_#{n}" }
4
+ association :compute_resource, :factory => :docker_cr
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ FactoryGirl.define do
2
+ factory :docker_image do
3
+ sequence(:image_id) { |n| "image#{n}" }
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ FactoryGirl.define do
2
+ factory :docker_tag do
3
+ sequence(:tag) { |n| "tag#{n}" }
4
+ association :image, :factory => :docker_image
5
+ end
6
+ end
@@ -0,0 +1,27 @@
1
+ require 'test_plugin_helper'
2
+
3
+ class ContainersControllerTest < ActionController::TestCase
4
+ test 'redirect if Docker provider is not available' do
5
+ get :index, {}, set_session_user
6
+ assert_redirected_to new_compute_resource_path
7
+ end
8
+
9
+ test 'index if Docker resource is available' do
10
+ Fog.mock!
11
+ # Avoid rendering errors by not retrieving any container
12
+ ComputeResource.any_instance.stubs(:vms).returns([])
13
+ FactoryGirl.create(:docker_cr)
14
+ get :index, {}, set_session_user
15
+ assert_template 'index'
16
+ end
17
+
18
+ test 'deleting a container in compute resource redirects to containers index' do
19
+ Fog.mock!
20
+ container_resource = FactoryGirl.create(:docker_cr)
21
+ container = container_resource.vms.first
22
+ container.class.any_instance.expects(:destroy).returns(true)
23
+ delete :destroy, { :compute_resource_id => container_resource,
24
+ :id => container.id }, set_session_user
25
+ assert_redirected_to containers_path
26
+ end
27
+ end
@@ -0,0 +1,39 @@
1
+ require 'test_plugin_helper'
2
+
3
+ module Containers
4
+ class StepsControllerTest < ActionController::TestCase
5
+ setup do
6
+ @container = FactoryGirl.create(:container)
7
+ end
8
+
9
+ test 'sets a docker image and tag for a new container' do
10
+ put :update, { :id => :image,
11
+ :container_id => @container.id,
12
+ :image => 'centos',
13
+ :container => { :tag => 'latest' } }, set_session_user
14
+ assert_response :found
15
+ assert_redirected_to container_step_path(:container_id => @container.id,
16
+ :id => :configuration)
17
+ assert_equal DockerImage.find_by_image_id('centos'), @container.reload.image
18
+ assert_equal DockerTag.find_by_tag('latest'), @container.tag
19
+ end
20
+
21
+ test 'uuid of the created container is saved at the end of the wizard' do
22
+ Fog.mock!
23
+ @container.update_attribute(:image, 'centos')
24
+ @container.update_attribute(:tag, 'latest')
25
+ fake_container = @container.compute_resource.create_vm
26
+ fake_container.id = SecureRandom.uuid
27
+ ForemanDocker::Docker.any_instance.expects(:create_vm).returns(fake_container)
28
+ put :update, { :id => :environment,
29
+ :container_id => @container.id }, set_session_user
30
+ assert_equal fake_container.id, Container.find(@container.id).uuid
31
+ end
32
+
33
+ test 'wizard finishes with a redirect to the managed container' do
34
+ get :show, { :id => :wicked_finish,
35
+ :container_id => @container.id }, set_session_user
36
+ assert_redirected_to container_path(:id => @container.id)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,36 @@
1
+ require 'test_plugin_helper'
2
+
3
+ class ContainerTest < ActiveSupport::TestCase
4
+ context 'update attributes' do
5
+ setup do
6
+ @container = FactoryGirl.create(:container)
7
+ end
8
+
9
+ test 'update image reuses previously created image' do
10
+ assert_difference('DockerImage.count', 1) do
11
+ @container.update_attribute(:image, "centos")
12
+ end
13
+ assert_equal "centos", @container.image.image_id
14
+ refute_nil DockerImage.find_by_image_id("centos")
15
+
16
+ assert_difference('DockerImage.count', 1) do
17
+ @container.update_attribute(:image, "redis")
18
+ end
19
+ assert_equal "redis", @container.image.image_id
20
+
21
+ assert_difference('DockerImage.count', 0) do
22
+ @container.update_attribute(:image, "centos")
23
+ end
24
+ end
25
+
26
+ test "update tag uses container's associated image" do
27
+ @container.update_attribute(:image, 'centos')
28
+ assert_difference('DockerTag.count', 1) do
29
+ @container.update_attribute(:tag, 'latest')
30
+ end
31
+
32
+ assert_equal 'latest', @container.tag.tag
33
+ assert_equal @container.tag.image, @container.image
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,12 @@
1
+ require 'test_plugin_helper'
2
+
3
+ class DockerImageTest < ActiveSupport::TestCase
4
+ test 'destroy docker image with tags is successful' do
5
+ tag = FactoryGirl.create(:docker_tag)
6
+ image = FactoryGirl.create(:docker_image)
7
+ image.tags << tag
8
+ assert image.destroy
9
+ refute DockerImage.exists?(image.id)
10
+ refute DockerTag.exists?(tag.id)
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ require 'test_plugin_helper'
2
+
3
+ class DockerTagTest < ActiveSupport::TestCase
4
+ test 'creating fails if no image is provided' do
5
+ tag = DockerTag.new(FactoryGirl.attributes_for(:docker_tag))
6
+ refute tag.valid?
7
+ assert tag.errors.size >= 1
8
+ end
9
+
10
+ test 'creating succeeds if an image is provided' do
11
+ tag = FactoryGirl.build(:docker_tag)
12
+ tag.image = FactoryGirl.create(:docker_image)
13
+
14
+ assert tag.valid?
15
+ assert tag.save
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ # This calls the main test_helper in Foreman-core
2
+ require 'test_helper'
3
+
4
+ def assert_row_button(index_path, link_text, button_text, dropdown = false)
5
+ visit index_path
6
+ within(:xpath, "//tr[contains(.,'#{link_text}')]") do
7
+ find("i.caret").click if dropdown
8
+ click_link(button_text)
9
+ end
10
+ end
11
+
12
+ # Add plugin to FactoryGirl's paths
13
+ FactoryGirl.definition_file_paths << File.join(File.dirname(__FILE__), 'factories')
14
+ FactoryGirl.reload
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_docker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
- - Amos Beanri
7
+ - Daniel Lobato, Amos Benari
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-09 00:00:00.000000000 Z
11
+ date: 2014-10-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -44,71 +44,103 @@ dependencies:
44
44
  requirements:
45
45
  - - ~>
46
46
  - !ruby/object:Gem::Version
47
- version: 1.8.0
47
+ version: 1.13.6
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: 1.8.0
54
+ version: 1.13.6
55
+ - !ruby/object:Gem::Dependency
56
+ name: wicked
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: 0.26.1
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: 0.26.1
55
83
  description: Provision and manage Docker containers and images from Foreman.
56
84
  email:
57
- - abenari@redhat.com
85
+ - dlobatog@redhat.com, abenari@redhat.com
58
86
  executables: []
59
87
  extensions: []
60
88
  extra_rdoc_files: []
61
89
  files:
62
- - app/views/images/form/_docker.html.erb
63
- - app/views/compute_resources_vms/form/_docker.html.erb
64
- - app/views/compute_resources_vms/show/_docker.html.erb
65
- - app/views/compute_resources_vms/index/_docker.html.erb
90
+ - LICENSE
91
+ - README.md
92
+ - Rakefile
93
+ - app/assets/stylesheets/foreman_docker/terminal.css.scss
94
+ - app/controllers/containers/steps_controller.rb
95
+ - app/controllers/containers_controller.rb
96
+ - app/helpers/container_steps_helper.rb
97
+ - app/helpers/containers_helper.rb
98
+ - app/models/concerns/fog_extensions/fogdocker/image.rb
99
+ - app/models/concerns/fog_extensions/fogdocker/server.rb
100
+ - app/models/container.rb
101
+ - app/models/docker_image.rb
102
+ - app/models/docker_tag.rb
103
+ - app/models/foreman_docker/docker.rb
104
+ - app/views/api/v1/compute_resources/docker.json
105
+ - app/views/api/v2/compute_resources/docker.json
66
106
  - app/views/compute_resources/form/_docker.html.erb
67
107
  - app/views/compute_resources/show/_docker.html.erb
68
- - app/models/foreman_docker/docker.rb
69
- - app/models/concerns/fog_extensions/fogdocker/server.rb
70
- - app/models/concerns/fog_extensions/fogdocker/image.rb
108
+ - app/views/compute_resources_vms/form/_docker.html.erb
109
+ - app/views/compute_resources_vms/index/_docker.html.erb
110
+ - app/views/compute_resources_vms/show/_docker.html.erb
111
+ - app/views/containers/_list.html.erb
112
+ - app/views/containers/index.html.erb
113
+ - app/views/containers/show.html.erb
114
+ - app/views/containers/steps/_form_buttons.html.erb
115
+ - app/views/containers/steps/_title.html.erb
116
+ - app/views/containers/steps/configuration.html.erb
117
+ - app/views/containers/steps/environment.html.erb
118
+ - app/views/containers/steps/image.html.erb
119
+ - app/views/containers/steps/preliminary.html.erb
120
+ - app/views/images/form/_docker.html.erb
121
+ - config/routes.rb
122
+ - db/migrate/20140930175337_add_email_to_compute_resource.rb
123
+ - db/migrate/20141005233312_create_containers.rb
124
+ - db/migrate/20141007225130_add_compute_resource_id_to_container.rb
125
+ - db/migrate/20141009001613_add_tag_to_container.rb
126
+ - db/migrate/20141009011026_add_attributes_to_container.rb
127
+ - db/migrate/20141010173220_create_docker_images.rb
128
+ - db/migrate/20141018110810_add_uuid_to_containers.rb
71
129
  - lib/foreman_docker.rb
72
- - lib/foreman_docker/version.rb
73
130
  - lib/foreman_docker/engine.rb
74
- - lib/tasks/foreman_docker_tasks.rake
131
+ - lib/foreman_docker/tasks/test.rake
132
+ - lib/foreman_docker/version.rb
75
133
  - locale/Makefile
76
- - LICENSE
77
- - Rakefile
78
- - README.md
79
- - test/dummy/README.rdoc
80
- - test/dummy/public/favicon.ico
81
- - test/dummy/public/422.html
82
- - test/dummy/public/404.html
83
- - test/dummy/public/500.html
84
- - test/dummy/config.ru
85
- - test/dummy/Rakefile
86
- - test/dummy/bin/bundle
87
- - test/dummy/bin/rails
88
- - test/dummy/bin/rake
89
- - test/dummy/config/environments/production.rb
90
- - test/dummy/config/environments/test.rb
91
- - test/dummy/config/environments/development.rb
92
- - test/dummy/config/initializers/secret_token.rb
93
- - test/dummy/config/initializers/filter_parameter_logging.rb
94
- - test/dummy/config/initializers/backtrace_silencers.rb
95
- - test/dummy/config/initializers/session_store.rb
96
- - test/dummy/config/initializers/inflections.rb
97
- - test/dummy/config/initializers/mime_types.rb
98
- - test/dummy/config/initializers/wrap_parameters.rb
99
- - test/dummy/config/database.yml
100
- - test/dummy/config/environment.rb
101
- - test/dummy/config/application.rb
102
- - test/dummy/config/locales/en.yml
103
- - test/dummy/config/routes.rb
104
- - test/dummy/config/boot.rb
105
- - test/dummy/app/controllers/application_controller.rb
106
- - test/dummy/app/assets/javascripts/application.js
107
- - test/dummy/app/assets/stylesheets/application.css
108
- - test/dummy/app/helpers/application_helper.rb
109
- - test/dummy/app/views/layouts/application.html.erb
110
- - test/foreman_docker_test.rb
111
- - test/test_helper.rb
134
+ - test/factories/compute_resources.rb
135
+ - test/factories/containers.rb
136
+ - test/factories/docker_image.rb
137
+ - test/factories/docker_tag.rb
138
+ - test/functionals/container_controller_test.rb
139
+ - test/functionals/containers_steps_controller_test.rb
140
+ - test/models/container_test.rb
141
+ - test/models/docker_image_test.rb
142
+ - test/models/docker_tag_test.rb
143
+ - test/test_plugin_helper.rb
112
144
  homepage: http://github.com/theforeman/foreman-docker
113
145
  licenses:
114
146
  - GPL-3
@@ -129,41 +161,19 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
161
  version: '0'
130
162
  requirements: []
131
163
  rubyforge_project:
132
- rubygems_version: 2.0.14
164
+ rubygems_version: 2.2.2
133
165
  signing_key:
134
166
  specification_version: 4
135
167
  summary: Provision and manage Docker containers and images from Foreman
136
168
  test_files:
137
- - test/dummy/README.rdoc
138
- - test/dummy/public/favicon.ico
139
- - test/dummy/public/422.html
140
- - test/dummy/public/404.html
141
- - test/dummy/public/500.html
142
- - test/dummy/config.ru
143
- - test/dummy/Rakefile
144
- - test/dummy/bin/bundle
145
- - test/dummy/bin/rails
146
- - test/dummy/bin/rake
147
- - test/dummy/config/environments/production.rb
148
- - test/dummy/config/environments/test.rb
149
- - test/dummy/config/environments/development.rb
150
- - test/dummy/config/initializers/secret_token.rb
151
- - test/dummy/config/initializers/filter_parameter_logging.rb
152
- - test/dummy/config/initializers/backtrace_silencers.rb
153
- - test/dummy/config/initializers/session_store.rb
154
- - test/dummy/config/initializers/inflections.rb
155
- - test/dummy/config/initializers/mime_types.rb
156
- - test/dummy/config/initializers/wrap_parameters.rb
157
- - test/dummy/config/database.yml
158
- - test/dummy/config/environment.rb
159
- - test/dummy/config/application.rb
160
- - test/dummy/config/locales/en.yml
161
- - test/dummy/config/routes.rb
162
- - test/dummy/config/boot.rb
163
- - test/dummy/app/controllers/application_controller.rb
164
- - test/dummy/app/assets/javascripts/application.js
165
- - test/dummy/app/assets/stylesheets/application.css
166
- - test/dummy/app/helpers/application_helper.rb
167
- - test/dummy/app/views/layouts/application.html.erb
168
- - test/foreman_docker_test.rb
169
- - test/test_helper.rb
169
+ - test/functionals/containers_steps_controller_test.rb
170
+ - test/functionals/container_controller_test.rb
171
+ - test/models/docker_image_test.rb
172
+ - test/models/container_test.rb
173
+ - test/models/docker_tag_test.rb
174
+ - test/factories/docker_image.rb
175
+ - test/factories/compute_resources.rb
176
+ - test/factories/docker_tag.rb
177
+ - test/factories/containers.rb
178
+ - test/test_plugin_helper.rb
179
+ has_rdoc: