~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to knit.py

  • Committer: Martin Pool
  • Date: 2005-06-27 02:38:05 UTC
  • mto: This revision was merged to the branch mainline in revision 852.
  • Revision ID: mbp@sourcefrog.net-20050627023805-5fdae55959ab1142
Import testsweet module adapted from bzr.

Start new test-driven development pattern, with a very trivial 
test that stores and retrieves a single text.

Show diffs side-by-side

added added

removed removed

Lines of Context:
7
7
# Author: Martin Pool <mbp@canonical.com>
8
8
 
9
9
 
10
 
"""knit - a weave-like structure
11
 
 
12
 
A Knit manages versions of line-based text files, keeping track of the
13
 
originating version for each line.
14
 
 
15
 
Versions are referenced by nonnegative integers.  In a full system
16
 
this will be just a local shorthand for some universally-unique
17
 
version identifier.
18
 
 
19
 
Texts are represented as a seqence of (version, text, live) tuples.
20
 
An empty sequence represents an empty text.  The version is the
21
 
version in which the line was introduced.  The *live* flag is false if
22
 
the line is no longer present and being tracked only for the purposes
23
 
of merging.
24
 
"""
 
10
"""knit - a weave-like structure"""
 
11
 
 
12
 
 
13
class Knit(object):
 
14
    """knit - versioned text file storage.
 
15
    
 
16
    A Knit manages versions of line-based text files, keeping track of the
 
17
    originating version for each line.
 
18
 
 
19
    Versions are referenced by nonnegative integers.  In a full system
 
20
    this will be just a local shorthand for some universally-unique
 
21
    version identifier.
 
22
 
 
23
    Texts are represented as a seqence of (version, text, live) tuples.
 
24
    An empty sequence represents an empty text.  The version is the
 
25
    version in which the line was introduced.  The *live* flag is false if
 
26
    the line is no longer present and being tracked only for the purposes
 
27
    of merging.
 
28
 
 
29
    _l
 
30
        Stores the actual weave.
 
31
    """
 
32
        
 
33
    def add(self, text):
 
34
        """Add a single text on top of the weave."""
 
35
        if not isinstance(text, list):
 
36
            raise ValueError("text should be a list, not %s" % type(text))
 
37
        self._l = text
 
38
 
 
39
    
 
40
    def get(self):
 
41
        return self._l[:]
25
42
 
26
43
 
27
44
text1 = [(0, "hello world", True)]
82
99
 
83
100
    return new_knit
84
101
        
85
 
    
86
 
 
87
 
 
88
 
print '***** annotated:'
89
 
show_annotated(knit2)
90
 
 
91
 
print '***** plain text:'
92
 
print '\n'.join(knit2text(knit2))
93
 
 
94
 
text3 = """hello world
95
 
an inserted line
96
 
hello boys""".split('\n')
97
 
 
98
 
print repr(knit2text(knit2))
99
 
print repr(text3)
100
 
knit3 = update_knit(knit2, 3, text3)
101
 
 
102
 
print '***** result of update:'
103
 
show_annotated(knit3)
 
102
 
 
103
 
 
104
def main(): 
 
105
    print '***** annotated:'
 
106
    show_annotated(knit2)
 
107
 
 
108
    print '***** plain text:'
 
109
    print '\n'.join(knit2text(knit2))
 
110
 
 
111
    text3 = """hello world
 
112
    an inserted line
 
113
    hello boys""".split('\n')
 
114
 
 
115
    print repr(knit2text(knit2))
 
116
    print repr(text3)
 
117
    knit3 = update_knit(knit2, 3, text3)
 
118
 
 
119
    print '***** result of update:'
 
120
    show_annotated(knit3)
104
121
 
105
122
 
106
123