TrueCar-chef 0.10.0.beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +201 -0
- data/README.rdoc +171 -0
- data/bin/chef-client +26 -0
- data/bin/chef-solo +25 -0
- data/bin/knife +26 -0
- data/bin/shef +34 -0
- data/distro/README +2 -0
- data/distro/arch/etc/conf.d/chef-client.conf +5 -0
- data/distro/arch/etc/conf.d/chef-server-webui.conf +10 -0
- data/distro/arch/etc/conf.d/chef-server.conf +10 -0
- data/distro/arch/etc/conf.d/chef-solr-indexer.conf +8 -0
- data/distro/arch/etc/conf.d/chef-solr.conf +8 -0
- data/distro/arch/etc/rc.d/chef-client +76 -0
- data/distro/arch/etc/rc.d/chef-server +78 -0
- data/distro/arch/etc/rc.d/chef-server-webui +78 -0
- data/distro/arch/etc/rc.d/chef-solr +78 -0
- data/distro/arch/etc/rc.d/chef-solr-indexer +78 -0
- data/distro/common/man/man1/chef-indexer.1 +42 -0
- data/distro/common/man/man1/chef-server-webui.1 +106 -0
- data/distro/common/man/man1/chef-server.1 +107 -0
- data/distro/common/man/man1/chef-solr-indexer.1 +55 -0
- data/distro/common/man/man1/chef-solr.1 +55 -0
- data/distro/common/man/man8/chef-client.8 +63 -0
- data/distro/common/man/man8/chef-solo.8 +57 -0
- data/distro/common/man/man8/chef-solr-rebuild.8 +37 -0
- data/distro/common/man/man8/knife.8 +1349 -0
- data/distro/common/man/man8/shef.8 +45 -0
- data/distro/common/markdown/README +3 -0
- data/distro/common/markdown/knife.mkd +865 -0
- data/distro/debian/etc/default/chef-client +4 -0
- data/distro/debian/etc/default/chef-server +9 -0
- data/distro/debian/etc/default/chef-server-webui +9 -0
- data/distro/debian/etc/default/chef-solr +8 -0
- data/distro/debian/etc/default/chef-solr-indexer +7 -0
- data/distro/debian/etc/init.d/chef-client +175 -0
- data/distro/debian/etc/init.d/chef-server +122 -0
- data/distro/debian/etc/init.d/chef-server-webui +123 -0
- data/distro/debian/etc/init.d/chef-solr +176 -0
- data/distro/debian/etc/init.d/chef-solr-indexer +176 -0
- data/distro/debian/etc/init/chef-client.conf +17 -0
- data/distro/debian/etc/init/chef-server-webui.conf +17 -0
- data/distro/debian/etc/init/chef-server.conf +17 -0
- data/distro/debian/etc/init/chef-solr-indexer.conf +17 -0
- data/distro/debian/etc/init/chef-solr.conf +17 -0
- data/distro/redhat/etc/init.d/chef-client +106 -0
- data/distro/redhat/etc/init.d/chef-server +112 -0
- data/distro/redhat/etc/init.d/chef-server-webui +112 -0
- data/distro/redhat/etc/init.d/chef-solr +104 -0
- data/distro/redhat/etc/init.d/chef-solr-indexer +104 -0
- data/distro/redhat/etc/logrotate.d/chef-client +8 -0
- data/distro/redhat/etc/logrotate.d/chef-server +8 -0
- data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
- data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
- data/distro/redhat/etc/logrotate.d/chef-solr-indexer +8 -0
- data/distro/redhat/etc/sysconfig/chef-client +15 -0
- data/distro/redhat/etc/sysconfig/chef-server +14 -0
- data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
- data/distro/redhat/etc/sysconfig/chef-solr +8 -0
- data/distro/redhat/etc/sysconfig/chef-solr-indexer +7 -0
- data/lib/chef.rb +40 -0
- data/lib/chef/api_client.rb +264 -0
- data/lib/chef/application.rb +137 -0
- data/lib/chef/application/agent.rb +18 -0
- data/lib/chef/application/client.rb +242 -0
- data/lib/chef/application/knife.rb +169 -0
- data/lib/chef/application/solo.rb +217 -0
- data/lib/chef/applications.rb +4 -0
- data/lib/chef/certificate.rb +194 -0
- data/lib/chef/checksum.rb +182 -0
- data/lib/chef/checksum_cache.rb +189 -0
- data/lib/chef/client.rb +362 -0
- data/lib/chef/config.rb +244 -0
- data/lib/chef/cookbook/chefignore.rb +66 -0
- data/lib/chef/cookbook/cookbook_collection.rb +45 -0
- data/lib/chef/cookbook/cookbook_version_loader.rb +151 -0
- data/lib/chef/cookbook/file_system_file_vendor.rb +56 -0
- data/lib/chef/cookbook/file_vendor.rb +48 -0
- data/lib/chef/cookbook/metadata.rb +592 -0
- data/lib/chef/cookbook/remote_file_vendor.rb +87 -0
- data/lib/chef/cookbook/syntax_check.rb +136 -0
- data/lib/chef/cookbook_loader.rb +103 -0
- data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
- data/lib/chef/cookbook_uploader.rb +125 -0
- data/lib/chef/cookbook_version.rb +979 -0
- data/lib/chef/cookbook_version_selector.rb +163 -0
- data/lib/chef/couchdb.rb +247 -0
- data/lib/chef/daemon.rb +172 -0
- data/lib/chef/data_bag.rb +223 -0
- data/lib/chef/data_bag_item.rb +267 -0
- data/lib/chef/encrypted_data_bag_item.rb +126 -0
- data/lib/chef/environment.rb +386 -0
- data/lib/chef/exceptions.rb +153 -0
- data/lib/chef/file_access_control.rb +140 -0
- data/lib/chef/file_cache.rb +218 -0
- data/lib/chef/handler.rb +206 -0
- data/lib/chef/handler/json_file.rb +58 -0
- data/lib/chef/index_queue.rb +29 -0
- data/lib/chef/index_queue/amqp_client.rb +116 -0
- data/lib/chef/index_queue/consumer.rb +76 -0
- data/lib/chef/index_queue/indexable.rb +109 -0
- data/lib/chef/json_compat.rb +52 -0
- data/lib/chef/knife.rb +424 -0
- data/lib/chef/knife/bootstrap.rb +185 -0
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +47 -0
- data/lib/chef/knife/bootstrap/centos5-gems.erb +41 -0
- data/lib/chef/knife/bootstrap/client-install.vbs +80 -0
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +38 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +32 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +46 -0
- data/lib/chef/knife/bootstrap/windows-gems.erb +34 -0
- data/lib/chef/knife/client_bulk_delete.rb +43 -0
- data/lib/chef/knife/client_create.rb +73 -0
- data/lib/chef/knife/client_delete.rb +48 -0
- data/lib/chef/knife/client_edit.rb +48 -0
- data/lib/chef/knife/client_list.rb +43 -0
- data/lib/chef/knife/client_reregister.rb +59 -0
- data/lib/chef/knife/client_show.rb +53 -0
- data/lib/chef/knife/configure.rb +136 -0
- data/lib/chef/knife/configure_client.rb +52 -0
- data/lib/chef/knife/cookbook_bulk_delete.rb +61 -0
- data/lib/chef/knife/cookbook_create.rb +274 -0
- data/lib/chef/knife/cookbook_delete.rb +149 -0
- data/lib/chef/knife/cookbook_download.rb +134 -0
- data/lib/chef/knife/cookbook_list.rb +50 -0
- data/lib/chef/knife/cookbook_metadata.rb +102 -0
- data/lib/chef/knife/cookbook_metadata_from_file.rb +44 -0
- data/lib/chef/knife/cookbook_show.rb +101 -0
- data/lib/chef/knife/cookbook_site_download.rb +58 -0
- data/lib/chef/knife/cookbook_site_list.rb +56 -0
- data/lib/chef/knife/cookbook_site_search.rb +51 -0
- data/lib/chef/knife/cookbook_site_share.rb +114 -0
- data/lib/chef/knife/cookbook_site_show.rb +57 -0
- data/lib/chef/knife/cookbook_site_unshare.rb +56 -0
- data/lib/chef/knife/cookbook_site_vendor.rb +145 -0
- data/lib/chef/knife/cookbook_test.rb +82 -0
- data/lib/chef/knife/cookbook_upload.rb +146 -0
- data/lib/chef/knife/data_bag_create.rb +94 -0
- data/lib/chef/knife/data_bag_delete.rb +51 -0
- data/lib/chef/knife/data_bag_edit.rb +94 -0
- data/lib/chef/knife/data_bag_from_file.rb +85 -0
- data/lib/chef/knife/data_bag_list.rb +46 -0
- data/lib/chef/knife/data_bag_show.rb +81 -0
- data/lib/chef/knife/environment_create.rb +53 -0
- data/lib/chef/knife/environment_delete.rb +45 -0
- data/lib/chef/knife/environment_edit.rb +45 -0
- data/lib/chef/knife/environment_from_file.rb +39 -0
- data/lib/chef/knife/environment_list.rb +42 -0
- data/lib/chef/knife/environment_show.rb +46 -0
- data/lib/chef/knife/exec.rb +51 -0
- data/lib/chef/knife/index_rebuild.rb +50 -0
- data/lib/chef/knife/node_bulk_delete.rb +46 -0
- data/lib/chef/knife/node_create.rb +50 -0
- data/lib/chef/knife/node_delete.rb +47 -0
- data/lib/chef/knife/node_edit.rb +163 -0
- data/lib/chef/knife/node_from_file.rb +45 -0
- data/lib/chef/knife/node_list.rb +46 -0
- data/lib/chef/knife/node_run_list_add.rb +67 -0
- data/lib/chef/knife/node_run_list_remove.rb +48 -0
- data/lib/chef/knife/node_show.rb +62 -0
- data/lib/chef/knife/recipe_list.rb +33 -0
- data/lib/chef/knife/role_bulk_delete.rb +47 -0
- data/lib/chef/knife/role_create.rb +55 -0
- data/lib/chef/knife/role_delete.rb +47 -0
- data/lib/chef/knife/role_edit.rb +48 -0
- data/lib/chef/knife/role_from_file.rb +49 -0
- data/lib/chef/knife/role_list.rb +43 -0
- data/lib/chef/knife/role_show.rb +54 -0
- data/lib/chef/knife/search.rb +123 -0
- data/lib/chef/knife/ssh.rb +318 -0
- data/lib/chef/knife/status.rb +90 -0
- data/lib/chef/knife/subcommand_loader.rb +101 -0
- data/lib/chef/knife/tag_create.rb +31 -0
- data/lib/chef/knife/tag_delete.rb +31 -0
- data/lib/chef/knife/tag_list.rb +29 -0
- data/lib/chef/knife/ui.rb +227 -0
- data/lib/chef/knife/windows_bootstrap.rb +157 -0
- data/lib/chef/log.rb +39 -0
- data/lib/chef/mash.rb +211 -0
- data/lib/chef/mixin/check_helper.rb +31 -0
- data/lib/chef/mixin/checksum.rb +32 -0
- data/lib/chef/mixin/command.rb +221 -0
- data/lib/chef/mixin/command/unix.rb +215 -0
- data/lib/chef/mixin/command/windows.rb +76 -0
- data/lib/chef/mixin/convert_to_class_name.rb +63 -0
- data/lib/chef/mixin/create_path.rb +56 -0
- data/lib/chef/mixin/deep_merge.rb +225 -0
- data/lib/chef/mixin/deprecation.rb +65 -0
- data/lib/chef/mixin/from_file.rb +50 -0
- data/lib/chef/mixin/language.rb +165 -0
- data/lib/chef/mixin/language_include_attribute.rb +61 -0
- data/lib/chef/mixin/language_include_recipe.rb +52 -0
- data/lib/chef/mixin/params_validate.rb +225 -0
- data/lib/chef/mixin/recipe_definition_dsl_core.rb +81 -0
- data/lib/chef/mixin/shell_out.rb +40 -0
- data/lib/chef/mixin/template.rb +95 -0
- data/lib/chef/mixin/xml_escape.rb +140 -0
- data/lib/chef/mixins.rb +15 -0
- data/lib/chef/monkey_patches/dir.rb +36 -0
- data/lib/chef/monkey_patches/numeric.rb +7 -0
- data/lib/chef/monkey_patches/regexp.rb +34 -0
- data/lib/chef/monkey_patches/string.rb +28 -0
- data/lib/chef/monkey_patches/tempfile.rb +64 -0
- data/lib/chef/nil_argument.rb +3 -0
- data/lib/chef/node.rb +661 -0
- data/lib/chef/node/attribute.rb +487 -0
- data/lib/chef/openid_registration.rb +187 -0
- data/lib/chef/platform.rb +409 -0
- data/lib/chef/provider.rb +124 -0
- data/lib/chef/provider/breakpoint.rb +36 -0
- data/lib/chef/provider/cookbook_file.rb +101 -0
- data/lib/chef/provider/cron.rb +186 -0
- data/lib/chef/provider/cron/solaris.rb +195 -0
- data/lib/chef/provider/deploy.rb +320 -0
- data/lib/chef/provider/deploy/revision.rb +80 -0
- data/lib/chef/provider/deploy/timestamped.rb +33 -0
- data/lib/chef/provider/directory.rb +72 -0
- data/lib/chef/provider/env.rb +152 -0
- data/lib/chef/provider/env/windows.rb +75 -0
- data/lib/chef/provider/erl_call.rb +100 -0
- data/lib/chef/provider/execute.rb +60 -0
- data/lib/chef/provider/file.rb +222 -0
- data/lib/chef/provider/git.rb +221 -0
- data/lib/chef/provider/group.rb +133 -0
- data/lib/chef/provider/group/aix.rb +70 -0
- data/lib/chef/provider/group/dscl.rb +121 -0
- data/lib/chef/provider/group/gpasswd.rb +53 -0
- data/lib/chef/provider/group/groupadd.rb +81 -0
- data/lib/chef/provider/group/pw.rb +84 -0
- data/lib/chef/provider/group/usermod.rb +57 -0
- data/lib/chef/provider/group/windows.rb +79 -0
- data/lib/chef/provider/http_request.rb +122 -0
- data/lib/chef/provider/ifconfig.rb +132 -0
- data/lib/chef/provider/link.rb +161 -0
- data/lib/chef/provider/log.rb +54 -0
- data/lib/chef/provider/mdadm.rb +91 -0
- data/lib/chef/provider/mount.rb +117 -0
- data/lib/chef/provider/mount/mount.rb +232 -0
- data/lib/chef/provider/mount/windows.rb +80 -0
- data/lib/chef/provider/ohai.rb +41 -0
- data/lib/chef/provider/package.rb +160 -0
- data/lib/chef/provider/package/apt.rb +110 -0
- data/lib/chef/provider/package/dpkg.rb +112 -0
- data/lib/chef/provider/package/easy_install.rb +136 -0
- data/lib/chef/provider/package/freebsd.rb +123 -0
- data/lib/chef/provider/package/macports.rb +105 -0
- data/lib/chef/provider/package/pacman.rb +101 -0
- data/lib/chef/provider/package/portage.rb +135 -0
- data/lib/chef/provider/package/rpm.rb +101 -0
- data/lib/chef/provider/package/rubygems.rb +462 -0
- data/lib/chef/provider/package/solaris.rb +127 -0
- data/lib/chef/provider/package/yum-dump.py +128 -0
- data/lib/chef/provider/package/yum.rb +261 -0
- data/lib/chef/provider/package/zypper.rb +133 -0
- data/lib/chef/provider/remote_directory.rb +138 -0
- data/lib/chef/provider/remote_file.rb +119 -0
- data/lib/chef/provider/route.rb +195 -0
- data/lib/chef/provider/ruby_block.rb +33 -0
- data/lib/chef/provider/script.rb +55 -0
- data/lib/chef/provider/service.rb +128 -0
- data/lib/chef/provider/service/arch.rb +109 -0
- data/lib/chef/provider/service/debian.rb +130 -0
- data/lib/chef/provider/service/freebsd.rb +156 -0
- data/lib/chef/provider/service/gentoo.rb +54 -0
- data/lib/chef/provider/service/init.rb +71 -0
- data/lib/chef/provider/service/insserv.rb +52 -0
- data/lib/chef/provider/service/redhat.rb +60 -0
- data/lib/chef/provider/service/simple.rb +118 -0
- data/lib/chef/provider/service/solaris.rb +85 -0
- data/lib/chef/provider/service/upstart.rb +192 -0
- data/lib/chef/provider/service/windows.rb +146 -0
- data/lib/chef/provider/subversion.rb +194 -0
- data/lib/chef/provider/template.rb +105 -0
- data/lib/chef/provider/user.rb +187 -0
- data/lib/chef/provider/user/dscl.rb +280 -0
- data/lib/chef/provider/user/pw.rb +113 -0
- data/lib/chef/provider/user/useradd.rb +137 -0
- data/lib/chef/provider/user/windows.rb +124 -0
- data/lib/chef/providers.rb +93 -0
- data/lib/chef/recipe.rb +128 -0
- data/lib/chef/resource.rb +530 -0
- data/lib/chef/resource/apt_package.rb +34 -0
- data/lib/chef/resource/bash.rb +33 -0
- data/lib/chef/resource/breakpoint.rb +35 -0
- data/lib/chef/resource/cookbook_file.rb +45 -0
- data/lib/chef/resource/cron.rb +188 -0
- data/lib/chef/resource/csh.rb +33 -0
- data/lib/chef/resource/deploy.rb +371 -0
- data/lib/chef/resource/deploy_revision.rb +35 -0
- data/lib/chef/resource/directory.rb +76 -0
- data/lib/chef/resource/dpkg_package.rb +34 -0
- data/lib/chef/resource/easy_install_package.rb +57 -0
- data/lib/chef/resource/env.rb +58 -0
- data/lib/chef/resource/erl_call.rb +83 -0
- data/lib/chef/resource/execute.rb +127 -0
- data/lib/chef/resource/file.rb +99 -0
- data/lib/chef/resource/freebsd_package.rb +35 -0
- data/lib/chef/resource/gem_package.rb +53 -0
- data/lib/chef/resource/git.rb +37 -0
- data/lib/chef/resource/group.rb +70 -0
- data/lib/chef/resource/http_request.rb +61 -0
- data/lib/chef/resource/ifconfig.rb +134 -0
- data/lib/chef/resource/link.rb +78 -0
- data/lib/chef/resource/log.rb +62 -0
- data/lib/chef/resource/macports_package.rb +29 -0
- data/lib/chef/resource/mdadm.rb +82 -0
- data/lib/chef/resource/mount.rb +135 -0
- data/lib/chef/resource/ohai.rb +40 -0
- data/lib/chef/resource/package.rb +80 -0
- data/lib/chef/resource/pacman_package.rb +33 -0
- data/lib/chef/resource/perl.rb +33 -0
- data/lib/chef/resource/portage_package.rb +33 -0
- data/lib/chef/resource/python.rb +33 -0
- data/lib/chef/resource/remote_directory.rb +109 -0
- data/lib/chef/resource/remote_file.rb +83 -0
- data/lib/chef/resource/route.rb +135 -0
- data/lib/chef/resource/rpm_package.rb +34 -0
- data/lib/chef/resource/ruby.rb +33 -0
- data/lib/chef/resource/ruby_block.rb +40 -0
- data/lib/chef/resource/scm.rb +147 -0
- data/lib/chef/resource/script.rb +60 -0
- data/lib/chef/resource/service.rb +160 -0
- data/lib/chef/resource/solaris_package.rb +36 -0
- data/lib/chef/resource/subversion.rb +36 -0
- data/lib/chef/resource/template.rb +69 -0
- data/lib/chef/resource/timestamped_deploy.rb +31 -0
- data/lib/chef/resource/user.rb +130 -0
- data/lib/chef/resource/yum_package.rb +43 -0
- data/lib/chef/resource_collection.rb +217 -0
- data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
- data/lib/chef/resource_definition.rb +67 -0
- data/lib/chef/resource_definition_list.rb +38 -0
- data/lib/chef/resources.rb +64 -0
- data/lib/chef/rest.rb +386 -0
- data/lib/chef/rest/auth_credentials.rb +71 -0
- data/lib/chef/rest/cookie_jar.rb +31 -0
- data/lib/chef/rest/rest_request.rb +188 -0
- data/lib/chef/role.rb +341 -0
- data/lib/chef/run_context.rb +126 -0
- data/lib/chef/run_list.rb +165 -0
- data/lib/chef/run_list/run_list_expansion.rb +193 -0
- data/lib/chef/run_list/run_list_item.rb +92 -0
- data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
- data/lib/chef/run_status.rb +121 -0
- data/lib/chef/runner.rb +99 -0
- data/lib/chef/sandbox.rb +153 -0
- data/lib/chef/search/query.rb +65 -0
- data/lib/chef/shef.rb +326 -0
- data/lib/chef/shef/ext.rb +569 -0
- data/lib/chef/shef/model_wrapper.rb +120 -0
- data/lib/chef/shef/shef_rest.rb +28 -0
- data/lib/chef/shef/shef_session.rb +284 -0
- data/lib/chef/shell_out.rb +238 -0
- data/lib/chef/shell_out/unix.rb +223 -0
- data/lib/chef/shell_out/windows.rb +98 -0
- data/lib/chef/solr_query.rb +187 -0
- data/lib/chef/solr_query/lucene.treetop +150 -0
- data/lib/chef/solr_query/lucene_nodes.rb +285 -0
- data/lib/chef/solr_query/query_transform.rb +65 -0
- data/lib/chef/solr_query/solr_http_request.rb +118 -0
- data/lib/chef/streaming_cookbook_uploader.rb +201 -0
- data/lib/chef/tasks/chef_repo.rake +256 -0
- data/lib/chef/util/file_edit.rb +122 -0
- data/lib/chef/util/windows.rb +56 -0
- data/lib/chef/util/windows/net_group.rb +101 -0
- data/lib/chef/util/windows/net_use.rb +121 -0
- data/lib/chef/util/windows/net_user.rb +198 -0
- data/lib/chef/util/windows/volume.rb +59 -0
- data/lib/chef/version.rb +23 -0
- data/lib/chef/version_class.rb +70 -0
- data/lib/chef/version_constraint.rb +116 -0
- data/lib/chef/webui_user.rb +231 -0
- metadata +600 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'chef/search/query'
|
|
20
|
+
require 'chef/data_bag'
|
|
21
|
+
require 'chef/data_bag_item'
|
|
22
|
+
|
|
23
|
+
class Chef
|
|
24
|
+
module Mixin
|
|
25
|
+
module Language
|
|
26
|
+
|
|
27
|
+
# Implementation class for determining platform dependent values
|
|
28
|
+
class PlatformDependentValue
|
|
29
|
+
|
|
30
|
+
# Create a platform dependent value object.
|
|
31
|
+
# === Arguments
|
|
32
|
+
# platform_hash (Hash) a hash of the same structure as Chef::Platform,
|
|
33
|
+
# like this:
|
|
34
|
+
# {
|
|
35
|
+
# :debian => {:default => 'the value for all debian'}
|
|
36
|
+
# [:centos, :redhat, :fedora] => {:default => "value for all EL variants"}
|
|
37
|
+
# :ubuntu => { :default => "default for ubuntu", '10.04' => "value for 10.04 only"},
|
|
38
|
+
# :default => "the default when nothing else matches"
|
|
39
|
+
# }
|
|
40
|
+
# * platforms can be specified as Symbols or Strings
|
|
41
|
+
# * multiple platforms can be grouped by using an Array as the key
|
|
42
|
+
# * values for platforms need to be Hashes of the form:
|
|
43
|
+
# {platform_version => value_for_that_version}
|
|
44
|
+
# * the exception to the above is the default value, which is given as
|
|
45
|
+
# :default => default_value
|
|
46
|
+
def initialize(platform_hash)
|
|
47
|
+
@values = {}
|
|
48
|
+
platform_hash.each { |platforms, value| set(platforms, value)}
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def value_for_node(node)
|
|
52
|
+
platform, version = node[:platform].to_s, node[:platform_version].to_s
|
|
53
|
+
if @values.key?(platform) && @values[platform].key?(version)
|
|
54
|
+
@values[platform][version]
|
|
55
|
+
elsif @values.key?(platform) && @values[platform].key?("default")
|
|
56
|
+
@values[platform]["default"]
|
|
57
|
+
elsif @values.key?("default")
|
|
58
|
+
@values["default"]
|
|
59
|
+
else
|
|
60
|
+
nil
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
private
|
|
65
|
+
|
|
66
|
+
def set(platforms, value)
|
|
67
|
+
if platforms.to_s == 'default'
|
|
68
|
+
@values["default"] = value
|
|
69
|
+
else
|
|
70
|
+
assert_valid_platform_values!(platforms, value)
|
|
71
|
+
Array(platforms).each { |platform| @values[platform.to_s] = format_values(value)}
|
|
72
|
+
value
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def format_values(hash)
|
|
77
|
+
formatted_array = flatten_one_level(hash.map { |key, value| [key.to_s, value]})
|
|
78
|
+
Hash[*formatted_array]
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def flatten_one_level(array)
|
|
82
|
+
array.inject([]) do |flatter_array, values|
|
|
83
|
+
Array(values).each {|value| flatter_array << value }
|
|
84
|
+
flatter_array
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def assert_valid_platform_values!(platforms, value)
|
|
90
|
+
unless value.kind_of?(Hash)
|
|
91
|
+
msg = "platform dependent values must be specified in the format :platform => {:version => value} "
|
|
92
|
+
msg << "you gave a value #{value.inspect} for platform(s) #{platforms}"
|
|
93
|
+
raise ArgumentError, msg
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Given a hash similar to the one we use for Platforms, select a value from the hash. Supports
|
|
99
|
+
# per platform defaults, along with a single base default. Arrays may be passed as hash keys and
|
|
100
|
+
# will be expanded.
|
|
101
|
+
#
|
|
102
|
+
# === Parameters
|
|
103
|
+
# platform_hash:: A platform-style hash.
|
|
104
|
+
#
|
|
105
|
+
# === Returns
|
|
106
|
+
# value:: Whatever the most specific value of the hash is.
|
|
107
|
+
def value_for_platform(platform_hash)
|
|
108
|
+
PlatformDependentValue.new(platform_hash).value_for_node(node)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Given a list of platforms, returns true if the current recipe is being run on a node with
|
|
112
|
+
# that platform, false otherwise.
|
|
113
|
+
#
|
|
114
|
+
# === Parameters
|
|
115
|
+
# args:: A list of platforms
|
|
116
|
+
#
|
|
117
|
+
# === Returns
|
|
118
|
+
# true:: If the current platform is in the list
|
|
119
|
+
# false:: If the current platform is not in the list
|
|
120
|
+
def platform?(*args)
|
|
121
|
+
has_platform = false
|
|
122
|
+
|
|
123
|
+
args.flatten.each do |platform|
|
|
124
|
+
has_platform = true if platform == node[:platform]
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
has_platform
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def search(*args, &block)
|
|
131
|
+
# If you pass a block, or have at least the start argument, do raw result parsing
|
|
132
|
+
#
|
|
133
|
+
# Otherwise, do the iteration for the end user
|
|
134
|
+
if Kernel.block_given? || args.length >= 4
|
|
135
|
+
Chef::Search::Query.new.search(*args, &block)
|
|
136
|
+
else
|
|
137
|
+
results = Array.new
|
|
138
|
+
Chef::Search::Query.new.search(*args) do |o|
|
|
139
|
+
results << o
|
|
140
|
+
end
|
|
141
|
+
results
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def data_bag(bag)
|
|
146
|
+
DataBag.validate_name!(bag)
|
|
147
|
+
rbag = DataBag.load(bag)
|
|
148
|
+
rbag.keys
|
|
149
|
+
rescue Exception
|
|
150
|
+
Log.error("Failed to list data bag items in data bag: #{bag.inspect}")
|
|
151
|
+
raise
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def data_bag_item(bag, item)
|
|
155
|
+
DataBag.validate_name!(bag)
|
|
156
|
+
DataBagItem.validate_id!(item)
|
|
157
|
+
DataBagItem.load(bag, item)
|
|
158
|
+
rescue Exception
|
|
159
|
+
Log.error("Failed to load data bag item: #{bag.inspect} #{item.inspect}")
|
|
160
|
+
raise
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2008, 2009 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'chef/log'
|
|
20
|
+
|
|
21
|
+
class Chef
|
|
22
|
+
module Mixin
|
|
23
|
+
module LanguageIncludeAttribute
|
|
24
|
+
|
|
25
|
+
# Loads the attribute file specified by the short name of the
|
|
26
|
+
# file, e.g., loads specified cookbook's
|
|
27
|
+
# "attributes/mailservers.rb"
|
|
28
|
+
# if passed
|
|
29
|
+
# "mailservers"
|
|
30
|
+
def include_attribute(*fully_qualified_attribute_short_filenames)
|
|
31
|
+
if self.kind_of?(Chef::Node)
|
|
32
|
+
node = self
|
|
33
|
+
else
|
|
34
|
+
node = @node
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
fully_qualified_attribute_short_filenames.flatten.each do |fully_qualified_attribute_short_filename|
|
|
38
|
+
if node.run_state[:seen_attributes].has_key?(fully_qualified_attribute_short_filename)
|
|
39
|
+
Chef::Log.debug("I am not loading attribute file #{fully_qualified_attribute_short_filename}, because I have already seen it.")
|
|
40
|
+
next
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
Chef::Log.debug("Loading Attribute #{fully_qualified_attribute_short_filename}")
|
|
44
|
+
node.run_state[:seen_attributes][fully_qualified_attribute_short_filename] = true
|
|
45
|
+
|
|
46
|
+
if amatch = fully_qualified_attribute_short_filename.match(/(.+?)::(.+)/)
|
|
47
|
+
cookbook_name = amatch[1].to_sym
|
|
48
|
+
node.load_attribute_by_short_filename(amatch[2], cookbook_name)
|
|
49
|
+
else
|
|
50
|
+
cookbook_name = fully_qualified_attribute_short_filename.to_sym
|
|
51
|
+
node.load_attribute_by_short_filename("default", cookbook_name)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
true
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2008, 2009 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'chef/log'
|
|
20
|
+
|
|
21
|
+
class Chef
|
|
22
|
+
module Mixin
|
|
23
|
+
module LanguageIncludeRecipe
|
|
24
|
+
|
|
25
|
+
def include_recipe(*recipe_names)
|
|
26
|
+
result_recipes = Array.new
|
|
27
|
+
recipe_names.flatten.each do |recipe_name|
|
|
28
|
+
if node.run_state[:seen_recipes].has_key?(recipe_name)
|
|
29
|
+
Chef::Log.debug("I am not loading #{recipe_name}, because I have already seen it.")
|
|
30
|
+
next
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
Chef::Log.debug("Loading Recipe #{recipe_name} via include_recipe")
|
|
34
|
+
node.run_state[:seen_recipes][recipe_name] = true
|
|
35
|
+
|
|
36
|
+
cookbook_name, recipe_short_name = Chef::Recipe.parse_recipe_name(recipe_name)
|
|
37
|
+
|
|
38
|
+
run_context = self.is_a?(Chef::RunContext) ? self : self.run_context
|
|
39
|
+
cookbook = run_context.cookbook_collection[cookbook_name]
|
|
40
|
+
result_recipes << cookbook.load_recipe(recipe_short_name, run_context)
|
|
41
|
+
end
|
|
42
|
+
result_recipes
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def require_recipe(*args)
|
|
46
|
+
include_recipe(*args)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
|
|
18
|
+
class Chef
|
|
19
|
+
|
|
20
|
+
module Mixin
|
|
21
|
+
module ParamsValidate
|
|
22
|
+
|
|
23
|
+
# Takes a hash of options, along with a map to validate them. Returns the original
|
|
24
|
+
# options hash, plus any changes that might have been made (through things like setting
|
|
25
|
+
# default values in the validation map)
|
|
26
|
+
#
|
|
27
|
+
# For example:
|
|
28
|
+
#
|
|
29
|
+
# validate({ :one => "neat" }, { :one => { :kind_of => String }})
|
|
30
|
+
#
|
|
31
|
+
# Would raise an exception if the value of :one above is not a kind_of? string. Valid
|
|
32
|
+
# map options are:
|
|
33
|
+
#
|
|
34
|
+
# :default:: Sets the default value for this parameter.
|
|
35
|
+
# :callbacks:: Takes a hash of Procs, which should return true if the argument is valid.
|
|
36
|
+
# The key will be inserted into the error message if the Proc does not return true:
|
|
37
|
+
# "Option #{key}'s value #{value} #{message}!"
|
|
38
|
+
# :kind_of:: Ensure that the value is a kind_of?(Whatever). If passed an array, it will ensure
|
|
39
|
+
# that the value is one of those types.
|
|
40
|
+
# :respond_to:: Ensure that the value has a given method. Takes one method name or an array of
|
|
41
|
+
# method names.
|
|
42
|
+
# :required:: Raise an exception if this parameter is missing. Valid values are true or false,
|
|
43
|
+
# by default, options are not required.
|
|
44
|
+
# :regex:: Match the value of the paramater against a regular expression.
|
|
45
|
+
# :equal_to:: Match the value of the paramater with ==. An array means it can be equal to any
|
|
46
|
+
# of the values.
|
|
47
|
+
def validate(opts, map)
|
|
48
|
+
#--
|
|
49
|
+
# validate works by taking the keys in the validation map, assuming it's a hash, and
|
|
50
|
+
# looking for _pv_:symbol as methods. Assuming it find them, it calls the right
|
|
51
|
+
# one.
|
|
52
|
+
#++
|
|
53
|
+
raise ArgumentError, "Options must be a hash" unless opts.kind_of?(Hash)
|
|
54
|
+
raise ArgumentError, "Validation Map must be a hash" unless map.kind_of?(Hash)
|
|
55
|
+
|
|
56
|
+
map.each do |key, validation|
|
|
57
|
+
unless key.kind_of?(Symbol) || key.kind_of?(String)
|
|
58
|
+
raise ArgumentError, "Validation map keys must be symbols or strings!"
|
|
59
|
+
end
|
|
60
|
+
case validation
|
|
61
|
+
when true
|
|
62
|
+
_pv_required(opts, key)
|
|
63
|
+
when false
|
|
64
|
+
true
|
|
65
|
+
when Hash
|
|
66
|
+
validation.each do |check, carg|
|
|
67
|
+
check_method = "_pv_#{check.to_s}"
|
|
68
|
+
if self.respond_to?(check_method, true)
|
|
69
|
+
self.send(check_method, opts, key, carg)
|
|
70
|
+
else
|
|
71
|
+
raise ArgumentError, "Validation map has unknown check: #{check}"
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
opts
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def set_or_return(symbol, arg, validation)
|
|
80
|
+
iv_symbol = "@#{symbol.to_s}".to_sym
|
|
81
|
+
map = {
|
|
82
|
+
symbol => validation
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if arg == nil && self.instance_variable_defined?(iv_symbol) == true
|
|
86
|
+
self.instance_variable_get(iv_symbol)
|
|
87
|
+
else
|
|
88
|
+
opts = validate({ symbol => arg }, { symbol => validation })
|
|
89
|
+
self.instance_variable_set(iv_symbol, opts[symbol])
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
private
|
|
94
|
+
|
|
95
|
+
# Return the value of a parameter, or nil if it doesn't exist.
|
|
96
|
+
def _pv_opts_lookup(opts, key)
|
|
97
|
+
if opts.has_key?(key.to_s)
|
|
98
|
+
opts[key.to_s]
|
|
99
|
+
elsif opts.has_key?(key.to_sym)
|
|
100
|
+
opts[key.to_sym]
|
|
101
|
+
else
|
|
102
|
+
nil
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Raise an exception if the parameter is not found.
|
|
107
|
+
def _pv_required(opts, key, is_required=true)
|
|
108
|
+
if is_required
|
|
109
|
+
if (opts.has_key?(key.to_s) && !opts[key.to_s].nil?) ||
|
|
110
|
+
(opts.has_key?(key.to_sym) && !opts[key.to_sym].nil?)
|
|
111
|
+
true
|
|
112
|
+
else
|
|
113
|
+
raise Exceptions::ValidationFailed, "Required argument #{key} is missing!"
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def _pv_equal_to(opts, key, to_be)
|
|
119
|
+
value = _pv_opts_lookup(opts, key)
|
|
120
|
+
unless value.nil?
|
|
121
|
+
passes = false
|
|
122
|
+
Array(to_be).each do |tb|
|
|
123
|
+
passes = true if value == tb
|
|
124
|
+
end
|
|
125
|
+
unless passes
|
|
126
|
+
raise Exceptions::ValidationFailed, "Option #{key} must be equal to one of: #{to_be.join(", ")}! You passed #{value.inspect}."
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Raise an exception if the parameter is not a kind_of?(to_be)
|
|
132
|
+
def _pv_kind_of(opts, key, to_be)
|
|
133
|
+
value = _pv_opts_lookup(opts, key)
|
|
134
|
+
unless value.nil?
|
|
135
|
+
passes = false
|
|
136
|
+
Array(to_be).each do |tb|
|
|
137
|
+
passes = true if value.kind_of?(tb)
|
|
138
|
+
end
|
|
139
|
+
unless passes
|
|
140
|
+
raise Exceptions::ValidationFailed, "Option #{key} must be a kind of #{to_be}! You passed #{value.inspect}."
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Raise an exception if the parameter does not respond to a given set of methods.
|
|
146
|
+
def _pv_respond_to(opts, key, method_name_list)
|
|
147
|
+
value = _pv_opts_lookup(opts, key)
|
|
148
|
+
unless value.nil?
|
|
149
|
+
Array(method_name_list).each do |method_name|
|
|
150
|
+
unless value.respond_to?(method_name)
|
|
151
|
+
raise Exceptions::ValidationFailed, "Option #{key} must have a #{method_name} method!"
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Assert that parameter returns false when passed a predicate method.
|
|
158
|
+
# For example, :cannot_be => :blank will raise a Exceptions::ValidationFailed
|
|
159
|
+
# error value.blank? returns a 'truthy' (not nil or false) value.
|
|
160
|
+
#
|
|
161
|
+
# Note, this will *PASS* if the object doesn't respond to the method.
|
|
162
|
+
# So, to make sure a value is not nil and not blank, you need to do
|
|
163
|
+
# both :cannot_be => :blank *and* :cannot_be => :nil (or :required => true)
|
|
164
|
+
def _pv_cannot_be(opts, key, predicate_method_base_name)
|
|
165
|
+
value = _pv_opts_lookup(opts, key)
|
|
166
|
+
predicate_method = (predicate_method_base_name.to_s + "?").to_sym
|
|
167
|
+
|
|
168
|
+
if value.respond_to?(predicate_method)
|
|
169
|
+
if value.send(predicate_method)
|
|
170
|
+
raise Exceptions::ValidationFailed, "Option #{key} cannot be #{predicate_method_base_name}"
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# Assign a default value to a parameter.
|
|
176
|
+
def _pv_default(opts, key, default_value)
|
|
177
|
+
value = _pv_opts_lookup(opts, key)
|
|
178
|
+
if value == nil
|
|
179
|
+
opts[key] = default_value
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
# Check a parameter against a regular expression.
|
|
184
|
+
def _pv_regex(opts, key, regex)
|
|
185
|
+
value = _pv_opts_lookup(opts, key)
|
|
186
|
+
if value != nil
|
|
187
|
+
passes = false
|
|
188
|
+
[ regex ].flatten.each do |r|
|
|
189
|
+
if value != nil
|
|
190
|
+
if r.match(value.to_s)
|
|
191
|
+
passes = true
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
unless passes
|
|
196
|
+
raise Exceptions::ValidationFailed, "Option #{key}'s value #{value} does not match regular expression #{regex.inspect}"
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
# Check a parameter against a hash of proc's.
|
|
202
|
+
def _pv_callbacks(opts, key, callbacks)
|
|
203
|
+
raise ArgumentError, "Callback list must be a hash!" unless callbacks.kind_of?(Hash)
|
|
204
|
+
value = _pv_opts_lookup(opts, key)
|
|
205
|
+
if value != nil
|
|
206
|
+
callbacks.each do |message, zeproc|
|
|
207
|
+
if zeproc.call(value) != true
|
|
208
|
+
raise Exceptions::ValidationFailed, "Option #{key}'s value #{value} #{message}!"
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
# Allow a parameter to default to @name
|
|
215
|
+
def _pv_name_attribute(opts, key, is_name_attribute=true)
|
|
216
|
+
if is_name_attribute
|
|
217
|
+
if opts[key] == nil
|
|
218
|
+
opts[key] = self.instance_variable_get("@name")
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
|