Class: Fog::Rake::DocumentationTask

Inherits:
Rake::TaskLib
  • Object
show all
Defined in:
lib/tasks/documentation_task.rb

Instance Method Summary collapse

Constructor Details

#initializeDocumentationTask

Returns a new instance of DocumentationTask.



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/tasks/documentation_task.rb', line 7

def initialize
  task :docs do
    Rake::Task[:supported_services_docs].invoke
    Rake::Task[:upload_fog_io].invoke
    Rake::Task[:upload_yardoc].invoke

    # connect to storage provider
    Fog.credential = :geemus
    storage = Fog::Storage.new(:provider => 'AWS')
    directory = storage.directories.new(:key => 'fog.io')
    # write base index with redirect to new version
    directory.files.create(
      :body         => redirecter('latest'),
      :content_type => 'text/html',
      :key          => 'index.html',
      :public       => true
    )

    Formatador.display_line
  end

  task :supported_services_docs do
    support, shared = {}, []
    for key, values in Fog.services
      unless values.length == 1
        shared |= [key]
        values.each do |value|
          support[value] ||= {}
          support[value][key] = '+'
        end
      else
        value = values.first
        support[value] ||= {}
        support[value][:other] ||= []
        support[value][:other] << key
      end
    end
    shared.sort! {|x,y| x.to_s <=> y.to_s}
    columns = [:provider] + shared + [:other]
    data = []
    for key in support.keys.sort {|x,y| x.to_s <=> y.to_s}
      data << { :provider => key }.merge!(support[key])
    end

    table = ''
    table << "<table border='1'>\n"

    table << "  <tr>"
    for column in columns
      table << "<th>#{column}</th>"
    end
    table << "</tr>\n"

    for datum in data
      table << "  <tr>"
      for column in columns
        if value = datum[column]
          case value
          when Array
            table << "<td>#{value.join(', ')}</td>"
          when '+'
            table << "<td style='text-align: center;'>#{value}</td>"
          else
            table << "<th>#{value}</th>"
          end
        else
          table << "<td></td>"
        end
      end
      table << "</tr>\n"
    end

    table << "</table>\n"

    File.open('docs/about/supported_services.markdown', 'w') do |file|
      file.puts <<-METADATA
---
layout: default
title:  Supported Services
---

      METADATA
      file.puts(table)
    end
  end

  desc "Builds the fog.io site content locally"
  task :build_fog_io do
    sh "jekyll docs docs/_site"
  end

  task :upload_fog_io => :build_fog_io do
    # connect to storage provider
    Fog.credential = :geemus
    storage = Fog::Storage.new(:provider => 'AWS')
    directory = storage.directories.new(:key => 'fog.io')

    # write web page files to versioned 'folder'
    for file_path in Dir.glob('docs/_site/**/*')
      next if File.directory?(file_path)
      file_name = file_path.gsub('docs/_site/', '')
      key = '' << version << '/' << file_name
      Formatador.redisplay(' ' * 128)
      Formatador.redisplay("Uploading [bold]#{key}[/]")
      if File.extname(file_name) == '.html'
        # rewrite links with version
        body = File.read(file_path)
        body.gsub!(/vX.Y.Z/, 'v' << version)
        body.gsub!(/='\//, %{='/} << version << '/')
        body.gsub!(/="\//, %{="/} << version << '/')
        content_type = 'text/html'
        directory.files.create(
          :body         => redirecter(key),
          :content_type => 'text/html',
          :key          => 'latest/' << file_name,
          :public       => true
        )
      else
        body = File.open(file_path)
        content_type = nil # leave it up to mime-types
      end
      directory.files.create(
        :body         => body,
        :content_type => content_type,
        :key          => key,
        :public       => true
      )
    end
    Formatador.redisplay(' ' * 128)
    Formatador.redisplay("Uploaded docs/_site\n")
  end

  def redirecter(path)
    redirecter = <<-HTML
<!doctype html>
<head>
<title>fog</title>
<meta http-equiv="REFRESH" content="0;url=http://fog.io/#{path}">
</head>
<body>
  <a href="http://fog.io/#{path}">redirecting to lastest (#{path})</a>
</body>
</html>
    HTML
  end
end

Instance Method Details

#redirecter(path) ⇒ Object



139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/tasks/documentation_task.rb', line 139

def redirecter(path)
  redirecter = <<-HTML
<!doctype html>
<head>
<title>fog</title>
<meta http-equiv="REFRESH" content="0;url=http://fog.io/#{path}">
</head>
<body>
  <a href="http://fog.io/#{path}">redirecting to lastest (#{path})</a>
</body>
</html>
  HTML
end