chef-server-webui 0.9.18 → 0.10.0.beta.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/README.rdoc +0 -4
  2. data/Rakefile +10 -0
  3. data/app/controllers/application.rb +34 -6
  4. data/app/controllers/cookbooks.rb +125 -35
  5. data/app/controllers/environments.rb +235 -0
  6. data/app/controllers/nodes.rb +26 -19
  7. data/app/controllers/roles.rb +37 -44
  8. data/app/controllers/search.rb +13 -13
  9. data/app/helpers/application_helper.rb +34 -0
  10. data/app/views/cookbooks/_cookbook_content.html.haml +7 -0
  11. data/app/views/cookbooks/index.html.haml +22 -7
  12. data/app/views/cookbooks/show.html.haml +8 -50
  13. data/app/views/environments/_form.html.erb +91 -0
  14. data/app/views/environments/_navigation.html.haml +9 -0
  15. data/app/views/environments/_version_selector.html.erb +8 -0
  16. data/app/views/environments/edit.html.erb +17 -0
  17. data/app/views/environments/index.html.haml +26 -0
  18. data/app/views/environments/new.html.erb +17 -0
  19. data/app/views/environments/show.html.haml +31 -0
  20. data/app/views/layout/application.html.haml +22 -13
  21. data/app/views/layout/login.html.haml +2 -2
  22. data/app/views/nodes/_form.html.erb +69 -0
  23. data/app/views/nodes/index.html.haml +6 -2
  24. data/app/views/nodes/show.html.haml +4 -1
  25. data/app/views/roles/_form.html.erb +92 -0
  26. data/app/views/roles/_run_lists.html.erb +26 -0
  27. data/app/views/roles/edit.html.haml +1 -1
  28. data/app/views/roles/new.html.haml +1 -1
  29. data/app/views/roles/show.html.haml +10 -7
  30. data/app/views/status/index.html.haml +2 -1
  31. data/bin/chef-server-webui +1 -0
  32. data/config/router.rb +14 -8
  33. data/lib/chef-server-webui/version.rb +1 -1
  34. data/public/javascripts/chef.js +206 -49
  35. data/public/javascripts/cookbook_constraint_ctrl.js +191 -0
  36. data/public/javascripts/cookbook_versions.js +75 -0
  37. data/public/javascripts/jquery-1.4.4.min.js +167 -0
  38. data/public/javascripts/jquery.suggest.js +250 -0
  39. data/public/stylesheets/base.css +30 -24
  40. data/public/stylesheets/chef.css +212 -45
  41. data/public/stylesheets/jquery.suggest.css +28 -0
  42. data/public/stylesheets/jsonedit_main.css +26 -10
  43. data/public/stylesheets/themes/djime-cerulean/style.css +31 -18
  44. metadata +22 -29
  45. data/app/controllers/cookbook_attributes.rb +0 -41
  46. data/app/controllers/cookbook_definitions.rb +0 -41
  47. data/app/controllers/cookbook_files.rb +0 -39
  48. data/app/controllers/cookbook_libraries.rb +0 -41
  49. data/app/controllers/cookbook_recipes.rb +0 -40
  50. data/app/controllers/cookbook_templates.rb +0 -57
  51. data/app/helpers/cookbook_attributes_helper.rb +0 -7
  52. data/app/helpers/cookbook_definitions_helper.rb +0 -8
  53. data/app/helpers/cookbook_files_helper.rb +0 -8
  54. data/app/helpers/cookbook_libraries_helper.rb +0 -7
  55. data/app/helpers/cookbook_recipes_helper.rb +0 -8
  56. data/app/helpers/cookbook_templates_helper.rb +0 -8
  57. data/app/helpers/exceptions_helper.rb +0 -6
  58. data/app/helpers/global_helpers.rb +0 -39
  59. data/app/helpers/nodes_helper.rb +0 -43
  60. data/app/helpers/openid_consumer_helper.rb +0 -8
  61. data/app/helpers/openid_register_helper.rb +0 -8
  62. data/app/helpers/openid_server_helper.rb +0 -6
  63. data/app/helpers/openid_server_helpers.rb +0 -32
  64. data/app/helpers/roles_helper.rb +0 -5
  65. data/app/helpers/search_entries_helper.rb +0 -8
  66. data/app/helpers/search_helper.rb +0 -44
  67. data/app/views/nodes/_form.html.haml +0 -52
  68. data/app/views/roles/_form.html.haml +0 -52
@@ -8,9 +8,9 @@
8
8
  # Licensed under the Apache License, Version 2.0 (the "License");
9
9
  # you may not use this file except in compliance with the License.
10
10
  # You may obtain a copy of the License at
11
- #
11
+ #
12
12
  # http://www.apache.org/licenses/LICENSE-2.0
13
- #
13
+ #
14
14
  # Unless required by applicable law or agreed to in writing, software
15
15
  # distributed under the License is distributed on an "AS IS" BASIS,
16
16
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -21,17 +21,19 @@
21
21
  require 'chef/node'
22
22
 
23
23
  class Nodes < Application
24
-
24
+
25
25
  provides :html
26
-
26
+
27
27
  before :login_required
28
28
  before :require_admin, :only => [:destroy]
29
-
29
+
30
30
  def index
31
31
  begin
32
- node_hash = Chef::Node.list
33
- require 'pp'
34
- pp node_hash
32
+ if session[:environment]
33
+ node_hash = Chef::Node.list_by_environment(session[:environment])
34
+ else
35
+ node_hash = Chef::Node.list
36
+ end
35
37
  @node_list = node_hash.keys.sort
36
38
  rescue => e
37
39
  Chef::Log.error("#{e}\n#{e.backtrace.join("\n")}")
@@ -42,35 +44,38 @@ class Nodes < Application
42
44
  end
43
45
 
44
46
  def show
45
- begin
47
+ begin
46
48
  @node =Chef::Node.load(params[:id])
47
49
  rescue => e
48
50
  Chef::Log.error("#{e}\n#{e.backtrace.join("\n")}")
49
51
  @_message = {:error => "Could not load node #{params[:id]}"}
50
52
  @node = Chef::Node.new
51
- end
53
+ end
52
54
  render
53
55
  end
54
56
 
55
57
  def new
56
58
  begin
57
59
  @node = Chef::Node.new
58
- @available_recipes = get_available_recipes
60
+ @node.chef_environment(session[:environment] || "_default")
61
+ @available_recipes = list_available_recipes_for(@node.chef_environment)
59
62
  @available_roles = Chef::Role.list.keys.sort
60
63
  @run_list = @node.run_list
64
+ @env = session[:environment]
61
65
  render
62
66
  rescue => e
63
67
  Chef::Log.error("#{e}\n#{e.backtrace.join("\n")}")
64
68
  @node_list = Chef::Node.list()
65
69
  @_message = {:error => "Could not load available recipes, roles, or the run list"}
66
70
  render :index
67
- end
71
+ end
68
72
  end
69
73
 
70
74
  def edit
71
75
  begin
72
76
  @node = Chef::Node.load(params[:id])
73
- @available_recipes = get_available_recipes
77
+ @env = @node.chef_environment
78
+ @available_recipes = list_available_recipes_for(@node.chef_environment)
74
79
  @available_roles = Chef::Role.list.keys.sort
75
80
  @run_list = @node.run_list
76
81
  render
@@ -82,13 +87,14 @@ class Nodes < Application
82
87
  @run_list = []
83
88
  @_message = {:error => "Could not load node #{params[:id]}"}
84
89
  render
85
- end
90
+ end
86
91
  end
87
92
 
88
93
  def create
89
- begin
94
+ begin
90
95
  @node = Chef::Node.new
91
96
  @node.name params[:name]
97
+ @node.chef_environment params[:chef_environment]
92
98
  @node.normal_attrs = Chef::JSONCompat.from_json(params[:attributes])
93
99
  @node.run_list.reset!(params[:for_node] ? params[:for_node] : [])
94
100
  raise ArgumentError, "Node name cannot be blank" if (params[:name].nil? || params[:name].length==0)
@@ -97,7 +103,7 @@ class Nodes < Application
97
103
  rescue => e
98
104
  Chef::Log.error("#{e}\n#{e.backtrace.join("\n")}")
99
105
  @node.normal_attrs = Chef::JSONCompat.from_json(params[:attributes])
100
- @available_recipes = get_available_recipes
106
+ @available_recipes = list_available_recipes_for(@node.chef_environment)
101
107
  @available_roles = Chef::Role.list.keys.sort
102
108
  @node.run_list params[:for_node]
103
109
  @run_list = @node.run_list
@@ -109,6 +115,7 @@ class Nodes < Application
109
115
  def update
110
116
  begin
111
117
  @node = Chef::Node.load(params[:id])
118
+ @node.chef_environment(params[:chef_environment])
112
119
  @node.run_list.reset!(params[:for_node] ? params[:for_node] : [])
113
120
  @node.normal_attrs = Chef::JSONCompat.from_json(params[:attributes])
114
121
  @node.save
@@ -116,7 +123,7 @@ class Nodes < Application
116
123
  render :show
117
124
  rescue => e
118
125
  Chef::Log.error("#{e}\n#{e.backtrace.join("\n")}")
119
- @available_recipes = get_available_recipes
126
+ @available_recipes = list_available_recipes_for(@node.chef_environment)
120
127
  @available_roles = Chef::Role.list.keys.sort
121
128
  @run_list = Chef::RunList.new
122
129
  @run_list.reset!(params[:for_node])
@@ -135,7 +142,7 @@ class Nodes < Application
135
142
  @node_list = Chef::Node.list()
136
143
  @_message = {:error => "Could not delete the node"}
137
144
  render :index
138
- end
145
+ end
139
146
  end
140
-
147
+
141
148
  end
@@ -7,9 +7,9 @@
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
8
8
  # you may not use this file except in compliance with the License.
9
9
  # You may obtain a copy of the License at
10
- #
10
+ #
11
11
  # http://www.apache.org/licenses/LICENSE-2.0
12
- #
12
+ #
13
13
  # Unless required by applicable law or agreed to in writing, software
14
14
  # distributed under the License is distributed on an "AS IS" BASIS,
15
15
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -24,7 +24,7 @@ class Roles < Application
24
24
  provides :html
25
25
  before :login_required
26
26
  before :require_admin, :only => [:destroy]
27
-
27
+
28
28
  # GET /roles
29
29
  def index
30
30
  @role_list = begin
@@ -33,7 +33,7 @@ class Roles < Application
33
33
  Chef::Log.error("#{e}\n#{e.backtrace.join("\n")}")
34
34
  @_message = {:error => "Could not list roles"}
35
35
  {}
36
- end
36
+ end
37
37
  render
38
38
  end
39
39
 
@@ -43,44 +43,54 @@ class Roles < Application
43
43
  Chef::Role.load(params[:id])
44
44
  rescue => e
45
45
  Chef::Log.error("#{e}\n#{e.backtrace.join("\n")}")
46
- @_message = {:error => "Could not load role #{params[:id]}"}
46
+ @_message = {:error => "Could not load role #{params[:id]}."}
47
47
  Chef::Role.new
48
- end
48
+ end
49
+
50
+ @current_env = session[:environment] || "_default"
51
+ @env_run_list_exists = @role.env_run_lists.has_key?(@current_env)
52
+ @run_list = @role.run_list_for(@current_env)
53
+ @recipes = @run_list.expand(@current_env, 'server').recipes
49
54
  render
50
55
  end
51
56
 
52
57
  # GET /roles/new
53
58
  def new
54
59
  begin
55
- @available_recipes = get_available_recipes
56
60
  @role = Chef::Role.new
57
61
  @available_roles = Chef::Role.list.keys.sort
58
- @run_list = @role.run_list
62
+ @environments = Chef::Environment.list.keys.sort
63
+ @run_lists = @environments.inject({}) { |run_lists, env| run_lists[env] = @role.env_run_lists[env]; run_lists}
64
+ @current_env = "_default"
65
+ @available_recipes = list_available_recipes_for(@current_env)
66
+ @existing_run_list_environments = @role.env_run_lists.keys
67
+ # merb select helper has no :include_blank => true, so fix the view in the controller.
68
+ @existing_run_list_environments.unshift('')
59
69
  render
60
70
  rescue => e
61
71
  Chef::Log.error("#{e}\n#{e.backtrace.join("\n")}")
62
- @role_list = Chef::Role.list()
63
- @_message = {:error => "Could not load available recipes, roles, or the run list."}
64
- render :index
65
- end
72
+ redirect url(:roles), :message => {:error => "Could not load available recipes, roles, or the run list."}
73
+ end
66
74
  end
67
75
 
68
76
  # GET /roles/:id/edit
69
77
  def edit
70
78
  begin
71
79
  @role = Chef::Role.load(params[:id])
72
- @available_recipes = get_available_recipes
73
80
  @available_roles = Chef::Role.list.keys.sort
81
+ @environments = Chef::Environment.list.keys.sort
82
+ @current_env = session[:environment] || "_default"
74
83
  @run_list = @role.run_list
84
+ @run_lists = @environments.inject({}) { |run_lists, env| run_lists[env] = @role.env_run_lists[env]; run_lists}
85
+ @existing_run_list_environments = @role.env_run_lists.keys
86
+ # merb select helper has no :include_blank => true, so fix the view in the controller.
87
+ @existing_run_list_environments.unshift('')
88
+ @available_recipes = list_available_recipes_for(@current_env)
89
+ render
75
90
  rescue => e
76
91
  Chef::Log.error("#{e}\n#{e.backtrace.join("\n")}")
77
- @role = Chef::Role.new
78
- @available_recipes = []
79
- @available_roles = []
80
- @run_list = []
81
- @_message = {:error => "Could not load role #{params[:id]}, the available recipes, roles, or the run list"}
82
- end
83
- render
92
+ redirect url(:roles), :message => {:error => "Could not load role #{params[:id]}. #{e.message}"}
93
+ end
84
94
  end
85
95
 
86
96
  # POST /roles
@@ -88,7 +98,7 @@ class Roles < Application
88
98
  begin
89
99
  @role = Chef::Role.new
90
100
  @role.name(params[:name])
91
- @role.run_list(params[:for_role] ? params[:for_role] : [])
101
+ @role.env_run_lists(params[:env_run_lists])
92
102
  @role.description(params[:description]) if params[:description] != ''
93
103
  @role.default_attributes(Chef::JSONCompat.from_json(params[:default_attributes])) if params[:default_attributes] != ''
94
104
  @role.override_attributes(Chef::JSONCompat.from_json(params[:override_attributes])) if params[:override_attributes] != ''
@@ -96,14 +106,7 @@ class Roles < Application
96
106
  redirect(url(:roles), :message => { :notice => "Created Role #{@role.name}" })
97
107
  rescue => e
98
108
  Chef::Log.error("#{e}\n#{e.backtrace.join("\n")}")
99
- @available_recipes = get_available_recipes
100
- @available_roles = Chef::Role.list.keys.sort
101
- @role = Chef::Role.new
102
- @role.default_attributes(Chef::JSONCompat.from_json(params[:default_attributes])) if params[:default_attributes] != ''
103
- @role.override_attributes(Chef::JSONCompat.from_json(params[:override_attributes])) if params[:override_attributes] != ''
104
- @run_list = Chef::RunList.new.reset!(Array(params[:for_role]))
105
- @_message = { :error => "Could not create role" }
106
- render :new
109
+ redirect(url(:new_role), :message => { :error => "Could not create role. #{e.message}" })
107
110
  end
108
111
  end
109
112
 
@@ -111,23 +114,15 @@ class Roles < Application
111
114
  def update
112
115
  begin
113
116
  @role = Chef::Role.load(params[:id])
114
- @role.run_list(params[:for_role] ? params[:for_role] : [])
117
+ @role.env_run_lists(params[:env_run_lists])
115
118
  @role.description(params[:description]) if params[:description] != ''
116
119
  @role.default_attributes(Chef::JSONCompat.from_json(params[:default_attributes])) if params[:default_attributes] != ''
117
120
  @role.override_attributes(Chef::JSONCompat.from_json(params[:override_attributes])) if params[:override_attributes] != ''
118
121
  @role.save
119
- @_message = { :notice => "Updated Role" }
120
- render :show
122
+ redirect(url(:role, params[:id]), :message => { :notice => "Updated Role" })
121
123
  rescue => e
122
124
  Chef::Log.error("#{e}\n#{e.backtrace.join("\n")}")
123
- @available_recipes = get_available_recipes
124
- @available_roles = Chef::Role.list.keys.sort
125
- @run_list = Chef::RunList.new.reset!( Array(params[:for_role]))
126
- Chef::Log.error(@run_list.inspect)
127
- @role.default_attributes(Chef::JSONCompat.from_json(params[:default_attributes])) if params[:default_attributes] != ''
128
- @role.override_attributes(Chef::JSONCompat.from_json(params[:override_attributes])) if params[:override_attributes] != ''
129
- @_message = {:error => "Could not update role #{params[:id]}"}
130
- render :edit
125
+ redirect url(:edit_role, params[:id]), :message => {:error => "Could not update role #{params[:id]}. #{e.message}"}
131
126
  end
132
127
  end
133
128
 
@@ -139,10 +134,8 @@ class Roles < Application
139
134
  redirect(absolute_url(:roles), :message => { :notice => "Role #{@role.name} deleted successfully." }, :permanent => true)
140
135
  rescue => e
141
136
  Chef::Log.error("#{e}\n#{e.backtrace.join("\n")}")
142
- @role_list = Chef::Role.list()
143
- @_message = {:error => "Could not delete role #{params[:id]}"}
144
- render :index
145
- end
137
+ redirect url(:roles), :message => {:error => "Could not delete role #{params[:id]}"}
138
+ end
146
139
  end
147
140
 
148
141
  end
@@ -6,9 +6,9 @@
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
8
8
  # You may obtain a copy of the License at
9
- #
9
+ #
10
10
  # http://www.apache.org/licenses/LICENSE-2.0
11
- #
11
+ #
12
12
  # Unless required by applicable law or agreed to in writing, software
13
13
  # distributed under the License is distributed on an "AS IS" BASIS,
14
14
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -19,10 +19,10 @@
19
19
  require 'chef' / 'search' / 'query'
20
20
 
21
21
  class Search < Application
22
-
22
+
23
23
  provides :html
24
- before :login_required
25
-
24
+ before :login_required
25
+
26
26
  def index
27
27
  @s = Chef::Search::Query.new
28
28
  @search_indexes = begin
@@ -31,20 +31,20 @@ class Search < Application
31
31
  Chef::Log.error("#{e}\n#{e.backtrace.join("\n")}")
32
32
  @_message = {:error => "Could not list search indexes"}
33
33
  {}
34
- end
34
+ end
35
35
  render
36
36
  end
37
37
 
38
38
  def show
39
39
  begin
40
40
  @s = Chef::Search::Query.new
41
- query = params[:q].nil? ? "*:*" : (params[:q].empty? ? "*:*" : params[:q])
42
- @results = @s.search(params[:id], query)
41
+ query = (params[:q].nil? || params[:q].empty?) ? "*:*" : URI.escape(params[:q], Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
42
+ @results = @s.search(params[:id], query)
43
43
  @type = if params[:id].to_s == "node" || params[:id].to_s == "role" || params[:id].to_s == "client"
44
44
  params[:id]
45
- else
46
- "databag"
47
- end
45
+ else
46
+ "databag"
47
+ end
48
48
  @results = @results - @results.last(2)
49
49
  @results.each do |result|
50
50
  result.delete(nil)
@@ -56,7 +56,7 @@ class Search < Application
56
56
  @_message = { :error => "Unable to find the #{params[:id]}. (#{$!})" }
57
57
  @search_indexes = @s.list_indexes
58
58
  render :index
59
- end
59
+ end
60
60
  end
61
-
61
+
62
62
  end
@@ -4,9 +4,43 @@ require 'chef-server-webui/version'
4
4
  module Merb
5
5
  module ApplicationHelper
6
6
 
7
+ ROLE_STR = "role"
8
+ RECIPE_STR = "recipe"
9
+
10
+
7
11
  def chef_version
8
12
  ::ChefServerWebui::VERSION
9
13
  end
10
14
 
15
+ def class_for_run_list_item(item)
16
+ case item.type.to_s
17
+ when ROLE_STR
18
+ 'ui-state-highlight'
19
+ when RECIPE_STR
20
+ 'ui-state-default'
21
+ else
22
+ raise ArgumentError, "Cannot generate UI class for #{item.inspect}"
23
+ end
24
+ end
25
+
26
+ def display_run_list_item(item)
27
+ case item.type.to_s
28
+ when ROLE_STR
29
+ item.name
30
+ when RECIPE_STR
31
+ # webui not sophisticated enough for versioned recipes
32
+ # "#{item.name}@#{item.version}"
33
+ item.name
34
+ else
35
+ raise ArgumentError, "can't generate display string for #{item.inspect}"
36
+ end
37
+ end
38
+
39
+ def nav_link_item(title, dest)
40
+ name = title.gsub(/ /, "").downcase
41
+ klass = controller_name == name ? 'class="active"' : ""
42
+ link = link_to(title, url(dest))
43
+ "<li #{klass}>#{link}</li>"
44
+ end
11
45
  end
12
46
  end
@@ -0,0 +1,7 @@
1
+ - unless @manifest[cookbook_part].empty?
2
+ %h4.head= link_to(cookbook_part, "JavaScript:void(0);")
3
+ .files
4
+ - @manifest[cookbook_part].each do |f|
5
+ .head= link_to(File.basename(f["name"]), "JavaScript:void(0);")
6
+ .code
7
+ %pre.ruby= highlight_content(f["url"], type)
@@ -1,12 +1,27 @@
1
1
  .block#block-tables
2
2
  .content
3
- %h2.title Cookbooks
3
+ %h2.title
4
+ Cookbooks
4
5
  .inner
5
- %table.table
6
+ %table.table#cookbook_version_table
6
7
  %thead
7
8
  %tr
8
- %th.first Cookbook Name
9
- %tbody
10
- - @cl.sort.each_with_index do |cookbook, index|
11
- %tr{:class => "#{index % 2 == 1 ? 'odd' : 'even'}"}
12
- %td= link_to cookbook[0], url(:cookbook, { :id => cookbook[0] })
9
+ %th Cookbook
10
+ %th Latest Version
11
+ %th Other Versions
12
+ %tbody.cookbook_versions
13
+ - @cl.keys.sort.each do |cookbook|
14
+ - versions = @cl[cookbook]
15
+ %tr
16
+ %td= cookbook
17
+ %td
18
+ %ul.cookbook_versions{ :id => "#{cookbook}_versions" }
19
+ - versions[0..4].each_with_index do |v, i|
20
+ - klass = i > 0 ? "other_version" : "latest_version"
21
+ %li{ :class => klass }
22
+ = link_to(v["version"], v["url"])
23
+ - if versions.length > 5
24
+ = all_versions_link(cookbook)
25
+ %td.show_more
26
+ = versions.length > 1 ? more_versions_link(cookbook) : ""
27
+ = js_include_tag "cookbook_versions"
@@ -1,56 +1,14 @@
1
- %script{:type=>"text/javascript", :src => "/javascripts/drop_down_menu.js"}
2
1
  .block#block-text
3
2
  .content
4
3
  %h2
5
4
  .title
6
- = "Cookbook: #{h @manifest["name"]}"
7
- - unless @other_versions.nil? || @other_versions.empty?
8
- %select{:name => "choice", :onchange => "jump(this)", :size => "1"}
9
- %option{:value => ""} Other Versions
10
- %option{:value => ""} --------------
11
- - @other_versions.each do |v|
12
- %option{:value => url(:show_specific_version_cookbook, :cookbook_id => @cookbook_id, :cb_version => v)} "#{v}"
5
+ = "#{@cookbook_id}"
6
+ %select{:name => "choice", :onchange => "jump(this)", :size => "1"}
7
+ - @versions.each do |version|
8
+ - selected = @version == version
9
+ %option{:value => cookbook_link(version), :selected => selected }
10
+ = version
13
11
  .inner
14
12
  .accordion
15
- - unless @manifest["libraries"].empty?
16
- %h2.head= link_to "Library Files", "JavaScript:void(0);"
17
- .files
18
- - @manifest["libraries"].each do |f|
19
- .code
20
- %h4.head= link_to File.basename(f["name"]), "JavaScript:void(0);"
21
- %pre.ruby= syntax_highlight(f["url"])
22
- - unless @manifest["attributes"].empty?
23
- %h2.head= link_to "Attribute Files", "JavaScript:void(0);"
24
- .files
25
- - @manifest["attributes"].each do |f|
26
- .code
27
- %h4.head= link_to File.basename(f["name"]), "JavaScript:void(0);"
28
- %pre.ruby= syntax_highlight(f["url"])
29
- - unless @manifest["definitions"].empty?
30
- %h2.head= link_to "Definition Files", "JavaScript:void(0);"
31
- .files
32
- - @manifest["definitions"].each do |f|
33
- .code
34
- %h4.head= link_to File.basename(f["name"]), "JavaScript:void(0);"
35
- %pre.ruby= syntax_highlight(f["url"])
36
- - unless @manifest["recipes"].empty?
37
- %h2.head= link_to "Recipe Files", "JavaScript:void(0);"
38
- .files
39
- - @manifest["recipes"].each do |f|
40
- .code
41
- %h4.head= link_to File.basename(f["name"]), "JavaScript:void(0);"
42
- %pre.ruby= syntax_highlight(f["url"])
43
- - unless @manifest["templates"].empty?
44
- %h2.head= link_to "Template Files", "JavaScript:void(0);"
45
- .files
46
- - @manifest["templates"].each do |f|
47
- .code
48
- %h4.head= link_to File.basename(f["name"]), "JavaScript:void(0);"
49
- %pre.ruby= syntax_highlight(f["url"])
50
- - unless @manifest["files"].empty?
51
- %h2.head= link_to "Cookbook Files", "JavaScript:void(0);"
52
- .files
53
- - @manifest["files"].each do |f|
54
- .code
55
- %h4.head= link_to File.basename(f["name"]), "JavaScript:void(0);"
56
- %pre= show_plain_file(f["url"])
13
+ - cookbook_parts.each do |(part, type)|
14
+ = partial('cookbook_content', :cookbook_part => part, :type => type)