def env(self):
return self.state.document.settings.env
+ @classmethod
+ def changes(cls, env):
+ return env.temp_data['ChangeLogDirective_changes']
+
class ChangeLogDirective(EnvDirective, Directive):
has_content = True
- type_ = "change"
-
default_section = 'misc'
def _organize_by_section(self, changes):
bysection = collections.defaultdict(list)
all_sections = set()
for rec in changes:
+ if self.version not in rec['versions']:
+ continue
inner_tag = rec['tags'].intersection(self.inner_tag_sort)
if inner_tag:
inner_tag = inner_tag.pop()
bysection[(self.default_section, inner_tag)].append(rec)
return bysection, all_sections
- @classmethod
- def changes(cls, env):
- return env.temp_data['ChangeLogDirective_%s_changes' % cls.type_]
-
def _setup_run(self):
self.sections = self.env.config.changelog_sections
self.inner_tag_sort = self.env.config.changelog_inner_tag_sort + [""]
- self.env.temp_data['ChangeLogDirective_%s_changes' % self.type_] = []
+ if 'ChangeLogDirective_changes' not in self.env.temp_data:
+ self.env.temp_data['ChangeLogDirective_changes'] = []
self._parsed_content = _parse_content(self.content)
+ self.version = version = self._parsed_content.get('version', '')
+ self.env.temp_data['ChangeLogDirective_version'] = version
+
p = nodes.paragraph('', '',)
self.state.nested_parse(self.content[1:], 0, p)
def run(self):
self._setup_run()
+
+ if 'ChangeLogDirective_includes' in self.env.temp_data:
+ return []
+
changes = self.changes(self.env)
output = []
- self.version = version = self._parsed_content.get('version', '')
- id_prefix = "%s-%s" % (self.type_, version)
+ id_prefix = "change-%s" % (self.version, )
topsection = self._run_top(id_prefix)
output.append(topsection)
text = _text_rawsource_from_node(para)
to_hash = "%s %s" % (self.version, text[0:100])
- targetid = "%s-%s" % (self.type_,
+ targetid = "change-%s" % (
md5.md5(to_hash.encode('ascii', 'ignore')
).hexdigest())
targetnode = nodes.target('', '', ids=[targetid])
)
para.append(permalink)
+ if len(rec['versions']) > 1:
+
+ backported_changes = rec['sorted_versions'][rec['sorted_versions'].index(self.version) + 1:]
+ if backported_changes:
+ backported = nodes.paragraph('')
+ backported.append(nodes.Text("This change is also ", ""))
+ backported.append(nodes.strong("", "backported"))
+ backported.append(nodes.Text(" to: %s" % ", ".join(backported_changes), ""))
+ para.append(backported)
+
insert_ticket = nodes.paragraph('')
para.append(insert_ticket)
if i > 0:
insert_ticket.append(nodes.Text(", ", ", "))
else:
- insert_ticket.append(nodes.Text(" ", " "))
+ insert_ticket.append(nodes.Text("References: """))
i += 1
if render is not None:
refuri = render % refname
)
)
+class ChangeLogImportDirective(EnvDirective, Directive):
+ has_content = True
+
+ def _setup_run(self):
+ if 'ChangeLogDirective_changes' not in self.env.temp_data:
+ self.env.temp_data['ChangeLogDirective_changes'] = []
+
+ def run(self):
+ self._setup_run()
+
+ # tell ChangeLogDirective we're here, also prevent
+ # nested .. include calls
+ if 'ChangeLogDirective_includes' not in self.env.temp_data:
+ self.env.temp_data['ChangeLogDirective_includes'] = True
+ p = nodes.paragraph('', '',)
+ self.state.nested_parse(self.content, 0, p)
+ del self.env.temp_data['ChangeLogDirective_includes']
+
+ return []
class ChangeDirective(EnvDirective, Directive):
has_content = True
- type_ = "change"
- parent_cls = ChangeLogDirective
-
def run(self):
content = _parse_content(self.content)
p = nodes.paragraph('', '',)
sorted_tags = _comma_list(content.get('tags', ''))
+ declared_version = self.env.temp_data['ChangeLogDirective_version']
+ versions = set(_comma_list(content.get("versions", ""))).difference(['']).\
+ union([declared_version])
+
+ # if we don't refer to any other versions and we're in an include,
+ # skip
+ if len(versions) == 1 and 'ChangeLogDirective_includes' in self.env.temp_data:
+ return []
+
+ def int_ver(ver):
+ out = []
+ for dig in ver.split("."):
+ try:
+ out.append(int(dig))
+ except ValueError:
+ out.append(0)
+ return tuple(out)
+
rec = {
'tags': set(sorted_tags).difference(['']),
'tickets': set(_comma_list(content.get('tickets', ''))).difference(['']),
'pullreq': set(_comma_list(content.get('pullreq', ''))).difference(['']),
'changeset': set(_comma_list(content.get('changeset', ''))).difference(['']),
'node': p,
- 'type': self.type_,
+ 'type': "change",
"title": content.get("title", None),
- 'sorted_tags': sorted_tags
+ 'sorted_tags': sorted_tags,
+ "versions": versions,
+ "sorted_versions": list(reversed(sorted(versions, key=int_ver)))
}
if "declarative" in rec['tags']:
rec['tags'].add("orm")
self.state.nested_parse(content['text'], 0, p)
- self.parent_cls.changes(self.env).append(rec)
+ ChangeLogDirective.changes(self.env).append(rec)
return []
def setup(app):
app.add_directive('changelog', ChangeLogDirective)
app.add_directive('change', ChangeDirective)
+ app.add_directive('changelog_imports', ChangeLogImportDirective)
app.add_config_value("changelog_sections", [], 'env')
app.add_config_value("changelog_inner_tag_sort", [], 'env')
app.add_config_value("changelog_render_ticket",
.. change::
:tags: bug, orm
:tickets: 2807
+ :versions: 0.8.3, 0.9.0
Fixed bug where list instrumentation would fail to represent a
setslice of ``[0:0]`` correctly, which in particular could occur
.. change::
:tags: bug, sql
:tickets: 2801
+ :versions: 0.8.3, 0.9.0
Fixed regression dating back to 0.7.9 whereby the name of a CTE might
not be properly quoted if it was referred to in multiple FROM clauses.
.. change::
:tags: mysql, bug
:tickets: 2791
+ :versions: 0.8.3, 0.9.0
Updates to MySQL reserved words for versions 5.5, 5.6, courtesy
Hanno Schlichting.
.. change::
:tags: sql, bug, cte
:tickets: 2783
+ :versions: 0.8.3, 0.9.0
Fixed bug in common table expression system where if the CTE were
used only as an ``alias()`` construct, it would not render using the
.. change::
:tags: bug, sql
:tickets: 2784
+ :versions: 0.8.3, 0.9.0
Fixed bug in :class:`.CheckConstraint` DDL where the "quote" flag from a
:class:`.Column` object would not be propagated.
.. change::
- :tags: bug, orm
- :tickets: 2699
+ :tags: bug, orm
+ :tickets: 2699
+ :versions: 0.8.1
Fixed bug when a query of the form:
``query(SubClass).options(subqueryload(Baseclass.attrname))``,
otherwise working correctly.
.. change::
- :tags: bug, orm
- :tickets: 2689
+ :tags: bug, orm
+ :tickets: 2689
+ :versions: 0.8.1
Fixed bug in unit of work whereby a joined-inheritance
subclass could insert the row for the "sub" table
.. change::
:tags: feature, postgresql
:tickets: 2676
+ :versions: 0.8.0
Added support for Postgresql's traditional SUBSTRING
function syntax, renders as "SUBSTRING(x FROM y FOR z)"
.. change::
:tags: sqlite, bug
:tickets: 2568
+ :versions: 0.8.0b2
More adjustment to this SQLite related issue which was released in
0.7.9, to intercept legacy SQLite quoting characters when reflecting
.. change::
:tags: sql, bug
:tickets: 2631
+ :versions: 0.8.0b2
Fixed bug where using server_onupdate=<FetchedValue|DefaultClause>
without passing the "for_update=True" flag would apply the default