Class: Nanoc::DataSource Abstract

Inherits:
Object
  • Object
show all
Defined in:
lib/nanoc/base/repos/data_source.rb

Overview

This class is abstract.

Subclasses should at least implement #items and #layouts.

Responsible for loading site data. It is the (abstract) superclass for all data sources. Subclasses must at least implement the data reading methods (#items and #layouts).

Apart from the methods for loading and storing data, there are the #up and #down methods for bringing up and tearing down the connection to the data source. These should be overridden in subclasses. The #loading method wraps #up and #down. #loading is a convenience method for the more low-level methods #use and #unuse, which respectively increment and decrement the reference count; when the reference count goes from 0 to 1, the data source will be loaded (#up will be called) and when the reference count goes from 1 to 0, the data source will be unloaded (#down will be called).

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(site_config, items_root, layouts_root, config) ⇒ DataSource

Returns a new instance of DataSource



32
33
34
35
36
37
38
39
# File 'lib/nanoc/base/repos/data_source.rb', line 32

def initialize(site_config, items_root, layouts_root, config)
  @site_config  = site_config
  @items_root   = items_root
  @layouts_root = layouts_root
  @config       = config || {}

  @references = 0
end

Instance Attribute Details

#configHash (readonly)

Returns The configuration for this data source. For example, online data sources could contain authentication details.

Returns:

  • (Hash)

    The configuration for this data source. For example, online data sources could contain authentication details.



28
29
30
# File 'lib/nanoc/base/repos/data_source.rb', line 28

def config
  @config
end

#items_rootString (readonly)

Returns The root path where items returned by this data source should be mounted.

Returns:

  • (String)

    The root path where items returned by this data source should be mounted.



20
21
22
# File 'lib/nanoc/base/repos/data_source.rb', line 20

def items_root
  @items_root
end

#layouts_rootString (readonly)

Returns The root path where layouts returned by this data source should be mounted.

Returns:

  • (String)

    The root path where layouts returned by this data source should be mounted.



24
25
26
# File 'lib/nanoc/base/repos/data_source.rb', line 24

def layouts_root
  @layouts_root
end

Instance Method Details

#downvoid

This method returns an undefined value.

Brings down the connection to the data. This method should undo the effects of the #up method. For example, a database connection established in #up should be closed in this method.

Subclasses may override this method, but are not required to do so; the default implementation simply does nothing.



99
100
# File 'lib/nanoc/base/repos/data_source.rb', line 99

def down
end

#itemsEnumerable

Returns the collection of items (represented by Int::Item) in this site. The default implementation simply returns an empty array.

Subclasses should not prepend items_root to the item’s identifiers, as this will be done automatically.

Subclasses may override this method, but are not required to do so; the default implementation simply does nothing.

Returns:

  • (Enumerable)

    The collection of items



112
113
114
# File 'lib/nanoc/base/repos/data_source.rb', line 112

def items
  []
end

#layoutsEnumerable

Returns the collection of layouts (represented by Int::Layout) in this site. The default implementation simply returns an empty array.

Subclasses should prepend layout_root to the layout’s identifiers, since this is not done automatically.

Subclasses may override this method, but are not required to do so; the default implementation simply does nothing.

Returns:

  • (Enumerable)

    The collection of layouts



126
127
128
# File 'lib/nanoc/base/repos/data_source.rb', line 126

def layouts
  []
end

#loadingvoid

This method returns an undefined value.

Loads the data source when necessary (calling #up), yields, and unloads (using #down) the data source when it is not being used elsewhere. All data source queries and data manipulations should be wrapped in a #loading block; it ensures that the data source is loaded when necessary and makes sure the data source does not get unloaded while it is still being used elsewhere.



49
50
51
52
53
54
# File 'lib/nanoc/base/repos/data_source.rb', line 49

def loading
  use
  yield
ensure
  unuse
end

#new_item(content, attributes, identifier, binary: false, checksum_data: nil) ⇒ Object

Creates a new in-memory item instance. This is intended for use within the #items method.

Parameters:

  • content (String, Proc)

    The uncompiled item content (if it is a textual item) or the path to the filename containing the content (if it is a binary item).

  • attributes (Hash, Proc)

    A hash containing this item’s attributes.

  • identifier (String)

    This item’s identifier.

  • binary (Boolean)

    Whether or not this item is binary

  • checksum_data (String, nil)

    Used to determine whether the item has changed



144
145
146
147
# File 'lib/nanoc/base/repos/data_source.rb', line 144

def new_item(content, attributes, identifier, binary: false, checksum_data: nil)
  content = Nanoc::Int::Content.create(content, binary: binary)
  Nanoc::Int::Item.new(content, attributes, identifier, checksum_data: checksum_data)
end

#new_layout(raw_content, attributes, identifier, checksum_data: nil) ⇒ Object

Creates a new in-memory layout instance. This is intended for use within the #layouts method.

Parameters:

  • raw_content (String)

    The raw content of this layout.

  • attributes (Hash)

    A hash containing this layout’s attributes.

  • identifier (String)

    This layout’s identifier.

  • checksum_data (String, nil)

    Used to determine whether the layout has changed



159
160
161
# File 'lib/nanoc/base/repos/data_source.rb', line 159

def new_layout(raw_content, attributes, identifier, checksum_data: nil)
  Nanoc::Int::Layout.new(raw_content, attributes, identifier, checksum_data: checksum_data)
end

#unusevoid

This method returns an undefined value.

Marks the data source as unused by the caller.

Calling this method decreases the internal reference count. When the reference count reaches zero, i.e. when the data source is not used any more, the data source will be unloaded (#down will be called).



75
76
77
78
# File 'lib/nanoc/base/repos/data_source.rb', line 75

def unuse
  @references -= 1
  down if @references.zero?
end

#upvoid

This method returns an undefined value.

Brings up the connection to the data. Depending on the way data is stored, this may not be necessary. This is the ideal place to connect to the database, for example.

Subclasses may override this method, but are not required to do so; the default implementation simply does nothing.



88
89
# File 'lib/nanoc/base/repos/data_source.rb', line 88

def up
end

#usevoid

This method returns an undefined value.

Marks the data source as used by the caller.

Calling this method increases the internal reference count. When the data source is used for the first time (first #use call), the data source will be loaded (#up will be called).



63
64
65
66
# File 'lib/nanoc/base/repos/data_source.rb', line 63

def use
  up if @references.zero?
  @references += 1
end