cdocutils.nodes document q)q}q(U nametypesq}q(Xtesting detailsqNXtoxqXsphinxqXrunning the testsq NXrestructured textq Xtaggingq Xvirtualenvwrapperq Xmerging a branch (core devs)q NXnoseqX$setting up a development environmentqNXwriting documentationqNX!testing supported python versionsqNXcontributing to botoqNuUsubstitution_defsq}qUparse_messagesq]qUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}q(hUtesting-detailsqhUtoxqhUsphinxqh Urunning-the-testsqh Urestructured-textq h Utaggingq!h Uvirtualenvwrapperq"h Umerging-a-branch-core-devsq#hUnoseq$hU$setting-up-a-development-environmentq%hUwriting-documentationq&hU!testing-supported-python-versionsq'hUcontributing-to-botoq(uUchildrenq)]q*cdocutils.nodes section q+)q,}q-(U rawsourceq.UUparentq/hUsourceq0XB/Users/kyleknap/Documents/GitHub/boto/docs/source/contributing.rstq1Utagnameq2Usectionq3U attributesq4}q5(Udupnamesq6]Uclassesq7]Ubackrefsq8]Uidsq9]q:h(aUnamesq;]qhh)]q?(cdocutils.nodes title q@)qA}qB(h.XContributing to BotoqCh/h,h0h1h2UtitleqDh4}qE(h6]h7]h8]h9]h;]uh=Kh>hh)]qFcdocutils.nodes Text qGXContributing to BotoqHqI}qJ(h.hCh/hAubaubh+)qK}qL(h.Uh/h,h0h1h2h3h4}qM(h6]h7]h8]h9]qNh%ah;]qOhauh=Kh>hh)]qP(h@)qQ}qR(h.X$Setting Up a Development EnvironmentqSh/hKh0h1h2hDh4}qT(h6]h7]h8]h9]h;]uh=Kh>hh)]qUhGX$Setting Up a Development EnvironmentqVqW}qX(h.hSh/hQubaubcdocutils.nodes paragraph qY)qZ}q[(h.XWhile not strictly required, it is highly recommended to do development in a virtualenv. You can install virtualenv using pip::h/hKh0h1h2U paragraphq\h4}q](h6]h7]h8]h9]h;]uh=K h>hh)]q^hGXWhile not strictly required, it is highly recommended to do development in a virtualenv. You can install virtualenv using pip:q_q`}qa(h.XWhile not strictly required, it is highly recommended to do development in a virtualenv. You can install virtualenv using pip:h/hZubaubcdocutils.nodes literal_block qb)qc}qd(h.X$ pip install virtualenvh/hKh0h1h2U literal_blockqeh4}qf(U xml:spaceqgUpreserveqhh9]h8]h6]h7]h;]uh=K h>hh)]qihGX$ pip install virtualenvqjqk}ql(h.Uh/hcubaubhY)qm}qn(h.XqOnce the package is installed, you'll have a ``virtualenv`` command you can use to create a virtual environment::h/hKh0h1h2h\h4}qo(h6]h7]h8]h9]h;]uh=Kh>hh)]qp(hGX-Once the package is installed, you'll have a qqqr}qs(h.X-Once the package is installed, you'll have a h/hmubcdocutils.nodes literal qt)qu}qv(h.X``virtualenv``h4}qw(h6]h7]h8]h9]h;]uh/hmh)]qxhGX virtualenvqyqz}q{(h.Uh/huubah2Uliteralq|ubhGX5 command you can use to create a virtual environment:q}q~}q(h.X5 command you can use to create a virtual environment:h/hmubeubhb)q}q(h.X$ virtualenv venvh/hKh0h1h2heh4}q(hghhh9]h8]h6]h7]h;]uh=Kh>hh)]qhGX$ virtualenv venvqq}q(h.Uh/hubaubhY)q}q(h.X&You can then activate the virtualenv::qh/hKh0h1h2h\h4}q(h6]h7]h8]h9]h;]uh=Kh>hh)]qhGX%You can then activate the virtualenv:qq}q(h.X%You can then activate the virtualenv:h/hubaubhb)q}q(h.X$ . venv/bin/activateh/hKh0h1h2heh4}q(hghhh9]h8]h6]h7]h;]uh=Kh>hh)]qhGX$ . venv/bin/activateqq}q(h.Uh/hubaubcdocutils.nodes note q)q}q(h.XYou may also want to check out virtualenvwrapper_, which is a set of extensions to virtualenv that makes it easy to manage multiple virtual environments.h/hKh0h1h2Unoteqh4}q(h6]h7]h8]h9]h;]uh=Nh>hh)]qhY)q}q(h.XYou may also want to check out virtualenvwrapper_, which is a set of extensions to virtualenv that makes it easy to manage multiple virtual environments.h/hh0h1h2h\h4}q(h6]h7]h8]h9]h;]uh=Kh)]q(hGXYou may also want to check out qq}q(h.XYou may also want to check out h/hubcdocutils.nodes reference q)q}q(h.Xvirtualenvwrapper_UresolvedqKh/hh2U referenceqh4}q(UnameXvirtualenvwrapperqUrefuriqX7http://www.doughellmann.com/projects/virtualenvwrapper/qh9]h8]h6]h7]h;]uh)]qhGXvirtualenvwrapperqq}q(h.Uh/hubaubhGXh, which is a set of extensions to virtualenv that makes it easy to manage multiple virtual environments.qq}q(h.Xh, which is a set of extensions to virtualenv that makes it easy to manage multiple virtual environments.h/hubeubaubhY)q}q(h.XA requirements.txt is included with boto which contains all the additional packages needed for boto development. You can install these packages by running::h/hKh0h1h2h\h4}q(h6]h7]h8]h9]h;]uh=Kh>hh)]qhGXA requirements.txt is included with boto which contains all the additional packages needed for boto development. You can install these packages by running:qq}q(h.XA requirements.txt is included with boto which contains all the additional packages needed for boto development. You can install these packages by running:h/hubaubhb)q}q(h.X!$ pip install -r requirements.txth/hKh0h1h2heh4}q(hghhh9]h8]h6]h7]h;]uh=K!h>hh)]qhGX!$ pip install -r requirements.txtqq}q(h.Uh/hubaubeubh+)q}q(h.Uh/h,h0h1h2h3h4}q(h6]h7]h8]h9]qhah;]qh auh=K%h>hh)]q(h@)q}q(h.XRunning the Testsqh/hh0h1h2hDh4}q(h6]h7]h8]h9]h;]uh=K%h>hh)]qhGXRunning the Testsq̅q}q(h.hh/hubaubhY)q}q(h.XAll of the tests for boto are under the ``tests/`` directory. The tests for boto have been split into two main categories, unit and integration tests:h/hh0h1h2h\h4}q(h6]h7]h8]h9]h;]uh=K'h>hh)]q(hGX(All of the tests for boto are under the qӅq}q(h.X(All of the tests for boto are under the h/hubht)q}q(h.X ``tests/``h4}q(h6]h7]h8]h9]h;]uh/hh)]qhGXtests/qڅq}q(h.Uh/hubah2h|ubhGXd directory. The tests for boto have been split into two main categories, unit and integration tests:q݅q}q(h.Xd directory. The tests for boto have been split into two main categories, unit and integration tests:h/hubeubcdocutils.nodes bullet_list q)q}q(h.Uh/hh0h1h2U bullet_listqh4}q(UbulletqX*h9]h8]h6]h7]h;]uh=K*h>hh)]q(cdocutils.nodes list_item q)q}q(h.X**unit** - These are tests that do not talk to any AWS services. Anyone should be able to run these tests without have any credentials configured. These are the types of tests that could be run in something like a public CI server. These tests tend to be fast. h/hh0h1h2U list_itemqh4}q(h6]h7]h8]h9]h;]uh=Nh>hh)]qhY)q}q(h.X**unit** - These are tests that do not talk to any AWS services. Anyone should be able to run these tests without have any credentials configured. These are the types of tests that could be run in something like a public CI server. These tests tend to be fast.h/hh0h1h2h\h4}q(h6]h7]h8]h9]h;]uh=K*h)]q(cdocutils.nodes strong q)q}q(h.X**unit**h4}q(h6]h7]h8]h9]h;]uh/hh)]qhGXunitqq}q(h.Uh/hubah2UstrongqubhGX - These are tests that do not talk to any AWS services. Anyone should be able to run these tests without have any credentials configured. These are the types of tests that could be run in something like a public CI server. These tests tend to be fast.qq}q(h.X - These are tests that do not talk to any AWS services. Anyone should be able to run these tests without have any credentials configured. These are the types of tests that could be run in something like a public CI server. These tests tend to be fast.h/hubeubaubh)q}q(h.X>**integration** - These are tests that will talk to AWS services, and will typically require a boto config file with valid credentials. Due to the nature of these tests, they tend to take a while to run. Also keep in mind anyone who runs these tests will incur any usage fees associated with the various AWS services. h/hh0h1h2hh4}q(h6]h7]h8]h9]h;]uh=Nh>hh)]rhY)r}r(h.X=**integration** - These are tests that will talk to AWS services, and will typically require a boto config file with valid credentials. Due to the nature of these tests, they tend to take a while to run. Also keep in mind anyone who runs these tests will incur any usage fees associated with the various AWS services.h/hh0h1h2h\h4}r(h6]h7]h8]h9]h;]uh=K/h)]r(h)r}r(h.X**integration**h4}r(h6]h7]h8]h9]h;]uh/jh)]rhGX integrationr r }r (h.Uh/jubah2hubhGX. - These are tests that will talk to AWS services, and will typically require a boto config file with valid credentials. Due to the nature of these tests, they tend to take a while to run. Also keep in mind anyone who runs these tests will incur any usage fees associated with the various AWS services.r r }r(h.X. - These are tests that will talk to AWS services, and will typically require a boto config file with valid credentials. Due to the nature of these tests, they tend to take a while to run. Also keep in mind anyone who runs these tests will incur any usage fees associated with the various AWS services.h/jubeubaubeubhY)r}r(h.XCTo run all the unit tests, cd to the ``tests/`` directory and run::rh/hh0h1h2h\h4}r(h6]h7]h8]h9]h;]uh=K5h>hh)]r(hGX%To run all the unit tests, cd to the rr}r(h.X%To run all the unit tests, cd to the h/jubht)r}r(h.X ``tests/``h4}r(h6]h7]h8]h9]h;]uh/jh)]rhGXtests/rr}r(h.Uh/jubah2h|ubhGX directory and run:rr}r (h.X directory and run:h/jubeubhb)r!}r"(h.X$ python test.py unith/hh0h1h2heh4}r#(hghhh9]h8]h6]h7]h;]uh=K7h>hh)]r$hGX$ python test.py unitr%r&}r'(h.Uh/j!ubaubhY)r(}r)(h.X!You should see output like this::r*h/hh0h1h2h\h4}r+(h6]h7]h8]h9]h;]uh=K9h>hh)]r,hGX You should see output like this:r-r.}r/(h.X You should see output like this:h/j(ubaubhb)r0}r1(h.X$ python test.py unit ................................ ---------------------------------------------------------------------- Ran 32 tests in 0.075s OKh/hh0h1h2heh4}r2(hghhh9]h8]h6]h7]h;]uh=K;h>hh)]r3hGX$ python test.py unit ................................ ---------------------------------------------------------------------- Ran 32 tests in 0.075s OKr4r5}r6(h.Uh/j0ubaubhY)r7}r8(h.X#To run the integration tests, run::r9h/hh0h1h2h\h4}r:(h6]h7]h8]h9]h;]uh=KBh>hh)]r;hGX"To run the integration tests, run:r<r=}r>(h.X"To run the integration tests, run:h/j7ubaubhb)r?}r@(h.X$ python test.py integrationh/hh0h1h2heh4}rA(hghhh9]h8]h6]h7]h;]uh=KDh>hh)]rBhGX$ python test.py integrationrCrD}rE(h.Uh/j?ubaubhY)rF}rG(h.X9Note that running the integration tests may take a while.rHh/hh0h1h2h\h4}rI(h6]h7]h8]h9]h;]uh=KFh>hh)]rJhGX9Note that running the integration tests may take a while.rKrL}rM(h.jHh/jFubaubhY)rN}rO(h.XVarious integration tests have been tagged with service names to allow you to easily run tests by service type. For example, to run the ec2 integration tests you can run::h/hh0h1h2h\h4}rP(h6]h7]h8]h9]h;]uh=KHh>hh)]rQhGXVarious integration tests have been tagged with service names to allow you to easily run tests by service type. For example, to run the ec2 integration tests you can run:rRrS}rT(h.XVarious integration tests have been tagged with service names to allow you to easily run tests by service type. For example, to run the ec2 integration tests you can run:h/jNubaubhb)rU}rV(h.X$ python test.py -t ec2h/hh0h1h2heh4}rW(hghhh9]h8]h6]h7]h;]uh=KLh>hh)]rXhGX$ python test.py -t ec2rYrZ}r[(h.Uh/jUubaubhY)r\}r](h.XkYou can specify the ``-t`` argument multiple times. For example, to run the s3 and ec2 tests you can run::h/hh0h1h2h\h4}r^(h6]h7]h8]h9]h;]uh=KNh>hh)]r_(hGXYou can specify the r`ra}rb(h.XYou can specify the h/j\ubht)rc}rd(h.X``-t``h4}re(h6]h7]h8]h9]h;]uh/j\h)]rfhGX-trgrh}ri(h.Uh/jcubah2h|ubhGXP argument multiple times. For example, to run the s3 and ec2 tests you can run:rjrk}rl(h.XP argument multiple times. For example, to run the s3 and ec2 tests you can run:h/j\ubeubhb)rm}rn(h.X$ python test.py -t ec2 -t s3h/hh0h1h2heh4}ro(hghhh9]h8]h6]h7]h;]uh=KQh>hh)]rphGX$ python test.py -t ec2 -t s3rqrr}rs(h.Uh/jmubaubcdocutils.nodes warning rt)ru}rv(h.XIn the examples above no top level directory was specified. By default, nose will assume the current working directory, so the above command is equivalent to:: $ python test.py -t ec2 -t s3 . Be sure that you are in the ``tests/`` directory when running the tests, or explicitly specify the top level directory. For example, if you in the root directory of the boto repo, you could run the ec2 and s3 tests by running:: $ python tests/test.py -t ec2 -t s3 tests/h/hh0h1h2Uwarningrwh4}rx(h6]h7]h8]h9]h;]uh=Nh>hh)]ry(hY)rz}r{(h.XIn the examples above no top level directory was specified. By default, nose will assume the current working directory, so the above command is equivalent to::h/juh0h1h2h\h4}r|(h6]h7]h8]h9]h;]uh=KUh)]r}hGXIn the examples above no top level directory was specified. By default, nose will assume the current working directory, so the above command is equivalent to:r~r}r(h.XIn the examples above no top level directory was specified. By default, nose will assume the current working directory, so the above command is equivalent to:h/jzubaubhb)r}r(h.X$ python test.py -t ec2 -t s3 .h/juh2heh4}r(hghhh9]h8]h6]h7]h;]uh=KYh)]rhGX$ python test.py -t ec2 -t s3 .rr}r(h.Uh/jubaubhY)r}r(h.XBe sure that you are in the ``tests/`` directory when running the tests, or explicitly specify the top level directory. For example, if you in the root directory of the boto repo, you could run the ec2 and s3 tests by running::h/juh0h1h2h\h4}r(h6]h7]h8]h9]h;]uh=K[h)]r(hGXBe sure that you are in the rr}r(h.XBe sure that you are in the h/jubht)r}r(h.X ``tests/``h4}r(h6]h7]h8]h9]h;]uh/jh)]rhGXtests/rr}r(h.Uh/jubah2h|ubhGX directory when running the tests, or explicitly specify the top level directory. For example, if you in the root directory of the boto repo, you could run the ec2 and s3 tests by running:rr}r(h.X directory when running the tests, or explicitly specify the top level directory. For example, if you in the root directory of the boto repo, you could run the ec2 and s3 tests by running:h/jubeubhb)r}r(h.X*$ python tests/test.py -t ec2 -t s3 tests/h/juh2heh4}r(hghhh9]h8]h6]h7]h;]uh=K`h)]rhGX*$ python tests/test.py -t ec2 -t s3 tests/rr}r(h.Uh/jubaubeubhY)r}r(h.XZYou can use nose's collect plugin to see what tests are associated with each service tag::h/hh0h1h2h\h4}r(h6]h7]h8]h9]h;]uh=Kch>hh)]rhGXYYou can use nose's collect plugin to see what tests are associated with each service tag:rr}r(h.XYYou can use nose's collect plugin to see what tests are associated with each service tag:h/jubaubhb)r}r(h.X5$ python tests.py -t s3 -t ec2 --with-id --collect -vh/hh0h1h2heh4}r(hghhh9]h8]h6]h7]h;]uh=Kfh>hh)]rhGX5$ python tests.py -t s3 -t ec2 --with-id --collect -vrr}r(h.Uh/jubaubh+)r}r(h.Uh/hh0h1h2h3h4}r(h6]h7]h8]h9]rhah;]rhauh=Kjh>hh)]r(h@)r}r(h.XTesting Detailsrh/jh0h1h2hDh4}r(h6]h7]h8]h9]h;]uh=Kjh>hh)]rhGXTesting Detailsrr}r(h.jh/jubaubhY)r}r(h.XtThe ``tests/test.py`` script is a lightweight wrapper around nose_. In general, you should be able to run ``nosetests`` directly instead of ``tests/test.py``. The ``tests/unit`` and ``tests/integration`` args in the commands above were referring to directories. The command line arguments are forwarded to nose when you use ``tests/test.py``. For example, you can run::h/jh0h1h2h\h4}r(h6]h7]h8]h9]h;]uh=Klh>hh)]r(hGXThe rr}r(h.XThe h/jubht)r}r(h.X``tests/test.py``h4}r(h6]h7]h8]h9]h;]uh/jh)]rhGX tests/test.pyrr}r(h.Uh/jubah2h|ubhGX( script is a lightweight wrapper around rr}r(h.X( script is a lightweight wrapper around h/jubh)r}r(h.Xnose_hKh/jh2hh4}r(UnameXnoserhX+http://readthedocs.org/docs/nose/en/latest/rh9]h8]h6]h7]h;]uh)]rhGXnoserr}r(h.Uh/jubaubhGX(. In general, you should be able to run rr}r(h.X(. In general, you should be able to run h/jubht)r}r(h.X ``nosetests``h4}r(h6]h7]h8]h9]h;]uh/jh)]rhGX nosetestsrr}r(h.Uh/jubah2h|ubhGX directly instead of rr}r(h.X directly instead of h/jubht)r}r(h.X``tests/test.py``h4}r(h6]h7]h8]h9]h;]uh/jh)]rhGX tests/test.pyrr}r(h.Uh/jubah2h|ubhGX. The rr}r(h.X. The h/jubht)r}r(h.X``tests/unit``h4}r(h6]h7]h8]h9]h;]uh/jh)]rhGX tests/unitrr}r(h.Uh/jubah2h|ubhGX and rr}r(h.X and h/jubht)r}r(h.X``tests/integration``h4}r(h6]h7]h8]h9]h;]uh/jh)]rhGXtests/integrationrr}r(h.Uh/jubah2h|ubhGXz args in the commands above were referring to directories. The command line arguments are forwarded to nose when you use rr}r(h.Xz args in the commands above were referring to directories. The command line arguments are forwarded to nose when you use h/jubht)r}r(h.X``tests/test.py``h4}r(h6]h7]h8]h9]h;]uh/jh)]rhGX tests/test.pyrr}r(h.Uh/jubah2h|ubhGX. For example, you can run:rr }r (h.X. For example, you can run:h/jubeubhb)r }r (h.X7$ python tests/test.py -x -vv tests/unit/cloudformationh/jh0h1h2heh4}r (hghhh9]h8]h6]h7]h;]uh=Ksh>hh)]rhGX7$ python tests/test.py -x -vv tests/unit/cloudformationrr}r(h.Uh/j ubaubhY)r}r(h.XAnd the ``-x -vv tests/unit/cloudformation`` are forwarded to nose. See the nose_ docs for the supported command line options, or run ``nosetests --help``.h/jh0h1h2h\h4}r(h6]h7]h8]h9]h;]uh=Kuh>hh)]r(hGXAnd the rr}r(h.XAnd the h/jubht)r}r(h.X$``-x -vv tests/unit/cloudformation``h4}r(h6]h7]h8]h9]h;]uh/jh)]rhGX -x -vv tests/unit/cloudformationrr}r(h.Uh/jubah2h|ubhGX! are forwarded to nose. See the r r!}r"(h.X! are forwarded to nose. See the h/jubh)r#}r$(h.Xnose_hKh/jh2hh4}r%(UnameXnosehjh9]h8]h6]h7]h;]uh)]r&hGXnoser'r(}r)(h.Uh/j#ubaubhGX5 docs for the supported command line options, or run r*r+}r,(h.X5 docs for the supported command line options, or run h/jubht)r-}r.(h.X``nosetests --help``h4}r/(h6]h7]h8]h9]h;]uh/jh)]r0hGXnosetests --helpr1r2}r3(h.Uh/j-ubah2h|ubhGX.r4}r5(h.X.h/jubeubhY)r6}r7(h.X~The only thing that ``tests/test.py`` does before invoking nose is to inject an argument that specifies that any testcase tagged with "notdefault" should not be run. A testcase may be tagged with "notdefault" if the test author does not want everyone to run the tests. In general, there shouldn't be many of these tests, but some reasons a test may be tagged "notdefault" include:h/jh0h1h2h\h4}r8(h6]h7]h8]h9]h;]uh=Kyh>hh)]r9(hGXThe only thing that r:r;}r<(h.XThe only thing that h/j6ubht)r=}r>(h.X``tests/test.py``h4}r?(h6]h7]h8]h9]h;]uh/j6h)]r@hGX tests/test.pyrArB}rC(h.Uh/j=ubah2h|ubhGXY does before invoking nose is to inject an argument that specifies that any testcase tagged with "notdefault" should not be run. A testcase may be tagged with "notdefault" if the test author does not want everyone to run the tests. In general, there shouldn't be many of these tests, but some reasons a test may be tagged "notdefault" include:rDrE}rF(h.XY does before invoking nose is to inject an argument that specifies that any testcase tagged with "notdefault" should not be run. A testcase may be tagged with "notdefault" if the test author does not want everyone to run the tests. In general, there shouldn't be many of these tests, but some reasons a test may be tagged "notdefault" include:h/j6ubeubh)rG}rH(h.Uh/jh0h1h2hh4}rI(hX*h9]h8]h6]h7]h;]uh=Kh>hh)]rJ(h)rK}rL(h.X7An integration test that requires specific credentials.rMh/jGh0h1h2hh4}rN(h6]h7]h8]h9]h;]uh=Nh>hh)]rOhY)rP}rQ(h.jMh/jKh0h1h2h\h4}rR(h6]h7]h8]h9]h;]uh=Kh)]rShGX7An integration test that requires specific credentials.rTrU}rV(h.jMh/jPubaubaubh)rW}rX(h.XPAn interactive test (the S3 MFA tests require you to type in the S/N and code). h/jGh0h1h2hh4}rY(h6]h7]h8]h9]h;]uh=Nh>hh)]rZhY)r[}r\(h.XOAn interactive test (the S3 MFA tests require you to type in the S/N and code).r]h/jWh0h1h2h\h4}r^(h6]h7]h8]h9]h;]uh=Kh)]r_hGXOAn interactive test (the S3 MFA tests require you to type in the S/N and code).r`ra}rb(h.j]h/j[ubaubaubeubhY)rc}rd(h.XTagging is done using nose's tagging_ plugin. To summarize, you can tag a specific testcase by setting an attribute on the object. Nose provides an ``attr`` decorator for convenience::h/jh0h1h2h\h4}re(h6]h7]h8]h9]h;]uh=Kh>hh)]rf(hGXTagging is done using nose's rgrh}ri(h.XTagging is done using nose's h/jcubh)rj}rk(h.Xtagging_hKh/jch2hh4}rl(UnameXtaggingrmhX9http://nose.readthedocs.org/en/latest/plugins/attrib.htmlrnh9]h8]h6]h7]h;]uh)]rohGXtaggingrprq}rr(h.Uh/jjubaubhGXq plugin. To summarize, you can tag a specific testcase by setting an attribute on the object. Nose provides an rsrt}ru(h.Xq plugin. To summarize, you can tag a specific testcase by setting an attribute on the object. Nose provides an h/jcubht)rv}rw(h.X``attr``h4}rx(h6]h7]h8]h9]h;]uh/jch)]ryhGXattrrzr{}r|(h.Uh/jvubah2h|ubhGX decorator for convenience:r}r~}r(h.X decorator for convenience:h/jcubeubhb)r}r(h.XUfrom nose.plugins.attrib import attr @attr('notdefault') def test_s3_mfs(): passh/jh0h1h2heh4}r(hghhh9]h8]h6]h7]h;]uh=Kh>hh)]rhGXUfrom nose.plugins.attrib import attr @attr('notdefault') def test_s3_mfs(): passrr}r(h.Uh/jubaubhY)r}r(h.X,You can then run these tests be specifying::rh/jh0h1h2h\h4}r(h6]h7]h8]h9]h;]uh=Kh>hh)]rhGX+You can then run these tests be specifying:rr}r(h.X+You can then run these tests be specifying:h/jubaubhb)r}r(h.Xnosetests -a 'notdefault'h/jh0h1h2heh4}r(hghhh9]h8]h6]h7]h;]uh=Kh>hh)]rhGXnosetests -a 'notdefault'rr}r(h.Uh/jubaubhY)r}r(h.XBOr you can exclude any tests tagged with 'notdefault' by running::rh/jh0h1h2h\h4}r(h6]h7]h8]h9]h;]uh=Kh>hh)]rhGXAOr you can exclude any tests tagged with 'notdefault' by running:rr}r(h.XAOr you can exclude any tests tagged with 'notdefault' by running:h/jubaubhb)r}r(h.Xnosetests -a '!notdefault'h/jh0h1h2heh4}r(hghhh9]h8]h6]h7]h;]uh=Kh>hh)]rhGXnosetests -a '!notdefault'rr}r(h.Uh/jubaubhY)r}r(h.XUConceptually, ``tests/test.py`` is injecting the "-a !notdefault" arg into nosetests.h/jh0h1h2h\h4}r(h6]h7]h8]h9]h;]uh=Kh>hh)]r(hGXConceptually, rr}r(h.XConceptually, h/jubht)r}r(h.X``tests/test.py``h4}r(h6]h7]h8]h9]h;]uh/jh)]rhGX tests/test.pyrr}r(h.Uh/jubah2h|ubhGX6 is injecting the "-a !notdefault" arg into nosetests.rr}r(h.X6 is injecting the "-a !notdefault" arg into nosetests.h/jubeubeubeubh+)r}r(h.Uh/h,h0h1h2h3h4}r(h6]h7]h8]h9]rh'ah;]rhauh=Kh>hh)]r(h@)r}r(h.X!Testing Supported Python Versionsrh/jh0h1h2hDh4}r(h6]h7]h8]h9]h;]uh=Kh>hh)]rhGX!Testing Supported Python Versionsrr}r(h.jh/jubaubhY)r}r(h.XBoto supports python 2.6 and 2.7. An easy way to verify functionality across multiple python versions is to use tox_. A tox.ini file is included with boto. You can run tox with no args and it will automatically test all supported python versions::h/jh0h1h2h\h4}r(h6]h7]h8]h9]h;]uh=Kh>hh)]r(hGXpBoto supports python 2.6 and 2.7. An easy way to verify functionality across multiple python versions is to use rr}r(h.XpBoto supports python 2.6 and 2.7. An easy way to verify functionality across multiple python versions is to use h/jubh)r}r(h.Xtox_hKh/jh2hh4}r(UnameXtoxrhXhttp://tox.testrun.org/latest/rh9]h8]h6]h7]h;]uh)]rhGXtoxrr}r(h.Uh/jubaubhGX. A tox.ini file is included with boto. You can run tox with no args and it will automatically test all supported python versions:rr}r(h.X. A tox.ini file is included with boto. You can run tox with no args and it will automatically test all supported python versions:h/jubeubhb)r}r(h.X$ tox GLOB sdist-make: boto/setup.py py26 sdist-reinst: boto/.tox/dist/boto-2.4.1.zip py26 runtests: commands[0] ................................ ---------------------------------------------------------------------- Ran 32 tests in 0.089s OK py27 sdist-reinst: boto/.tox/dist/boto-2.4.1.zip py27 runtests: commands[0] ................................ ---------------------------------------------------------------------- Ran 32 tests in 0.087s OK ____ summary ____ py26: commands succeeded py27: commands succeeded congratulations :)h/jh0h1h2heh4}r(hghhh9]h8]h6]h7]h;]uh=Kh>hh)]rhGX$ tox GLOB sdist-make: boto/setup.py py26 sdist-reinst: boto/.tox/dist/boto-2.4.1.zip py26 runtests: commands[0] ................................ ---------------------------------------------------------------------- Ran 32 tests in 0.089s OK py27 sdist-reinst: boto/.tox/dist/boto-2.4.1.zip py27 runtests: commands[0] ................................ ---------------------------------------------------------------------- Ran 32 tests in 0.087s OK ____ summary ____ py26: commands succeeded py27: commands succeeded congratulations :)rr}r(h.Uh/jubaubeubh+)r}r(h.Uh/h,h0h1h2h3h4}r(h6]h7]h8]h9]rh&ah;]rhauh=Kh>hh)]r(h@)r}r(h.XWriting Documentationrh/jh0h1h2hDh4}r(h6]h7]h8]h9]h;]uh=Kh>hh)]rhGXWriting Documentationrr}r(h.jh/jubaubhY)r}r(h.XThe boto docs use sphinx_ to generate documentation. All of the docs are located in the ``docs/`` directory. To generate the html documentation, cd into the docs directory and run ``make html``::h/jh0h1h2h\h4}r(h6]h7]h8]h9]h;]uh=Kh>hh)]r(hGXThe boto docs use rr}r(h.XThe boto docs use h/jubh)r}r(h.Xsphinx_hKh/jh2hh4}r(UnameXsphinxrhXhttp://sphinx.pocoo.org/rh9]h8]h6]h7]h;]uh)]rhGXsphinxrr}r(h.Uh/jubaubhGX@ to generate documentation. All of the docs are located in the rr}r(h.X@ to generate documentation. All of the docs are located in the h/jubht)r}r(h.X ``docs/``h4}r(h6]h7]h8]h9]h;]uh/jh)]rhGXdocs/rr}r(h.Uh/jubah2h|ubhGXT directory. To generate the html documentation, cd into the docs directory and run rr}r(h.XT directory. To generate the html documentation, cd into the docs directory and run h/jubht)r }r (h.X ``make html``h4}r (h6]h7]h8]h9]h;]uh/jh)]r hGX make htmlr r}r(h.Uh/j ubah2h|ubhGX:r}r(h.X:h/jubeubhb)r}r(h.X$ cd docs $ make htmlh/jh0h1h2heh4}r(hghhh9]h8]h6]h7]h;]uh=Kh>hh)]rhGX$ cd docs $ make htmlrr}r(h.Uh/jubaubhY)r}r(h.XThe generated documentation will be in the ``docs/build/html`` directory. The source for the documentation is located in ``docs/source`` directory, and uses `restructured text`_ for the markup language.h/jh0h1h2h\h4}r(h6]h7]h8]h9]h;]uh=Kh>hh)]r(hGX+The generated documentation will be in the rr}r(h.X+The generated documentation will be in the h/jubht)r }r!(h.X``docs/build/html``h4}r"(h6]h7]h8]h9]h;]uh/jh)]r#hGXdocs/build/htmlr$r%}r&(h.Uh/j ubah2h|ubhGX; directory. The source for the documentation is located in r'r(}r)(h.X; directory. The source for the documentation is located in h/jubht)r*}r+(h.X``docs/source``h4}r,(h6]h7]h8]h9]h;]uh/jh)]r-hGX docs/sourcer.r/}r0(h.Uh/j*ubah2h|ubhGX directory, and uses r1r2}r3(h.X directory, and uses h/jubh)r4}r5(h.X`restructured text`_hKh/jh2hh4}r6(UnameXrestructured texthX!http://sphinx.pocoo.org/rest.htmlr7h9]h8]h6]h7]h;]uh)]r8hGXrestructured textr9r:}r;(h.Uh/j4ubaubhGX for the markup language.r<r=}r>(h.X for the markup language.h/jubeubcdocutils.nodes target r?)r@}rA(h.X5.. _nose: http://readthedocs.org/docs/nose/en/latest/U referencedrBKh/jh0h1h2UtargetrCh4}rD(hjh9]rEh$ah8]h6]h7]h;]rFhauh=Kh>hh)]ubj?)rG}rH(h.XF.. _tagging: http://nose.readthedocs.org/en/latest/plugins/attrib.htmljBKh/jh0h1h2jCh4}rI(hjnh9]rJh!ah8]h6]h7]h;]rKh auh=Kh>hh)]ubj?)rL}rM(h.X'.. _tox: http://tox.testrun.org/latest/jBKh/jh0h1h2jCh4}rN(hjh9]rOhah8]h6]h7]h;]rPhauh=Kh>hh)]ubj?)rQ}rR(h.XN.. _virtualenvwrapper: http://www.doughellmann.com/projects/virtualenvwrapper/jBKh/jh0h1h2jCh4}rS(hhh9]rTh"ah8]h6]h7]h;]rUh auh=Kh>hh)]ubj?)rV}rW(h.X$.. _sphinx: http://sphinx.pocoo.org/jBKh/jh0h1h2jCh4}rX(hjh9]rYhah8]h6]h7]h;]rZhauh=Kh>hh)]ubj?)r[}r\(h.X8.. _restructured text: http://sphinx.pocoo.org/rest.htmljBKh/jh0h1h2jCh4}r](hj7h9]r^h ah8]h6]h7]h;]r_h auh=Kh>hh)]ubeubh+)r`}ra(h.Uh/h,h0h1h2h3h4}rb(h6]h7]h8]h9]rch#ah;]rdh auh=Kh>hh)]re(h@)rf}rg(h.XMerging A Branch (Core Devs)rhh/j`h0h1h2hDh4}ri(h6]h7]h8]h9]h;]uh=Kh>hh)]rjhGXMerging A Branch (Core Devs)rkrl}rm(h.jhh/jfubaubh)rn}ro(h.Uh/j`h0h1h2hh4}rp(hX*h9]h8]h6]h7]h;]uh=Kh>hh)]rq(h)rr}rs(h.XAll features/bugfixes should go through a review. * This includes new features added by core devs themselves. The usual branch/pull-request/merge flow that happens for community contributions should also apply to core. h/jnh0Nh2hh4}rt(h6]h7]h8]h9]h;]uh=Nh>hh)]ru(hY)rv}rw(h.X1All features/bugfixes should go through a review.rxh/jrh0h1h2h\h4}ry(h6]h7]h8]h9]h;]uh=Kh)]rzhGX1All features/bugfixes should go through a review.r{r|}r}(h.jxh/jvubaubh)r~}r(h.Uh4}r(hX*h9]h8]h6]h7]h;]uh/jrh)]rh)r}r(h.XThis includes new features added by core devs themselves. The usual branch/pull-request/merge flow that happens for community contributions should also apply to core. h4}r(h6]h7]h8]h9]h;]uh/j~h)]rhY)r}r(h.XThis includes new features added by core devs themselves. The usual branch/pull-request/merge flow that happens for community contributions should also apply to core.rh/jh0h1h2h\h4}r(h6]h7]h8]h9]h;]uh=Kh)]rhGXThis includes new features added by core devs themselves. The usual branch/pull-request/merge flow that happens for community contributions should also apply to core.rr}r(h.jh/jubaubah2hubah2hubeubh)r}r(h.XEnsure there is proper test coverage. If there's a change in behavior, there should be a test demonstrating the failure before the change & passing with the change. * This helps ensure we don't regress in the future as well. h/jnh0Nh2hh4}r(h6]h7]h8]h9]h;]uh=Nh>hh)]r(hY)r}r(h.XEnsure there is proper test coverage. If there's a change in behavior, there should be a test demonstrating the failure before the change & passing with the change.rh/jh0h1h2h\h4}r(h6]h7]h8]h9]h;]uh=Kh)]rhGXEnsure there is proper test coverage. If there's a change in behavior, there should be a test demonstrating the failure before the change & passing with the change.rr}r(h.jh/jubaubh)r}r(h.Uh4}r(hX*h9]h8]h6]h7]h;]uh/jh)]rh)r}r(h.X:This helps ensure we don't regress in the future as well. h4}r(h6]h7]h8]h9]h;]uh/jh)]rhY)r}r(h.X9This helps ensure we don't regress in the future as well.rh/jh0h1h2h\h4}r(h6]h7]h8]h9]h;]uh=Kh)]rhGX9This helps ensure we don't regress in the future as well.rr}r(h.jh/jubaubah2hubah2hubeubh)r}r(h.XMerging of pull requests is typically done with ``git merge --no-ff ``. * GitHub's big green button is probably OK for very small PRs (like doc fixes), but you can't run tests on GH, so most things should get pulled down locally.h/jnh0Nh2hh4}r(h6]h7]h8]h9]h;]uh=Nh>hh)]r(hY)r}r(h.X[Merging of pull requests is typically done with ``git merge --no-ff ``.h/jh0h1h2h\h4}r(h6]h7]h8]h9]h;]uh=Kh)]r(hGX0Merging of pull requests is typically done with rr}r(h.X0Merging of pull requests is typically done with h/jubht)r}r(h.X*``git merge --no-ff ``h4}r(h6]h7]h8]h9]h;]uh/jh)]rhGX&git merge --no-ff rr}r(h.Uh/jubah2h|ubhGX.r}r(h.X.h/jubeubh)r}r(h.Uh4}r(hX*h9]h8]h6]h7]h;]uh/jh)]rh)r}r(h.XGitHub's big green button is probably OK for very small PRs (like doc fixes), but you can't run tests on GH, so most things should get pulled down locally.h4}r(h6]h7]h8]h9]h;]uh/jh)]rhY)r}r(h.XGitHub's big green button is probably OK for very small PRs (like doc fixes), but you can't run tests on GH, so most things should get pulled down locally.rh/jh0h1h2h\h4}r(h6]h7]h8]h9]h;]uh=Kh)]rhGXGitHub's big green button is probably OK for very small PRs (like doc fixes), but you can't run tests on GH, so most things should get pulled down locally.rr}r(h.jh/jubaubah2hubah2hubeubeubeubeubah.UU transformerrNU footnote_refsr}rUrefnamesr}r(j]rjaj]rjajm]rjjah]rhaj]r(jj#eXrestructured text]rj4auUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rU citationsr]rh>hU current_linerNUtransform_messagesr]rUreporterrNUid_startrKU autofootnotesr]rU citation_refsr}rUindirect_targetsr]rUsettingsr(cdocutils.frontend Values ror}r(Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNhDNUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamr NUpep_file_url_templater Upep-%04dr Uexit_status_levelr KUconfigr NUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8r U_sourcer!h1Ugettext_compactr"U generatorr#NUdump_internalsr$NU smart_quotesr%U pep_base_urlr&Uhttp://www.python.org/dev/peps/r'Usyntax_highlightr(Ulongr)Uinput_encoding_error_handlerr*jUauto_id_prefixr+Uidr,Udoctitle_xformr-Ustrip_elements_with_classesr.NU _config_filesr/]Ufile_insertion_enabledr0U raw_enabledr1KU dump_settingsr2NubUsymbol_footnote_startr3KUidsr4}r5(hjLh'jhjVhhh&jh"jQh#j`h$j@hjh%hKh(h,h j[h!jGuUsubstitution_namesr6}r7h2h>h4}r8(h6]h9]h8]Usourceh1h7]h;]uU footnotesr9]r:Urefidsr;}r<ub.