| |
| |
Foreword | |
| |
| |
Preface | |
| |
| |
| |
Driving Code Through Tests | |
| |
| |
A Quick Note on Testing Frameworks | |
| |
| |
Designing for Testability | |
| |
| |
Testing Fundamentals | |
| |
| |
Well-Focused Examples | |
| |
| |
Testing Exceptions | |
| |
| |
Run the Whole Suite at Once | |
| |
| |
Advanced Testing Techniques | |
| |
| |
Using Mocks and Stubs | |
| |
| |
Testing Complex Output | |
| |
| |
Keeping Things Organized | |
| |
| |
Embedding Tests in Library Files | |
| |
| |
Test Helpers | |
| |
| |
Custom Assertions | |
| |
| |
Conclusions | |
| |
| |
| |
Designing Beautiful APIs | |
| |
| |
Designing for Convenience: Ruport's Table() feature | |
| |
| |
Ruby's Secret Power: Flexible Argument Processing | |
| |
| |
Standard Ordinal Arguments | |
| |
| |
Ordinal Arguments with Optional Parameters | |
| |
| |
Pseudo-Keyword Arguments | |
| |
| |
Treating Arguments As an Array | |
| |
| |
Ruby's Other Secret Power: Code Blocks | |
| |
| |
Working with Enumerable | |
| |
| |
Using Blocks to Abstract Pre- and Postprocessing | |
| |
| |
Blocks As Dynamic Callbacks | |
| |
| |
Blocks for Interface Simplification | |
| |
| |
Avoiding Surprises | |
| |
| |
Use attr_reader, attr_writer, and attr_accessor | |
| |
| |
Understand What method? and method! Mean | |
| |
| |
Make Use of Custom Operators | |
| |
| |
Conclusions | |
| |
| |
| |
Mastering the Dynamic Toolkit | |
| |
| |
BlankSlate: A BasicObject on Steroids | |
| |
| |
Building Flexible Interfaces | |
| |
| |
Making instance_eval() Optional | |
| |
| |
Handling Messages with method_missing() and send() | |
| |
| |
Dual-Purpose Accessors | |
| |
| |
Implementing Per-Object Behavior | |
| |
| |
Extending and Modifying Preexisting Code | |
| |
| |
Adding New Functionality | |
| |
| |
Modification via Aliasing | |
| |
| |
Per-Object Modification | |
| |
| |
Building Classes and Modules Programmatically | |
| |
| |
Registering Hooks and Callbacks | |
| |
| |
Detecting Newly Added Functionality | |
| |
| |
Tracking Inheritance | |
| |
| |
Tracking Mixins | |
| |
| |
Conclusions | |
| |
| |
| |
Text Processing and File Management | |
| |
| |
Line-Based File Processing with State Tracking | |
| |
| |
Regular Expressions | |
| |
| |
Don't Work Too Hard | |
| |
| |
Anchors Are Your Friends | |
| |
| |
Use Caution When Working with Quantifiers | |
| |
| |
Working with Files | |
| |
| |
Using Pathname and FileUtils | |
| |
| |
The tempfile Standard Library | |
| |
| |
Automatic Temporary Directory Handling | |
| |
| |
Collision Avoidance | |
| |
| |
Same Old I/O Operations | |
| |
| |
Automatic Unlinking | |
| |
| |
Text-Processing Strategies | |
| |
| |
Advanced Line Processing | |
| |
| |
Atomic Saves | |
| |
| |
Conclusions | |
| |
| |
| |
Functional Programming Techniques | |
| |
| |
Laziness Can Be a Virtue (A Look at lazy.rb) | |
| |
| |
Minimizing Mutable State and Reducing Side Effects | |
| |
| |
Modular Code Organization | |
| |
| |
Memoization | |
| |
| |
Infinite Lists | |
| |
| |
Higher-Order Procedures | |
| |
| |
Conclusions | |
| |
| |
| |
When Things Go Wrong | |
| |
| |
A Process for Debugging Ruby Code | |
| |
| |
Capturing the Essence of a Defect | |
| |
| |
Scrutinizing Your Code | |
| |
| |
Utilizing Reflection | |
| |
| |
Improving inspect Output | |
| |
| |
Finding Needles in a Haystack | |
| |
| |
Working with Logger | |
| |
| |
Conclusions | |
| |
| |
| |
Reducing Cultural Barriers | |
| |
| |
m17n by Example: A Look at Ruby's CSV Standard Library | |
| |
| |
Portable m17n Through UTF-8 Transcoding | |
| |
| |
Source Encodings | |
| |
| |
Working with Files | |
| |
| |
Transcoding User Input in an Organized Fashion | |
| |
| |
m17n in Standalone Scripts | |
| |
| |
Inferring Encodings from Locale | |
| |
| |
Customizing Encoding Defaults | |
| |
| |
m17n-Safe Low-Level Text Processing | |
| |
| |
Localizing Your Code | |
| |
| |
Conclusions | |
| |
| |
| |
Skillful Project Maintenance | |
| |
| |
Exploring a Well-Organized Ruby Project (Haml) | |
| |
| |
Conventions to Know About | |
| |
| |
What Goes in a README | |
| |
| |
Laying Out Your Library | |
| |
| |
Executables | |
| |
| |
Tests | |
| |
| |
Examples | |
| |
| |
API Documentation via RDoc | |
| |
| |
Basic Documentation Techniques and Guidelines | |
| |
| |
Controlling Output with RDoc Directives | |
| |
| |
The RubyGems Package Manager | |
| |
| |
Writing a Gem::Specification | |
| |
| |
Working with Dependencies | |
| |
| |
Rake: Ruby's Built-in Build Utility | |
| |
| |
Conclusions | |
| |
| |
| |
Writing Backward-Compatible Code | |
| |
| |
| |
Leveraging Ruby's Standard Library | |
| |
| |
| |
Ruby Worst Practices | |
| |
| |
Index | |