Project

General

Profile

« Previous | Next » 

Revision 5266

Adding new documentation section for Metacat design documents in Sphinx/ReStructured Text format. Build this documentation using the
provided Makefile, assuming that both Sphinx and PlantUML are installed and on the local executable path by running 'make plantuml html'.
This will produce HTML versions of the documentation in build/html.

Current documentation includes sequence diagrams describing how to handle arbitrary identifiers in Metacat.

View differences:

docs/dev/metacat/source/plantuml.conf
1
skinparam activityFontColor black
2
skinparam activityFontSize 10
3
skinparam activityFontName arial
4
skinparam activityArrowFontColor black
5
skinparam activityArrowFontSize 10
6
skinparam activityArrowFontName arial
7
skinparam classArrowFontColor black
8
skinparam classArrowFontSize 10
9
skinparam classArrowFontName arial
10
skinparam classAttributeFontColor black
11
skinparam classAttributeFontSize 10
12
skinparam classAttributeFontName arial
13
skinparam classFontColor black
14
skinparam classFontSize 10
15
skinparam classFontName arial
16
skinparam componentFontColor black
17
skinparam componentFontSize 10
18
skinparam componentFontName arial
19
skinparam componentArrowFontColor black
20
skinparam componentArrowFontSize 10
21
skinparam componentArrowFontName arial
22
skinparam noteFontColor black
23
skinparam noteFontSize 10
24
skinparam noteFontName arial
25
skinparam packageFontColor black
26
skinparam packageFontSize 10
27
skinparam packageFontName arial
28
skinparam sequenceActorFontColor black
29
skinparam sequenceActorFontSize 10
30
skinparam sequenceActorFontName arial
31
skinparam sequenceArrowFontColor black
32
skinparam sequenceArrowFontSize 10
33
skinparam sequenceArrowFontName arial
34
skinparam sequenceGroupingFontColor black
35
skinparam sequenceGroupingFontSize 10
36
skinparam sequenceGroupingFontName arial
37
skinparam sequenceGroupingHeaderFontColor black
38
skinparam sequenceGroupingHeaderFontSize 10
39
skinparam sequenceGroupingHeaderFontName arial
40
skinparam sequenceParticipantFontColor black
41
skinparam sequenceParticipantFontSize 10
42
skinparam sequenceParticipantFontName arial
43
skinparam sequenceTitleFontColor black
44
skinparam sequenceTitleFontSize 10
45
skinparam sequenceTitleFontName arial
46
skinparam titleFontColor black
47
skinparam titleFontSize 10
48
skinparam titleFontName arial
49
skinparam usecaseFontColor black
50
skinparam usecaseFontSize 10
51
skinparam usecaseFontName arial
52
skinparam usecaseActorFontColor black
53
skinparam usecaseActorFontSize 10
54
skinparam usecaseActorFontName arial
55
skinparam usecaseArrowFontColor black
56
skinparam usecaseArrowFontSize 10
57
skinparam usecaseArrowFontName arial
docs/dev/metacat/source/identifiers.txt
1
.. raw:: latex
2

  
3
  \newpage
4
  
5

  
6
Identifier Management
7
---------------------
8

  
9
.. index:: Identifiers
10

  
11
Author
12
  Matthew B. Jones
13

  
14
Date
15
  - 20100301 [MBJ] Initial draft of Identifier documentation
16

  
17
Version 
18
  1.9.2
19

  
20
Goal
21
  Extend Metacat to support identifiers with arbitrary syntax
22

  
23
Summary 
24
  Metacat currently supports identifier strings called 'docids' that have
25
  the syntax 'scope.object.revision', such as 'foo.34.1' (we will refer to
26
  these as 'LocalIDs'). We now want Metacat to support identifiers that are 
27
  arbitrary strings, but still enforce uniqueness and proper revision
28
  handling (referred to these as GUIDs).  Metacat must be able to accept 
29
  these strings as identifiers for all CRUD operations, and reference them 
30
  in search results.
31

  
32
Identifier Resolution
33
=====================
34
Because Metacat uses LocalIDs throughout the code for references to objects,
35
and that LocalID has a constrained structure that includes semantics about
36
revisions in the identifier, it is difficult to wholesale replace it with
37
less-constrained string identifiers without re-writing much of Metacat.
38
Thus, our alternate strategy would is to wrap the Metacat APIs with a
39
identifier resolution layer that keeps track of the unconstrained GUIDs and
40
maps them to constrained local identifiers which are used internally within
41
Metacat. The basic identifer table model is shown in Figure 1, while the
42
basic strategy for retrieving an object is shown in Figure 2.
43

  
44

  
45
Identifier Table Structure
46
~~~~~~~~~~~~~~~~~~~~~~~~~~
47

  
48
.. figure:: images/identifiers.png
49

  
50
   Figure 1. Table structure for identifiers.
51

  
52
..
53
  This block defines the table structure diagram referenced above.
54
  @startuml images/identifiers.png
55

  
56
  identifiers "*" -- "1" xml_documents
57

  
58
  identifiers : String identifier
59
  identifiers : String docid
60
  identifiers : Integer rev
61

  
62
  xml_documents : String docid
63
  xml_documents : String rev
64

  
65
  note right of identifiers
66
    "identifiers.(docid,rev) is a foreign key into xml_documents"
67
  end note
68
  @enduml
69

  
70
.. raw:: latex
71

  
72
  \newpage
73

  
74
.. raw:: pdf
75

  
76
  PageBreak
77

  
78

  
79
Handling document read operations
80
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
81

  
82
An overview of the process needed to read an object using a GUID.
83

  
84

  
85
.. figure:: images/guid_read.png
86

  
87
   Figure 2. Basic handling for string identifiers (GUIDs) as mapped to
88
   docids (LocalIDs) to retrieve an object.
89

  
90
..
91
  @startuml images/guid_read.png
92
  !include plantuml.conf
93
  actor User
94
  participant "Client" as app_client << Application >>
95
  participant "CRUD API" as c_crud << MetacatRestServlet >>
96
  participant "Identifier Manager" as ident_man << IdentifierManager >>
97
  participant "Handler" as handler << MetacatHandler >>
98
  User -> app_client
99
  app_client -> c_crud: get(token, GUID)
100
  c_crud -> ident_man: getLocalID(GUID)
101
  c_crud <-- ident_man: localID
102
  c_crud -> handler: handleReadAction(localID)
103
  c_crud <-- handler: object
104
  c_crud --> app_client: object
105
  
106
  @enduml
107

  
108
Handling document create operations
109
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
110

  
111
An overview of the process needed to create an object using a GUID.
112

  
113
.. figure:: images/guid_insert.png
114

  
115
   Figure 3. Basic handling for string identifiers (GUIDs) as mapped to
116
   docids (LocalIDs) to create an object.
117

  
118
..
119
  @startuml images/guid_insert.png
120
  !include plantuml.conf
121
  actor User
122
  participant "Client" as app_client << Application >>
123
  participant "CRUD API" as c_crud << MetacatRestServlet >>
124
  participant "Identifier Manager" as ident_man << IdentifierManager >>
125
  participant "Handler" as handler << MetacatHandler >>
126
  User -> app_client
127
  app_client -> c_crud: create(token, GUID, object, sysmeta)
128
  c_crud -> ident_man: identifierExists(GUID)
129
  c_crud <-- ident_man: T or F 
130
  alt identifierExists == "F"
131
      c_crud -> ident_man: mapToLocalId(GUID)
132
      c_crud <-- ident_man: localID
133
      c_crud -> handler: handleInsertAction(localID)
134
      c_crud <-- handler: success
135
      note right of c_crud
136
        "Also need to address how to handle the sysmeta information wrt insertion methods"
137
      end note
138
      app_client <-- c_crud: success
139
  else identifierExists == "T"
140
      app_client <-- c_crud: IdentifierNotUnique
141
  end
142
  @enduml
143

  
144
Handling document update operations
145
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
146

  
147
An overview of the process needed to update an object using a GUID.
148

  
149
.. figure:: images/guid_update.png
150

  
151
   Figure 4. Basic handling for string identifiers (GUIDs) as mapped to
152
   docids (LocalIDs) to update an object.
153

  
154
..
155
  @startuml images/guid_update.png
156
  !include plantuml.conf
157
  actor User
158
  participant "Client" as app_client << Application >>
159
  participant "CRUD API" as c_crud << MetacatRestServlet >>
160
  participant "Identifier Manager" as ident_man << IdentifierManager >>
161
  participant "Handler" as handler << MetacatHandler >>
162
  User -> app_client
163
  app_client -> c_crud: update(token, GUID, object, obsoletedGUID, sysmeta)
164

  
165
  c_crud -> ident_man: identifierExists(obsoletedGUID)
166
  c_crud <-- ident_man: T or F 
167
  alt identifierExists == "T"
168

  
169
      c_crud -> ident_man: identifierExists(GUID)
170
      c_crud <-- ident_man: T or F 
171
      alt identifierExists == "F"
172
          c_crud -> ident_man: mapToLocalId(GUID, obsoletedGUID)
173
          c_crud <-- ident_man: localID
174
          c_crud -> handler: handleUpdateAction(localID)
175
          c_crud <-- handler: success
176
          note right of c_crud
177
            "Also need to address how to handle the sysmeta information wrt update methods"
178
          end note
179
          app_client <-- c_crud: success
180
      else identifierExists == "T"
181
          app_client <-- c_crud: IdentifierNotUnique
182
      end
183
  else identifierExists == "F"
184
      app_client <-- c_crud: NotFound
185
  end
186
  @enduml
187

  
188
Handling document delete operations
189
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
190

  
191
An overview of the process needed to delete an object using a GUID.
192

  
193
.. figure:: images/guid_delete.png
194

  
195
   Figure 5. Basic handling for string identifiers (GUIDs) as mapped to
196
   docids (LocalIDs) to delete an object.
197

  
198
..
199
  @startuml images/guid_delete.png
200
  !include plantuml.conf
201
  actor User
202
  participant "Client" as app_client << Application >>
203
  participant "CRUD API" as c_crud << MetacatRestServlet >>
204
  participant "Identifier Manager" as ident_man << IdentifierManager >>
205
  participant "Handler" as handler << MetacatHandler >>
206
  User -> app_client
207
  app_client -> c_crud: delete(token, GUID)
208
  c_crud -> ident_man: identifierExists(GUID)
209
  c_crud <-- ident_man: T or F 
210
  alt identifierExists == "T"
211
      c_crud -> ident_man: mapToLocalId(GUID)
212
      c_crud <-- ident_man: localID
213
      c_crud -> handler: handleDeleteAction(localID)
214
      c_crud <-- handler: success
215
      app_client <-- c_crud: success
216
  else identifierExists == "F"
217
      app_client <-- c_crud: NotFound
218
  end
219
  @enduml
220

  
221
..
222
  This block defines the interaction diagram referenced above.
223
  startuml images/01_interaction.png
224
    !include plantuml.conf
225
    actor User
226
    participant "Client" as app_client << Application >>
227
    User -> app_client
228

  
229
    participant "CRUD API" as c_crud << Coordinating Node >>
230
    activate c_crud
231
    app_client -> c_crud: resolve(GUID, auth_token)
232
    participant "Authorization API" as c_authorize << Coordinating Node >>
233
    c_crud -> c_authorize: isAuth(auth_token, GUID)
234
    participant "Verify API" as c_ver << Coordinating Node >>
235
    c_authorize -> c_ver: isValidToken (token)
236
    c_authorize <-- c_ver: T or F
237
    c_crud <-- c_authorize: T or F
238
    app_client <-- c_crud: handle_list
239
    deactivate c_crud
240

  
241
    participant "CRUD API" as m_crud << Member Node >>
242
    activate m_crud
243
    app_client -> m_crud: get(auth_token, handle)
244
    participant "Server Authentication API" as m_authenticate << Member Node >>
245
    m_crud -> m_authenticate: isAuth(auth_token, GUID)
246
    m_crud <-- m_authenticate: T or F
247
    m_crud -> m_crud: log(get, UserID, GUID)
248
    app_client <-- m_crud: object or unauth or doesNotExist
249
    deactivate m_crud
250
  enduml
0 251

  
docs/dev/metacat/source/index.txt
1
.. Metacat documentation master file, created by
2
   sphinx-quickstart on Mon Mar  1 14:16:16 2010.
3
   You can adapt this file completely to your liking, but it should at least
4
   contain the root `toctree` directive.
5

  
6
Welcome to Metacat's documentation!
7
===================================
8

  
9
Contents:
10

  
11
.. toctree::
12
   :maxdepth: 2
13

  
14
   identifiers.txt
15

  
16
Indices and tables
17
==================
18

  
19
* :ref:`genindex`
20
* :ref:`modindex`
21
* :ref:`search`
22

  
0 23

  
docs/dev/metacat/source/themes/readable/layout.html
1
{%- block doctype -%}
2
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
3
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4
{%- endblock %}
5
{%- set reldelim1 = reldelim1 is not defined and ' &raquo;' or reldelim1 %}
6
{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
7

  
8
{%- macro relbar() %}
9
    <div class="related">
10
      <h3>{{ _('Navigation') }}</h3>
11
      <ul>
12

  
13
        {%- if pagename != "search" %}
14
        <li class="right">
15
        <span id="searchbox" style="display: none; margin-right: 10px">
16
            <form class="search" action="{{ pathto('search') }}" method="get">
17
              <input type="text" name="q" size="18" />
18
              <input type="submit" value="{{ _('Go') }}" />
19
              <input type="hidden" name="check_keywords" value="yes" />
20
              <input type="hidden" name="area" value="default" />
21
            </form>
22
        </span>
23
        </li>
24
        <script type="text/javascript">$('#searchbox').show(0);</script>
25
        {%- endif %}
26

  
27

  
28
        {%- for rellink in rellinks %}
29
        <li class="right">
30
          <a href="{{ pathto(rellink[0]) }}" title="{{ rellink[1]|striptags }}"
31
             {{ accesskey(rellink[2]) }}>{{ rellink[3] }}</a>
32
          {{ reldelim2 }}</li>
33
        {%- endfor %}
34

  
35

  
36

  
37
        {%- block rootrellink %}
38
        <li><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a>{{ reldelim1 }}</li>
39
        {%- endblock %}
40
        {%- for parent in parents %}
41
          <li><a href="{{ parent.link|e }}" {% if loop.last %}{{ accesskey("U") }}{% endif %}>{{ parent.title }}</a>{{ reldelim1 }}</li>
42
        {%- endfor %}
43
        {%- block relbaritems %} {% endblock %}
44
      </ul>
45
      
46
    </div>
47
{%- endmacro %}
48

  
49
{%- macro sidebar() %}
50
      {%- if not embedded %}{% if not theme_nosidebar|tobool %}
51
      <div class="sphinxsidebar">
52
        <div class="sphinxsidebarwrapper">
53
          {%- block sidebarlogo %}
54
          {%- if logo %}
55
            <p class="logo"><a href="{{ pathto(master_doc) }}">
56
              <img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/>
57
            </a></p>
58
          {%- endif %}
59
          {%- endblock %}
60
          {%- block sidebartoc %}
61
          {%- if display_toc %}
62
            <h3><a href="{{ pathto(master_doc) }}">{{ _('Table Of Contents') }}</a></h3>
63
            {{ toc }}
64
          {%- endif %}
65
          {%- endblock %}
66
          {%- block sidebarrel %}
67
          {%- if prev %}
68
            <h4>{{ _('Previous topic') }}</h4>
69
            <p class="topless"><a href="{{ prev.link|e }}"
70
                                  title="{{ _('previous chapter') }}">{{ prev.title }}</a></p>
71
          {%- endif %}
72
          {%- if next %}
73
            <h4>{{ _('Next topic') }}</h4>
74
            <p class="topless"><a href="{{ next.link|e }}"
75
                                  title="{{ _('next chapter') }}">{{ next.title }}</a></p>
76
          {%- endif %}
77
          {%- endblock %}
78
          {%- block sidebarsourcelink %}
79
          {%- if show_source and has_source and sourcename %}
80
            <h3>{{ _('This Page') }}</h3>
81
            <ul class="this-page-menu">
82
              <li><a href="{{ pathto('_sources/' + sourcename, true)|e }}"
83
                     rel="nofollow">{{ _('Show Source') }}</a></li>
84
            </ul>
85
          {%- endif %}
86
          {%- endblock %}
87
          {%- if customsidebar %}
88
          {% include customsidebar %}
89
          {%- endif %}
90
          {%- block sidebarsearch %}
91
          {%- if pagename != "search" %}
92
          <div id="searchbox" style="display: none">
93
            <h3>{{ _('Quick search') }}</h3>
94
              <form class="search" action="{{ pathto('search') }}" method="get">
95
                <input type="text" name="q" size="18" />
96
                <input type="submit" value="{{ _('Go') }}" />
97
                <input type="hidden" name="check_keywords" value="yes" />
98
                <input type="hidden" name="area" value="default" />
99
              </form>
100
              <p class="searchtip" style="font-size: 90%">
101
              {{ _('Enter search terms or a module, class or function name.') }}
102
              </p>
103
          </div>
104
          <script type="text/javascript">$('#searchbox').show(0);</script>
105
          {%- endif %}
106
          {%- endblock %}
107
        </div>
108
      </div>
109
      {%- endif %}{% endif %}
110
{%- endmacro %}
111

  
112
<html xmlns="http://www.w3.org/1999/xhtml">
113
  <head>
114
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
115
    {{ metatags }}
116
    {%- if not embedded %}
117
      {%- set titlesuffix = " &mdash; "|safe + docstitle|e %}
118
    {%- else %}
119
      {%- set titlesuffix = "" %}
120
    {%- endif %}
121
    <title>{{ title|striptags }}{{ titlesuffix }}</title>
122
    <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
123
    <link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
124
    {%- if not embedded %}
125
    <script type="text/javascript">
126
      var DOCUMENTATION_OPTIONS = {
127
        URL_ROOT:    '{{ pathto("", 1) }}',
128
        VERSION:     '{{ release|e }}',
129
        COLLAPSE_MODINDEX: false,
130
        FILE_SUFFIX: '{{ file_suffix }}',
131
        HAS_SOURCE:  {{ has_source|lower }}
132
      };
133
    </script>
134
    {%- for scriptfile in script_files %}
135
    <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
136
    {%- endfor %}
137
    {%- if use_opensearch %}
138
    <link rel="search" type="application/opensearchdescription+xml"
139
          title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
140
          href="{{ pathto('_static/opensearch.xml', 1) }}"/>
141
    {%- endif %}
142
    {%- if favicon %}
143
    <link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
144
    {%- endif %}
145
    {%- endif %}
146
{%- block linktags %}
147
    {%- if hasdoc('about') %}
148
    <link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
149
    {%- endif %}
150
    {%- if hasdoc('genindex') %}
151
    <link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" />
152
    {%- endif %}
153
    {%- if hasdoc('search') %}
154
    <link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" />
155
    {%- endif %}
156
    {%- if hasdoc('copyright') %}
157
    <link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
158
    {%- endif %}
159
    <link rel="top" title="{{ docstitle|e }}" href="{{ pathto('index') }}" />
160
    {%- if parents %}
161
    <link rel="up" title="{{ parents[-1].title|striptags }}" href="{{ parents[-1].link|e }}" />
162
    {%- endif %}
163
    {%- if next %}
164
    <link rel="next" title="{{ next.title|striptags }}" href="{{ next.link|e }}" />
165
    {%- endif %}
166
    {%- if prev %}
167
    <link rel="prev" title="{{ prev.title|striptags }}" href="{{ prev.link|e }}" />
168
    {%- endif %}
169
{%- endblock %}
170
{%- block extrahead %} {% endblock %}
171
  </head>
172
  <body>
173
{%- block header %}{% endblock %}
174

  
175
{%- block relbar1 %}{{ relbar() }}{% endblock %}
176

  
177
{# Comment out the sidebar
178
  {%- block sidebar1 %} {# possible location for sidebar  {% endblock %}
179
#}
180
    <div class="document">
181
{%- block document %}
182
      <div class="documentwrapper">
183
      {%- if not embedded %}{% if not theme_nosidebar|tobool %}
184
        <div class="bodywrapper">
185
      {%- endif %}{% endif %}
186
          <div class="body">
187
            {% block body %} {% endblock %}
188
          </div>
189
      {%- if not embedded %}{% if not theme_nosidebar|tobool %}
190
        </div>
191
      {%- endif %}{% endif %}
192
      </div>
193
{%- endblock %}
194

  
195
{# {%- block sidebar2 %}{{ sidebar() }}{% endblock %} #}
196
      <div class="clearer"></div>
197
    </div>
198

  
199
{%- block relbar2 %}{{ relbar() }}{% endblock %}
200

  
201
{%- block footer %}
202
    <div class="footer">
203
    {%- if hasdoc('copyright') %}
204
      {% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
205
    {%- else %}
206
      {% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %}
207
    {%- endif %}
208
    {%- if last_updated %}
209
      {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
210
    {%- endif %}
211
    {%- if show_sphinx %}
212
      {% trans sphinx_version=sphinx_version|e %}Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %}
213
    {%- endif %}
214
    </div>
215
{%- endblock %}
216
  </body>
217
</html>
docs/dev/metacat/source/themes/readable/theme.conf
1
[theme]
2
inherit = sphinxdoc
3
stylesheet = readable.css
4
pygments_style = sphinx
5

  
6
[options]
7
bgcolor = #FFFFFF
docs/dev/metacat/source/themes/readable/static/readable.css
1
/**
2
 * Sphinx theme based on sphinxdoc and arc90 readability.css
3
 * Dave Vieglais
4
 */
5

  
6
body {
7
    font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', 'Verdana', sans-serif;
8
    /*font-family:"Palatino Linotype", "Book Antiqua", Palatino, serif;*/
9
    font-size: 14px;
10
    letter-spacing: -0.01em;
11
    line-height: 150%;
12
    text-align: center;
13
    /*background-color: #BFD1D4;*/
14
    /*background: #F4F3DB;*/
15
    background: white;
16
    color: black;
17
    /*color: #222;*/
18
    padding: 0;
19
    /*border: 1px solid #aaa;*/
20

  
21
    margin: 0px 80px 0px 80px;
22
    min-width: 740px;
23
}
24

  
25
a {
26
    /*color: #CA7900;*/
27
    color: #003399;
28
    text-decoration: none;
29
}
30

  
31
a:hover {
32
    /*color: #2491CF;*/
33
    text-decoration:underline;
34
}
35

  
36
pre {
37
    font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
38
    font-size: 0.95em;
39
    letter-spacing: 0.015em;
40
    padding: 0.5em;
41
    border: 1px solid #ccc;
42
    background-color: #f8f8f8;
43
}
44

  
45
td.linenos pre {
46
    padding: 0.5em 0;
47
    border: 0;
48
    background-color: transparent;
49
    color: #aaa;
50
}
51

  
52
table.highlighttable {
53
    margin-left: 0.5em;
54
}
55

  
56
table.highlighttable td {
57
    padding: 0 0.5em 0 0.5em;
58
}
59

  
60
cite, code, tt {
61
    font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
62
    font-size: 0.95em;
63
    letter-spacing: 0.01em;
64
}
65

  
66
hr {
67
    border: 1px solid #abc;
68
    margin: 2em;
69
}
70

  
71
tt {
72
    background-color: #f2f2f2;
73
    border-bottom: 1px solid #ddd;
74
    color: #333;
75
}
76

  
77
tt.descname {
78
    background-color: transparent;
79
    font-weight: bold;
80
    font-size: 1.2em;
81
    border: 0;
82
}
83

  
84
tt.descclassname {
85
    background-color: transparent;
86
    border: 0;
87
}
88

  
89
tt.xref {
90
    background-color: transparent;
91
    font-weight: bold;
92
    border: 0;
93
}
94

  
95
a tt {
96
    background-color: transparent;
97
    font-weight: bold;
98
    border: 0;
99
    /*color: #CA7900;*/
100
    color: inherit;
101
}
102

  
103
/*a tt:hover {
104
    color: #2491CF;
105
}*/
106

  
107
.field-list ul {
108
    margin: 0;
109
    padding-left: 1em;
110
}
111

  
112
.field-list p {
113
    margin: 0;
114
}
115

  
116
dl {
117
    margin-bottom: 15px;
118
}
119

  
120
dd p {
121
    margin-top: 0px;
122
}
123

  
124
dd ul, dd table {
125
    margin-bottom: 10px;
126
}
127

  
128
dd {
129
    margin-top: 3px;
130
    margin-bottom: 10px;
131
    margin-left: 30px;
132
}
133

  
134
.refcount {
135
    color: #060;
136
}
137

  
138
dt:target,
139
.highlight {
140
    background-color: #fbe54e;
141
}
142

  
143
dl.glossary dt {
144
    font-weight: bold;
145
    font-size: 1.1em;
146
}
147

  
148
pre {
149
    line-height: 120%;
150
}
151

  
152
pre a {
153
    color: inherit;
154
    /*text-decoration: underline;*/
155
}
156

  
157
.first {
158
    margin-top: 0 !important;
159
}
160

  
161
div.document {
162
    background-color: white;
163
    text-align: left;
164
    background-image: url(contents.png);
165
    background-repeat: repeat-x;
166
}
167

  
168
/*
169
div.documentwrapper {
170
    width: 100%;
171
}
172
*/
173

  
174
div.clearer {
175
    clear: both;
176
}
177

  
178
div.related h3 {
179
    display: none;
180
}
181

  
182
div.related ul {
183
    background-image: url(navigation.png);
184
    height: 2em;
185
    list-style: none;
186
    border-top: 1px solid #ddd;
187
    border-bottom: 1px solid #ddd;
188
    margin: 0;
189
    padding-left: 10px;
190
}
191

  
192
div.related ul li {
193
    margin: 0;
194
    padding: 0;
195
    height: 2em;
196
    float: left;
197
}
198

  
199
div.related ul li.right {
200
    float: right;
201
    margin-right: 5px;
202
}
203

  
204
div.related ul li a {
205
    margin: 0;
206
    padding: 0 5px 0 5px;
207
    line-height: 1.75em;
208
    /*color: #EE9816;*/
209
    color: #555;
210
}
211

  
212
div.related ul li a:hover {
213
    /*color: #3CA8E7;*/
214
}
215

  
216
div.body {
217
    margin: 0;
218
    padding: 0.5em 20px 20px 20px;
219
}
220

  
221
div.bodywrapper {
222
    /*margin: 0 240px 0 0;*/
223
    /*border-right: 1px solid #ccc;*/
224
}
225

  
226
div.body a {
227
    /*text-decoration: underline;*/
228
    text-decoration:inherit;
229
}
230

  
231
div.body a:hover {
232
  text-decoration: underline;
233
}
234

  
235
div.sphinxsidebar {
236
    margin: 0;
237
    padding: 0.5em 15px 15px 0;
238
    width: 210px;
239
    float: right;
240
    text-align: left;
241
/*    margin-left: -100%; */
242
}
243

  
244
div.sphinxsidebarwrapper {
245
  position: fixed;
246
  width: 210px;
247
}
248

  
249
div.sphinxsidebar h4, div.sphinxsidebar h3 {
250
    font-size: 0.9em;
251
    /*margin: 1em 0 0.5em 0;
252
    padding: 0.1em 0 0.1em 0.5em;
253
    color: white;
254
    border: 1px solid #86989B;
255
    background-color: #AFC1C4; */
256
}
257

  
258
div.sphinxsidebar h3 a {
259
    color: white;
260
}
261

  
262
div.sphinxsidebar a {
263
  color: #555;
264
}
265

  
266
div.sphinxsidebar ul {
267
    padding-left: 1.5em;
268
    margin-top: 7px;
269
    list-style: none;
270
    padding: 0;
271
    line-height: 130%;
272
}
273

  
274
div.sphinxsidebar ul ul {
275
    list-style: square;
276
    margin-left: 20px;
277
}
278

  
279
p {
280
    margin: 0.8em 0 0.5em 0;
281
}
282

  
283
p.rubric {
284
    font-weight: bold;
285
}
286

  
287
div.sidebar {
288
    margin: 0 0 0.5em 1em;
289
    border: 1px solid #ddb;
290
    padding: 7px 7px 0 7px;
291
    background-color: #ffe;
292
    width: 40%;
293
    float: right;
294
}
295

  
296
div.quotebar {
297
    background-color: #f8f8f8;
298
    max-width: 250px;
299
    float: right;
300
    padding: 2px 7px;
301
    border: 1px solid #ccc;
302
}
303

  
304
p.sidebar-title {
305
    font-weight: bold;
306
}
307

  
308
div.topic {
309
    background-color: #f8f8f8;
310
    border: 1px solid #ccc;
311
    padding: 7px 7px 0 7px;
312
    margin: 10px 0 10px 0;
313
}
314

  
315
p.topic-title {
316
    font-size: 1.1em;
317
    font-weight: bold;
318
}
319

  
320
h1 {
321
    margin: 0;
322
    padding: 0.7em 0 0.3em 0;
323
    /*font-size: 1.5em;*/
324
    /*color: #11557C;*/
325
    display: block;
326
    border-bottom: 1px solid #333;
327
    font-size: 1.4em;
328
}
329

  
330
h2 {
331
    margin: 1.3em 0 0.2em 0;
332
    font-size: 1.35em;
333
    padding: 0;
334
}
335

  
336
h3 {
337
    margin: 1em 0 -0.3em 0;
338
    font-size: 1.2em;
339
}
340

  
341
div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a {
342
    color: black!important;
343
}
344

  
345
h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor {
346
    display: none;
347
    margin: 0 0 0 0.3em;
348
    padding: 0 0.2em 0 0.2em;
349
    color: #aaa!important;
350
}
351

  
352
h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor,
353
h5:hover a.anchor, h6:hover a.anchor {
354
    display: inline;
355
}
356

  
357
h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover,
358
h5 a.anchor:hover, h6 a.anchor:hover {
359
    color: #777;
360
    background-color: #eee;
361
}
362

  
363
table {
364
    border-collapse: collapse;
365
    margin: 0 -0.5em 0 -0.5em;
366
}
367

  
368
table td, table th {
369
    padding: 0.2em 0.5em 0.2em 0.5em;
370
}
371

  
372
div.footer {
373
    /*background-color: #E3EFF1;*/
374
    color: #86989B;
375
    padding: 3px 8px 3px 0;
376
    clear: both;
377
    font-size: 0.8em;
378
    text-align: right;
379
}
380

  
381
div.footer a {
382
    color: #86989B;
383
    text-decoration: underline;
384
}
385

  
386
div.pagination {
387
    margin-top: 2em;
388
    padding-top: 0.5em;
389
    border-top: 1px solid black;
390
    text-align: center;
391
}
392

  
393
div.sphinxsidebar ul.toc {
394
    margin: 1em 0 1em 0;
395
    padding: 0 0 0 0.5em;
396
    list-style: none;
397
}
398

  
399
div.sphinxsidebar ul.toc li {
400
    margin: 0.5em 0 0.5em 0;
401
    font-size: 0.9em;
402
    line-height: 130%;
403
}
404

  
405
div.sphinxsidebar ul.toc li p {
406
    margin: 0;
407
    padding: 0;
408
}
409

  
410
div.sphinxsidebar ul.toc ul {
411
    margin: 0.2em 0 0.2em 0;
412
    padding: 0 0 0 1.8em;
413
}
414

  
415
div.sphinxsidebar ul.toc ul li {
416
    padding: 0;
417
}
418

  
419
div.admonition, div.warning {
420
    font-size: 0.9em;
421
    margin: 1em 0 0 0;
422
    border: 1px solid #86989B;
423
    background-color: #f7f7f7;
424
}
425

  
426
div.admonition p, div.warning p {
427
    margin: 0.5em 1em 0.5em 1em;
428
    padding: 0;
429
}
430

  
431
div.admonition pre, div.warning pre {
432
    margin: 0.4em 1em 0.4em 1em;
433
}
434

  
435
div.admonition p.admonition-title,
436
div.warning p.admonition-title {
437
    margin: 0;
438
    padding: 0.1em 0 0.1em 0.5em;
439
    color: white;
440
    border-bottom: 1px solid #86989B;
441
    font-weight: bold;
442
    background-color: #AFC1C4;
443
}
444

  
445
div.warning {
446
    border: 1px solid #940000;
447
}
448

  
449
div.warning p.admonition-title {
450
    background-color: #CF0000;
451
    border-bottom-color: #940000;
452
}
453

  
454
div.admonition ul, div.admonition ol,
455
div.warning ul, div.warning ol {
456
    margin: 0.1em 0.5em 0.5em 3em;
457
    padding: 0;
458
}
459

  
460
div.versioninfo {
461
    margin: 1em 0 0 0;
462
    border: 1px solid #ccc;
463
    background-color: #DDEAF0;
464
    padding: 8px;
465
    line-height: 1.3em;
466
    font-size: 0.9em;
467
}
468

  
469

  
470
a.headerlink {
471
    color: #c60f0f!important;
472
    font-size: 1em;
473
    margin-left: 6px;
474
    padding: 0 4px 0 4px;
475
    text-decoration: none!important;
476
    visibility: hidden;
477
}
478

  
479
h1:hover > a.headerlink,
480
h2:hover > a.headerlink,
481
h3:hover > a.headerlink,
482
h4:hover > a.headerlink,
483
h5:hover > a.headerlink,
484
h6:hover > a.headerlink,
485
dt:hover > a.headerlink {
486
    visibility: visible;
487
}
488

  
489
a.headerlink:hover {
490
    background-color: #ccc;
491
    color: white!important;
492
}
493

  
494
table.indextable td {
495
    text-align: left;
496
    vertical-align: top;
497
}
498

  
499
table.indextable dl, table.indextable dd {
500
    margin-top: 0;
501
    margin-bottom: 0;
502
}
503

  
504
table.indextable tr.pcap {
505
    height: 10px;
506
}
507

  
508
table.indextable tr.cap {
509
    margin-top: 10px;
510
    background-color: #f2f2f2;
511
}
512

  
513
img.toggler {
514
    margin-right: 3px;
515
    margin-top: 3px;
516
    cursor: pointer;
517
}
518

  
519
form.pfform {
520
    margin: 10px 0 20px 0;
521
}
522

  
523
table.contentstable {
524
    width: 90%;
525
}
526

  
527
table.contentstable p.biglink {
528
    line-height: 150%;
529
}
530

  
531
a.biglink {
532
    font-size: 1.3em;
533
}
534

  
535
span.linkdescr {
536
    font-style: italic;
537
    padding-top: 5px;
538
    font-size: 90%;
539
}
540

  
541
ul.search {
542
    margin: 10px 0 0 20px;
543
    padding: 0;
544
}
545

  
546
ul.search li {
547
    padding: 5px 0 5px 20px;
548
    background-image: url(file.png);
549
    background-repeat: no-repeat;
550
    background-position: 0 7px;
551
}
552

  
553
ul.search li a {
554
    font-weight: bold;
555
}
556

  
557
ul.search li div.context {
558
    color: #888;
559
    margin: 2px 0 0 30px;
560
    text-align: left;
561
}
562

  
563
ul.keywordmatches li.goodmatch a {
564
    font-weight: bold;
565
}
566

  
567
img.math {
568
    vertical-align: center;
569
}
570

  
571
div.math {
572
    text-align: center;
573
}
574

  
575
span.eqno {
576
    float: right;
577
}
578

  
579
img.logo {
580
    border: 0;
581
}
docs/dev/metacat/source/conf.py
1
# -*- coding: utf-8 -*-
2
#
3
# Metacat documentation build configuration file, created by
4
# sphinx-quickstart on Mon Mar  1 14:16:16 2010.
5
#
6
# This file is execfile()d with the current directory set to its containing dir.
7
#
8
# Note that not all possible configuration values are present in this
9
# autogenerated file.
10
#
11
# All configuration values have a default; values that are commented out
12
# serve to show the default.
13

  
14
import sys, os
15

  
16
# If extensions (or modules to document with autodoc) are in another directory,
17
# add these directories to sys.path here. If the directory is relative to the
18
# documentation root, use os.path.abspath to make it absolute, like shown here.
19
#sys.path.append(os.path.abspath('.'))
20

  
21
# -- General configuration -----------------------------------------------------
22

  
23
# Add any Sphinx extension module names here, as strings. They can be extensions
24
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
25
extensions = []
26

  
27
# Add any paths that contain templates here, relative to this directory.
28
templates_path = ['_templates']
29

  
30
# The suffix of source filenames.
31
source_suffix = '.txt'
32

  
33
# The encoding of source files.
34
#source_encoding = 'utf-8'
35

  
36
# The master toctree document.
37
master_doc = 'index'
38

  
39
# General information about the project.
40
project = u'Metacat'
41
copyright = u'2010, Matthew B. Jones'
42

  
43
# The version info for the project you're documenting, acts as replacement for
44
# |version| and |release|, also used in various other places throughout the
45
# built documents.
46
#
47
# The short X.Y version.
48
version = '2.0'
49
# The full version, including alpha/beta/rc tags.
50
release = '2.0.0'
51

  
52
# The language for content autogenerated by Sphinx. Refer to documentation
53
# for a list of supported languages.
54
#language = None
55

  
56
# There are two options for replacing |today|: either, you set today to some
57
# non-false value, then it is used:
58
#today = ''
59
# Else, today_fmt is used as the format for a strftime call.
60
#today_fmt = '%B %d, %Y'
61

  
62
# List of documents that shouldn't be included in the build.
63
#unused_docs = []
64

  
65
# List of directories, relative to source directory, that shouldn't be searched
66
# for source files.
67
exclude_trees = []
68

  
69
# The reST default role (used for this markup: `text`) to use for all documents.
70
#default_role = None
71

  
72
# If true, '()' will be appended to :func: etc. cross-reference text.
73
#add_function_parentheses = True
74

  
75
# If true, the current module name will be prepended to all description
76
# unit titles (such as .. function::).
77
#add_module_names = True
78

  
79
# If true, sectionauthor and moduleauthor directives will be shown in the
80
# output. They are ignored by default.
81
#show_authors = False
82

  
83
# The name of the Pygments (syntax highlighting) style to use.
84
pygments_style = 'sphinx'
85

  
86
# A list of ignored prefixes for module index sorting.
87
#modindex_common_prefix = []
88

  
89

  
90
# -- Options for HTML output ---------------------------------------------------
91

  
92
# The theme to use for HTML and HTML Help pages.  Major themes that come with
93
# Sphinx are currently 'default' and 'sphinxdoc'.
94
#html_theme = 'default'
95
html_theme = 'readable'
96

  
97
# Theme options are theme-specific and customize the look and feel of a theme
98
# further.  For a list of options available for each theme, see the
99
# documentation.
100
#html_theme_options = {}
101

  
102
# Add any paths that contain custom themes here, relative to this directory.
103
html_theme_path = ['themes',]
104

  
105
# The name for this set of Sphinx documents.  If None, it defaults to
106
# "<project> v<release> documentation".
107
#html_title = None
108

  
109
# A shorter title for the navigation bar.  Default is the same as html_title.
110
#html_short_title = None
111

  
112
# The name of an image file (relative to this directory) to place at the top
113
# of the sidebar.
114
#html_logo = None
115

  
116
# The name of an image file (within the static path) to use as favicon of the
117
# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
118
# pixels large.
119
#html_favicon = None
120

  
121
# Add any paths that contain custom static files (such as style sheets) here,
122
# relative to this directory. They are copied after the builtin static files,
123
# so a file named "default.css" will overwrite the builtin "default.css".
124
html_static_path = ['_static']
125

  
126
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
127
# using the given strftime format.
128
#html_last_updated_fmt = '%b %d, %Y'
129

  
130
# If true, SmartyPants will be used to convert quotes and dashes to
131
# typographically correct entities.
132
#html_use_smartypants = True
133

  
134
# Custom sidebar templates, maps document names to template names.
135
#html_sidebars = {}
136

  
137
# Additional templates that should be rendered to pages, maps page names to
138
# template names.
139
#html_additional_pages = {}
140

  
141
# If false, no module index is generated.
142
#html_use_modindex = True
143

  
144
# If false, no index is generated.
145
#html_use_index = True
146

  
147
# If true, the index is split into individual pages for each letter.
148
#html_split_index = False
149

  
150
# If true, links to the reST sources are added to the pages.
151
#html_show_sourcelink = True
152

  
153
# If true, an OpenSearch description file will be output, and all pages will
154
# contain a <link> tag referring to it.  The value of this option must be the
155
# base URL from which the finished HTML is served.
156
#html_use_opensearch = ''
157

  
158
# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
159
#html_file_suffix = ''
160

  
161
# Output file base name for HTML help builder.
162
htmlhelp_basename = 'Metacatdoc'
163

  
164

  
165
# -- Options for LaTeX output --------------------------------------------------
166

  
167
# The paper size ('letter' or 'a4').
168
#latex_paper_size = 'letter'
169

  
170
# The font size ('10pt', '11pt' or '12pt').
171
#latex_font_size = '10pt'
172

  
173
# Grouping the document tree into LaTeX files. List of tuples
174
# (source start file, target name, title, author, documentclass [howto/manual]).
175
latex_documents = [
176
  ('index', 'Metacat.tex', u'Metacat Documentation',
177
   u'Matthew B. Jones', 'manual'),
178
]
179

  
180
# The name of an image file (relative to this directory) to place at the top of
181
# the title page.
182
#latex_logo = None
183

  
184
# For "manual" documents, if this is true, then toplevel headings are parts,
185
# not chapters.
186
#latex_use_parts = False
187

  
188
# Additional stuff for the LaTeX preamble.
189
#latex_preamble = ''
190

  
191
# Documents to append as an appendix to all manuals.
192
#latex_appendices = []
193

  
194
# If false, no module index is generated.
195
#latex_use_modindex = True
docs/dev/metacat/Makefile
1
# Makefile for Sphinx documentation
2
#
3

  
4
# You can set these variables from the command line.
5
SPHINXOPTS    =
6
SPHINXBUILD   = sphinx-build
7
PAPER         =
8
BUILDDIR      = build
9
GRAPHVIZ      = /opt/local/bin/dot
10

  
11
# Internal variables.
12
PAPEROPT_a4     = -D latex_paper_size=a4
13
PAPEROPT_letter = -D latex_paper_size=letter
14
ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
15

  
16
.PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest pdf
17

  
18
help:
19
	@echo "Please use \`make <target>' where <target> is one of"
20
	@echo "  html      to make standalone HTML files"
21
	@echo "  dirhtml   to make HTML files named index.html in directories"
22
	@echo "  pickle    to make pickle files"
23
	@echo "  json      to make JSON files"
24
	@echo "  htmlhelp  to make HTML files and a HTML help project"
25
	@echo "  qthelp    to make HTML files and a qthelp project"
26
	@echo "  latex     to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
27
	@echo "  changes   to make an overview of all changed/added/deprecated items"
28
	@echo "  linkcheck to check all external links for integrity"
29
	@echo "  doctest   to run all doctests embedded in the documentation (if enabled)"
30
	@echo "  pdf       to make PDF files"
31

  
32
clean:
33
	-rm -rf $(BUILDDIR)/*
34

  
35
plantuml:
36
	GRAPHVIZ_DOT=$(GRAPHVIZ) plantuml source 
37

  
38
html: 
39
	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
40
	@echo
41
	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
42

  
43
dirhtml:
44
	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
45
	@echo
46
	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
47

  
48
pickle:
49
	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
50
	@echo
51
	@echo "Build finished; now you can process the pickle files."
52

  
53
json:
54
	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
55
	@echo
56
	@echo "Build finished; now you can process the JSON files."
57

  
58
pdf:
59
	$(SPHINXBUILD) -b pdf $(ALLSPHINXOPTS) $(BUILDDIR)/pdf
60
	@echo
61
	@echo "Build finished. The PDF files are in $(BUILDDIR)/pdf."
62

  
63
htmlhelp:
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff