Class: Mill::Resource

Inherits:
Object
  • Object
show all
Defined in:
lib/mill/resource.rb,
lib/mill/resources/feed.rb,
lib/mill/resources/text.rb,
lib/mill/resources/image.rb,
lib/mill/resources/robots.rb,
lib/mill/resources/generic.rb,
lib/mill/resources/sitemap.rb,
lib/mill/resources/redirect.rb

Direct Known Subclasses

Feed, Generic, Image, Redirect, Robots, Sitemap, Text

Defined Under Namespace

Classes: Feed, Generic, Image, Redirect, Robots, Sitemap, Text

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(params = {}) ⇒ Resource

Returns a new instance of Resource.



16
17
18
# File 'lib/mill/resource.rb', line 16

def initialize(params={})
  params.each { |k, v| send("#{k}=", v) }
end

Instance Attribute Details

#contentObject

Returns the value of attribute content.



9
10
11
# File 'lib/mill/resource.rb', line 9

def content
  @content
end

#dateObject

Returns the value of attribute date.



7
8
9
# File 'lib/mill/resource.rb', line 7

def date
  @date
end

#input_fileObject

Returns the value of attribute input_file.



5
6
7
# File 'lib/mill/resource.rb', line 5

def input_file
  @input_file
end

#millObject

Returns the value of attribute mill.



10
11
12
# File 'lib/mill/resource.rb', line 10

def mill
  @mill
end

#output_fileObject

Returns the value of attribute output_file.



6
7
8
# File 'lib/mill/resource.rb', line 6

def output_file
  @output_file
end

#publicObject

Returns the value of attribute public.



8
9
10
# File 'lib/mill/resource.rb', line 8

def public
  @public
end

Class Method Details

.typeObject



12
13
14
# File 'lib/mill/resource.rb', line 12

def self.type
  # implemented by subclass
end

Instance Method Details

#absolute_uriObject



60
61
62
# File 'lib/mill/resource.rb', line 60

def absolute_uri
  @mill.site_uri + uri
end

#buildObject



82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/mill/resource.rb', line 82

def build
  @output_file.dirname.mkpath
  if (c = final_content)
    # ;;warn "#{uri}: writing #{@input_file} to #{@output_file}"
    @output_file.write(c.to_s)
    @output_file.utime(@date.to_time, @date.to_time)
  elsif @input_file
    # ;;warn "#{uri}: copying #{@input_file} to #{@output_file}"
    @input_file.copy(@output_file)
  else
    raise "Can't build resource without content or input file: #{uri}"
  end
  validate
end

#change_frequencyObject



68
69
70
# File 'lib/mill/resource.rb', line 68

def change_frequency
  :weekly
end

#final_contentObject



72
73
74
# File 'lib/mill/resource.rb', line 72

def final_content
  @content
end

#loadObject



76
77
78
79
80
# File 'lib/mill/resource.rb', line 76

def load
  raise "#{uri} (#{self.class}): no content" unless @input_file || @content
  self.date ||= @input_file ? @input_file.mtime : DateTime.now
  @mill.update_resource(self)
end

#tag_uriObject



64
65
66
# File 'lib/mill/resource.rb', line 64

def tag_uri
  @mill.tag_uri + uri
end

#uriObject



52
53
54
55
56
57
58
# File 'lib/mill/resource.rb', line 52

def uri
  raise "#{@input_file}: No output file defined for #{self.class}" unless @output_file
  path = '/' + @output_file.relative_to(@mill.output_dir).to_s
  path.sub!(%r{/index\.html$}, '/')
  path.sub!(%r{\.html$}, '') if @mill.shorten_uris
  Addressable::URI.parse(path)
end

#validateObject



97
98
99
100
101
# File 'lib/mill/resource.rb', line 97

def validate
  if (schema = @mill.schema_for_type(self.class.type))
    validate_xml(schema)
  end
end

#validate_xml(schema) ⇒ Object



103
104
105
106
107
108
109
110
111
112
# File 'lib/mill/resource.rb', line 103

def validate_xml(schema)
  doc = Nokogiri::XML::Document.parse(@output_file.open)
  errors = doc.errors + schema.validate(doc)
  unless errors.empty?
    errors.each do |error|
      warn "[#{error.file}:#{error.line}:#{error.column}] #{error}"
    end
    raise "#{uri}: Validation failed"
  end
end