forked from iwakuraLain/LaiNomic
initial commit
This commit is contained in:
commit
c9fd68a44f
22
LICENSE
Normal file
22
LICENSE
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2015 Travis Briggs
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
9
README.md
Normal file
9
README.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# LaiNomic: Nomic on git.lain.chuch
|
||||||
|
|
||||||
|
This repository represents a game of
|
||||||
|
[Nomic](http://legacy.earlham.edu/~peters/nomic.htm) where the bookkeeping of
|
||||||
|
the rules and the scores is done through Markdown flavored text files in a Github repository.
|
||||||
|
|
||||||
|
The repository is the single source of authority on the current state of the game (unless, of course, the rules change and that is no longer the case).
|
||||||
|
|
||||||
|
The initial set of rules were taken from [here](https://github.com/audiodude/tiny-nomic/commit/21429fde4eb8455e72743e2946d37aa889677082), and modified in order to change each mention of 'Github' to 'git.lain.church'
|
4
immutable_rules/101_Abide-by-all-the-rules.md
Normal file
4
immutable_rules/101_Abide-by-all-the-rules.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
All players must always abide by all the rules then in effect, in the form in
|
||||||
|
which they are then in effect. The rules in the Initial Set are in effect
|
||||||
|
whenever a game begins. The Initial Set consists of Rules 101-119 (immutable)
|
||||||
|
and 201-215 (mutable).
|
7
immutable_rules/102_Mutability.md
Normal file
7
immutable_rules/102_Mutability.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
Initially rules in the 100's are immutable and rules in the 200's are mutable.
|
||||||
|
Rules subsequently enacted or transmuted (that is, changed from immutable to
|
||||||
|
mutable or *vice versa*) may be immutable or mutable regardless of their
|
||||||
|
numbers, and rules in the Initial Set may be transmuted regardless of their
|
||||||
|
numbers.
|
||||||
|
|
||||||
|
If the game is being played on git.lain.church, mutable rules must be stored in the mutable_rules/ directory and immutable rules must be stored in the immutable_rules/ directory. The directory in which a rule resides is the sole factor in determining its mutability.
|
11
immutable_rules/103_Rule-changes.md
Normal file
11
immutable_rules/103_Rule-changes.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
A rule-change is any of the following:
|
||||||
|
|
||||||
|
1. the enactment, repeal, or amendment of a mutable rule;
|
||||||
|
2. the enactment, repeal, or amendment of an amendment of a mutable rule; or
|
||||||
|
3. the transmutation of an immutable rule into a mutable rule or *vice versa*.
|
||||||
|
|
||||||
|
(Note: This definition implies that, at least initially, all new rules are
|
||||||
|
mutable; immutable rules, as long as they are immutable, may not be amended or
|
||||||
|
repealed; mutable rules, as long as they are mutable, may be amended or
|
||||||
|
repealed; any rule of any status may be transmuted; no rule is absolutely
|
||||||
|
immune to change.)
|
2
immutable_rules/104_All-rule-changes-voted-on.md
Normal file
2
immutable_rules/104_All-rule-changes-voted-on.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
All rule-changes proposed in the proper way shall be voted on. They will be
|
||||||
|
adopted if and only if they receive the required number of votes.
|
2
immutable_rules/105_Eligible-voters.md
Normal file
2
immutable_rules/105_Eligible-voters.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Every player is an eligible voter. Every eligible voter must participate in
|
||||||
|
every vote on rule-changes.
|
4
immutable_rules/106_Write-down-rules.md
Normal file
4
immutable_rules/106_Write-down-rules.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
All proposed rule-changes shall be written down before they are voted on. If
|
||||||
|
they are adopted, they shall guide play in the form in which they were voted on.
|
||||||
|
|
||||||
|
If the game is being played on git.lain.church, Pull Requests which add files to the proper directory shall satisfy this rule.
|
3
immutable_rules/107_Temporality.md
Normal file
3
immutable_rules/107_Temporality.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
No rule-change may take effect earlier than the moment of the completion of the
|
||||||
|
vote that adopted it, even if its wording explicitly states otherwise. No
|
||||||
|
rule-change may have retroactive application.
|
9
immutable_rules/108_Numbering-rules.md
Normal file
9
immutable_rules/108_Numbering-rules.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
Each proposed rule-change shall be given a number for reference. The numbers
|
||||||
|
shall begin with 301, and each rule-change proposed in the proper way shall
|
||||||
|
receive the next successive integer, whether or not the proposal is adopted.
|
||||||
|
|
||||||
|
If a rule is repealed and reenacted, it receives the number of the proposal to
|
||||||
|
reenact it. If a rule is amended or transmuted, it receives the number of the
|
||||||
|
proposal to amend or transmute it. If an amendment is amended or repealed, the
|
||||||
|
entire rule of which it is a part receives the number of the proposal to amend
|
||||||
|
or repeal the amendment.
|
6
immutable_rules/109_Transmutation.md
Normal file
6
immutable_rules/109_Transmutation.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
Rule-changes that transmute immutable rules into mutable rules may be adopted
|
||||||
|
if and only if the vote is unanimous among the eligible voters. Transmutation
|
||||||
|
shall not be implied, but must be stated explicitly in a proposal to take
|
||||||
|
effect.
|
||||||
|
|
||||||
|
If the game is being played on git.lain.church, a simple file move to or from the immutable_rules/mutable_rules directories shall satisfy this rule.
|
4
immutable_rules/110_Immutable-rules-take-precedence.md
Normal file
4
immutable_rules/110_Immutable-rules-take-precedence.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
In a conflict between a mutable and an immutable rule, the immutable rule takes
|
||||||
|
precedence and the mutable rule shall be entirely void. For the purposes of this
|
||||||
|
rule a proposal to transmute an immutable rule does not "conflict" with that
|
||||||
|
immutable rule.
|
8
immutable_rules/111_Time-for-debate.md
Normal file
8
immutable_rules/111_Time-for-debate.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
If a rule-change as proposed is unclear, ambiguous, paradoxical, or destructive
|
||||||
|
of play, or if it arguably consists of two or more rule-changes compounded or is
|
||||||
|
an amendment that makes no difference, or if it is otherwise of questionable
|
||||||
|
value, then the other players may suggest amendments or argue against the
|
||||||
|
proposal before the vote. A reasonable time must be allowed for this debate. The
|
||||||
|
proponent decides the final form in which the proposal is to be voted on and,
|
||||||
|
unless the Judge has been asked to do so, also decides the time to end debate
|
||||||
|
and vote.
|
5
immutable_rules/112_Winning-state-of-affairs.md
Normal file
5
immutable_rules/112_Winning-state-of-affairs.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
The state of affairs that constitutes winning may not be altered from achieving
|
||||||
|
*n* points to any other state of affairs. The magnitude of *n* and the means of
|
||||||
|
earning points may be changed, and rules that establish a winner when play
|
||||||
|
cannot continue may be enacted and (while they are mutable) be amended or
|
||||||
|
repealed.
|
3
immutable_rules/113_Option-to-forfeit.md
Normal file
3
immutable_rules/113_Option-to-forfeit.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
A player always has the option to forfeit the game rather than continue to play
|
||||||
|
or incur a game penalty. No penalty worse than losing, in the judgment of the
|
||||||
|
player to incur it, may be imposed.
|
2
immutable_rules/114_One-mutable-rule.md
Normal file
2
immutable_rules/114_One-mutable-rule.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
There must always be at least one mutable rule. The adoption of rule-changes
|
||||||
|
must never become completely impermissible.
|
4
immutable_rules/115_Self-reference.md
Normal file
4
immutable_rules/115_Self-reference.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
Rule-changes that affect rules needed to allow or apply rule-changes are as
|
||||||
|
permissible as other rule-changes. Even rule-changes that amend or repeal their
|
||||||
|
own authority are permissible. No rule-change or type of move is impermissible
|
||||||
|
solely on account of the self-reference or self-application of a rule.
|
3
immutable_rules/116_Not-otherwise-prohibited.md
Normal file
3
immutable_rules/116_Not-otherwise-prohibited.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Whatever is not prohibited or regulated by a rule is permitted and unregulated,
|
||||||
|
with the sole exception of changing the rules, which is permitted only when a
|
||||||
|
rule or set of rules explicitly or implicitly permits it.
|
27
immutable_rules/117_Github-repository.md
Normal file
27
immutable_rules/117_Github-repository.md
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
Each rule shall be represented by a file in either the `immutable_rules/` or
|
||||||
|
`mutable_rules/` directory of the git repository where the game is being
|
||||||
|
recorded. No other files in the repository shall be constituted to represent a
|
||||||
|
rule or have the force of a rule.
|
||||||
|
|
||||||
|
The master branch of the repository will serve as a representation of the
|
||||||
|
current game state. No commits are allowed to be made to the master branch
|
||||||
|
except through the mechanism of a git.lain.church Pull Request.
|
||||||
|
|
||||||
|
Pull Requests must perform exactly one of the following actions:
|
||||||
|
|
||||||
|
1. Add a file to one of the rules directory, when a rule is enacted.
|
||||||
|
2. Remove a file from one of the rules directories when a rule is repealed.
|
||||||
|
3. Modify an existing rule file, when an amendment is made, or repealed, or when
|
||||||
|
an amendment to an amendment is made or repealed.
|
||||||
|
4. Move a rule from either the immutable_rules directory or the mutable_rules
|
||||||
|
directory to the other one, when a rule is transmuted.
|
||||||
|
5. Create a new player file in the `players/` directory
|
||||||
|
6. Perform some administrative task on the repository, at the discretion of the
|
||||||
|
players. Pull Requests of this type can happen outside of the normal turn
|
||||||
|
order, must be approved by majority vote of all players, and cannot
|
||||||
|
materially affect the operation of the rules or the game. An example of this
|
||||||
|
would be removing or replacing the LICENSE or README files.
|
||||||
|
|
||||||
|
The proper way to propose a rule-change is a Pull Request. Players vote on Pull
|
||||||
|
Requests/proposals by putting either "+1" or "-1" as a comment on the Pull
|
||||||
|
Request, or by using the proper :thumbsup: or :thumbsdown: emoji on the Pull Request comment.
|
23
immutable_rules/118_Players-and-joining-the-game.md
Normal file
23
immutable_rules/118_Players-and-joining-the-game.md
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
Any person with a git.lain.church account is eligible to play the game (become a player).
|
||||||
|
However, a single person shall only ever constitute a single player in the game,
|
||||||
|
regardless of the number of git.lain.church accounts he or she has.
|
||||||
|
|
||||||
|
To become a player in the game, a candidate player shall send a git.lain.church Pull
|
||||||
|
Request to the master branch of the repository where the game is being recorded.
|
||||||
|
The Pull Request shall modify the players/ directory of the repository by adding
|
||||||
|
a single file whose name is exactly in the Name Format.
|
||||||
|
|
||||||
|
For the purposes of this rule, the Name Format means a string which:
|
||||||
|
|
||||||
|
* Starts with a zero-padded number that must contain 3 digits and be equal
|
||||||
|
in numerical value to the number of files that were present in the
|
||||||
|
directory before the candidate player's file was added. So if the
|
||||||
|
candidate player's file is the 4th, the number would be 003.
|
||||||
|
* This is followed by a hyphen, then ends with the git.lain.church username of the
|
||||||
|
candidate player, ie audiodude.
|
||||||
|
* For example, the file could be named `003-audiodude`.
|
||||||
|
|
||||||
|
Each player's file must at all times contain the numeric score of the player.
|
||||||
|
|
||||||
|
The Pull Request to add a player (as described in this rule) can be
|
||||||
|
approved/merged by any existing player. Only one player's approval is required.
|
3
immutable_rules/119_Commit-access.md
Normal file
3
immutable_rules/119_Commit-access.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
All active players must have commit access to the repository where the game is
|
||||||
|
being recorded. Accordingly, no one who is not a player is allowed commit
|
||||||
|
access to the repository.
|
11
mutable_rules/201_Turn-alternation.md
Normal file
11
mutable_rules/201_Turn-alternation.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
The game shall consist of a series of rounds. Each round begins immediately
|
||||||
|
after the end of the turn of the last player in the previous round. A player is
|
||||||
|
said to be *in* a round if the player has a player file in the `players/`
|
||||||
|
directory when the round begins. The order of turns is determined by taking the
|
||||||
|
numeric part of the name of each file in the `players/` directory and assigning
|
||||||
|
it to the player corresponding to the file. The player with the lowest number
|
||||||
|
goes first and play passes to each player in increasing numeric order of his or
|
||||||
|
her assigned number.
|
||||||
|
|
||||||
|
Turns may not be skipped or passed, and parts of turns may not be omitted. All
|
||||||
|
players begin with zero points, which (if the game is being played on git.lain.church) should be reflected in their player files.
|
12
mutable_rules/202_Parts-of-a-turn.md
Normal file
12
mutable_rules/202_Parts-of-a-turn.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
One turn consists of two parts in this order:
|
||||||
|
|
||||||
|
1. proposing one rule-change and having it voted on, and
|
||||||
|
2. throwing one die once and adding the number of points on its face to one's
|
||||||
|
score.
|
||||||
|
|
||||||
|
In mail and computer games (and by extension, if playing on git.lain.church) instead of
|
||||||
|
throwing a die, players subtract 291 from the ordinal number of their proposal
|
||||||
|
and multiply the result by the fraction of favorable votes it received, rounded
|
||||||
|
to the nearest integer. (This yields a number between 0 and 10 for the first
|
||||||
|
player, with the upper limit increasing by one each turn; more points are
|
||||||
|
awarded for more popular proposals.)
|
3
mutable_rules/203_Rule-changes-unanimous-at-first.md
Normal file
3
mutable_rules/203_Rule-changes-unanimous-at-first.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
A rule-change is adopted if and only if the vote is unanimous among the eligible
|
||||||
|
voters. If this rule is not amended by the end of the second round, it
|
||||||
|
automatically changes to require only a simple majority.
|
2
mutable_rules/204_Points-for-dissent.md
Normal file
2
mutable_rules/204_Points-for-dissent.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
If and when rule-changes can be adopted without unanimity, the players who vote
|
||||||
|
against winning proposals shall receive 10 points each.
|
2
mutable_rules/205_Moment-of-completion.md
Normal file
2
mutable_rules/205_Moment-of-completion.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
An adopted rule-change takes full effect at the moment of the completion of the
|
||||||
|
vote that adopted it.
|
2
mutable_rules/206_Defeated-proposals.md
Normal file
2
mutable_rules/206_Defeated-proposals.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
When a proposed rule-change is defeated, the player who proposed it loses 10
|
||||||
|
points.
|
1
mutable_rules/207_Votes-per-player.md
Normal file
1
mutable_rules/207_Votes-per-player.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
Each player always has exactly one vote.
|
4
mutable_rules/208_Winner-by-points.md
Normal file
4
mutable_rules/208_Winner-by-points.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
The winner is the first player to achieve 100 (positive) points.
|
||||||
|
|
||||||
|
In mail and computer games (and by extension, games played on git.lain.church), the
|
||||||
|
winner is the first player to achieve 200 (positive) points.
|
1
mutable_rules/209_Mutable-rule-limit.md
Normal file
1
mutable_rules/209_Mutable-rule-limit.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
At no time may there be more than 25 mutable rules.
|
5
mutable_rules/210_Conspiracy-to-rule-change.md
Normal file
5
mutable_rules/210_Conspiracy-to-rule-change.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
Players may not conspire or consult on the making of future rule-changes unless
|
||||||
|
they are team-mates.
|
||||||
|
|
||||||
|
The first paragraph of this rule does not apply to games by mail or computer
|
||||||
|
(or, by extension, those played on git.lain.church).
|
11
mutable_rules/211_Precedence.md
Normal file
11
mutable_rules/211_Precedence.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
If two or more mutable rules conflict with one another, or if two or more
|
||||||
|
immutable rules conflict with one another, then the rule with the lowest ordinal
|
||||||
|
number takes precedence.
|
||||||
|
|
||||||
|
If at least one of the rules in conflict explicitly says of itself that it defers
|
||||||
|
to another rule (or type of rule) or takes precedence over another rule (or type
|
||||||
|
of rule), then such provisions shall supersede the numerical method for
|
||||||
|
determining precedence.
|
||||||
|
|
||||||
|
If two or more rules claim to take precedence over one another or to defer to
|
||||||
|
one another, then the numerical method again governs.
|
26
mutable_rules/212_Judging.md
Normal file
26
mutable_rules/212_Judging.md
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
If players disagree about the legality of a move or the interpretation or
|
||||||
|
application of a rule, then the player preceding the one moving is to be the
|
||||||
|
Judge and decide the question. Disagreement for the purposes of this rule may
|
||||||
|
be created by the insistence of any player. This process is called *invoking
|
||||||
|
Judgment*.
|
||||||
|
|
||||||
|
When Judgment has been invoked, the next player may not begin his or her turn
|
||||||
|
without the consent of a majority of the other players.
|
||||||
|
|
||||||
|
The Judge's Judgment may be overruled only by a unanimous vote of the other
|
||||||
|
players taken before the next turn is begun. If a Judge's Judgment is overruled,
|
||||||
|
then the player preceding the Judge in the playing order becomes the new Judge
|
||||||
|
for the question, and so on, except that no player is to be Judge during his or
|
||||||
|
her own turn or during the turn of a team-mate.
|
||||||
|
|
||||||
|
Unless a Judge is overruled, one Judge settles all questions arising from the
|
||||||
|
game until the next turn is begun, including questions as to his or her own
|
||||||
|
legitimacy and jurisdiction as Judge.
|
||||||
|
|
||||||
|
New Judges are not bound by the decisions of old Judges. New Judges may,
|
||||||
|
however, settle only those questions on which the players currently disagree
|
||||||
|
and that affect the completion of the turn in which Judgment was invoked. All
|
||||||
|
decisions by Judges shall be in accordance with all the rules then in effect;
|
||||||
|
but when the rules are silent, inconsistent, or unclear on the point at issue,
|
||||||
|
then the Judge shall consider game-custom and the spirit of the game before
|
||||||
|
applying other standards.
|
6
mutable_rules/213_Stalemate-makes-a-winner.md
Normal file
6
mutable_rules/213_Stalemate-makes-a-winner.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
If the rules are changed so that further play is impossible, or if the legality
|
||||||
|
of a move cannot be determined with finality, or if by the Judge's best
|
||||||
|
reasoning, not overruled, a move appears equally legal and illegal, then the
|
||||||
|
first player unable to complete a turn is the winner.
|
||||||
|
|
||||||
|
This rule takes precedence over every other rule determining the winner.
|
6
mutable_rules/214_Communication-on-github.md
Normal file
6
mutable_rules/214_Communication-on-github.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
To the degree possible, the game should be played using git.lain.church. Conversation
|
||||||
|
relevant to the game should happen there. Earnest attempts should be made to
|
||||||
|
keep discussion and judging pertinent to a rule-change proposal attached to the
|
||||||
|
Pull Request that contains the proposal.
|
||||||
|
|
||||||
|
Judgement can be invoked at any time by opening a new issue on the git.lain.church repository that hosts the game. If possible, the current judge should be @mentioned in such an issue, to prompt a speedy reply.
|
3
mutable_rules/215_Begin-and-end-of-the-game.md
Normal file
3
mutable_rules/215_Begin-and-end-of-the-game.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
The game shall begin (the first round shall start) once there are at least 5
|
||||||
|
players. The game does not necessarily end when it is won or even when there
|
||||||
|
are less than 5 or even no players.
|
93
tools/rulecat
Executable file
93
tools/rulecat
Executable file
@ -0,0 +1,93 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
"""Find and concatenate all the rule files into one readable output.
|
||||||
|
"""
|
||||||
|
# n.b.: This shows any file, not just ones committed in git, which would
|
||||||
|
# require parsing output from git ls-files or something.
|
||||||
|
# This doesn't show files in subdirectories.
|
||||||
|
# This won't show anything that doesn't have a .md extension.
|
||||||
|
# This is supposed to generate valid markdown, but that depends on the
|
||||||
|
# rule files.
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
_FILENAME_RE = re.compile(r'(\d+)_(.*)\.md')
|
||||||
|
|
||||||
|
|
||||||
|
def file_paths_under(root):
|
||||||
|
"""Yield paths of files under the given root.
|
||||||
|
"""
|
||||||
|
for filename in sorted(os.listdir(root)):
|
||||||
|
full_path = os.path.join(root, filename)
|
||||||
|
# n.b.: lots of checks against filesystem.
|
||||||
|
if os.path.isfile(full_path):
|
||||||
|
yield full_path
|
||||||
|
|
||||||
|
|
||||||
|
def files(file_paths):
|
||||||
|
"""Yield file objects for the given file paths.
|
||||||
|
"""
|
||||||
|
# n.b.: no error handling if files don't exist or can't be opened.
|
||||||
|
for file_path in file_paths:
|
||||||
|
with open(file_path, "r") as file_obj:
|
||||||
|
yield file_obj
|
||||||
|
|
||||||
|
|
||||||
|
def parse_path(filename):
|
||||||
|
"""Extract rule number and title from given path to rule file.
|
||||||
|
"""
|
||||||
|
basename = os.path.basename(filename)
|
||||||
|
match = _FILENAME_RE.match(basename)
|
||||||
|
if not match:
|
||||||
|
return None
|
||||||
|
number = match.group(1)
|
||||||
|
words = [word.capitalize() for word in match.group(2).split("-")]
|
||||||
|
title = " ".join(words)
|
||||||
|
return number, title
|
||||||
|
|
||||||
|
|
||||||
|
def render_dir(root):
|
||||||
|
"""Yield lines presenting rule files in the given directory.
|
||||||
|
"""
|
||||||
|
for file_obj in files(file_paths_under(root)):
|
||||||
|
parsed = parse_path(file_obj.name)
|
||||||
|
# n.b.: parsed may be None and fail to unpack here.
|
||||||
|
number, title = parsed
|
||||||
|
content = file_obj.read().rstrip()
|
||||||
|
title_line = "{0}. {1}".format(number, title)
|
||||||
|
yield ""
|
||||||
|
yield title_line
|
||||||
|
yield "-" * len(title_line)
|
||||||
|
yield ""
|
||||||
|
yield content
|
||||||
|
|
||||||
|
|
||||||
|
def render_section(root, title):
|
||||||
|
"""Add a title to the output of render_dir.
|
||||||
|
"""
|
||||||
|
yield title
|
||||||
|
yield "=" * len(title)
|
||||||
|
for line in render_dir(root):
|
||||||
|
yield line
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""What happens when the script is run
|
||||||
|
"""
|
||||||
|
this_file = os.path.abspath(__file__)
|
||||||
|
here = os.path.dirname(this_file)
|
||||||
|
parent = os.path.dirname(here)
|
||||||
|
immutable_rule_dir = os.path.join(parent, 'immutable_rules')
|
||||||
|
mutable_rule_dir = os.path.join(parent, 'mutable_rules')
|
||||||
|
|
||||||
|
for line in render_section(immutable_rule_dir, "Immutable Rules"):
|
||||||
|
print(line)
|
||||||
|
|
||||||
|
print("")
|
||||||
|
|
||||||
|
for line in render_section(mutable_rule_dir, "Mutable Rules"):
|
||||||
|
print(line)
|
||||||
|
|
||||||
|
|
||||||
|
# This is a script file, so __name__ stuff is not useful.
|
||||||
|
main()
|
Loading…
Reference in New Issue
Block a user