)]}'
{
  "log": [
    {
      "commit": "8ef2153224506cd281ce07151619a320d3e94964",
      "tree": "acde7b8c33bc7009a52d6387a10570b25013615e",
      "parents": [
        "4563a983a36d3871d41c1f73804edc24c9d5c6c3"
      ],
      "author": {
        "name": "Jon Perritt",
        "email": "jrperritt@gmail.com",
        "time": "Thu Aug 28 16:44:36 2014 -0500"
      },
      "committer": {
        "name": "Jon Perritt",
        "email": "jrperritt@gmail.com",
        "time": "Fri Aug 29 11:43:06 2014 -0500"
      },
      "message": "update README for v0.2.0\n"
    },
    {
      "commit": "d79a705ffaed23a4baf1d10b61a184d83d0881bb",
      "tree": "6da9ee1b25dd1272b01be8feaf0b89ba53f5d2f1",
      "parents": [
        "68c54c0b267f158962e7032bfdbe1a3b0950065e"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Mon Mar 10 17:18:03 2014 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Mon Mar 10 17:18:03 2014 -0700"
      },
      "message": "Eliminate the readme cruft\n"
    },
    {
      "commit": "9e271cf2ebda1c812db20e6db89b4b1f86e98e4e",
      "tree": "76fc73efbd8d69d27decc595c123ea20c15c51c3",
      "parents": [
        "e859d0f0f980f75e422f53b3f61065b69fe0a8ed"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Tue Feb 25 11:21:43 2014 -0800"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Tue Feb 25 11:21:43 2014 -0800"
      },
      "message": "Place link to godocs in README.\n"
    },
    {
      "commit": "f21fcac4b6d55bbadac3ea1c2f5d27ef91e1ab6e",
      "tree": "fb536524eefcabcb073bcf77101cac984e96416e",
      "parents": [
        "2f2cb30e929a1a1068f470f702fa992c97f8de3a"
      ],
      "author": {
        "name": "Josh Toft",
        "email": "josh@ooyala.com",
        "time": "Mon Dec 16 16:19:47 2013 -0800"
      },
      "committer": {
        "name": "Josh Toft",
        "email": "josh@ooyala.com",
        "time": "Mon Dec 16 16:31:40 2013 -0800"
      },
      "message": "Add travis badge to README\n\ncloses #43\n\n* Note: It appears that the integration was already done just not shown on the README\n"
    },
    {
      "commit": "3fd3e9c89483edbef117d170b0c6b96e1c69a8ad",
      "tree": "7c9a23114b40eeeaa8dc11e7f25f71b2cde126a0",
      "parents": [
        "7c7e88a97e01e2a01e791b5515a32ae94567789b"
      ],
      "author": {
        "name": "Jamie Hannaford",
        "email": "jamie@limetree.org",
        "time": "Thu Aug 15 11:46:22 2013 -0500"
      },
      "committer": {
        "name": "Jamie Hannaford",
        "email": "jamie@limetree.org",
        "time": "Thu Aug 15 11:46:22 2013 -0500"
      },
      "message": "Change Bash script URL"
    },
    {
      "commit": "6c2efcc125aa328f10dd11de4ca987d539c58551",
      "tree": "c4cf76d7ab9292996d8a5faeb6ec508ed6e1ada3",
      "parents": [
        "e79d8a6383365c1e3a4babefb5878f10d2fbb2e7"
      ],
      "author": {
        "name": "Brandon Philips",
        "email": "brandon@ifup.org",
        "time": "Tue Aug 13 08:08:03 2013 -0700"
      },
      "committer": {
        "name": "Brandon Philips",
        "email": "brandon@ifup.org",
        "time": "Tue Aug 13 08:08:03 2013 -0700"
      },
      "message": "README: remove notes about private/public workspace scripts\n\nSince this project is now announced I assume these notes can go away."
    },
    {
      "commit": "73e3e874bec15a06a8a2b165ad602477ff7397fe",
      "tree": "599f4e91aca206d6da8fe568873aeaaa3dd7aff5",
      "parents": [
        "1a28751ec60e4019b5d1129fe8d6ce88c939c795"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:40:02 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:40:07 2013 -0700"
      },
      "message": "Align call-outs\n"
    },
    {
      "commit": "1a28751ec60e4019b5d1129fe8d6ce88c939c795",
      "tree": "906979d566cdf56dc1a6d910b7e8cbdad1f4d9b6",
      "parents": [
        "fc2cdefed8f8dba336222c17f2ad651269176d92"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:37:42 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:37:42 2013 -0700"
      },
      "message": "Remove typo\n"
    },
    {
      "commit": "fc2cdefed8f8dba336222c17f2ad651269176d92",
      "tree": "c3f487a0ea147797bf534b320d50c96f281e78db",
      "parents": [
        "56e961f1257c11057ebc6c507d89922efdc39924"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:36:00 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:36:00 2013 -0700"
      },
      "message": "Fix admonition again\n"
    },
    {
      "commit": "56e961f1257c11057ebc6c507d89922efdc39924",
      "tree": "fde124308bc3f8eb3193023114f6b9078788a488",
      "parents": [
        "9566bf8689231b467af3652679ab52e38b28edc7"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:35:00 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:35:00 2013 -0700"
      },
      "message": "Add link to gophercloud-dev, fix admonition\n"
    },
    {
      "commit": "9566bf8689231b467af3652679ab52e38b28edc7",
      "tree": "b27ed8dce366463d35431560b30f4fa78126cefe",
      "parents": [
        "b4abb058ae399858dce42154dac40edd45ef75ac"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:28:23 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:28:23 2013 -0700"
      },
      "message": "Replace table with callouts\n"
    },
    {
      "commit": "b4abb058ae399858dce42154dac40edd45ef75ac",
      "tree": "c7f2e081ba56f28efeb5d6f564674284b53aff94",
      "parents": [
        "4c11721051d516cf999666f30bfc7837ce4990d4"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:25:09 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:25:09 2013 -0700"
      },
      "message": "Compensate for lack of gh support for admonitions\n"
    },
    {
      "commit": "4c11721051d516cf999666f30bfc7837ce4990d4",
      "tree": "202bc82bf82ab077d058d93d26201ee81d28cdb0",
      "parents": [
        "841204d289c81f16426cc7ba4727d85924c5fe98"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:23:42 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:23:42 2013 -0700"
      },
      "message": "Fix accidental code block syntax\n"
    },
    {
      "commit": "841204d289c81f16426cc7ba4727d85924c5fe98",
      "tree": "22e1ea3ba5b28338cc85209d570e37e5396aa4f2",
      "parents": [
        "7b830c970d2a1011093f95a0a1f6df39fa2b9cd0"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:20:29 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:20:29 2013 -0700"
      },
      "message": "Change filename to match new format\n"
    },
    {
      "commit": "7b830c970d2a1011093f95a0a1f6df39fa2b9cd0",
      "tree": "80e2591679c0e129efa65d7ec7d272b2cb30f438",
      "parents": [
        "07552815c87658057cfee56cfae9e50a9cfee889"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:20:14 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:20:14 2013 -0700"
      },
      "message": "Translate from markdown to asciidoc\n"
    },
    {
      "commit": "07552815c87658057cfee56cfae9e50a9cfee889",
      "tree": "4f2495bb9915030652a9cbd8b572ab44d5536926",
      "parents": [
        "43fa244bacff5277b68739b3c50586110196532c"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Thu Jun 27 15:02:13 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Thu Jun 27 15:02:13 2013 -0700"
      },
      "message": "Update README.md with typo fixes and Getting Started\n"
    },
    {
      "commit": "43fa244bacff5277b68739b3c50586110196532c",
      "tree": "f416308c2716b9cd2839199a65b532f3a6b5c1ed",
      "parents": [],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "kc5tja@arrl.net",
        "time": "Thu Jun 27 11:08:16 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "kc5tja@arrl.net",
        "time": "Thu Jun 27 11:08:16 2013 -0700"
      },
      "message": "Merge pull request #9 from rackspace/authentication\n\nAdd Authentication functionality.\r\n\r\nNow that I have the time to write this up, here\u0027s the description that should have gone into the git commit message.\r\n\r\ngophercloud needs to authenticate against a provider. However, gorax\u0027s API isn\u0027t ideal from a multi-provider perspective. Thus, instead of requiring the user to instantiate Identity objects, configuring them, and then authenticating in a 3-step process, I create a single public function, Authenticate(), which performs (essentially) these tasks.\r\n\r\nI cannot predict the future, and cannot guarantee Identity V3 compatibility in its current form. However, in an attempt to anticipate the future, the Authenticate function is designed to automatically guess which Identity API you intend on using based on which set of credentials you provide it. The underlying assumption is that a V3 token is compatible with a V2 token; once we have the token, it should be usable with other V2 and V3 APIs as appropriate.\r\n\r\nUnlike Ruby or Python, Go lacks support for keyword arguments. There are two ways to overcome this deficiency: (1) Make a function that accepts one or more interface{} types, and rely on type-checks to disambiguate meaning from supplied parameters; and, (2) use a structure and rely upon Go\u0027s automatic initialization of unspecified fields to well-known \"zero\" values. Here\u0027s a comparison of the two approaches from the point of view of the caller:\r\n\r\n// option 1 -- use list of interface{} types\r\nacc, err :\u003d gophercloud.Authenticate(\"rackspace-us\", gophercloud.Username(\"sfalvo\"), gophercloud.Password(\"my-pass-here\"), gophercloud.TenantId(\"blah\"))\r\n\r\n// option 2 -- use of a dedicated options structure\r\naccRackspace, err :\u003d gophercloud.Authenticate(\"rackspace-us\", gophercloud.AuthOptions{\r\n    Username: \"sfalvo\",\r\n    Password: \"my-pass-here\",\r\n    TenantId: \"blah\",\r\n})\r\nAs can be seen, the latter requires much less physical typing (assuming one doesn\u0027t rename the gophercloud package to just \u0027g\u0027 in the import statement), and thus less chance for error. That\u0027s why I decided to use an options structure instead. It also impacts the design of the callee as well; with option (1), I\u0027d have to manually loop through all the parameters, using a type-case statement to decode the supplied parameters and fill in variables as they\u0027re discovered, while in (2) I just inspect the options structure directly. Less code means fewer bugs.\r\n\r\nSince the method of authentication remains the same across all providers, assuming universal use of V2 APIs, I associate an AuthEndpoint field with each Provider instance. That\u0027s the only per-provider piece of information defined at the moment.\r\n\r\nMost other SDKs hard-wire their providers; however, this is grossly inconvenient for unit-testing purposes. Therefore, I wrap what would otherwise be global state into a Context structure. TestContext exists to create a blank context, which can be used by unit tests at will. You\u0027ll notice that the init() function (in the api.go file) uses it to create the one, true, global context, and pre-populates it with the otherwise statically defined list of providers. Through this mechanism, users of the library needn\u0027t concern themselves with contexts and their proper initialization. Instead, they can just use the package-global functions, and they should \"just work.\"\r\n\r\nNote that the result of Authenticate() is a structure instance, allowing the client access to the service catalog, tenant ID information, and user information. As we flesh out additional APIs for the Go SDK, we will add methods to this Access structure, allowing more convenient access to various APIs. For example, one hypothetical approach to working with Cloud Compute services would involve using Access as a factory:\r\n\r\ncompute, err :\u003d accRackspace.CloudComputeApi()\r\nThis conforms to the first two levels of the desired \u003corganization.service.entity.method\u003e SDK organization, and provides the appropriate propegation of state that allows for token re-auth in a fully transparent manner, if necessary."
    }
  ]
}
