* Goal Numero Uno is Sourcerer Parity (direct and unadorned)

  - /No/ tap-tester test
  - /No/ features that sourcerer doesn't have (lock down the version via
    the api-version header)

    We think this should be possible with the current oauth-flow. We will
    fail fast if that turns out not to be the case and fall back to
    authenticating via their token.
  - !!! We could really use an alpha tester but it's not necessary. We only
    need to deliver something we think will probably work rather than
    something we're pretty sure will work!
  - !!! We should /not/ do field selection. It makes the sync logic much
    harder as you have a combinatoric situation of what among Events +
    Objects is selected and what records to emit because of it!
  - !!! Sourcerer stripe does /not/ implement 429 support!
  - !!! Sourcerer does /not/ update all objects. Only =InvoiceItems=,
    =Invoices=, =Coupons=, =Plans=, =Customers=, =Transfers=, and
    =Charges=.

    Is it possible that retrieving an object by ID merges all updates to
    it into its state but retrieving the same object from the Object's
    stream has it as it was created?
  - @brian Do we need docs according to the contract?
** DONE Can the VM perform the oauth dance?                              :v0:
** DONE Add the form to the ui                                           :v0:

   Start with the assumption that we'll be collecting a 
** DONE Add oauth callback support for platform.stripe to =connections-service= :v0:

   This is when we decide whether we can get the account-id or not.
** DONE Create the skeleton tap project based on =singer-tap-template=   :v0:
** DONE Get a skeleton pylint build running in circle                    :v0:
** DONE Run a check job                                                  :v0:

   #+BEGIN_SRC bash
   # in orca
   ./run_it check <conn_id>
   #+END_SRC

   We need at this point to be using the =account_id= property /or/ the
   =api_key= property.

   This is probably good enough to do with an
   =stripe.Account.retrieve(account_id)= call.

   Log the name, etc. of the account we retrieved.

   Need to be sure to use the stable version of the API that we are
   currently using. Allowing customer specification of the API version
   needs to come later because it introduces too much uncertainty.
** DONE Implement the schema for Charges                                 :v0:

   Always selected. We will do field selection later.
** DONE Do a sync for Charges                                            :v0:

   Notably, we do /not/ get updates for Charges at this time.
** DONE Handle rate limiting                                             :v0:

   This should be in line with the spike for [[file:spikes/timeout/timeout.py][=timeout=]].

   This is not a strict requirement because sourcerer doesn't handle it.
   /But/ we think it's super easy.
** DONE Add Charges data typing
** DONE Add bookmarking for Charges                                      :v0:

   This is object cursor id pagination. See [[https://github.com/singer-io/tap-stripe/blob/cf3eaf16e162762978a8e23d77a99948f248520f/spikes/sdk/sdk.py#L47-L52][sdk.py]].
** TODO Add =Events= stream                                              :v0:

   Because we are not doing field selection, this part will be easy.
** TODO Add =Charges= updates
** TODO Add =Customers= syncing
** TODO Add =Customers= updating
** TODO Add =Plans= syncing
** TODO Add =Plans= updating
** TODO Add =Invoices= syncing
** TODO Add =Invoices= updating
** TODO Add =InvoiceItems= syncing
** TODO Add =InvoiceItems= updating
** TODO Add =Transfers= syncing
** TODO Add =Transfers= updating
** TODO Add =Coupons= syncing
** TODO Add =Coupons= updating
** The following get no updates according to sourcerer
** TODO Add =Subscriptions= syncing
** TODO Add =BalanceHistory= syncing
** TODO Add =TransferTransactions= syncing
** TODO Support =start_date= config property
* v1
** TODO Test field selection                                             :v1:

   @brian: Do we have any reason to believe that field selection could be
   complicated for this tap? Are their field exclusions, etc?
** TODO Implement discovery for Charges                                  :v1:

   The schema may be tricky here. There are many deeply nested objects
   (See
   https://github.com/stitchdata/sourcerer/blob/f828820666363f15ab47bcff3a883f9fb14791f3/sourcerer/src/clojure/sourcerer/apis/datatype/stripe.clj#L113)
   but /all/ of the data typing concerns appear to be around datetime
   parsing. We'll need to put that in by hand unfortunately.
** TODO Add bookmark logic around =Events= / =Object= selection combinatorics.

   How does sourcerer handle resetting your bookmark?