From a201ff9a72ed8cccedf27ef712bae00e4532b48c Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 4 Oct 2009 21:34:54 -0400 Subject: Updated sample html report. --- doc/sample_html/_ned_py_path.html | 1508 +++++++++++++++++++++++++++++++++++++ 1 file changed, 1508 insertions(+) create mode 100644 doc/sample_html/_ned_py_path.html (limited to 'doc/sample_html/_ned_py_path.html') diff --git a/doc/sample_html/_ned_py_path.html b/doc/sample_html/_ned_py_path.html new file mode 100644 index 0000000..78637ee --- /dev/null +++ b/doc/sample_html/_ned_py_path.html @@ -0,0 +1,1508 @@ + + + +Coverage for c:\ned\py\path + + + + + + + +
+ + + + + +
+

1

+

2

+

3

+

4

+

5

+

6

+

7

+

8

+

9

+

10

+

11

+

12

+

13

+

14

+

15

+

16

+

17

+

18

+

19

+

20

+

21

+

22

+

23

+

24

+

25

+

26

+

27

+

28

+

29

+

30

+

31

+

32

+

33

+

34

+

35

+

36

+

37

+

38

+

39

+

40

+

41

+

42

+

43

+

44

+

45

+

46

+

47

+

48

+

49

+

50

+

51

+

52

+

53

+

54

+

55

+

56

+

57

+

58

+

59

+

60

+

61

+

62

+

63

+

64

+

65

+

66

+

67

+

68

+

69

+

70

+

71

+

72

+

73

+

74

+

75

+

76

+

77

+

78

+

79

+

80

+

81

+

82

+

83

+

84

+

85

+

86

+

87

+

88

+

89

+

90

+

91

+

92

+

93

+

94

+

95

+

96

+

97

+

98

+

99

+

100

+

101

+

102

+

103

+

104

+

105

+

106

+

107

+

108

+

109

+

110

+

111

+

112

+

113

+

114

+

115

+

116

+

117

+

118

+

119

+

120

+

121

+

122

+

123

+

124

+

125

+

126

+

127

+

128

+

129

+

130

+

131

+

132

+

133

+

134

+

135

+

136

+

137

+

138

+

139

+

140

+

141

+

142

+

143

+

144

+

145

+

146

+

147

+

148

+

149

+

150

+

151

+

152

+

153

+

154

+

155

+

156

+

157

+

158

+

159

+

160

+

161

+

162

+

163

+

164

+

165

+

166

+

167

+

168

+

169

+

170

+

171

+

172

+

173

+

174

+

175

+

176

+

177

+

178

+

179

+

180

+

181

+

182

+

183

+

184

+

185

+

186

+

187

+

188

+

189

+

190

+

191

+

192

+

193

+

194

+

195

+

196

+

197

+

198

+

199

+

200

+

201

+

202

+

203

+

204

+

205

+

206

+

207

+

208

+

209

+

210

+

211

+

212

+

213

+

214

+

215

+

216

+

217

+

218

+

219

+

220

+

221

+

222

+

223

+

224

+

225

+

226

+

227

+

228

+

229

+

230

+

231

+

232

+

233

+

234

+

235

+

236

+

237

+

238

+

239

+

240

+

241

+

242

+

243

+

244

+

245

+

246

+

247

+

248

+

249

+

250

+

251

+

252

+

253

+

254

+

255

+

256

+

257

+

258

+

259

+

260

+

261

+

262

+

263

+

264

+

265

+

266

+

267

+

268

+

269

+

270

+

271

+

272

+

273

+

274

+

275

+

276

+

277

+

278

+

279

+

280

+

281

+

282

+

283

+

284

+

285

+

286

+

287

+

288

+

289

+

290

+

291

+

292

+

293

+

294

+

295

+

296

+

297

+

298

+

299

+

300

+

301

+

302

+

303

+

304

+

305

+

306

+

307

+

308

+

309

+

310

+

311

+

312

+

313

+

314

+

315

+

316

+

317

+

318

+

319

+

320

+

321

+

322

+

323

+

324

+

325

+

326

+

327

+

328

+

329

+

330

+

331

+

332

+

333

+

334

+

335

+

336

+

337

+

338

+

339

+

340

+

341

+

342

+

343

+

344

+

345

+

346

+

347

+

348

+

349

+

350

+

351

+

352

+

353

+

354

+

355

+

356

+

357

+

358

+

359

+

360

+

361

+

362

+

363

+

364

+

365

+

366

+

367

+

368

+

369

+

370

+

371

+

372

+

373

+

374

+

375

+

376

+

377

+

378

+

379

+

380

+

381

+

382

+

383

+

384

+

385

+

386

+

387

+

388

+

389

+

390

+

391

+

392

+

393

+

394

+

395

+

396

+

397

+

398

+

399

+

400

+

401

+

402

+

403

+

404

+

405

+

406

+

407

+

408

+

409

+

410

+

411

+

412

+

413

+

414

+

415

+

416

+

417

+

418

+

419

+

420

+

421

+

422

+

423

+

424

+

425

+

426

+

427

+

428

+

429

+

430

+

431

+

432

+

433

+

434

+

435

+

436

+

437

+

438

+

439

+

440

+

441

+

442

+

443

+

444

+

445

+

446

+

447

+

448

+

449

+

450

+

451

+

452

+

453

+

454

+

455

+

456

+

457

+

458

+

459

+

460

+

461

+

462

+

463

+

464

+

465

+

466

+

467

+

468

+

469

+

470

+

471

+

472

+

473

+

474

+

475

+

476

+

477

+

478

+

479

+

480

+

481

+

482

+

483

+

484

+

485

+

486

+

487

+

488

+

489

+

490

+

491

+

492

+

493

+

494

+

495

+

496

+

497

+

498

+

499

+

500

+

501

+

502

+

503

+

504

+

505

+

506

+

507

+

508

+

509

+

510

+

511

+

512

+

513

+

514

+

515

+

516

+

517

+

518

+

519

+

520

+

521

+

522

+

523

+

524

+

525

+

526

+

527

+

528

+

529

+

530

+

531

+

532

+

533

+

534

+

535

+

536

+

537

+

538

+

539

+

540

+

541

+

542

+

543

+

544

+

545

+

546

+

547

+

548

+

549

+

550

+

551

+

552

+

553

+

554

+

555

+

556

+

557

+

558

+

559

+

560

+

561

+

562

+

563

+

564

+

565

+

566

+

567

+

568

+

569

+

570

+

571

+

572

+

573

+

574

+

575

+

576

+

577

+

578

+

579

+

580

+

581

+

582

+

583

+

584

+

585

+

586

+

587

+

588

+

589

+

590

+

591

+

592

+

593

+

594

+

595

+

596

+

597

+

598

+

599

+

600

+

601

+

602

+

603

+

604

+

605

+

606

+

607

+

608

+

609

+

610

+

611

+

612

+

613

+

614

+

615

+

616

+

617

+

618

+

619

+

620

+

621

+

622

+

623

+

624

+

625

+

626

+

627

+

628

+

629

+

630

+

631

+

632

+

633

+

634

+

635

+

636

+

637

+

638

+

639

+

640

+

641

+

642

+

643

+

644

+

645

+

646

+

647

+

648

+

649

+

650

+

651

+

652

+

653

+

654

+

655

+

656

+

657

+

658

+

659

+

660

+

661

+

662

+

663

+

664

+

665

+

666

+

667

+

668

+

669

+

670

+

671

+

672

+

673

+

674

+

675

+

676

+

677

+

678

+

679

+

680

+

681

+

682

+

683

+

684

+

685

+

686

+

687

+

688

+

689

+

690

+

691

+

692

+

693

+

694

+

695

+

696

+

697

+

698

+

699

+

700

+

701

+

702

+

703

+

704

+

705

+

706

+

707

+

708

+

709

+

710

+

711

+

712

+

713

+

714

+

715

+

716

+

717

+

718

+

719

+

720

+

721

+

722

+

723

+

724

+

725

+

726

+

727

+

728

+

729

+ +
+

""" path.py - An object representing a path to a file or directory. 

+

 

+

Example: 

+

 

+

from path import path 

+

d = path('/home/guido/bin') 

+

for f in d.files('*.py'): 

+

    f.chmod(0755) 

+

 

+

This module requires Python 2.2 or later. 

+

 

+

 

+

URL:     http://www.jorendorff.com/articles/python/path 

+

Author:  Jason Orendorff <jason@jorendorff.com> (and others - see the url!) 

+

Date:    29 Feb 2004 

+

""" 

+

 

+

 

+

# TODO 

+

#   - Bug in write_text().  It doesn't support Universal newline mode. 

+

#   - Better error message in listdir() when self isn't a 

+

#     directory. (On Windows, the error message really sucks.) 

+

#   - Make sure everything has a good docstring. 

+

#   - Add methods for regex find and replace. 

+

#   - guess_content_type() method? 

+

#   - Perhaps support arguments to touch(). 

+

#   - Could add split() and join() methods that generate warnings. 

+

#   - Note:  __add__() technically has a bug, I think, where 

+

#     it doesn't play nice with other types that implement 

+

#     __radd__().  Test this. 

+

 

+

from __future__ import generators 

+

 

+

import sys, os, fnmatch, glob, shutil, codecs 

+

 

+

__version__ = '2.0.2' 

+

__all__ = ['path'] 

+

 

+

# Pre-2.3 support.  Are unicode filenames supported? 

+

_base = str 

+

try: 

+

    if os.path.supports_unicode_filenames: 

+

        _base = unicode 

+

except AttributeError: 

+

    pass 

+

 

+

# Pre-2.3 workaround for basestring. 

+

try: 

+

    basestring 

+

except NameError: 

+

    basestring = (str, unicode) 

+

 

+

# Universal newline support 

+

_textmode = 'r' 

+

if hasattr(file, 'newlines'): 

+

    _textmode = 'U' 

+

 

+

 

+

class path(_base): 

+

    """ Represents a filesystem path. 

+

 

+

    For documentation on individual methods, consult their 

+

    counterparts in os.path. 

+

    """ 

+

 

+

    # --- Special Python methods. 

+

 

+

    def __repr__(self): 

+

        return 'path(%s)' % _base.__repr__(self) 

+

 

+

    # Adding a path and a string yields a path. 

+

    def __add__(self, more): 

+

        return path(_base(self) + more) 

+

 

+

    def __radd__(self, other): 

+

        return path(other + _base(self)) 

+

 

+

    # The / operator joins paths. 

+

    def __div__(self, rel): 

+

        """ fp.__div__(rel) == fp / rel == fp.joinpath(rel) 

+

 

+

        Join two path components, adding a separator character if 

+

        needed. 

+

        """ 

+

        return path(os.path.join(self, rel)) 

+

 

+

    # Make the / operator work even when true division is enabled. 

+

    __truediv__ = __div__ 

+

 

+

    def getcwd(): 

+

        """ Return the current working directory as a path object. """ 

+

        return path(os.getcwd()) 

+

    getcwd = staticmethod(getcwd) 

+

 

+

 

+

    # --- Operations on path strings. 

+

 

+

    def abspath(self):       return path(os.path.abspath(self)) 

+

    def normcase(self):      return path(os.path.normcase(self)) 

+

    def normpath(self):      return path(os.path.normpath(self)) 

+

    def realpath(self):      return path(os.path.realpath(self)) 

+

    def expanduser(self):    return path(os.path.expanduser(self)) 

+

    def expandvars(self):    return path(os.path.expandvars(self)) 

+

    def dirname(self):       return path(os.path.dirname(self)) 

+

    basename = os.path.basename 

+

 

+

    def expand(self): 

+

        """ Clean up a filename by calling expandvars(), 

+

        expanduser(), and normpath() on it. 

+

 

+

        This is commonly everything needed to clean up a filename 

+

        read from a configuration file, for example. 

+

        """ 

+

        return self.expandvars().expanduser().normpath() 

+

 

+

    def _get_namebase(self): 

+

        base, ext = os.path.splitext(self.name) 

+

        return base 

+

 

+

    def _get_ext(self): 

+

        f, ext = os.path.splitext(_base(self)) 

+

        return ext 

+

 

+

    def _get_drive(self): 

+

        drive, r = os.path.splitdrive(self) 

+

        return path(drive) 

+

 

+

    parent = property( 

+

        dirname, None, None, 

+

        """ This path's parent directory, as a new path object. 

+

 

+

        For example, path('/usr/local/lib/libpython.so').parent == path('/usr/local/lib') 

+

        """) 

+

 

+

    name = property( 

+

        basename, None, None, 

+

        """ The name of this file or directory without the full path. 

+

 

+

        For example, path('/usr/local/lib/libpython.so').name == 'libpython.so' 

+

        """) 

+

 

+

    namebase = property( 

+

        _get_namebase, None, None, 

+

        """ The same as path.name, but with one file extension stripped off. 

+

 

+

        For example, path('/home/guido/python.tar.gz').name     == 'python.tar.gz', 

+

        but          path('/home/guido/python.tar.gz').namebase == 'python.tar' 

+

        """) 

+

 

+

    ext = property( 

+

        _get_ext, None, None, 

+

        """ The file extension, for example '.py'. """) 

+

 

+

    drive = property( 

+

        _get_drive, None, None, 

+

        """ The drive specifier, for example 'C:'. 

+

        This is always empty on systems that don't use drive specifiers. 

+

        """) 

+

 

+

    def splitpath(self): 

+

        """ p.splitpath() -> Return (p.parent, p.name). """ 

+

        parent, child = os.path.split(self) 

+

        return path(parent), child 

+

 

+

    def splitdrive(self): 

+

        """ p.splitdrive() -> Return (p.drive, <the rest of p>). 

+

 

+

        Split the drive specifier from this path.  If there is 

+

        no drive specifier, p.drive is empty, so the return value 

+

        is simply (path(''), p).  This is always the case on Unix. 

+

        """ 

+

        drive, rel = os.path.splitdrive(self) 

+

        return path(drive), rel 

+

 

+

    def splitext(self): 

+

        """ p.splitext() -> Return (p.stripext(), p.ext). 

+

 

+

        Split the filename extension from this path and return 

+

        the two parts.  Either part may be empty. 

+

 

+

        The extension is everything from '.' to the end of the 

+

        last path segment.  This has the property that if 

+

        (a, b) == p.splitext(), then a + b == p. 

+

        """ 

+

        # Cast to plain string using _base because Python 2.2 

+

        # implementations of os.path.splitext use "for c in path:..." 

+

        # which means something different when applied to a path 

+

        # object. 

+

        filename, ext = os.path.splitext(_base(self)) 

+

        return path(filename), ext 

+

 

+

    def stripext(self): 

+

        """ p.stripext() -> Remove one file extension from the path. 

+

 

+

        For example, path('/home/guido/python.tar.gz').stripext() 

+

        returns path('/home/guido/python.tar'). 

+

        """ 

+

        return self.splitext()[0] 

+

 

+

    if hasattr(os.path, 'splitunc'): 

+

        def splitunc(self): 

+

            unc, rest = os.path.splitunc(self) 

+

            return path(unc), rest 

+

 

+

        def _get_uncshare(self): 

+

            unc, r = os.path.splitunc(self) 

+

            return path(unc) 

+

 

+

        uncshare = property( 

+

            _get_uncshare, None, None, 

+

            """ The UNC mount point for this path. 

+

            This is empty for paths on local drives. """) 

+

 

+

    def joinpath(self, *args): 

+

        """ Join two or more path components, adding a separator 

+

        character (os.sep) if needed.  Returns a new path 

+

        object. 

+

        """ 

+

        return path(os.path.join(self, *args)) 

+

 

+

    def splitall(self): 

+

        """ Return a list of the path components in this path. 

+

 

+

        The first item in the list will be a path.  Its value will be 

+

        either os.curdir, os.pardir, empty, or the root directory of 

+

        this path (for example, '/' or 'C:\\').  The other items in 

+

        the list will be strings. 

+

 

+

        path.path.joinpath(*result) will yield the original path. 

+

        """ 

+

        parts = [] 

+

        loc = self 

+

        while loc != os.curdir and loc != os.pardir: 

+

            prev = loc 

+

            loc, child = prev.splitpath() 

+

            if loc == prev: 

+

                break 

+

            parts.append(child) 

+

        parts.append(loc) 

+

        parts.reverse() 

+

        return parts 

+

 

+

    def relpath(self): 

+

        """ Return this path as a relative path, 

+

        based from the current working directory. 

+

        """ 

+

        cwd = path(os.getcwd()) 

+

        return cwd.relpathto(self) 

+

 

+

    def relpathto(self, dest): 

+

        """ Return a relative path from self to dest. 

+

 

+

        If there is no relative path from self to dest, for example if 

+

        they reside on different drives in Windows, then this returns 

+

        dest.abspath(). 

+

        """ 

+

        origin = self.abspath() 

+

        dest = path(dest).abspath() 

+

 

+

        orig_list = origin.normcase().splitall() 

+

        # Don't normcase dest!  We want to preserve the case. 

+

        dest_list = dest.splitall() 

+

 

+

        if orig_list[0] != os.path.normcase(dest_list[0]): 

+

            # Can't get here from there. 

+

            return dest 

+

 

+

        # Find the location where the two paths start to differ. 

+

        i = 0 

+

        for start_seg, dest_seg in zip(orig_list, dest_list): 

+

            if start_seg != os.path.normcase(dest_seg): 

+

                break 

+

            i += 1 

+

 

+

        # Now i is the point where the two paths diverge. 

+

        # Need a certain number of "os.pardir"s to work up 

+

        # from the origin to the point of divergence. 

+

        segments = [os.pardir] * (len(orig_list) - i) 

+

        # Need to add the diverging part of dest_list. 

+

        segments += dest_list[i:] 

+

        if len(segments) == 0: 

+

            # If they happen to be identical, use os.curdir. 

+

            return path(os.curdir) 

+

        else: 

+

            return path(os.path.join(*segments)) 

+

 

+

 

+

    # --- Listing, searching, walking, and matching 

+

 

+

    def listdir(self, pattern=None): 

+

        """ D.listdir() -> List of items in this directory. 

+

 

+

        Use D.files() or D.dirs() instead if you want a listing 

+

        of just files or just subdirectories. 

+

 

+

        The elements of the list are path objects. 

+

 

+

        With the optional 'pattern' argument, this only lists 

+

        items whose names match the given pattern. 

+

        """ 

+

        names = os.listdir(self) 

+

        if pattern is not None: 

+

            names = fnmatch.filter(names, pattern) 

+

        return [self / child for child in names] 

+

 

+

    def dirs(self, pattern=None): 

+

        """ D.dirs() -> List of this directory's subdirectories. 

+

 

+

        The elements of the list are path objects. 

+

        This does not walk recursively into subdirectories 

+

        (but see path.walkdirs). 

+

 

+

        With the optional 'pattern' argument, this only lists 

+

        directories whose names match the given pattern.  For 

+

        example, d.dirs('build-*'). 

+

        """ 

+

        return [p for p in self.listdir(pattern) if p.isdir()] 

+

 

+

    def files(self, pattern=None): 

+

        """ D.files() -> List of the files in this directory. 

+

 

+

        The elements of the list are path objects. 

+

        This does not walk into subdirectories (see path.walkfiles). 

+

 

+

        With the optional 'pattern' argument, this only lists files 

+

        whose names match the given pattern.  For example, 

+

        d.files('*.pyc'). 

+

        """ 

+

 

+

        return [p for p in self.listdir(pattern) if p.isfile()] 

+

 

+

    def walk(self, pattern=None): 

+

        """ D.walk() -> iterator over files and subdirs, recursively. 

+

 

+

        The iterator yields path objects naming each child item of 

+

        this directory and its descendants.  This requires that 

+

        D.isdir(). 

+

 

+

        This performs a depth-first traversal of the directory tree. 

+

        Each directory is returned just before all its children. 

+

        """ 

+

        for child in self.listdir(): 

+

            if pattern is None or child.fnmatch(pattern): 

+

                yield child 

+

            if child.isdir(): 

+

                for item in child.walk(pattern): 

+

                    yield item 

+

 

+

    def walkdirs(self, pattern=None): 

+

        """ D.walkdirs() -> iterator over subdirs, recursively. 

+

 

+

        With the optional 'pattern' argument, this yields only 

+

        directories whose names match the given pattern.  For 

+

        example, mydir.walkdirs('*test') yields only directories 

+

        with names ending in 'test'. 

+

        """ 

+

        for child in self.dirs(): 

+

            if pattern is None or child.fnmatch(pattern): 

+

                yield child 

+

            for subsubdir in child.walkdirs(pattern): 

+

                yield subsubdir 

+

 

+

    def walkfiles(self, pattern=None): 

+

        """ D.walkfiles() -> iterator over files in D, recursively. 

+

 

+

        The optional argument, pattern, limits the results to files 

+

        with names that match the pattern.  For example, 

+

        mydir.walkfiles('*.tmp') yields only files with the .tmp 

+

        extension. 

+

        """ 

+

        for child in self.listdir(): 

+

            if child.isfile(): 

+

                if pattern is None or child.fnmatch(pattern): 

+

                    yield child 

+

            elif child.isdir(): 

+

                for f in child.walkfiles(pattern): 

+

                    yield f 

+

 

+

    def fnmatch(self, pattern): 

+

        """ Return True if self.name matches the given pattern. 

+

 

+

        pattern - A filename pattern with wildcards, 

+

            for example '*.py'. 

+

        """ 

+

        return fnmatch.fnmatch(self.name, pattern) 

+

 

+

    def glob(self, pattern): 

+

        """ Return a list of path objects that match the pattern. 

+

 

+

        pattern - a path relative to this directory, with wildcards. 

+

 

+

        For example, path('/users').glob('*/bin/*') returns a list 

+

        of all the files users have in their bin directories. 

+

        """ 

+

        return map(path, glob.glob(_base(self / pattern))) 

+

 

+

 

+

    # --- Reading or writing an entire file at once. 

+

 

+

    def open(self, mode='r'): 

+

        """ Open this file.  Return a file object. """ 

+

        return file(self, mode) 

+

 

+

    def bytes(self): 

+

        """ Open this file, read all bytes, return them as a string. """ 

+

        f = self.open('rb') 

+

        try: 

+

            return f.read() 

+

        finally: 

+

            f.close() 

+

 

+

    def write_bytes(self, bytes, append=False): 

+

        """ Open this file and write the given bytes to it. 

+

 

+

        Default behavior is to overwrite any existing file. 

+

        Call this with write_bytes(bytes, append=True) to append instead. 

+

        """ 

+

        if append: 

+

            mode = 'ab' 

+

        else: 

+

            mode = 'wb' 

+

        f = self.open(mode) 

+

        try: 

+

            f.write(bytes) 

+

        finally: 

+

            f.close() 

+

 

+

    def text(self, encoding=None, errors='strict'): 

+

        """ Open this file, read it in, return the content as a string. 

+

 

+

        This uses 'U' mode in Python 2.3 and later, so '\r\n' and '\r' 

+

        are automatically translated to '\n'. 

+

 

+

        Optional arguments: 

+

 

+

        encoding - The Unicode encoding (or character set) of 

+

            the file.  If present, the content of the file is 

+

            decoded and returned as a unicode object; otherwise 

+

            it is returned as an 8-bit str. 

+

        errors - How to handle Unicode errors; see help(str.decode) 

+

            for the options.  Default is 'strict'. 

+

        """ 

+

        if encoding is None: 

+

            # 8-bit 

+

            f = self.open(_textmode) 

+

            try: 

+

                return f.read() 

+

            finally: 

+

                f.close() 

+

        else: 

+

            # Unicode 

+

            f = codecs.open(self, 'r', encoding, errors) 

+

            # (Note - Can't use 'U' mode here, since codecs.open 

+

            # doesn't support 'U' mode, even in Python 2.3.) 

+

            try: 

+

                t = f.read() 

+

            finally: 

+

                f.close() 

+

            return t.replace(u'\r\n', u'\n').replace(u'\r', u'\n') 

+

 

+

    def write_text(self, text, encoding=None, errors='strict', append=False): 

+

        """ Write the given text to this file. 

+

 

+

        The default behavior is to overwrite any existing file; 

+

        to append instead, use the 'append=True' keyword argument. 

+

 

+

        There are two differences between path.write_text() and 

+

        path.write_bytes(): Unicode handling and newline handling. 

+

 

+

        --- Unicode 

+

 

+

        If 'text' isn't Unicode, this essentially just does 

+

        open(self, 'w').write(text).  The 'encoding' and 'errors' 

+

        arguments are ignored. 

+

 

+

        If 'text' is Unicode, it is first converted to bytes using the 

+

        specified 'encoding' (or the default encoding if 'encoding' 

+

        isn't specified).  The 'errors' argument applies only to this 

+

        conversion. 

+

 

+

        --- Newlines 

+

 

+

        write_text() converts from programmer-friendly newlines 

+

        (always '\n') to platform-specific newlines (see os.linesep; 

+

        on Windows, for example, the end-of-line marker is '\r\n'). 

+

        This applies to Unicode text the same as to 8-bit text. 

+

 

+

        Because of this conversion, the text should only contain plain 

+

        newlines ('\n'), just like the return value of path.text(). 

+

        If the text contains the characters '\r\n', it may be written 

+

        as '\r\r\n' or '\r\r' depending on your platform.  (This is 

+

        exactly the same as when you open a file for writing with 

+

        fopen(filename, "w") in C or file(filename, 'w') in Python.) 

+

        """ 

+

        if isinstance(text, unicode): 

+

            text = text.replace(u'\n', os.linesep) 

+

            if encoding is None: 

+

                encoding = sys.getdefaultencoding() 

+

            bytes = text.encode(encoding, errors) 

+

            self.write_bytes(bytes, append) 

+

        else: 

+

            if append: 

+

                mode = 'a' 

+

            else: 

+

                mode = 'w' 

+

            f = self.open(mode) 

+

            try: 

+

                f.write(text) 

+

            finally: 

+

                f.close() 

+

 

+

    def lines(self, encoding=None, errors='strict', retain=True): 

+

        """ Open this file, read all lines, return them in a list. 

+

 

+

        Optional arguments: 

+

            encoding - The Unicode encoding (or character set) of 

+

                the file.  The default is None, meaning the content 

+

                of the file is read as 8-bit characters and returned 

+

                as a list of (non-Unicode) str objects. 

+

            errors - How to handle Unicode errors; see help(str.decode) 

+

                for the options.  Default is 'strict' 

+

            retain - If true, retain newline characters; but all newline 

+

                character combinations ('\r', '\n', '\r\n') are 

+

                translated to '\n'.  If false, newline characters are 

+

                stripped off.  Default is True. 

+

 

+

        This uses 'U' mode in Python 2.3 and later. 

+

        """ 

+

        if encoding is None and retain: 

+

            f = self.open(_textmode) 

+

            try: 

+

                return f.readlines() 

+

            finally: 

+

                f.close() 

+

        else: 

+

            return self.text(encoding, errors).splitlines(retain) 

+

 

+

    def write_lines(self, lines, encoding=None, errors='strict', 

+

                    linesep=os.linesep): 

+

        """ Overwrite this file with the given lines of text. 

+

 

+

        lines - A list of strings. 

+

        encoding - A Unicode encoding to use.  This applies only if 

+

            'lines' contains any Unicode strings. 

+

        errors - How to handle errors in Unicode encoding.  This 

+

            also applies only to Unicode strings. 

+

        linesep - A character sequence that will be added at the 

+

            end of every line that doesn't already have it. 

+

        """ 

+

        f = self.open('wb') 

+

        try: 

+

            for line in lines: 

+

                if not line.endswith(linesep): 

+

                    line += linesep 

+

                if isinstance(line, unicode): 

+

                    if encoding is None: 

+

                        encoding = sys.getdefaultencoding() 

+

                    line = line.encode(encoding, errors=errors) 

+

                f.write(line) 

+

        finally: 

+

            f.close() 

+

 

+

 

+

    # --- Methods for querying the filesystem. 

+

 

+

    exists = os.path.exists 

+

    isabs = os.path.isabs 

+

    isdir = os.path.isdir 

+

    isfile = os.path.isfile 

+

    islink = os.path.islink 

+

    ismount = os.path.ismount 

+

 

+

    if hasattr(os.path, 'samefile'): 

+

        samefile = os.path.samefile 

+

 

+

    getatime = os.path.getatime 

+

    atime = property( 

+

        getatime, None, None, 

+

        """ Last access time of the file. """) 

+

 

+

    getmtime = os.path.getmtime 

+

    mtime = property( 

+

        getmtime, None, None, 

+

        """ Last-modified time of the file. """) 

+

 

+

    if hasattr(os.path, 'getctime'): 

+

        getctime = os.path.getctime 

+

        ctime = property( 

+

            getctime, None, None, 

+

            """ Creation time of the file. """) 

+

 

+

    getsize = os.path.getsize 

+

    size = property( 

+

        getsize, None, None, 

+

        """ Size of the file, in bytes. """) 

+

 

+

    if hasattr(os, 'access'): 

+

        def access(self, mode): 

+

            """ Return true if current user has access to this path. 

+

 

+

            mode - One of the constants os.F_OK, os.R_OK, os.W_OK, os.X_OK 

+

            """ 

+

            return os.access(self, mode) 

+

 

+

    def stat(self): 

+

        """ Perform a stat() system call on this path. """ 

+

        return os.stat(self) 

+

 

+

    def lstat(self): 

+

        """ Like path.stat(), but do not follow symbolic links. """ 

+

        return os.lstat(self) 

+

 

+

    if hasattr(os, 'statvfs'): 

+

        def statvfs(self): 

+

            """ Perform a statvfs() system call on this path. """ 

+

            return os.statvfs(self) 

+

 

+

    if hasattr(os, 'pathconf'): 

+

        def pathconf(self, name): 

+

            return os.pathconf(self, name) 

+

 

+

 

+

    # --- Modifying operations on files and directories 

+

 

+

    def utime(self, times): 

+

        """ Set the access and modified times of this file. """ 

+

        os.utime(self, times) 

+

 

+

    def chmod(self, mode): 

+

        os.chmod(self, mode) 

+

 

+

    if hasattr(os, 'chown'): 

+

        def chown(self, uid, gid): 

+

            os.chown(self, uid, gid) 

+

 

+

    def rename(self, new): 

+

        os.rename(self, new) 

+

 

+

    def renames(self, new): 

+

        os.renames(self, new) 

+

 

+

 

+

    # --- Create/delete operations on directories 

+

 

+

    def mkdir(self, mode=0777): 

+

        os.mkdir(self, mode) 

+

 

+

    def makedirs(self, mode=0777): 

+

        os.makedirs(self, mode) 

+

 

+

    def rmdir(self): 

+

        os.rmdir(self) 

+

 

+

    def removedirs(self): 

+

        os.removedirs(self) 

+

 

+

 

+

    # --- Modifying operations on files 

+

 

+

    def touch(self): 

+

        """ Set the access/modified times of this file to the current time. 

+

        Create the file if it does not exist. 

+

        """ 

+

        fd = os.open(self, os.O_WRONLY | os.O_CREAT, 0666) 

+

        os.close(fd) 

+

        os.utime(self, None) 

+

 

+

    def remove(self): 

+

        os.remove(self) 

+

 

+

    def unlink(self): 

+

        os.unlink(self) 

+

 

+

 

+

    # --- Links 

+

 

+

    if hasattr(os, 'link'): 

+

        def link(self, newpath): 

+

            """ Create a hard link at 'newpath', pointing to this file. """ 

+

            os.link(self, newpath) 

+

 

+

    if hasattr(os, 'symlink'): 

+

        def symlink(self, newlink): 

+

            """ Create a symbolic link at 'newlink', pointing here. """ 

+

            os.symlink(self, newlink) 

+

 

+

    if hasattr(os, 'readlink'): 

+

        def readlink(self): 

+

            """ Return the path to which this symbolic link points. 

+

 

+

            The result may be an absolute or a relative path. 

+

            """ 

+

            return path(os.readlink(self)) 

+

 

+

        def readlinkabs(self): 

+

            """ Return the path to which this symbolic link points. 

+

 

+

            The result is always an absolute path. 

+

            """ 

+

            p = self.readlink() 

+

            if p.isabs(): 

+

                return p 

+

            else: 

+

                return (self.parent / p).abspath() 

+

 

+

 

+

    # --- High-level functions from shutil 

+

 

+

    copyfile = shutil.copyfile 

+

    copymode = shutil.copymode 

+

    copystat = shutil.copystat 

+

    copy = shutil.copy 

+

    copy2 = shutil.copy2 

+

    copytree = shutil.copytree 

+

    if hasattr(shutil, 'move'): 

+

        move = shutil.move 

+

    rmtree = shutil.rmtree 

+

 

+

 

+

    # --- Special stuff from os 

+

 

+

    if hasattr(os, 'chroot'): 

+

        def chroot(self): 

+

            os.chroot(self) 

+

 

+

    if hasattr(os, 'startfile'): 

+

        def startfile(self): 

+

            os.startfile(self) 

+

 

+ +
+
+ + + -- cgit v1.2.1