<The Development Workflow
The standard development on CocoaPods happens like so:
- Set up your development environment with Rainforest.
- Fork
CocoaPods/CocoaPods
- Pick up an Issue . See issue classifications explained below
- Check the CONTRIBUTING requirements.
- Make a pull request.
<Picking Up Issues
Issue Classifications
- Defect: These are known bugs. The issue should also contain steps to reproduce. Feel free to fix these and submit a pull request.
- Enhancement: These are planned enhancements that have not been picked up yet. If you would like to work on one, please add a comment that you are doing so.
- Discussion: These are issues that can be non-issues, and encompass best practices, or plans for the future.
- Quick: These are small issues, that should be able to be fixed quickly. Normally these issues don't stay around for very long.
- To check: These issues may not be reproducible, or have not been vetted by a team member.
- Workaround known: These issues have had their solutions discussed, but have yet to be implemented.
- Easy First Step These issues are great issues to get started with. They tend to stick around for a while. We want people to feel like there's always somewhere you can start.
Making the Pull Request
Before submitting your pull request, please do the following:
- Run
rake spec
and make sure all the tests pass. If you are adding new commands or features, they must include tests. If you are changing functionality, update the tests if you need to. - Add a note to the
CHANGELOG
describing what you changed. - Make your pull request. If it is related to an issue, add a link to the issue in the description.
<Code Style
CocoaPods favours small methods and many classes as convention. It is encouraged that methods are as small as possible, both for code reuse, and for ease of reading.
Take
install!
from theInstaller
class of the CocoaPods gem:
def install!
resolve_dependencies
download_dependencies
generate_pods_project
integrate_user_project if config.integrate_targets?
perform_post_install_actions
end
Almost all classes are namespaced. For example, Installer
calls upon Installer::TargetInstaller
and Installer::PodSourceInstaller
to get its work done. Source files for these should reside within the named folder.
Method and variable naming should be very explicit. For example PodSourceInstaller#download_source
is responsible for downloading the sources. Please avoid method and variable names that are generic, i.e. var
, a
etc, unless used in a block.
All methods should be documented and grouped as explained in the documentation section.
<Tests
CocoaPods has an extensive test suite. No code is accepted to master
where the tests do not pass. All test files can be found in the spec
folder.
The tests for CocoaPods are written in Bacon and separated into Unit, Integration, and Functional test.
To run the full test suite:
$ bundle exec rake
# Or to run a single test suite:
$ bundle exec rake spec:functional
Occasionally, the fixtures used for functional tests need to be rebuilt. This is especially true when changes are made to the file structure of the Pods directory.
To update these fixtures:
$ bundle exec rake spec:rebuild_integration_fixtures
<Documentation
All methods and attributes must be documented. As part of the release process for CocoaPods, documentation is generated from source and posted online. YARD is used for generating this documentation.
Documentation should be brief, but explanatory. All parameters and return values need to be explained. Notes and examples, while not required, are encouraged. Take a look at this method from the Project class:
# @return [Pathname] Returns the relative path from the project root.
#
# @param [Pathname] path
# The path that needs to be converted to the relative format.
#
# @note If the two absolute paths don't share the same root directory an
# extra `../` is added to the result of
# {Pathname#relative_path_from}.
#
# @example
#
# path = Pathname.new('/Users/dir')
# @sandbox.root #=> Pathname('/tmp/CocoaPods/Lint/Pods')
#
# @sandbox.relativize(path) #=> '../../../../Users/dir'
# @sandbox.relativize(path) #=> '../../../../../Users/dir'
#