nanoc2 2.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. data/ChangeLog +3 -0
  2. data/LICENSE +19 -0
  3. data/README +75 -0
  4. data/Rakefile +76 -0
  5. data/bin/nanoc2 +26 -0
  6. data/lib/nanoc2.rb +73 -0
  7. data/lib/nanoc2/base.rb +26 -0
  8. data/lib/nanoc2/base/asset.rb +117 -0
  9. data/lib/nanoc2/base/asset_defaults.rb +21 -0
  10. data/lib/nanoc2/base/asset_rep.rb +282 -0
  11. data/lib/nanoc2/base/binary_filter.rb +44 -0
  12. data/lib/nanoc2/base/code.rb +41 -0
  13. data/lib/nanoc2/base/compiler.rb +67 -0
  14. data/lib/nanoc2/base/core_ext.rb +2 -0
  15. data/lib/nanoc2/base/core_ext/hash.rb +78 -0
  16. data/lib/nanoc2/base/core_ext/string.rb +8 -0
  17. data/lib/nanoc2/base/data_source.rb +286 -0
  18. data/lib/nanoc2/base/defaults.rb +30 -0
  19. data/lib/nanoc2/base/filter.rb +93 -0
  20. data/lib/nanoc2/base/layout.rb +91 -0
  21. data/lib/nanoc2/base/notification_center.rb +66 -0
  22. data/lib/nanoc2/base/page.rb +132 -0
  23. data/lib/nanoc2/base/page_defaults.rb +20 -0
  24. data/lib/nanoc2/base/page_rep.rb +324 -0
  25. data/lib/nanoc2/base/plugin.rb +71 -0
  26. data/lib/nanoc2/base/proxies.rb +5 -0
  27. data/lib/nanoc2/base/proxies/asset_proxy.rb +29 -0
  28. data/lib/nanoc2/base/proxies/asset_rep_proxy.rb +26 -0
  29. data/lib/nanoc2/base/proxies/layout_proxy.rb +25 -0
  30. data/lib/nanoc2/base/proxies/page_proxy.rb +35 -0
  31. data/lib/nanoc2/base/proxies/page_rep_proxy.rb +28 -0
  32. data/lib/nanoc2/base/proxy.rb +37 -0
  33. data/lib/nanoc2/base/router.rb +72 -0
  34. data/lib/nanoc2/base/site.rb +274 -0
  35. data/lib/nanoc2/base/template.rb +64 -0
  36. data/lib/nanoc2/binary_filters.rb +1 -0
  37. data/lib/nanoc2/binary_filters/image_science_thumbnail.rb +28 -0
  38. data/lib/nanoc2/cli.rb +9 -0
  39. data/lib/nanoc2/cli/base.rb +132 -0
  40. data/lib/nanoc2/cli/commands.rb +10 -0
  41. data/lib/nanoc2/cli/commands/autocompile.rb +80 -0
  42. data/lib/nanoc2/cli/commands/compile.rb +312 -0
  43. data/lib/nanoc2/cli/commands/create_layout.rb +85 -0
  44. data/lib/nanoc2/cli/commands/create_page.rb +85 -0
  45. data/lib/nanoc2/cli/commands/create_site.rb +323 -0
  46. data/lib/nanoc2/cli/commands/create_template.rb +76 -0
  47. data/lib/nanoc2/cli/commands/help.rb +69 -0
  48. data/lib/nanoc2/cli/commands/info.rb +125 -0
  49. data/lib/nanoc2/cli/commands/switch.rb +141 -0
  50. data/lib/nanoc2/cli/commands/update.rb +91 -0
  51. data/lib/nanoc2/cli/logger.rb +72 -0
  52. data/lib/nanoc2/data_sources.rb +2 -0
  53. data/lib/nanoc2/data_sources/filesystem.rb +707 -0
  54. data/lib/nanoc2/data_sources/filesystem_combined.rb +495 -0
  55. data/lib/nanoc2/extra.rb +6 -0
  56. data/lib/nanoc2/extra/auto_compiler.rb +285 -0
  57. data/lib/nanoc2/extra/context.rb +22 -0
  58. data/lib/nanoc2/extra/core_ext.rb +2 -0
  59. data/lib/nanoc2/extra/core_ext/hash.rb +54 -0
  60. data/lib/nanoc2/extra/core_ext/time.rb +13 -0
  61. data/lib/nanoc2/extra/file_proxy.rb +29 -0
  62. data/lib/nanoc2/extra/vcs.rb +48 -0
  63. data/lib/nanoc2/extra/vcses.rb +5 -0
  64. data/lib/nanoc2/extra/vcses/bazaar.rb +21 -0
  65. data/lib/nanoc2/extra/vcses/dummy.rb +20 -0
  66. data/lib/nanoc2/extra/vcses/git.rb +21 -0
  67. data/lib/nanoc2/extra/vcses/mercurial.rb +21 -0
  68. data/lib/nanoc2/extra/vcses/subversion.rb +21 -0
  69. data/lib/nanoc2/filters.rb +16 -0
  70. data/lib/nanoc2/filters/bluecloth.rb +13 -0
  71. data/lib/nanoc2/filters/erb.rb +19 -0
  72. data/lib/nanoc2/filters/erubis.rb +14 -0
  73. data/lib/nanoc2/filters/haml.rb +21 -0
  74. data/lib/nanoc2/filters/markaby.rb +14 -0
  75. data/lib/nanoc2/filters/maruku.rb +14 -0
  76. data/lib/nanoc2/filters/old.rb +19 -0
  77. data/lib/nanoc2/filters/rainpress.rb +13 -0
  78. data/lib/nanoc2/filters/rdiscount.rb +13 -0
  79. data/lib/nanoc2/filters/rdoc.rb +23 -0
  80. data/lib/nanoc2/filters/redcloth.rb +14 -0
  81. data/lib/nanoc2/filters/relativize_paths.rb +16 -0
  82. data/lib/nanoc2/filters/relativize_paths_in_css.rb +16 -0
  83. data/lib/nanoc2/filters/relativize_paths_in_html.rb +16 -0
  84. data/lib/nanoc2/filters/rubypants.rb +14 -0
  85. data/lib/nanoc2/filters/sass.rb +18 -0
  86. data/lib/nanoc2/helpers.rb +9 -0
  87. data/lib/nanoc2/helpers/blogging.rb +217 -0
  88. data/lib/nanoc2/helpers/capturing.rb +63 -0
  89. data/lib/nanoc2/helpers/filtering.rb +54 -0
  90. data/lib/nanoc2/helpers/html_escape.rb +25 -0
  91. data/lib/nanoc2/helpers/link_to.rb +113 -0
  92. data/lib/nanoc2/helpers/render.rb +49 -0
  93. data/lib/nanoc2/helpers/tagging.rb +56 -0
  94. data/lib/nanoc2/helpers/text.rb +38 -0
  95. data/lib/nanoc2/helpers/xml_sitemap.rb +63 -0
  96. data/lib/nanoc2/routers.rb +3 -0
  97. data/lib/nanoc2/routers/default.rb +54 -0
  98. data/lib/nanoc2/routers/no_dirs.rb +66 -0
  99. data/lib/nanoc2/routers/versioned.rb +79 -0
  100. metadata +185 -0
@@ -0,0 +1,3 @@
1
+ For a list of all changes, please see the changelog on the project repository
2
+ instead (http://projects.stoneship.org/hg/shared/nanoc/shortlog). For release
3
+ notes, please see the NEWS file.
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2007-2008 Denis Defreyne and contributors
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
data/README ADDED
@@ -0,0 +1,75 @@
1
+ == Overview
2
+
3
+ nanoc is a simple but very flexible static site generator written in Ruby.
4
+ It operates on local files, and therefore does not run on the server. nanoc
5
+ "compiles" the local source files into HTML (usually), by evaluating eRuby,
6
+ Markdown, etc.
7
+
8
+ == Documentation
9
+
10
+ nanoc's web site, which can be found at http://nanoc.stoneship.org, contains a
11
+ few useful resources to help you get started with nanoc:
12
+
13
+ * The tutorial at http://nanoc.stoneship.org/help/tutorial
14
+ * The manual at http://nanoc.stoneship.org/help/manual
15
+
16
+ It is probably also worth checking out and perhaps subscribing to the
17
+ discussion groups:
18
+
19
+ * The discussion group in English at http://groups.google.com/group/nanoc
20
+ * The discussion group in Spanish at http://groups.google.com/group/nanoc-es
21
+
22
+ === Source Code Documentation
23
+
24
+ The source code is structured in a few directories:
25
+
26
+ * *bin* contains the commandline tool aptly named +nanoc+
27
+ * *lib*
28
+ * *nanoc*
29
+ * *base* contains the bare essentials necessary for nanoc to function
30
+ * *binary_filters* contains the standard binary filters
31
+ (Nanoc2::BinaryFilter subclasses) such as the thumbnail filter
32
+ * *cli* contains the commandline interface
33
+ * *data_sources* contains the standard data sources (Nanoc2::DataSource
34
+ subclasses), such as the filesystem data source
35
+ * *helpers* contains helpers, which provide functionality some sites
36
+ may find useful, such as the blogging and tagging helpers
37
+ * *extra* contains stuff that is not needed by nanoc itself, but which may
38
+ be used by helpers, data sources, filters or routers.
39
+ * *filters* contains the standard filters (Nanoc2::Filter subclasses) such
40
+ as ERB, Markdown, Haml, ...
41
+ * *routers* contains the standard routers (Nanoc2::Router subclasses)
42
+ * *test* contains test fixtures as well as testing code, structured in the
43
+ same way as lib/nanoc
44
+
45
+ The namespaces (modules) are organised like this:
46
+
47
+ * *Nanoc2* is the namespace for everything nanoc-related (obviously). The
48
+ classes in 'lib/nanoc2/base' are part of this module (not Nanoc2::Base
49
+ which does not exist)
50
+ * *BinaryFilters* contains the binary filters
51
+ * *CLI* containing everything related to the commandline tool.
52
+ * *DataSources* contains the data sources
53
+ * *Helpers* contains the helpers
54
+ * *Extra* contains useful stuff not needed by nanoc itself
55
+ * *Filters* contains the (textual) filters
56
+ * *Routers* contains the routers
57
+
58
+ The central class in nanoc is Nanoc2::Site, so you should start there if you
59
+ want to explore nanoc from a technical perspective.
60
+
61
+ == Contributors
62
+
63
+ (In alphabetical order)
64
+
65
+ * Colin Barrett
66
+ * Dmitry Bilunov
67
+ * Šime Ramov
68
+ * "Soryu"
69
+ * Dennis Sutch
70
+
71
+ Special thanks to Ale Muñoz.
72
+
73
+ == Contact
74
+
75
+ You can reach me at <denis.defreyne@stoneship.org>.
@@ -0,0 +1,76 @@
1
+ ##### Requirements
2
+
3
+ # Rake etc
4
+ require 'rake'
5
+ require 'rake/gempackagetask'
6
+
7
+ # nanoc itself
8
+ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/lib'))
9
+ require 'nanoc2'
10
+
11
+ ##### General details
12
+
13
+ NAME = 'nanoc2'
14
+ VERS = Nanoc2::VERSION
15
+ SUMMARY = 'a tool that runs on your local computer and compiles ' +
16
+ 'Markdown, Textile, Haml, ... documents into static web pages'
17
+ HOMEPAGE = 'http://nanoc.stoneship.org/'
18
+
19
+ AUTHOR = 'Denis Defreyne'
20
+ EMAIL = 'denis.defreyne@stoneship.org'
21
+
22
+ MESSAGE = <<EOS
23
+ Thanks for installing nanoc 2.2! Here are some resources to help you get started:
24
+
25
+ * The tutorial at <http://nanoc.stoneship.org/help/tutorial/>
26
+ * The manual at <http://nanoc.stoneship.org/help/manual/>
27
+ * The discussion group at <http://groups.google.com/group/nanoc>
28
+
29
+ Be sure to check out the nanoc blog at <http://nanoc.stoneship.org/blog/> for
30
+ details about this release.
31
+
32
+ Enjoy!
33
+ EOS
34
+
35
+ ##### Packaging
36
+
37
+ GemSpec = Gem::Specification.new do |s|
38
+ s.name = NAME
39
+ s.version = VERS
40
+ s.platform = Gem::Platform::RUBY
41
+ s.summary = SUMMARY
42
+ s.description = s.summary
43
+ s.homepage = HOMEPAGE
44
+
45
+ s.author = AUTHOR
46
+ s.email = EMAIL
47
+
48
+ s.post_install_message = '-' * 78 + "\n" + MESSAGE + '-' * 78
49
+
50
+ s.rubyforge_project = 'nanoc'
51
+
52
+ s.required_ruby_version = '>= 1.8.5'
53
+
54
+ s.has_rdoc = true
55
+ s.extra_rdoc_files = [ 'README' ]
56
+ s.rdoc_options << '--title' << 'nanoc2' <<
57
+ '--main' << 'README' <<
58
+ '--charset' << 'utf-8' <<
59
+ '--exclude' << 'lib/nanoc2/cli/commands' <<
60
+ '--exclude' << 'lib/nanoc2/binary_filters' <<
61
+ '--exclude' << 'lib/nanoc2/extra/vcses' <<
62
+ '--exclude' << 'lib/nanoc2/filters' <<
63
+ '--exclude' << 'doc' <<
64
+ '--exclude' << 'test' <<
65
+ '--exclude' << 'vendor' <<
66
+ '--line-numbers'
67
+
68
+ s.files = %w( README LICENSE ChangeLog Rakefile ) + Dir[File.join('{bin,lib,vendor}', '**', '*')]
69
+ s.executables = [ 'nanoc2' ]
70
+ s.require_path = 'lib'
71
+ s.bindir = 'bin'
72
+ end
73
+
74
+ Dir.glob('tasks/**/*.rake').each { |r| Rake.application.add_import r }
75
+
76
+ task :default => [ :fetch_dependencies, :test ]
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Add lib to load path
4
+ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib'))
5
+
6
+ # Print deprecation warning
7
+ $stderr.puts <<-EOS
8
+ +----------------------------------------------------------------------------+
9
+ | WARNING: nanoc 2.x has been superseded by nanoc 3.x and is no longer main- |
10
+ | tained. There will be no future updates to nanoc 2.x. Consider upgrading |
11
+ | to nanoc 3.x. For more information, see the nanoc 2.x-to-3.x migration |
12
+ | guide at <http://nanoc.stoneship.org/migrating/>. |
13
+ +----------------------------------------------------------------------------+
14
+ EOS
15
+ $stderr.puts
16
+
17
+ # Load nanoc
18
+ require 'nanoc2'
19
+ require 'nanoc2/cli'
20
+
21
+ # Load custom code that can't be load later
22
+ Dir['lib/commands/*.rb'].each { |f| require f }
23
+ Dir['lib/data_sources/*.rb'].each { |f| require f }
24
+
25
+ # Run base
26
+ Nanoc2::CLI::Base.new.run(ARGV)
@@ -0,0 +1,73 @@
1
+ module Nanoc2
2
+
3
+ # The current nanoc version.
4
+ VERSION = '2.2.3'
5
+
6
+ # Generic error. Superclass for all nanoc-specific errors.
7
+ class Error < RuntimeError ; end
8
+
9
+ module Errors # :nodoc:
10
+
11
+ # Error that is raised when a site is loaded that uses a data source with
12
+ # an unknown identifier.
13
+ class UnknownDataSourceError < Error ; end
14
+
15
+ # Error that is raised when a site is loaded that uses a data source with
16
+ # an unknown identifier.
17
+ class UnknownRouterError < Error ; end
18
+
19
+ # Error that is raised during site compilation when a page uses a layout
20
+ # that is not present in the site.
21
+ class UnknownLayoutError < Error ; end
22
+
23
+ # Error that is raised during site compilation when a page uses a filter
24
+ # that is not known.
25
+ class UnknownFilterError < Error ; end
26
+
27
+ # Error that is raised during site compilation when a layout is compiled
28
+ # for which the filter cannot be determined. This is similar to the
29
+ # UnknownFilterError, but specific for filters for layouts.
30
+ class CannotDetermineFilterError < Error ; end
31
+
32
+ # Error that is raised during site compilation when a page (directly or
33
+ # indirectly) includes its own page content, leading to endless recursion.
34
+ class RecursiveCompilationError < Error ; end
35
+
36
+ # Error that is raised when a certain function or feature is used that is
37
+ # no longer supported by nanoc.
38
+ class NoLongerSupportedError < Error ; end
39
+
40
+ end
41
+
42
+ module BinaryFilters # :nodoc:
43
+ end
44
+
45
+ module DataSources # :nodoc:
46
+ end
47
+
48
+ module Helpers # :nodoc:
49
+ end
50
+
51
+ module Extra # :nodoc:
52
+ end
53
+
54
+ module Filters # :nodoc:
55
+ end
56
+
57
+ module Routers # :nodoc:
58
+ end
59
+
60
+ end
61
+
62
+ # Load requirements
63
+ require 'yaml'
64
+ require 'fileutils'
65
+
66
+ # Load nanoc
67
+ require 'nanoc2/base'
68
+ require 'nanoc2/extra'
69
+ require 'nanoc2/data_sources'
70
+ require 'nanoc2/binary_filters'
71
+ require 'nanoc2/filters'
72
+ require 'nanoc2/routers'
73
+ require 'nanoc2/helpers'
@@ -0,0 +1,26 @@
1
+ module Nanoc2
2
+
3
+ autoload :Asset, 'nanoc2/base/asset'
4
+ autoload :AssetDefaults, 'nanoc2/base/asset_defaults'
5
+ autoload :AssetRep, 'nanoc2/base/asset_rep'
6
+ autoload :BinaryFilter, 'nanoc2/base/binary_filter'
7
+ autoload :Code, 'nanoc2/base/code'
8
+ autoload :Compiler, 'nanoc2/base/compiler'
9
+ autoload :DataSource, 'nanoc2/base/data_source'
10
+ autoload :Defaults, 'nanoc2/base/defaults'
11
+ autoload :Filter, 'nanoc2/base/filter'
12
+ autoload :Layout, 'nanoc2/base/layout'
13
+ autoload :NotificationCenter, 'nanoc2/base/notification_center'
14
+ autoload :Page, 'nanoc2/base/page'
15
+ autoload :PageDefaults, 'nanoc2/base/page_defaults'
16
+ autoload :PageRep, 'nanoc2/base/page_rep'
17
+ autoload :Plugin, 'nanoc2/base/plugin'
18
+ autoload :Proxy, 'nanoc2/base/proxy'
19
+ autoload :Router, 'nanoc2/base/router'
20
+ autoload :Site, 'nanoc2/base/site'
21
+ autoload :Template, 'nanoc2/base/template'
22
+
23
+ require 'nanoc2/base/core_ext'
24
+ require 'nanoc2/base/proxies'
25
+
26
+ end
@@ -0,0 +1,117 @@
1
+ module Nanoc2
2
+
3
+ # A Nanoc2::Asset represents an asset in a nanoc site. It has a file object
4
+ # (File instance) and attributes, as well as a path. It can also store the
5
+ # modification time to speed up compilation.
6
+ #
7
+ # Each asset has a list of asset representations or reps (Nanoc2::AssetRep);
8
+ # compiling an asset actually compiles all of its assets.
9
+ class Asset
10
+
11
+ # Defaults values for assets.
12
+ DEFAULTS = {
13
+ :extension => 'dat',
14
+ :binary => true,
15
+ :filters => []
16
+ }
17
+
18
+ # The Nanoc2::Site this asset belongs to.
19
+ attr_accessor :site
20
+
21
+ # This assets's file.
22
+ attr_reader :file
23
+
24
+ # A hash containing this asset's attributes.
25
+ attr_accessor :attributes
26
+
27
+ # This asset's path.
28
+ attr_reader :path
29
+
30
+ # The time when this asset was last modified.
31
+ attr_reader :mtime
32
+
33
+ # This asset's list of asset representations.
34
+ attr_reader :reps
35
+
36
+ # Creates a new asset.
37
+ #
38
+ # +file+:: An instance of File representing the uncompiled asset.
39
+ #
40
+ # +attributes+:: A hash containing this asset's attributes.
41
+ #
42
+ # +path+:: This asset's path.
43
+ #
44
+ # +mtime+:: The time when this asset was last modified.
45
+ def initialize(file, attributes, path, mtime=nil)
46
+ # Set primary attributes
47
+ @file = file
48
+ @attributes = attributes.clean
49
+ @path = path.cleaned_path
50
+ @mtime = mtime
51
+ end
52
+
53
+ # Builds the individual asset representations (Nanoc2::AssetRep) for this
54
+ # asset.
55
+ def build_reps
56
+ # Get list of rep names
57
+ rep_names_default = (@site.asset_defaults.attributes[:reps] || {}).keys
58
+ rep_names_this = (@attributes[:reps] || {}).keys + [ :default ]
59
+ rep_names = rep_names_default | rep_names_this
60
+
61
+ # Get list of reps
62
+ reps = rep_names.inject({}) do |memo, rep_name|
63
+ rep = (@attributes[:reps] || {})[rep_name]
64
+ is_bad = (@attributes[:reps] || {}).has_key?(rep_name) && rep.nil?
65
+ is_bad ? memo : memo.merge(rep_name => rep || {})
66
+ end
67
+
68
+ # Build reps
69
+ @reps = []
70
+ reps.each_pair do |name, attrs|
71
+ @reps << AssetRep.new(self, attrs, name)
72
+ end
73
+ end
74
+
75
+ # Returns a proxy (Nanoc2::AssetProxy) for this asset.
76
+ def to_proxy
77
+ @proxy ||= AssetProxy.new(self)
78
+ end
79
+
80
+ # Returns the attribute with the given name.
81
+ def attribute_named(name)
82
+ return @attributes[name] if @attributes.has_key?(name)
83
+ return @site.asset_defaults.attributes[name] if @site.asset_defaults.attributes.has_key?(name)
84
+ return DEFAULTS[name]
85
+ end
86
+
87
+ # Saves the asset in the database, creating it if it doesn't exist yet or
88
+ # updating it if it already exists. Tells the site's data source to save
89
+ # the asset.
90
+ def save
91
+ @site.data_source.loading do
92
+ @site.data_source.save_asset(self)
93
+ end
94
+ end
95
+
96
+ # Moves the asset to a new path. Tells the site's data source to move the
97
+ # asset.
98
+ def move_to(new_path)
99
+ @site.data_source.loading do
100
+ @site.data_source.move_asset(self, new_path)
101
+ end
102
+ end
103
+
104
+ # Deletes the asset. Tells the site's data source to delete the asset.
105
+ def delete
106
+ @site.data_source.loading do
107
+ @site.data_source.delete_asset(self)
108
+ end
109
+ end
110
+
111
+ def inspect
112
+ "<#{self.class} path=#{self.path}>"
113
+ end
114
+
115
+ end
116
+
117
+ end
@@ -0,0 +1,21 @@
1
+ module Nanoc2
2
+
3
+ # Nanoc2::AssetDefaults represent the default attributes for all assets in
4
+ # the site. If a specific asset attribute is requested, but not found, then
5
+ # the asset defaults will be queried for this attribute. (If the attribute
6
+ # doesn't even exist in the asset defaults, hardcoded defaults will be
7
+ # used.)
8
+ class AssetDefaults < Defaults
9
+
10
+ # Saves the asset defaults in the database, creating it if it doesn't
11
+ # exist yet or updating it if it already exists. Tells the site's data
12
+ # source to save the asset defaults.
13
+ def save
14
+ @site.data_source.loading do
15
+ @site.data_source.save_asset_defaults(self)
16
+ end
17
+ end
18
+
19
+ end
20
+
21
+ end