mbailey-chef 0.9.12.1

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.
Files changed (345) hide show
  1. data/LICENSE +201 -0
  2. data/README.rdoc +172 -0
  3. data/bin/chef-client +26 -0
  4. data/bin/chef-solo +25 -0
  5. data/bin/knife +26 -0
  6. data/bin/shef +34 -0
  7. data/distro/README +2 -0
  8. data/distro/common/man/man1/chef-indexer.1 +42 -0
  9. data/distro/common/man/man1/chef-server-webui.1 +106 -0
  10. data/distro/common/man/man1/chef-server.1 +107 -0
  11. data/distro/common/man/man1/chef-solr-indexer.1 +55 -0
  12. data/distro/common/man/man1/chef-solr.1 +55 -0
  13. data/distro/common/man/man8/chef-client.8 +63 -0
  14. data/distro/common/man/man8/chef-solo.8 +57 -0
  15. data/distro/common/man/man8/chef-solr-rebuild.8 +37 -0
  16. data/distro/common/man/man8/knife.8 +1349 -0
  17. data/distro/common/man/man8/shef.8 +45 -0
  18. data/distro/common/markdown/README +3 -0
  19. data/distro/common/markdown/knife.mkd +832 -0
  20. data/distro/debian/etc/default/chef-client +4 -0
  21. data/distro/debian/etc/default/chef-server +9 -0
  22. data/distro/debian/etc/default/chef-server-webui +9 -0
  23. data/distro/debian/etc/default/chef-solr +7 -0
  24. data/distro/debian/etc/default/chef-solr-indexer +7 -0
  25. data/distro/debian/etc/init/chef-client.conf +17 -0
  26. data/distro/debian/etc/init/chef-server-webui.conf +17 -0
  27. data/distro/debian/etc/init/chef-server.conf +17 -0
  28. data/distro/debian/etc/init/chef-solr-indexer.conf +17 -0
  29. data/distro/debian/etc/init/chef-solr.conf +17 -0
  30. data/distro/debian/etc/init.d/chef-client +175 -0
  31. data/distro/debian/etc/init.d/chef-server +122 -0
  32. data/distro/debian/etc/init.d/chef-server-webui +123 -0
  33. data/distro/debian/etc/init.d/chef-solr +177 -0
  34. data/distro/debian/etc/init.d/chef-solr-indexer +176 -0
  35. data/distro/redhat/etc/init.d/chef-client +106 -0
  36. data/distro/redhat/etc/init.d/chef-server +112 -0
  37. data/distro/redhat/etc/init.d/chef-server-webui +112 -0
  38. data/distro/redhat/etc/init.d/chef-solr +104 -0
  39. data/distro/redhat/etc/init.d/chef-solr-indexer +104 -0
  40. data/distro/redhat/etc/logrotate.d/chef-client +8 -0
  41. data/distro/redhat/etc/logrotate.d/chef-server +8 -0
  42. data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
  43. data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
  44. data/distro/redhat/etc/logrotate.d/chef-solr-indexer +8 -0
  45. data/distro/redhat/etc/sysconfig/chef-client +15 -0
  46. data/distro/redhat/etc/sysconfig/chef-server +14 -0
  47. data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
  48. data/distro/redhat/etc/sysconfig/chef-solr +8 -0
  49. data/distro/redhat/etc/sysconfig/chef-solr-indexer +7 -0
  50. data/lib/chef/api_client.rb +264 -0
  51. data/lib/chef/application/agent.rb +18 -0
  52. data/lib/chef/application/client.rb +246 -0
  53. data/lib/chef/application/knife.rb +171 -0
  54. data/lib/chef/application/solo.rb +215 -0
  55. data/lib/chef/application.rb +127 -0
  56. data/lib/chef/applications.rb +4 -0
  57. data/lib/chef/certificate.rb +194 -0
  58. data/lib/chef/checksum.rb +182 -0
  59. data/lib/chef/checksum_cache.rb +173 -0
  60. data/lib/chef/client.rb +304 -0
  61. data/lib/chef/config.rb +240 -0
  62. data/lib/chef/cookbook/cookbook_collection.rb +44 -0
  63. data/lib/chef/cookbook/file_system_file_vendor.rb +54 -0
  64. data/lib/chef/cookbook/file_vendor.rb +48 -0
  65. data/lib/chef/cookbook/metadata/version.rb +87 -0
  66. data/lib/chef/cookbook/metadata.rb +500 -0
  67. data/lib/chef/cookbook/remote_file_vendor.rb +87 -0
  68. data/lib/chef/cookbook/syntax_check.rb +136 -0
  69. data/lib/chef/cookbook_loader.rb +227 -0
  70. data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
  71. data/lib/chef/cookbook_uploader.rb +103 -0
  72. data/lib/chef/cookbook_version.rb +930 -0
  73. data/lib/chef/couchdb.rb +239 -0
  74. data/lib/chef/daemon.rb +172 -0
  75. data/lib/chef/data_bag.rb +215 -0
  76. data/lib/chef/data_bag_item.rb +228 -0
  77. data/lib/chef/exceptions.rb +66 -0
  78. data/lib/chef/file_access_control.rb +140 -0
  79. data/lib/chef/file_cache.rb +218 -0
  80. data/lib/chef/handler/json_file.rb +58 -0
  81. data/lib/chef/handler.rb +206 -0
  82. data/lib/chef/index_queue/amqp_client.rb +113 -0
  83. data/lib/chef/index_queue/consumer.rb +76 -0
  84. data/lib/chef/index_queue/indexable.rb +76 -0
  85. data/lib/chef/index_queue.rb +29 -0
  86. data/lib/chef/knife/bootstrap/archlinux-gems.erb +44 -0
  87. data/lib/chef/knife/bootstrap/centos5-gems.erb +41 -0
  88. data/lib/chef/knife/bootstrap/client-install.vbs +80 -0
  89. data/lib/chef/knife/bootstrap/fedora13-gems.erb +38 -0
  90. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +32 -0
  91. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +43 -0
  92. data/lib/chef/knife/bootstrap/windows-gems.erb +34 -0
  93. data/lib/chef/knife/bootstrap.rb +181 -0
  94. data/lib/chef/knife/client_bulk_delete.rb +40 -0
  95. data/lib/chef/knife/client_create.rb +70 -0
  96. data/lib/chef/knife/client_delete.rb +45 -0
  97. data/lib/chef/knife/client_edit.rb +45 -0
  98. data/lib/chef/knife/client_list.rb +40 -0
  99. data/lib/chef/knife/client_reregister.rb +56 -0
  100. data/lib/chef/knife/client_show.rb +50 -0
  101. data/lib/chef/knife/configure.rb +140 -0
  102. data/lib/chef/knife/configure_client.rb +52 -0
  103. data/lib/chef/knife/cookbook_bulk_delete.rb +58 -0
  104. data/lib/chef/knife/cookbook_create.rb +209 -0
  105. data/lib/chef/knife/cookbook_delete.rb +143 -0
  106. data/lib/chef/knife/cookbook_download.rb +130 -0
  107. data/lib/chef/knife/cookbook_list.rb +41 -0
  108. data/lib/chef/knife/cookbook_metadata.rb +82 -0
  109. data/lib/chef/knife/cookbook_metadata_from_file.rb +40 -0
  110. data/lib/chef/knife/cookbook_show.rb +98 -0
  111. data/lib/chef/knife/cookbook_site_download.rb +58 -0
  112. data/lib/chef/knife/cookbook_site_list.rb +56 -0
  113. data/lib/chef/knife/cookbook_site_search.rb +51 -0
  114. data/lib/chef/knife/cookbook_site_share.rb +109 -0
  115. data/lib/chef/knife/cookbook_site_show.rb +57 -0
  116. data/lib/chef/knife/cookbook_site_unshare.rb +52 -0
  117. data/lib/chef/knife/cookbook_site_vendor.rb +133 -0
  118. data/lib/chef/knife/cookbook_test.rb +82 -0
  119. data/lib/chef/knife/cookbook_upload.rb +95 -0
  120. data/lib/chef/knife/data_bag_create.rb +59 -0
  121. data/lib/chef/knife/data_bag_delete.rb +48 -0
  122. data/lib/chef/knife/data_bag_edit.rb +50 -0
  123. data/lib/chef/knife/data_bag_from_file.rb +44 -0
  124. data/lib/chef/knife/data_bag_list.rb +43 -0
  125. data/lib/chef/knife/data_bag_show.rb +41 -0
  126. data/lib/chef/knife/ec2_instance_data.rb +46 -0
  127. data/lib/chef/knife/ec2_server_create.rb +216 -0
  128. data/lib/chef/knife/ec2_server_delete.rb +90 -0
  129. data/lib/chef/knife/ec2_server_list.rb +88 -0
  130. data/lib/chef/knife/exec.rb +52 -0
  131. data/lib/chef/knife/index_rebuild.rb +51 -0
  132. data/lib/chef/knife/node_bulk_delete.rb +43 -0
  133. data/lib/chef/knife/node_create.rb +47 -0
  134. data/lib/chef/knife/node_delete.rb +44 -0
  135. data/lib/chef/knife/node_edit.rb +44 -0
  136. data/lib/chef/knife/node_from_file.rb +42 -0
  137. data/lib/chef/knife/node_list.rb +41 -0
  138. data/lib/chef/knife/node_run_list_add.rb +64 -0
  139. data/lib/chef/knife/node_run_list_remove.rb +45 -0
  140. data/lib/chef/knife/node_show.rb +54 -0
  141. data/lib/chef/knife/rackspace_server_create.rb +156 -0
  142. data/lib/chef/knife/rackspace_server_delete.rb +57 -0
  143. data/lib/chef/knife/rackspace_server_list.rb +59 -0
  144. data/lib/chef/knife/recipe_list.rb +32 -0
  145. data/lib/chef/knife/role_bulk_delete.rb +44 -0
  146. data/lib/chef/knife/role_create.rb +52 -0
  147. data/lib/chef/knife/role_delete.rb +44 -0
  148. data/lib/chef/knife/role_edit.rb +45 -0
  149. data/lib/chef/knife/role_from_file.rb +46 -0
  150. data/lib/chef/knife/role_list.rb +40 -0
  151. data/lib/chef/knife/role_show.rb +51 -0
  152. data/lib/chef/knife/search.rb +94 -0
  153. data/lib/chef/knife/slicehost_images_list.rb +53 -0
  154. data/lib/chef/knife/slicehost_server_create.rb +103 -0
  155. data/lib/chef/knife/slicehost_server_delete.rb +61 -0
  156. data/lib/chef/knife/slicehost_server_list.rb +64 -0
  157. data/lib/chef/knife/ssh.rb +328 -0
  158. data/lib/chef/knife/status.rb +87 -0
  159. data/lib/chef/knife/terremark_server_create.rb +152 -0
  160. data/lib/chef/knife/terremark_server_delete.rb +87 -0
  161. data/lib/chef/knife/terremark_server_list.rb +77 -0
  162. data/lib/chef/knife/windows_bootstrap.rb +154 -0
  163. data/lib/chef/knife.rb +522 -0
  164. data/lib/chef/log.rb +61 -0
  165. data/lib/chef/mixin/check_helper.rb +31 -0
  166. data/lib/chef/mixin/checksum.rb +32 -0
  167. data/lib/chef/mixin/command/unix.rb +215 -0
  168. data/lib/chef/mixin/command/windows.rb +72 -0
  169. data/lib/chef/mixin/command.rb +220 -0
  170. data/lib/chef/mixin/convert_to_class_name.rb +63 -0
  171. data/lib/chef/mixin/create_path.rb +56 -0
  172. data/lib/chef/mixin/deep_merge.rb +225 -0
  173. data/lib/chef/mixin/deprecation.rb +65 -0
  174. data/lib/chef/mixin/find_preferred_file.rb +92 -0
  175. data/lib/chef/mixin/from_file.rb +50 -0
  176. data/lib/chef/mixin/language.rb +156 -0
  177. data/lib/chef/mixin/language_include_attribute.rb +61 -0
  178. data/lib/chef/mixin/language_include_recipe.rb +52 -0
  179. data/lib/chef/mixin/params_validate.rb +225 -0
  180. data/lib/chef/mixin/recipe_definition_dsl_core.rb +81 -0
  181. data/lib/chef/mixin/shell_out.rb +38 -0
  182. data/lib/chef/mixin/template.rb +95 -0
  183. data/lib/chef/mixin/xml_escape.rb +140 -0
  184. data/lib/chef/mixins.rb +16 -0
  185. data/lib/chef/monkey_patches/dir.rb +36 -0
  186. data/lib/chef/monkey_patches/string.rb +28 -0
  187. data/lib/chef/monkey_patches/tempfile.rb +64 -0
  188. data/lib/chef/node/attribute.rb +465 -0
  189. data/lib/chef/node.rb +601 -0
  190. data/lib/chef/openid_registration.rb +187 -0
  191. data/lib/chef/platform.rb +371 -0
  192. data/lib/chef/provider/breakpoint.rb +36 -0
  193. data/lib/chef/provider/cookbook_file.rb +100 -0
  194. data/lib/chef/provider/cron/solaris.rb +195 -0
  195. data/lib/chef/provider/cron.rb +186 -0
  196. data/lib/chef/provider/deploy/revision.rb +73 -0
  197. data/lib/chef/provider/deploy/timestamped.rb +33 -0
  198. data/lib/chef/provider/deploy.rb +319 -0
  199. data/lib/chef/provider/directory.rb +72 -0
  200. data/lib/chef/provider/env/windows.rb +75 -0
  201. data/lib/chef/provider/env.rb +152 -0
  202. data/lib/chef/provider/erl_call.rb +72 -0
  203. data/lib/chef/provider/execute.rb +58 -0
  204. data/lib/chef/provider/file.rb +213 -0
  205. data/lib/chef/provider/git.rb +211 -0
  206. data/lib/chef/provider/group/dscl.rb +121 -0
  207. data/lib/chef/provider/group/gpasswd.rb +53 -0
  208. data/lib/chef/provider/group/groupadd.rb +78 -0
  209. data/lib/chef/provider/group/pw.rb +84 -0
  210. data/lib/chef/provider/group/usermod.rb +57 -0
  211. data/lib/chef/provider/group/windows.rb +79 -0
  212. data/lib/chef/provider/group.rb +133 -0
  213. data/lib/chef/provider/http_request.rb +122 -0
  214. data/lib/chef/provider/ifconfig.rb +132 -0
  215. data/lib/chef/provider/link.rb +161 -0
  216. data/lib/chef/provider/log.rb +54 -0
  217. data/lib/chef/provider/mdadm.rb +91 -0
  218. data/lib/chef/provider/mount/mount.rb +232 -0
  219. data/lib/chef/provider/mount/windows.rb +80 -0
  220. data/lib/chef/provider/mount.rb +117 -0
  221. data/lib/chef/provider/ohai.rb +41 -0
  222. data/lib/chef/provider/package/apt.rb +110 -0
  223. data/lib/chef/provider/package/dpkg.rb +112 -0
  224. data/lib/chef/provider/package/easy_install.rb +114 -0
  225. data/lib/chef/provider/package/freebsd.rb +123 -0
  226. data/lib/chef/provider/package/macports.rb +105 -0
  227. data/lib/chef/provider/package/pacman.rb +101 -0
  228. data/lib/chef/provider/package/portage.rb +124 -0
  229. data/lib/chef/provider/package/rpm.rb +101 -0
  230. data/lib/chef/provider/package/rubygems.rb +462 -0
  231. data/lib/chef/provider/package/solaris.rb +127 -0
  232. data/lib/chef/provider/package/yum-dump.py +128 -0
  233. data/lib/chef/provider/package/yum.rb +222 -0
  234. data/lib/chef/provider/package/zypper.rb +133 -0
  235. data/lib/chef/provider/package.rb +160 -0
  236. data/lib/chef/provider/remote_directory.rb +140 -0
  237. data/lib/chef/provider/remote_file.rb +120 -0
  238. data/lib/chef/provider/route.rb +195 -0
  239. data/lib/chef/provider/ruby_block.rb +33 -0
  240. data/lib/chef/provider/script.rb +55 -0
  241. data/lib/chef/provider/service/arch.rb +109 -0
  242. data/lib/chef/provider/service/debian.rb +105 -0
  243. data/lib/chef/provider/service/freebsd.rb +156 -0
  244. data/lib/chef/provider/service/gentoo.rb +54 -0
  245. data/lib/chef/provider/service/init.rb +71 -0
  246. data/lib/chef/provider/service/redhat.rb +60 -0
  247. data/lib/chef/provider/service/simple.rb +118 -0
  248. data/lib/chef/provider/service/solaris.rb +85 -0
  249. data/lib/chef/provider/service/upstart.rb +192 -0
  250. data/lib/chef/provider/service/windows.rb +129 -0
  251. data/lib/chef/provider/service.rb +128 -0
  252. data/lib/chef/provider/subversion.rb +159 -0
  253. data/lib/chef/provider/template.rb +105 -0
  254. data/lib/chef/provider/user/dscl.rb +280 -0
  255. data/lib/chef/provider/user/pw.rb +113 -0
  256. data/lib/chef/provider/user/useradd.rb +137 -0
  257. data/lib/chef/provider/user/windows.rb +124 -0
  258. data/lib/chef/provider/user.rb +187 -0
  259. data/lib/chef/provider.rb +124 -0
  260. data/lib/chef/providers.rb +91 -0
  261. data/lib/chef/recipe.rb +130 -0
  262. data/lib/chef/resource/apt_package.rb +34 -0
  263. data/lib/chef/resource/bash.rb +33 -0
  264. data/lib/chef/resource/breakpoint.rb +35 -0
  265. data/lib/chef/resource/cookbook_file.rb +45 -0
  266. data/lib/chef/resource/cron.rb +188 -0
  267. data/lib/chef/resource/csh.rb +33 -0
  268. data/lib/chef/resource/deploy.rb +371 -0
  269. data/lib/chef/resource/deploy_revision.rb +35 -0
  270. data/lib/chef/resource/directory.rb +76 -0
  271. data/lib/chef/resource/dpkg_package.rb +34 -0
  272. data/lib/chef/resource/easy_install_package.rb +41 -0
  273. data/lib/chef/resource/env.rb +58 -0
  274. data/lib/chef/resource/erl_call.rb +83 -0
  275. data/lib/chef/resource/execute.rb +127 -0
  276. data/lib/chef/resource/file.rb +92 -0
  277. data/lib/chef/resource/freebsd_package.rb +35 -0
  278. data/lib/chef/resource/gem_package.rb +49 -0
  279. data/lib/chef/resource/git.rb +36 -0
  280. data/lib/chef/resource/group.rb +70 -0
  281. data/lib/chef/resource/http_request.rb +61 -0
  282. data/lib/chef/resource/ifconfig.rb +134 -0
  283. data/lib/chef/resource/link.rb +78 -0
  284. data/lib/chef/resource/log.rb +62 -0
  285. data/lib/chef/resource/macports_package.rb +29 -0
  286. data/lib/chef/resource/mdadm.rb +82 -0
  287. data/lib/chef/resource/mount.rb +135 -0
  288. data/lib/chef/resource/ohai.rb +40 -0
  289. data/lib/chef/resource/package.rb +80 -0
  290. data/lib/chef/resource/pacman_package.rb +33 -0
  291. data/lib/chef/resource/perl.rb +33 -0
  292. data/lib/chef/resource/portage_package.rb +33 -0
  293. data/lib/chef/resource/python.rb +33 -0
  294. data/lib/chef/resource/remote_directory.rb +109 -0
  295. data/lib/chef/resource/remote_file.rb +83 -0
  296. data/lib/chef/resource/route.rb +135 -0
  297. data/lib/chef/resource/rpm_package.rb +34 -0
  298. data/lib/chef/resource/ruby.rb +33 -0
  299. data/lib/chef/resource/ruby_block.rb +40 -0
  300. data/lib/chef/resource/scm.rb +146 -0
  301. data/lib/chef/resource/script.rb +60 -0
  302. data/lib/chef/resource/service.rb +160 -0
  303. data/lib/chef/resource/solaris_package.rb +36 -0
  304. data/lib/chef/resource/subversion.rb +36 -0
  305. data/lib/chef/resource/template.rb +69 -0
  306. data/lib/chef/resource/timestamped_deploy.rb +31 -0
  307. data/lib/chef/resource/user.rb +130 -0
  308. data/lib/chef/resource/yum_package.rb +43 -0
  309. data/lib/chef/resource.rb +523 -0
  310. data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
  311. data/lib/chef/resource_collection.rb +217 -0
  312. data/lib/chef/resource_definition.rb +67 -0
  313. data/lib/chef/resource_definition_list.rb +38 -0
  314. data/lib/chef/resources.rb +64 -0
  315. data/lib/chef/rest/auth_credentials.rb +78 -0
  316. data/lib/chef/rest/cookie_jar.rb +31 -0
  317. data/lib/chef/rest/rest_request.rb +188 -0
  318. data/lib/chef/rest.rb +394 -0
  319. data/lib/chef/role.rb +287 -0
  320. data/lib/chef/run_context.rb +110 -0
  321. data/lib/chef/run_list/run_list_expansion.rb +172 -0
  322. data/lib/chef/run_list/run_list_item.rb +78 -0
  323. data/lib/chef/run_list.rb +150 -0
  324. data/lib/chef/run_status.rb +121 -0
  325. data/lib/chef/runner.rb +107 -0
  326. data/lib/chef/sandbox.rb +153 -0
  327. data/lib/chef/search/query.rb +60 -0
  328. data/lib/chef/shef/ext.rb +568 -0
  329. data/lib/chef/shef/model_wrapper.rb +120 -0
  330. data/lib/chef/shef/shef_rest.rb +28 -0
  331. data/lib/chef/shef/shef_session.rb +271 -0
  332. data/lib/chef/shef.rb +325 -0
  333. data/lib/chef/shell_out.rb +413 -0
  334. data/lib/chef/streaming_cookbook_uploader.rb +201 -0
  335. data/lib/chef/tasks/chef_repo.rake +256 -0
  336. data/lib/chef/util/file_edit.rb +122 -0
  337. data/lib/chef/util/windows/net_group.rb +101 -0
  338. data/lib/chef/util/windows/net_use.rb +121 -0
  339. data/lib/chef/util/windows/net_user.rb +198 -0
  340. data/lib/chef/util/windows/volume.rb +59 -0
  341. data/lib/chef/util/windows.rb +56 -0
  342. data/lib/chef/version.rb +21 -0
  343. data/lib/chef/webui_user.rb +231 -0
  344. data/lib/chef.rb +39 -0
  345. metadata +533 -0
@@ -0,0 +1,44 @@
1
+ #--
2
+ # Author:: Tim Hinderliter (<tim@opscode.com>)
3
+ # Author:: Christopher Walters (<cw@opscode.com>)
4
+ # Copyright:: Copyright (c) 2010 Opscode, Inc.
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ require 'extlib'
21
+
22
+ class Chef
23
+ # == Chef::CookbookCollection
24
+ # This class is the consistent interface for a node to obtain its
25
+ # cookbooks by name.
26
+ #
27
+ # This class is basically a glorified Hash, but since there are
28
+ # several ways this cookbook information is collected,
29
+ # (e.g. CookbookLoader for solo, hash of auto-vivified Cookbook
30
+ # objects for lazily-loaded remote cookbooks), it gets transformed
31
+ # into this.
32
+ class CookbookCollection < Mash
33
+
34
+ # The input is a mapping of cookbook name to CookbookVersion objects. We
35
+ # simply extract them
36
+ def initialize(cookbook_versions={})
37
+ super() do |hash, key|
38
+ raise Chef::Exceptions::CookbookNotFound, "Cookbook #{key} not found"
39
+ end
40
+ cookbook_versions.each{ |cookbook_name, cookbook_version| self[cookbook_name] = cookbook_version }
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,54 @@
1
+ #--
2
+ # Author:: Christopher Walters (<cw@opscode.com>)
3
+ # Author:: Tim Hinderliter (<tim@opscode.com>)
4
+ # Copyright:: Copyright (c) 2010 Opscode, Inc.
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ require 'chef/cookbook/file_vendor'
21
+
22
+ class Chef
23
+ class Cookbook
24
+ # == Chef::Cookbook::FileSystemFileVendor
25
+ # This FileVendor loads files from Chef::Config.cookbook_path. The
26
+ # thing that's sort of janky about this FileVendor implementation is
27
+ # that it basically takes only the cookbook's name from the manifest
28
+ # and throws the rest away then re-builds the list of files on the
29
+ # disk. This is due to the manifest not having the on-disk file
30
+ # locations, since in the chef-client case, that information is
31
+ # non-sensical.
32
+ class FileSystemFileVendor < FileVendor
33
+
34
+ def initialize(manifest)
35
+ @cookbook_name = manifest[:cookbook_name]
36
+ end
37
+
38
+ # Implements abstract base's requirement. It looks in the
39
+ # Chef::Config.cookbook_path file hierarchy for the requested
40
+ # file.
41
+ def get_filename(filename)
42
+ location = Array(Chef::Config.cookbook_path).inject(nil) do |memo, basepath|
43
+ candidate_location = File.join(basepath, @cookbook_name, filename)
44
+ memo = candidate_location if File.exist?(candidate_location)
45
+ memo
46
+ end
47
+ raise "File #{filename} does not exist for cookbook #{@cookbook_name}" unless location
48
+
49
+ location
50
+ end
51
+
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,48 @@
1
+ #
2
+ # Author:: Christopher Walters (<cw@opscode.com>)
3
+ # Author:: Tim Hinderliter (<tim@opscode.com>)
4
+ # Copyright:: Copyright (c) 2010 Opscode, Inc.
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+
21
+ class Chef
22
+ class Cookbook
23
+ # == Chef::Cookbook::FileVendor
24
+ # This class handles fetching of cookbook files based on specificity.
25
+ class FileVendor
26
+
27
+ def self.on_create(&block)
28
+ @instance_creator = block
29
+ end
30
+
31
+ # Factory method that creates the appropriate kind of
32
+ # Cookbook::FileVendor to serve the contents of the manifest
33
+ def self.create_from_manifest(manifest)
34
+ raise "Must call Chef::Cookbook::FileVendor.on_create before calling create_from_manifest factory" unless defined?(@instance_creator)
35
+ @instance_creator.call(manifest)
36
+ end
37
+
38
+ # Gets the on-disk location for the given cookbook file.
39
+ #
40
+ # Subclasses are responsible for determining exactly how the
41
+ # files are obtained and where they are stored.
42
+ def get_filename(filename)
43
+ raise NotImplemented, "Subclasses must implement this method"
44
+ end
45
+
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,87 @@
1
+ #
2
+ # Author:: AJ Christensen (<aj@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/cookbook_version'
20
+ require 'chef/cookbook/metadata'
21
+
22
+ class Chef::Cookbook::Metadata
23
+ class Version
24
+ include Comparable
25
+
26
+ attr_accessor :major,
27
+ :minor,
28
+ :patch
29
+
30
+ def initialize(str="")
31
+ @major, @minor, @patch = _parse(str)
32
+ end
33
+
34
+ def _parse(str="")
35
+ @major, @minor, @patch = case str.to_s
36
+ when /^(\d+)\.(\d+)\.(\d+)$/
37
+ [ $1.to_i, $2.to_i, $3.to_i ]
38
+ when /^(\d+)\.(\d+)$/
39
+ [ $1.to_i, $2.to_i, 0 ]
40
+ else
41
+ raise "Metadata version '#{str.to_s}' does not match 'x.y.z' or 'x.y'"
42
+ end
43
+ end
44
+
45
+ def inspect
46
+ "#{@major}.#{@minor}.#{@patch}"
47
+ end
48
+
49
+ def to_s
50
+ "#{@major}.#{@minor}.#{@patch}"
51
+ end
52
+
53
+ def <=>(v)
54
+ major, minor, patch = (
55
+ [ :major, :minor, :patch ].collect do |method|
56
+ self.send(method) <=> v.send(method)
57
+ end
58
+ )
59
+
60
+ Chef::Log.debug "(#{self.to_s}/#{v.to_s}) major,minor,patch: #{[major,minor,patch].join(',')}"
61
+
62
+ # all these returns feels like C, surely there is a better way!
63
+
64
+ if major == 0 && minor == 0 && patch == 0
65
+ comp = 0
66
+ end
67
+
68
+ if major == 1
69
+ comp = 1
70
+ end
71
+
72
+ if major == 0 && minor == 1 && patch == -1
73
+ comp = 1
74
+ end
75
+
76
+ if minor == 1 && major == 0 && patch == 0
77
+ comp = 1
78
+ end
79
+
80
+ if patch == 1 && major == 0 && minor == 0
81
+ comp = 1
82
+ end
83
+
84
+ return (comp || -1)
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,500 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: AJ Christensen (<aj@opscode.com>)
4
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ require 'chef/mixin/from_file'
21
+ require 'chef/mixin/params_validate'
22
+ require 'chef/mixin/check_helper'
23
+ require 'chef/log'
24
+ require 'chef/cookbook/metadata/version'
25
+
26
+ class Chef
27
+ class Cookbook
28
+ # == Chef::Cookbook::Metadata
29
+ # Chef::Cookbook::Metadata provides a convenient DSL for declaring metadata
30
+ # about Chef Cookbooks.
31
+ class Metadata
32
+
33
+ COMPARISON_FIELDS = [ :name, :description, :long_description, :maintainer,
34
+ :maintainer_email, :license, :platforms, :dependencies,
35
+ :recommendations, :suggestions, :conflicting, :providing,
36
+ :replacing, :attributes, :groupings, :recipes, :version]
37
+
38
+ include Chef::Mixin::CheckHelper
39
+ include Chef::Mixin::ParamsValidate
40
+ include Chef::Mixin::FromFile
41
+
42
+ attr_reader :cookbook,
43
+ :platforms,
44
+ :dependencies,
45
+ :recommendations,
46
+ :suggestions,
47
+ :conflicting,
48
+ :providing,
49
+ :replacing,
50
+ :attributes,
51
+ :groupings,
52
+ :recipes,
53
+ :version
54
+
55
+ # Builds a new Chef::Cookbook::Metadata object.
56
+ #
57
+ # === Parameters
58
+ # cookbook<String>:: An optional cookbook object
59
+ # maintainer<String>:: An optional maintainer
60
+ # maintainer_email<String>:: An optional maintainer email
61
+ # license<String>::An optional license. Default is Apache v2.0
62
+ #
63
+ # === Returns
64
+ # metadata<Chef::Cookbook::Metadata>
65
+ def initialize(cookbook=nil, maintainer='Your Name', maintainer_email='youremail@example.com', license='Apache v2.0')
66
+ @cookbook = cookbook
67
+ @name = cookbook ? cookbook.name : ""
68
+ @long_description = ""
69
+ self.maintainer(maintainer)
70
+ self.maintainer_email(maintainer_email)
71
+ self.license(license)
72
+ self.description('A fabulous new cookbook')
73
+ @platforms = Mash.new
74
+ @dependencies = Mash.new
75
+ @recommendations = Mash.new
76
+ @suggestions = Mash.new
77
+ @conflicting = Mash.new
78
+ @providing = Mash.new
79
+ @replacing = Mash.new
80
+ @attributes = Mash.new
81
+ @groupings = Mash.new
82
+ @recipes = Mash.new
83
+ @version = Version.new "0.0.0"
84
+ if cookbook
85
+ @recipes = cookbook.fully_qualified_recipe_names.inject({}) do |r, e|
86
+ e = self.name if e =~ /::default$/
87
+ r[e] = ""
88
+ self.provides e
89
+ r
90
+ end
91
+ end
92
+ end
93
+
94
+ def ==(other)
95
+ COMPARISON_FIELDS.inject(true) do |equal_so_far, field|
96
+ equal_so_far && other.respond_to?(field) && (other.send(field) == send(field))
97
+ end
98
+ end
99
+
100
+ # Sets the cookbooks maintainer, or returns it.
101
+ #
102
+ # === Parameters
103
+ # maintainer<String>:: The maintainers name
104
+ #
105
+ # === Returns
106
+ # maintainer<String>:: Returns the current maintainer.
107
+ def maintainer(arg=nil)
108
+ set_or_return(
109
+ :maintainer,
110
+ arg,
111
+ :kind_of => [ String ]
112
+ )
113
+ end
114
+
115
+ # Sets the maintainers email address, or returns it.
116
+ #
117
+ # === Parameters
118
+ # maintainer_email<String>:: The maintainers email address
119
+ #
120
+ # === Returns
121
+ # maintainer_email<String>:: Returns the current maintainer email.
122
+ def maintainer_email(arg=nil)
123
+ set_or_return(
124
+ :maintainer_email,
125
+ arg,
126
+ :kind_of => [ String ]
127
+ )
128
+ end
129
+
130
+ # Sets the current license, or returns it.
131
+ #
132
+ # === Parameters
133
+ # license<String>:: The current license.
134
+ #
135
+ # === Returns
136
+ # license<String>:: Returns the current license
137
+ def license(arg=nil)
138
+ set_or_return(
139
+ :license,
140
+ arg,
141
+ :kind_of => [ String ]
142
+ )
143
+ end
144
+
145
+ # Sets the current description, or returns it. Should be short - one line only!
146
+ #
147
+ # === Parameters
148
+ # description<String>:: The new description
149
+ #
150
+ # === Returns
151
+ # description<String>:: Returns the description
152
+ def description(arg=nil)
153
+ set_or_return(
154
+ :description,
155
+ arg,
156
+ :kind_of => [ String ]
157
+ )
158
+ end
159
+
160
+ # Sets the current long description, or returns it. Might come from a README, say.
161
+ #
162
+ # === Parameters
163
+ # long_description<String>:: The new long description
164
+ #
165
+ # === Returns
166
+ # long_description<String>:: Returns the long description
167
+ def long_description(arg=nil)
168
+ set_or_return(
169
+ :long_description,
170
+ arg,
171
+ :kind_of => [ String ]
172
+ )
173
+ end
174
+
175
+ # Sets the current cookbook version, or returns it. Can be two or three digits, seperated
176
+ # by dots. ie: '2.1', '1.5.4' or '0.9'.
177
+ #
178
+ # === Parameters
179
+ # version<String>:: The curent version, as a string
180
+ #
181
+ # === Returns
182
+ # version<String>:: Returns the current version
183
+ def version(arg=nil)
184
+ if arg
185
+ @version = Version.new(arg)
186
+ end
187
+
188
+ @version.to_s
189
+ end
190
+
191
+ # Sets the name of the cookbook, or returns it.
192
+ #
193
+ # === Parameters
194
+ # name<String>:: The curent cookbook name.
195
+ #
196
+ # === Returns
197
+ # name<String>:: Returns the current cookbook name.
198
+ def name(arg=nil)
199
+ set_or_return(
200
+ :name,
201
+ arg,
202
+ :kind_of => [ String ]
203
+ )
204
+ end
205
+
206
+ # Adds a supported platform, with version checking strings.
207
+ #
208
+ # === Parameters
209
+ # platform<String>,<Symbol>:: The platform (like :ubuntu or :mac_os_x)
210
+ # *versions<String>:: A list of versions matching << <= = >= >> followed by a version.
211
+ #
212
+ # === Returns
213
+ # versions<Array>:: Returns the list of versions for the platform
214
+ def supports(platform, *versions)
215
+ versions.each { |v| _check_version_expression(v) }
216
+ @platforms[platform] = versions
217
+ @platforms[platform]
218
+ end
219
+
220
+ # Adds a dependency on another cookbook, with version checking strings.
221
+ #
222
+ # === Parameters
223
+ # cookbook<String>:: The cookbook
224
+ # *versions<String>:: A list of versions matching << <= = >= >> followed by a version.
225
+ #
226
+ # === Returns
227
+ # versions<Array>:: Returns the list of versions for the platform
228
+ def depends(cookbook, *versions)
229
+ versions.each { |v| _check_version_expression(v) }
230
+ @dependencies[cookbook] = versions
231
+ @dependencies[cookbook]
232
+ end
233
+
234
+ # Adds a recommendation for another cookbook, with version checking strings.
235
+ #
236
+ # === Parameters
237
+ # cookbook<String>:: The cookbook
238
+ # *versions<String>:: A list of versions matching << <= = >= >> followed by a version.
239
+ #
240
+ # === Returns
241
+ # versions<Array>:: Returns the list of versions for the platform
242
+ def recommends(cookbook, *versions)
243
+ versions.each { |v| _check_version_expression(v) }
244
+ @recommendations[cookbook] = versions
245
+ @recommendations[cookbook]
246
+ end
247
+
248
+ # Adds a suggestion for another cookbook, with version checking strings.
249
+ #
250
+ # === Parameters
251
+ # cookbook<String>:: The cookbook
252
+ # *versions<String>:: A list of versions matching << <= = >= >> followed by a version.
253
+ #
254
+ # === Returns
255
+ # versions<Array>:: Returns the list of versions for the platform
256
+ def suggests(cookbook, *versions)
257
+ versions.each { |v| _check_version_expression(v) }
258
+ @suggestions[cookbook] = versions
259
+ @suggestions[cookbook]
260
+ end
261
+
262
+ # Adds a conflict for another cookbook, with version checking strings.
263
+ #
264
+ # === Parameters
265
+ # cookbook<String>:: The cookbook
266
+ # *versions<String>:: A list of versions matching << <= = >= >> followed by a version.
267
+ #
268
+ # === Returns
269
+ # versions<Array>:: Returns the list of versions for the platform
270
+ def conflicts(cookbook, *versions)
271
+ versions.each { |v| _check_version_expression(v) }
272
+ @conflicting[cookbook] = versions
273
+ @conflicting[cookbook]
274
+ end
275
+
276
+ # Adds a recipe, definition, or resource provided by this cookbook.
277
+ #
278
+ # Recipes are specified as normal
279
+ # Definitions are followed by (), and can include :params for prototyping
280
+ # Resources are the stringified version (service[apache2])
281
+ #
282
+ # === Parameters
283
+ # recipe, definition, resource<String>:: The thing we provide
284
+ # *versions<String>:: A list of versions matching << <= = >= >> followed by a version.
285
+ #
286
+ # === Returns
287
+ # versions<Array>:: Returns the list of versions for the platform
288
+ def provides(cookbook, *versions)
289
+ versions.each { |v| _check_version_expression(v) }
290
+ @providing[cookbook] = versions
291
+ @providing[cookbook]
292
+ end
293
+
294
+ # Adds a cookbook that is replaced by this one, with version checking strings.
295
+ #
296
+ # === Parameters
297
+ # cookbook<String>:: The cookbook we replace
298
+ # *versions<String>:: A list of versions matching << <= = >= >> followed by a version.
299
+ #
300
+ # === Returns
301
+ # versions<Array>:: Returns the list of versions for the platform
302
+ def replaces(cookbook, *versions)
303
+ versions.each { |v| _check_version_expression(v) }
304
+ @replacing[cookbook] = versions
305
+ @replacing[cookbook]
306
+ end
307
+
308
+ # Adds a description for a recipe.
309
+ #
310
+ # === Parameters
311
+ # recipe<String>:: The recipe
312
+ # description<String>:: The description of the recipe
313
+ #
314
+ # === Returns
315
+ # description<String>:: Returns the current description
316
+ def recipe(name, description)
317
+ @recipes[name] = description
318
+ end
319
+
320
+ # Adds an attribute that a user needs to configure for this cookbook. Takes
321
+ # a name (with the / notation for a nested attribute), followed by any of
322
+ # these options
323
+ #
324
+ # display_name<String>:: What a UI should show for this attribute
325
+ # description<String>:: A hint as to what this attr is for
326
+ # choice<Array>:: An array of choices to present to the user.
327
+ # calculated<Boolean>:: If true, the default value is calculated by the recipe and cannot be displayed.
328
+ # type<String>:: "string" or "array" - default is "string" ("hash" is supported for backwards compatibility)
329
+ # required<String>:: Whether this attr is 'required', 'recommended' or 'optional' - default 'optional' (true/false values also supported for backwards compatibility)
330
+ # recipes<Array>:: An array of recipes which need this attr set.
331
+ # default<String>,<Array>,<Hash>:: The default value
332
+ #
333
+ # === Parameters
334
+ # name<String>:: The name of the attribute ('foo', or 'apache2/log_dir')
335
+ # options<Hash>:: The description of the options
336
+ #
337
+ # === Returns
338
+ # options<Hash>:: Returns the current options hash
339
+ def attribute(name, options)
340
+ validate(
341
+ options,
342
+ {
343
+ :display_name => { :kind_of => String },
344
+ :description => { :kind_of => String },
345
+ :choice => { :kind_of => [ Array ], :default => [] },
346
+ :calculated => { :equal_to => [ true, false ], :default => false },
347
+ :type => { :equal_to => [ "string", "array", "hash", "symbol" ], :default => "string" },
348
+ :required => { :equal_to => [ "required", "recommended", "optional", true, false ], :default => "optional" },
349
+ :recipes => { :kind_of => [ Array ], :default => [] },
350
+ :default => { :kind_of => [ String, Array, Hash ] }
351
+ }
352
+ )
353
+ options[:required] = remap_required_attribute(options[:required]) unless options[:required].nil?
354
+ validate_string_array(options[:choice])
355
+ validate_calculated_default_rule(options)
356
+ validate_choice_default_rule(options)
357
+
358
+ @attributes[name] = options
359
+ @attributes[name]
360
+ end
361
+
362
+ def grouping(name, options)
363
+ validate(
364
+ options,
365
+ {
366
+ :title => { :kind_of => String },
367
+ :description => { :kind_of => String }
368
+ }
369
+ )
370
+ @groupings[name] = options
371
+ @groupings[name]
372
+ end
373
+
374
+ def _check_version_expression(version_string)
375
+ if version_string =~ /^(>>|>=|=|<=|<<) (.+)$/
376
+ [ $1, $2 ]
377
+ else
378
+ raise ArgumentError, "Version expression #{version_string} is invalid!"
379
+ end
380
+ end
381
+
382
+ def to_json(*a)
383
+ result = {
384
+ :name => self.name,
385
+ :description => self.description,
386
+ :long_description => self.long_description,
387
+ :maintainer => self.maintainer,
388
+ :maintainer_email => self.maintainer_email,
389
+ :license => self.license,
390
+ :platforms => self.platforms,
391
+ :dependencies => self.dependencies,
392
+ :recommendations => self.recommendations,
393
+ :suggestions => self.suggestions,
394
+ :conflicting => self.conflicting,
395
+ :providing => self.providing,
396
+ :replacing => self.replacing,
397
+ :attributes => self.attributes,
398
+ :groupings => self.groupings,
399
+ :recipes => self.recipes,
400
+ :version => self.version
401
+ }
402
+ result.to_json(*a)
403
+ end
404
+
405
+ def self.from_hash(o)
406
+ cm = self.new()
407
+ cm.from_hash(o)
408
+ cm
409
+ end
410
+
411
+ def from_hash(o)
412
+ @name = o['name'] if o.has_key?('name')
413
+ @description = o['description'] if o.has_key?('description')
414
+ @long_description = o['long_description'] if o.has_key?('long_description')
415
+ @maintainer = o['maintainer'] if o.has_key?('maintainer')
416
+ @maintainer_email = o['maintainer_email'] if o.has_key?('maintainer_email')
417
+ @license = o['license'] if o.has_key?('license')
418
+ @platforms = o['platforms'] if o.has_key?('platforms')
419
+ @dependencies = o['dependencies'] if o.has_key?('dependencies')
420
+ @recommendations = o['recommendations'] if o.has_key?('recommendations')
421
+ @suggestions = o['suggestions'] if o.has_key?('suggestions')
422
+ @conflicting = o['conflicting'] if o.has_key?('conflicting')
423
+ @providing = o['providing'] if o.has_key?('providing')
424
+ @replacing = o['replacing'] if o.has_key?('replacing')
425
+ @attributes = o['attributes'] if o.has_key?('attributes')
426
+ @groupings = o['groupings'] if o.has_key?('groupings')
427
+ @recipes = o['recipes'] if o.has_key?('recipes')
428
+ @version = o['version'] if o.has_key?('version')
429
+ self
430
+ end
431
+
432
+ def self.from_json(string)
433
+ o = JSON.parse(string)
434
+ self.from_hash(o)
435
+ end
436
+
437
+ def from_json(string)
438
+ o = JSON.parse(string)
439
+ from_hash(o)
440
+ end
441
+
442
+ private
443
+
444
+ # Verify that the given array is an array of strings
445
+ #
446
+ # Raise an exception if the members of the array are not Strings
447
+ #
448
+ # === Parameters
449
+ # arry<Array>:: An array to be validated
450
+ def validate_string_array(arry)
451
+ if arry.kind_of?(Array)
452
+ arry.each do |choice|
453
+ validate( {:choice => choice}, {:choice => {:kind_of => String}} )
454
+ end
455
+ end
456
+ end
457
+
458
+ # For backwards compatibility, remap Boolean values to String
459
+ # true is mapped to "required"
460
+ # false is mapped to "optional"
461
+ #
462
+ # === Parameters
463
+ # required_attr<String><Boolean>:: The value of options[:required]
464
+ #
465
+ # === Returns
466
+ # required_attr<String>:: "required", "recommended", or "optional"
467
+ def remap_required_attribute(value)
468
+ case value
469
+ when true
470
+ value = "required"
471
+ when false
472
+ value = "optional"
473
+ end
474
+ value
475
+ end
476
+
477
+ def validate_calculated_default_rule(options)
478
+ calculated_conflict = ((options[:default].is_a?(Array) && !options[:default].empty?) ||
479
+ (options[:default].is_a?(String) && !options[:default] != "")) &&
480
+ options[:calculated] == true
481
+ raise ArgumentError, "Default cannot be specified if calculated is true!" if calculated_conflict
482
+ end
483
+
484
+ def validate_choice_default_rule(options)
485
+ return if !options[:choice].is_a?(Array) || options[:choice].empty?
486
+
487
+ if options[:default].is_a?(String) && options[:default] != ""
488
+ raise ArgumentError, "Default must be one of your choice values!" if options[:choice].index(options[:default]) == nil
489
+ end
490
+
491
+ if options[:default].is_a?(Array) && !options[:default].empty?
492
+ options[:default].each do |val|
493
+ raise ArgumentError, "Default values must be a subset of your choice values!" if options[:choice].index(val) == nil
494
+ end
495
+ end
496
+ end
497
+
498
+ end
499
+ end
500
+ end