176
125
class InvalidRevisionId(BzrNewError):
177
126
"""Invalid revision-id {%(revision_id)s} in %(branch)s"""
179
127
def __init__(self, revision_id, branch):
180
# branch can be any string or object with __str__ defined
181
128
BzrNewError.__init__(self)
182
129
self.revision_id = revision_id
183
130
self.branch = branch
186
class NoSuchId(BzrNewError):
187
"""The file id %(file_id)s is not present in the tree %(tree)s."""
189
def __init__(self, tree, file_id):
190
BzrNewError.__init__(self)
191
self.file_id = file_id
195
133
class NoWorkingTree(BzrNewError):
196
"""No WorkingTree exists for %(base)s."""
134
"""No WorkingTree exists for %s(base)."""
198
136
def __init__(self, base):
199
137
BzrNewError.__init__(self)
203
class NotBuilding(BzrNewError):
204
"""Not currently building a tree."""
207
class NotLocalUrl(BzrNewError):
208
"""%(url)s is not a local path."""
210
def __init__(self, url):
211
BzrNewError.__init__(self)
215
class BzrCommandError(BzrNewError):
216
"""Error from user command"""
220
# Error from malformed user command; please avoid raising this as a
221
# generic exception not caused by user input.
223
# I think it's a waste of effort to differentiate between errors that
224
# are not intended to be caught anyway. UI code need not subclass
225
# BzrCommandError, and non-UI code should not throw a subclass of
226
# BzrCommandError. ADHB 20051211
227
def __init__(self, msg):
228
# Object.__str__() must return a real string
229
# returning a Unicode string is a python error.
230
if isinstance(msg, unicode):
231
self.msg = msg.encode('utf8')
141
class BzrCommandError(BzrError):
142
# Error from malformed user command
143
# This is being misused as a generic exception
144
# pleae subclass. RBC 20051030
235
145
def __str__(self):
239
149
class BzrOptionError(BzrCommandError):
240
"""Error in command line options"""
150
"""Some missing or otherwise incorrect option was supplied."""
243
class StrictCommitFailed(BzrNewError):
244
"""Commit refused because there are unknown files in the tree"""
247
# XXX: Should be unified with TransportError; they seem to represent the
153
class StrictCommitFailed(Exception):
154
"""Commit refused because there are unknowns in the tree."""
249
157
class PathError(BzrNewError):
250
158
"""Generic path error: %(path)r%(extra)s)"""
252
159
def __init__(self, path, extra=None):
253
160
BzrNewError.__init__(self)
416
class PathsNotVersionedError(BzrNewError):
417
# used when reporting several paths are not versioned
418
"""Path(s) are not versioned: %(paths_as_string)s"""
420
def __init__(self, paths):
421
from bzrlib.osutils import quotefn
422
BzrNewError.__init__(self)
424
self.paths_as_string = ' '.join([quotefn(p) for p in paths])
427
class PathsDoNotExist(BzrNewError):
428
"""Path(s) do not exist: %(paths_as_string)s"""
430
# used when reporting that paths are neither versioned nor in the working
433
def __init__(self, paths):
435
from bzrlib.osutils import quotefn
436
BzrNewError.__init__(self)
438
self.paths_as_string = ' '.join([quotefn(p) for p in paths])
441
class BadFileKindError(BzrNewError):
442
"""Cannot operate on %(filename)s of unsupported kind %(kind)s"""
445
class ForbiddenControlFileError(BzrNewError):
446
"""Cannot operate on %(filename)s because it is a control file"""
449
class LockError(BzrNewError):
450
"""Lock error: %(message)s"""
221
class BadFileKindError(BzrError):
222
"""Specified file is of a kind that cannot be added.
224
(For example a symlink or device file.)"""
227
class ForbiddenFileError(BzrError):
228
"""Cannot operate on a file because it is a control file."""
231
class LockError(Exception):
451
233
# All exceptions from the lock/unlock functions should be from
452
234
# this exception class. They will be translated as necessary. The
453
235
# original exception is available as e.original_error
455
# New code should prefer to raise specific subclasses
456
def __init__(self, message):
457
self.message = message
460
238
class CommitNotPossible(LockError):
461
239
"""A commit was attempted but we do not have a write lock open."""
466
242
class AlreadyCommitted(LockError):
467
243
"""A rollback was requested, but is not able to be accomplished."""
472
246
class ReadOnlyError(LockError):
473
"""A write attempt was made in a read only transaction on %(obj)s"""
474
def __init__(self, obj):
478
class OutSideTransaction(BzrNewError):
479
"""A transaction related operation was attempted after the transaction finished."""
482
class ObjectNotLocked(LockError):
483
"""%(obj)r is not locked"""
485
is_user_error = False
487
# this can indicate that any particular object is not locked; see also
488
# LockNotHeld which means that a particular *lock* object is not held by
489
# the caller -- perhaps they should be unified.
490
def __init__(self, obj):
494
class ReadOnlyObjectDirtiedError(ReadOnlyError):
495
"""Cannot change object %(obj)r in read only transaction"""
496
def __init__(self, obj):
500
class UnlockableTransport(LockError):
501
"""Cannot lock: transport is read only: %(transport)s"""
502
def __init__(self, transport):
503
self.transport = transport
506
class LockContention(LockError):
507
"""Could not acquire lock %(lock)s"""
508
# TODO: show full url for lock, combining the transport and relative bits?
509
def __init__(self, lock):
513
class LockBroken(LockError):
514
"""Lock was broken while still open: %(lock)s - check storage consistency!"""
515
def __init__(self, lock):
519
class LockBreakMismatch(LockError):
520
"""Lock was released and re-acquired before being broken: %(lock)s: held by %(holder)r, wanted to break %(target)r"""
521
def __init__(self, lock, holder, target):
527
class LockNotHeld(LockError):
528
"""Lock not held: %(lock)s"""
529
def __init__(self, lock):
247
"""A write attempt was made in a read only transaction."""
533
250
class PointlessCommit(BzrNewError):
534
251
"""No changes to commit"""
537
class UpgradeReadonly(BzrNewError):
538
"""Upgrade URL cannot work with readonly URL's."""
541
class UpToDateFormat(BzrNewError):
542
"""The branch format %(format)s is already at the most recent format."""
544
def __init__(self, format):
545
BzrNewError.__init__(self)
549
253
class StrictCommitFailed(Exception):
550
254
"""Commit refused because there are unknowns in the tree."""
553
class NoSuchRevision(BzrNewError):
554
"""Branch %(branch)s has no revision %(revision)s"""
556
is_user_error = False
256
class NoSuchRevision(BzrError):
558
257
def __init__(self, branch, revision):
559
BzrNewError.__init__(self, branch=branch, revision=revision)
562
class NoSuchRevisionSpec(BzrNewError):
563
"""No namespace registered for string: %(spec)r"""
565
def __init__(self, spec):
566
BzrNewError.__init__(self, spec=spec)
569
class InvalidRevisionSpec(BzrNewError):
570
"""Requested revision: '%(spec)s' does not exist in branch:
571
%(branch)s%(extra)s"""
573
def __init__(self, spec, branch, extra=None):
574
BzrNewError.__init__(self, branch=branch, spec=spec)
576
self.extra = '\n' + str(extra)
259
self.revision = revision
260
msg = "Branch %s has no revision %s" % (branch, revision)
261
BzrError.__init__(self, msg)
581
264
class HistoryMissing(BzrError):
637
313
class AmbiguousBase(BzrError):
638
314
def __init__(self, bases):
639
warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
641
msg = "The correct base is unclear, because %s are all equally close" %\
315
msg = "The correct base is unclear, becase %s are all equally close" %\
643
317
BzrError.__init__(self, msg)
644
318
self.bases = bases
647
class NoCommits(BzrNewError):
648
"""Branch %(branch)s has no commits."""
320
class NoCommits(BzrError):
650
321
def __init__(self, branch):
651
BzrNewError.__init__(self, branch=branch)
322
msg = "Branch %s has no commits." % branch
323
BzrError.__init__(self, msg)
654
325
class UnlistableStore(BzrError):
655
326
def __init__(self, store):
656
327
BzrError.__init__(self, "Store %s is not listable" % store)
660
329
class UnlistableBranch(BzrError):
661
330
def __init__(self, br):
662
331
BzrError.__init__(self, "Stores for branch %s are not listable" % br)
665
class BoundBranchOutOfDate(BzrNewError):
666
"""Bound branch %(branch)s is out of date with master branch %(master)s."""
667
def __init__(self, branch, master):
668
BzrNewError.__init__(self)
673
class CommitToDoubleBoundBranch(BzrNewError):
674
"""Cannot commit to branch %(branch)s. It is bound to %(master)s, which is bound to %(remote)s."""
675
def __init__(self, branch, master, remote):
676
BzrNewError.__init__(self)
682
class OverwriteBoundBranch(BzrNewError):
683
"""Cannot pull --overwrite to a branch which is bound %(branch)s"""
684
def __init__(self, branch):
685
BzrNewError.__init__(self)
689
class BoundBranchConnectionFailure(BzrNewError):
690
"""Unable to connect to target of bound branch %(branch)s => %(target)s: %(error)s"""
691
def __init__(self, branch, target, error):
692
BzrNewError.__init__(self)
698
334
class WeaveError(BzrNewError):
699
335
"""Error in processing weave: %(message)s"""
701
336
def __init__(self, message=None):
702
337
BzrNewError.__init__(self)
703
338
self.message = message
733
365
"""Parents are mismatched between two revisions."""
736
class WeaveInvalidChecksum(WeaveError):
737
"""Text did not match it's checksum: %(message)s"""
740
class WeaveTextDiffers(WeaveError):
741
"""Weaves differ on text content. Revision: {%(revision_id)s}, %(weave_a)s, %(weave_b)s"""
743
def __init__(self, revision_id, weave_a, weave_b):
744
WeaveError.__init__(self)
745
self.revision_id = revision_id
746
self.weave_a = weave_a
747
self.weave_b = weave_b
750
class WeaveTextDiffers(WeaveError):
751
"""Weaves differ on text content. Revision: {%(revision_id)s}, %(weave_a)s, %(weave_b)s"""
753
def __init__(self, revision_id, weave_a, weave_b):
754
WeaveError.__init__(self)
755
self.revision_id = revision_id
756
self.weave_a = weave_a
757
self.weave_b = weave_b
760
class VersionedFileError(BzrNewError):
761
"""Versioned file error."""
764
class RevisionNotPresent(VersionedFileError):
765
"""Revision {%(revision_id)s} not present in %(file_id)s."""
767
def __init__(self, revision_id, file_id):
768
VersionedFileError.__init__(self)
769
self.revision_id = revision_id
770
self.file_id = file_id
773
class RevisionAlreadyPresent(VersionedFileError):
774
"""Revision {%(revision_id)s} already present in %(file_id)s."""
776
def __init__(self, revision_id, file_id):
777
VersionedFileError.__init__(self)
778
self.revision_id = revision_id
779
self.file_id = file_id
782
class KnitError(BzrNewError):
786
class KnitHeaderError(KnitError):
787
"""Knit header error: %(badline)r unexpected"""
789
def __init__(self, badline):
790
KnitError.__init__(self)
791
self.badline = badline
794
class KnitCorrupt(KnitError):
795
"""Knit %(filename)s corrupt: %(how)s"""
797
def __init__(self, filename, how):
798
KnitError.__init__(self)
799
self.filename = filename
803
368
class NoSuchExportFormat(BzrNewError):
804
369
"""Export format %(format)r not supported"""
805
370
def __init__(self, format):
807
372
self.format = format
810
class TransportError(BzrNewError):
811
"""Transport error: %(msg)s %(orig_error)s"""
375
class TransportError(BzrError):
376
"""All errors thrown by Transport implementations should derive
813
379
def __init__(self, msg=None, orig_error=None):
814
380
if msg is None and orig_error is not None:
815
381
msg = str(orig_error)
816
if orig_error is None:
382
BzrError.__init__(self, msg)
821
384
self.orig_error = orig_error
822
BzrNewError.__init__(self)
825
class SmartProtocolError(TransportError):
826
"""Generic bzr smart protocol error: %(details)s"""
828
def __init__(self, details):
829
self.details = details
832
386
# A set of semi-meaningful errors which can be thrown
833
387
class TransportNotPossible(TransportError):
834
"""Transport operation not possible: %(msg)s %(orig_error)s"""
388
"""This is for transports where a specific function is explicitly not
389
possible. Such as pushing files to an HTTP server.
837
394
class ConnectionError(TransportError):
838
"""Connection error: %(msg)s %(orig_error)s"""
395
"""A connection problem prevents file retrieval.
396
This does not indicate whether the file exists or not; it indicates that a
397
precondition for requesting the file was not met.
399
def __init__(self, msg=None, orig_error=None):
400
TransportError.__init__(self, msg=msg, orig_error=orig_error)
841
403
class ConnectionReset(TransportError):
842
"""Connection closed: %(msg)s %(orig_error)s"""
845
class InvalidRange(TransportError):
846
"""Invalid range access in %(path)s at %(offset)s."""
848
def __init__(self, path, offset):
849
TransportError.__init__(self, ("Invalid range access in %s at %d"
855
class InvalidHttpResponse(TransportError):
856
"""Invalid http response for %(path)s: %(msg)s"""
858
def __init__(self, path, msg, orig_error=None):
860
TransportError.__init__(self, msg, orig_error=orig_error)
863
class InvalidHttpRange(InvalidHttpResponse):
864
"""Invalid http range "%(range)s" for %(path)s: %(msg)s"""
866
def __init__(self, path, range, msg):
868
InvalidHttpResponse.__init__(self, path, msg)
871
class InvalidHttpContentType(InvalidHttpResponse):
872
"""Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s"""
874
def __init__(self, path, ctype, msg):
876
InvalidHttpResponse.__init__(self, path, msg)
404
"""The connection has been closed."""
879
407
class ConflictsInTree(BzrError):
880
408
def __init__(self):
881
409
BzrError.__init__(self, "Working tree has conflicts.")
884
411
class ParseConfigError(BzrError):
885
412
def __init__(self, errors, filename):
886
413
if filename is None:
889
416
(filename, ('\n'.join(e.message for e in errors)))
890
417
BzrError.__init__(self, message)
893
419
class SigningFailed(BzrError):
894
420
def __init__(self, command_line):
895
421
BzrError.__init__(self, "Failed to gpg sign data with command '%s'"
899
424
class WorkingTreeNotRevision(BzrError):
900
425
def __init__(self, tree):
901
426
BzrError.__init__(self, "The working tree for %s has changed since"
902
427
" last commit, but weave merge requires that it be"
903
428
" unchanged." % tree.basedir)
906
430
class CantReprocessAndShowBase(BzrNewError):
907
431
"""Can't reprocess and show base.
908
432
Reprocessing obscures relationship of conflicting lines to base."""
911
434
class GraphCycleError(BzrNewError):
912
435
"""Cycle in graph %(graph)r"""
913
436
def __init__(self, graph):
914
437
BzrNewError.__init__(self)
915
438
self.graph = graph
918
440
class NotConflicted(BzrNewError):
919
441
"""File %(filename)s is not conflicted."""
921
442
def __init__(self, filename):
922
443
BzrNewError.__init__(self)
923
444
self.filename = filename
926
446
class MustUseDecorated(Exception):
927
447
"""A decorating function has requested its original command be used.
929
449
This should never escape bzr, so does not need to be printable.
933
class NoBundleFound(BzrNewError):
934
"""No bundle was found in %(filename)s"""
935
def __init__(self, filename):
936
BzrNewError.__init__(self)
937
self.filename = filename
940
class BundleNotSupported(BzrNewError):
941
"""Unable to handle bundle version %(version)s: %(msg)s"""
942
def __init__(self, version, msg):
943
BzrNewError.__init__(self)
944
self.version = version
948
452
class MissingText(BzrNewError):
949
453
"""Branch %(base)s is missing revision %(text_revision)s of %(file_id)s"""
951
454
def __init__(self, branch, text_revision, file_id):
952
BzrNewError.__init__(self)
953
455
self.branch = branch
954
456
self.base = branch.base
955
457
self.text_revision = text_revision
956
458
self.file_id = file_id
959
class DuplicateKey(BzrNewError):
960
"""Key %(key)s is already present in map"""
963
class MalformedTransform(BzrNewError):
964
"""Tree transform is malformed %(conflicts)r"""
967
class BzrBadParameter(BzrNewError):
968
"""A bad parameter : %(param)s is not usable.
970
This exception should never be thrown, but it is a base class for all
971
parameter-to-function errors.
973
def __init__(self, param):
974
BzrNewError.__init__(self)
978
class BzrBadParameterNotUnicode(BzrBadParameter):
979
"""Parameter %(param)s is neither unicode nor utf8."""
982
class ReusingTransform(BzrNewError):
983
"""Attempt to reuse a transform that has already been applied."""
986
class CantMoveRoot(BzrNewError):
987
"""Moving the root directory is not supported at this time"""
990
class BzrBadParameterNotString(BzrBadParameter):
991
"""Parameter %(param)s is not a string or unicode string."""
994
class BzrBadParameterMissing(BzrBadParameter):
995
"""Parameter $(param)s is required but not present."""
998
class BzrBadParameterUnicode(BzrBadParameter):
999
"""Parameter %(param)s is unicode but only byte-strings are permitted."""
1002
class BzrBadParameterContainsNewline(BzrBadParameter):
1003
"""Parameter %(param)s contains a newline."""
1006
class DependencyNotPresent(BzrNewError):
1007
"""Unable to import library "%(library)s": %(error)s"""
1009
def __init__(self, library, error):
1010
BzrNewError.__init__(self, library=library, error=error)
1013
class ParamikoNotPresent(DependencyNotPresent):
1014
"""Unable to import paramiko (required for sftp support): %(error)s"""
1016
def __init__(self, error):
1017
DependencyNotPresent.__init__(self, 'paramiko', error)
1020
class PointlessMerge(BzrNewError):
1021
"""Nothing to merge."""
1024
class UninitializableFormat(BzrNewError):
1025
"""Format %(format)s cannot be initialised by this version of bzr."""
1027
def __init__(self, format):
1028
BzrNewError.__init__(self)
1029
self.format = format
1032
class BadConversionTarget(BzrNewError):
1033
"""Cannot convert to format %(format)s. %(problem)s"""
1035
def __init__(self, problem, format):
1036
BzrNewError.__init__(self)
1037
self.problem = problem
1038
self.format = format
1041
class NoDiff(BzrNewError):
1042
"""Diff is not installed on this machine: %(msg)s"""
1044
def __init__(self, msg):
1045
BzrNewError.__init__(self, msg=msg)
1048
class NoDiff3(BzrNewError):
1049
"""Diff3 is not installed on this machine."""
1052
class ExistingLimbo(BzrNewError):
1053
"""This tree contains left-over files from a failed operation.
1054
Please examine %(limbo_dir)s to see if it contains any files you wish to
1055
keep, and delete it when you are done.
1057
def __init__(self, limbo_dir):
1058
BzrNewError.__init__(self)
1059
self.limbo_dir = limbo_dir
1062
class ImmortalLimbo(BzrNewError):
1063
"""Unable to delete transform temporary directory $(limbo_dir)s.
1064
Please examine %(limbo_dir)s to see if it contains any files you wish to
1065
keep, and delete it when you are done.
1067
def __init__(self, limbo_dir):
1068
BzrNewError.__init__(self)
1069
self.limbo_dir = limbo_dir
1072
class OutOfDateTree(BzrNewError):
1073
"""Working tree is out of date, please run 'bzr update'."""
1075
def __init__(self, tree):
1076
BzrNewError.__init__(self)
1080
class MergeModifiedFormatError(BzrNewError):
1081
"""Error in merge modified format"""
1084
class ConflictFormatError(BzrNewError):
1085
"""Format error in conflict listings"""
1088
class CorruptRepository(BzrNewError):
1089
"""An error has been detected in the repository %(repo_path)s.
1090
Please run bzr reconcile on this repository."""
1092
def __init__(self, repo):
1093
BzrNewError.__init__(self)
1094
self.repo_path = repo.bzrdir.root_transport.base
1097
class UpgradeRequired(BzrNewError):
1098
"""To use this feature you must upgrade your branch at %(path)s."""
1100
def __init__(self, path):
1101
BzrNewError.__init__(self)
1105
class LocalRequiresBoundBranch(BzrNewError):
1106
"""Cannot perform local-only commits on unbound branches."""
1109
class MissingProgressBarFinish(BzrNewError):
1110
"""A nested progress bar was not 'finished' correctly."""
1113
class InvalidProgressBarType(BzrNewError):
1114
"""Environment variable BZR_PROGRESS_BAR='%(bar_type)s is not a supported type
1115
Select one of: %(valid_types)s"""
1117
def __init__(self, bar_type, valid_types):
1118
BzrNewError.__init__(self, bar_type=bar_type, valid_types=valid_types)
1121
class UnsupportedOperation(BzrNewError):
1122
"""The method %(mname)s is not supported on objects of type %(tname)s."""
1123
def __init__(self, method, method_self):
1124
self.method = method
1125
self.mname = method.__name__
1126
self.tname = type(method_self).__name__
1129
class BinaryFile(BzrNewError):
1130
"""File is binary but should be text."""
1133
class IllegalPath(BzrNewError):
1134
"""The path %(path)s is not permitted on this platform"""
1136
def __init__(self, path):
1137
BzrNewError.__init__(self)
1141
class TestamentMismatch(BzrNewError):
1142
"""Testament did not match expected value.
1143
For revision_id {%(revision_id)s}, expected {%(expected)s}, measured
1146
def __init__(self, revision_id, expected, measured):
1147
self.revision_id = revision_id
1148
self.expected = expected
1149
self.measured = measured
1152
class NotABundle(BzrNewError):
1153
"""Not a bzr revision-bundle: %(text)r"""
1155
def __init__(self, text):
1156
BzrNewError.__init__(self)
1160
class BadBundle(BzrNewError):
1161
"""Bad bzr revision-bundle: %(text)r"""
1163
def __init__(self, text):
1164
BzrNewError.__init__(self)
1168
class MalformedHeader(BadBundle):
1169
"""Malformed bzr revision-bundle header: %(text)r"""
1171
def __init__(self, text):
1172
BzrNewError.__init__(self)
1176
class MalformedPatches(BadBundle):
1177
"""Malformed patches in bzr revision-bundle: %(text)r"""
1179
def __init__(self, text):
1180
BzrNewError.__init__(self)
1184
class MalformedFooter(BadBundle):
1185
"""Malformed footer in bzr revision-bundle: %(text)r"""
1187
def __init__(self, text):
1188
BzrNewError.__init__(self)
1192
class UnsupportedEOLMarker(BadBundle):
1193
"""End of line marker was not \\n in bzr revision-bundle"""
1196
BzrNewError.__init__(self)
1199
class IncompatibleFormat(BzrNewError):
1200
"""Bundle format %(bundle_format)s is incompatible with %(other)s"""
1202
def __init__(self, bundle_format, other):
1203
BzrNewError.__init__(self)
1204
self.bundle_format = bundle_format
1208
class BadInventoryFormat(BzrNewError):
1209
"""Root class for inventory serialization errors"""
1212
class UnexpectedInventoryFormat(BadInventoryFormat):
1213
"""The inventory was not in the expected format:\n %(msg)s"""
1215
def __init__(self, msg):
1216
BadInventoryFormat.__init__(self, msg=msg)
1219
class NoSmartServer(NotBranchError):
1220
"""No smart server available at %(url)s"""
1222
def __init__(self, url):
1226
class UnknownSSH(BzrNewError):
1227
"""Unrecognised value for BZR_SSH environment variable: %(vendor)s"""
1229
def __init__(self, vendor):
1230
BzrNewError.__init__(self)
1231
self.vendor = vendor
1234
class GhostRevisionUnusableHere(BzrNewError):
1235
"""Ghost revision {%(revision_id)s} cannot be used here."""
1237
def __init__(self, revision_id):
1238
BzrNewError.__init__(self)
1239
self.revision_id = revision_id
1242
class IllegalUseOfScopeReplacer(BzrNewError):
1243
"""ScopeReplacer object %(name)r was used incorrectly: %(msg)s%(extra)s"""
1245
is_user_error = False
1247
def __init__(self, name, msg, extra=None):
1248
BzrNewError.__init__(self)
1252
self.extra = ': ' + str(extra)
1257
class InvalidImportLine(BzrNewError):
1258
"""Not a valid import statement: %(msg)\n%(text)s"""
1260
is_user_error = False
1262
def __init__(self, text, msg):
1263
BzrNewError.__init__(self)
1268
class ImportNameCollision(BzrNewError):
1269
"""Tried to import an object to the same name as an existing object. %(name)s"""
1271
is_user_error = False
1273
def __init__(self, name):
1274
BzrNewError.__init__(self)