Commit Graph

289 Commits

Author SHA1 Message Date
Robert Schilling 97371848c5 API: Add GPG key management for admins 2017-09-05 14:30:53 +02:00
Robert Schilling b69579742b API: Add GPG key management 2017-09-05 14:30:53 +02:00
Robert Schilling dcd4ea473c Update remaining endpoints 2017-08-28 17:10:30 +02:00
Robert Schilling e80313f9ee Conditionally destroy a ressource 2017-08-28 16:40:25 +02:00
Robert Schilling 998afa5f74 API: Respect the 'If-Unmodified-Since' for delete endpoints 2017-08-28 16:40:25 +02:00
Rémy Coutable 09a348eb13
Include the `is_admin` field in the `GET /users/:id` API when current user is an admin
Signed-off-by: Rémy Coutable <remy@rymai.me>
2017-08-11 15:14:32 +02:00
Dmitriy Zaporozhets 6b8ad689da
Update grape gem
New version of the gem returns 200 status code on delete with content
instead of 204 so we explicitly set status code to keep existing
behavior

Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
2017-07-20 16:33:18 +03:00
Rémy Coutable 91f63820a5
Return `is_admin` attribute in the GET /user endpoint for admins
Signed-off-by: Rémy Coutable <remy@rymai.me>
2017-07-12 12:45:46 +02:00
James Lopez 5e66c6568b fix specs 2017-07-07 16:09:30 +02:00
James Lopez 1a7d2aba3b add created at filter logic to users finder and API 2017-07-07 10:38:57 +02:00
Douwe Maan 5e2f7f25eb Merge branch 'master' into '33580-fix-api-scoping'
# Conflicts:
#   lib/api/users.rb
2017-07-04 15:00:01 +00:00
Timothy Andrew d1488268b2 Simplify authentication logic in the v4 users API for !12445.
- Rather than using an explicit check to turn off authentication for the
  `/users` endpoint, simply call `authenticate_non_get!`.

- All `GET` endpoints we wish to restrict already call
  `authenticated_as_admin!`, and so remain inacessible to anonymous users.

- This _does_ open up the `/users/:id` endpoint to anonymous access. It contains
  the same access check that `/users` users, and so is safe for use here.

- More context: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/12445#note_34031323
2017-07-04 12:19:48 +00:00
Timothy Andrew 5dedea358d Merge remote-tracking branch 'origin/master' into 34141-allow-unauthenticated-access-to-the-users-api
- Modify policy code to work with the `DeclarativePolicy` refactor
  in 37c401433b.
2017-06-30 13:45:51 +00:00
Timothy Andrew 3c88a7869b Implement review comments for !12445 from @godfat and @rymai.
- Use `GlobalPolicy` to authorize the users that a non-authenticated user can
  fetch from `/api/v4/users`. We allow access if the `Gitlab::VisibilityLevel::PUBLIC`
  visibility level is not restricted.

- Further, as before, `/api/v4/users` is only accessible to unauthenticated users if
  the `username` parameter is passed.

- Turn off `authenticate!` for the `/api/v4/users` endpoint by matching on the actual
  route + method, rather than the description.

- Change the type of `current_user` check in `UsersFinder` to be more
  compatible with EE.
2017-06-30 13:06:03 +00:00
Timothy Andrew 6f1922500b Initial attempt at refactoring API scope declarations.
- Declaring an endpoint's scopes in a `before` block has proved to be
  unreliable. For example, if we're accessing the `API::Users` endpoint - code
  in a `before` block in `API::API` wouldn't be able to see the scopes set in
  `API::Users` since the `API::API` `before` block runs first.

- This commit moves these declarations to the class level, since they don't need
  to change once set.
2017-06-28 07:17:13 +00:00
Timothy Andrew 20f679d620 Allow unauthenticated access to the `/api/v4/users` API.
- The issue filtering frontend code needs access to this API for non-logged-in
  users + public projects. It uses the API to fetch information for a user by
  username.

- We don't authenticate this API anymore, but instead - if the `current_user` is
  not present:

  - Verify that the `username` parameter has been passed. This disallows an
    unauthenticated user from grabbing a list of all users on the instance. The
    `UsersFinder` class performs an exact match on the `username`, so we are
    guaranteed to get 0 or 1 users.
  - Verify that the resulting user (if any) is accessible to be viewed publicly
    by calling `can?(current_user, :read_user, user)`
2017-06-26 07:20:30 +00:00
James Lopez ae95310523 fix spec failures 2017-06-24 10:00:23 +02:00
James Lopez 859858c7e6 fix spec failures 2017-06-23 21:13:46 +02:00
James Lopez b804db2648 refactor update user service not to do auth checks 2017-06-23 11:41:43 +02:00
James Lopez 12dc3992ea fix spec failures 2017-06-23 11:41:42 +02:00
James Lopez 785cbb79e2 refactor emails service 2017-06-23 11:41:42 +02:00
James Lopez 831b2fccf9 update missing email actions 2017-06-23 11:41:42 +02:00
James Lopez 87bf08c96c fix specs 2017-06-23 11:41:42 +02:00
James Lopez 3bab585bec update to use emails destroy service 2017-06-23 11:41:42 +02:00
James Lopez ad44af2faa fixed specs 2017-06-23 11:41:42 +02:00
James Lopez 158550cf37 added service in the rest of controllers and classes 2017-06-23 11:41:42 +02:00
James Lopez bf3a3f3652 fix api and controller issues 2017-06-23 11:41:41 +02:00
James Lopez ef6a4240e5 update notification settings, fix api specs 2017-06-23 11:41:41 +02:00
Grzegorz Bizon 0430b76441 Enable Style/DotPosition Rubocop 👮 2017-06-21 13:48:12 +00:00
Mike Ricketts 0e7478064f Re-instate is_admin flag in users API is current user is an admin 2017-06-20 14:54:29 +00:00
vanadium23 83a9a472b3 Accept image for avatar in user API 2017-06-16 23:52:15 +03:00
Grzegorz Bizon eebd18c3ac Merge branch '2563-backport-ee1942' into 'master'
Backport some EE changes from adding shared_runners_minutes_limit to the API

Closes gitlab-ee#2563

See merge request !11936
2017-06-07 07:04:21 +00:00
Lin Jen-Shin d919f924bf Backport https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/1942 2017-06-06 21:42:45 +08:00
Mark Fletcher ad3e180ed3 Introduce an Events API
* Meld the following disparate endpoints:
 * `/projects/:id/events`
 * `/events`
 * `/users/:id/events`
+ Add result filtering to the above endpoints:
 * action
 * target_type
 * before and after dates
2017-06-06 20:16:41 +08:00
Nick Thomas 158581a447 Refactor the DeleteUserWorker 2017-06-05 13:08:06 +01:00
Nick Thomas c890c6aaf2 Allow users to be hard-deleted from the API 2017-06-02 18:28:12 +01:00
George Andrinopoulos 872e7b7efe Create a Users Finder 2017-05-15 13:53:12 +00:00
Timothy Andrew 34b71e734b Don't display the `is_admin?` flag for user API responses.
- To prevent an attacker from enumerating the `/users` API to get a list of all
  the admins.

- Display the `is_admin?` flag wherever we display the `private_token` - at the
  moment, there are two instances:

  - When an admin uses `sudo` to view the `/user` endpoint
  - When logging in using the `/session` endpoint
2017-04-25 09:46:05 +00:00
Robert Speicher 93e23a5d71 Merge branch 'query-users-by-extern-uid' into 'master'
Implement search by extern_uid in Users API

See merge request !10509
2017-04-19 19:50:38 +00:00
Robin Bobbitt ddf7e6ae78 Implement search by extern_uid in Users API 2017-04-18 14:55:32 -04:00
Sean McGivern 380e40fee3 Remove unused user activities code 2017-04-14 15:20:55 +02:00
Rémy Coutable 814212621f Expose `last_activity_on` in the User API
Signed-off-by: Rémy Coutable <remy@rymai.me>
2017-04-14 15:20:55 +02:00
Sean McGivern 91ac0e038a Port 'Add user activities API' to CE
CE port of https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/962
2017-04-14 15:20:55 +02:00
Oswaldo Ferreira fd32960e7c Separate CE params on Grape API 2017-04-10 16:13:48 -03:00
blackst0ne 11aff97d88 Remove the User#is_admin? method 2017-04-09 13:20:57 +11:00
Jacopo b996a82ff4 ProjectsFinder should handle more options
Extended ProjectFinder in order to handle the following options:
 - current_user - which user use
 - project_ids_relation: int[] - project ids to use
 - params:
   -  trending: boolean
   -  non_public: boolean
   -  starred: boolean
   -  sort: string
   -  visibility_level: int
   -  tags: string[]
   -  personal: boolean
   -  search: string
   -  non_archived: boolean

GroupProjectsFinder now inherits from ProjectsFinder.
Changed the code in order to use the new available options.
2017-04-06 07:11:37 +02:00
Stan Hu 6a2d022d1d Delete users asynchronously 2017-04-02 05:37:05 -07:00
George Andrinopoulos 7c74a0209b Implement new service for creating user 2017-03-27 09:37:24 +00:00
http://jneen.net/ 846e581732 use a magic default :global symbol instead of nil
to make sure we mean the global permissions
2017-03-09 11:49:52 -08:00
Tiago Botelho 005749a616 apply codestyle and implementation changes to the respective feature code 2017-03-06 19:18:26 +00:00
Tiago Botelho 2b474dc2b2 refactors finder and correlated code 2017-03-01 13:11:11 +00:00
Tiago Botelho 9f2e4742e3 applies relevant changes to the code and code structure 2017-02-28 22:15:40 +00:00
Tiago Botelho f0ea7130f7 refactors documentation and personal access tokens form to not allow admins to generate non impersionation tokens 2017-02-28 22:15:40 +00:00
Simon Vocella a3dfb58e7f add impersonation token 2017-02-28 22:15:39 +00:00
Simon Vocella 81246e5649 manage personal_access_tokens through api 2017-02-28 22:15:39 +00:00
Robert Schilling 86c58687b2 Return 204 for delete endpoints 2017-02-28 08:32:38 +01:00
Douwe Maan 1fe7501b49 Revert "Prefer leading style for Style/DotPosition"
This reverts commit cb10b725c8929b8b4460f89c9d96c773af39ba6b.
2017-02-23 09:33:05 -06:00
Douwe Maan 206953a430 Prefer leading style for Style/DotPosition 2017-02-23 09:32:22 -06:00
Douwe Maan 030baf70d2 Enable Performance/RedundantMerge 2017-02-23 09:31:57 -06:00
Robert Schilling 8f690604a5 API: Use POST to (un)block a user 2017-02-20 15:18:40 +01:00
Robert Schilling 01ea65e0e9 Paginate all endpoints that return an array 2017-02-16 15:32:01 +01:00
Rémy Coutable 6c62ec76c0 Merge branch '1051-api-create-users-without-password' into 'master'
Optionally make users created via the API set their password

Closes #1051

See merge request !8957
2017-02-10 18:34:58 +00:00
Joost Rijneveld 6fab6d94ce
Optionally make users created via the API set their password 2017-02-09 20:32:54 +01:00
dixpac 0dacf3c169 Fix inconsistent naming for services that delete things
* Changed name of delete_user_service and worker to destroy
* Move and change delete_group_service to Groups::DestroyService
* Rename Notes::DeleteService to Notes::DestroyService
2017-02-08 09:16:43 +01:00
George Andrinopoulos 19dda1606b Force new password after password reset via API 2017-02-02 12:47:23 +02:00
Mark Fletcher 72c68b98ae Fix Users API to accept confirm parameter 2017-01-11 14:38:41 +00:00
Rémy Coutable 8b1914ceb2
Fix the failing spec in POST /users API
Signed-off-by: Rémy Coutable <remy@rymai.me>
2017-01-05 13:30:31 +01:00
Robert Schilling 15932c360c API: extern_uid is a string 2017-01-03 08:44:33 +01:00
Arsenev Vladislav 3cc334eae5 remove build_user from model User 2016-12-18 23:26:29 +00:00
Timothy Andrew 7fa06ed55d Calls to the API are checked for scope.
- Move the `Oauth2::AccessTokenValidationService` class to
  `AccessTokenValidationService`, since it is now being used for
  personal access token validation as well.

- Each API endpoint declares the scopes it accepts (if any). Currently,
  the top level API module declares the `api` scope, and the `Users` API
  module declares the `read_user` scope (for GET requests).

- Move the `find_user_by_private_token` from the API `Helpers` module to
  the `APIGuard` module, to avoid littering `Helpers` with more
  auth-related methods to support `find_user_by_private_token`
2016-12-16 16:29:31 +05:30
Rémy Coutable 2f45d3bcf0 API: Memoize the current_user so that the sudo can work properly
The issue was arising when `#current_user` was called a second time
after a user was impersonated: the `User#is_admin?` check would be
performed on it and it would fail.

Signed-off-by: Rémy Coutable <remy@rymai.me>
2016-12-12 13:50:31 +01:00
tiagonbotelho 3ed96afc47 adds impersonator variable and makes sudo usage overall more clear 2016-12-07 14:42:51 +00:00
tiagonbotelho 8b379465a5 Reenables /user API request to return private-token if user is admin and requested with sudo 2016-12-07 14:42:51 +00:00
Robert Schilling 74c8669b0a Use the pagination helper in the API 2016-12-04 18:11:19 +01:00
Rémy Coutable 039d4a1cbf
Fix StrongAttibutes error with Ruby 2.1
Signed-off-by: Rémy Coutable <remy@rymai.me>
2016-11-21 18:47:55 +01:00
Robert Schilling 4cb3c0b404 Grapify the users API 2016-11-21 10:53:28 +01:00
Yatish Mehta a0aaf93fe5
Add query param to filter users on 'external' & 'blocked' type on API 2016-11-08 12:04:05 -08:00
Airat Shigapov 3685e867c8
Get rid of extra .page call 2016-10-24 22:56:27 +03:00
Airat Shigapov 1a04a51b52
Fix events order in user contributions API 2016-10-24 22:56:27 +03:00
Rémy Coutable 33ce197645
API: New /users/:id/events endpoint
Signed-off-by: Rémy Coutable <remy@rymai.me>
2016-10-10 13:35:53 +02:00
Dmitriy Zaporozhets d0b556eb1b Add User#organization to users api
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
2016-09-27 14:04:39 +03:00
Timothy Andrew 727dff3f15 Don't expose a user's private token in the `/api/v3/user` API.
- This would allow anyone with a personal access token (even a read-only
  token, once scopes are implemented) to escalate their access by
  obtaining the private token.
2016-08-31 12:33:24 +05:30
Grzegorz Bizon c370dce01c Enable Style/RedundantParentheses rubocop cop
See #17478
2016-05-30 15:07:18 +02:00
Felipe Artur 2366768d3b Add changelog entry 2016-04-18 11:12:28 -03:00
Felipe Artur 820c08cefd Fix documentation and improve permissions code 2016-04-18 11:12:28 -03:00
Felipe Artur ce96d482d9 Insert users check into api 2016-04-18 11:12:27 -03:00
Robert Schilling 62b6963255 Expose user location in API 2016-04-06 15:53:17 +02:00
Achilleas Pipinellis 956e914307 Add missing API docs on external user
[ci skip]
2016-03-17 12:21:12 +02:00
Zeger-Jan van de Weg 51300d9b2a API support for setting External flag on existing users 2016-03-17 09:36:00 +01:00
Zeger-Jan van de Weg 42fcd3881f External Users
The user has the rights of a public user execpt it can never create a project,
 group, or team. Also it cant view internal projects.
2016-03-13 19:08:04 +01:00
Gabriel Mazetto ac6a10f3e8 Codestyle changes 2016-01-12 12:29:10 -02:00
Gabriel Mazetto 6e7db8e23e Prevent ldap_blocked users from being blocked/unblocked by the API 2016-01-08 16:26:04 -02:00
Michi302 141b8b67ff Make single user API endpoint return Entities::User instead of Entities::UserBasic 2015-12-28 15:50:44 +01:00
Stan Hu 5a8c65b508 Add API support for looking up a user by username
Needed to support Huboard
2015-12-24 07:57:13 -08:00
Patricio Cano f60eb60473 Added ability to update or set the identity of an existing user, like the documentation said it was possible, but actually wasn't. 2015-09-22 16:26:59 -05:00
Stan Hu d241c6d057 Restrict users API endpoints to use integer IDs
Closes #2267
2015-08-23 06:13:16 -07:00
Douwe Maan 8802846565 Fix indentation 2015-07-31 16:39:51 -04:00
Douwe Maan 4fb6ddfe06 Add ability to manage user email addresses via the API. 2015-07-29 15:40:08 +02:00
Steve Norman b3a751112d Allow user to be blocked and unblocked via the API 2015-07-03 11:17:57 +00:00
Stan Hu e80d7a804f Fix error when deleting a user who has projects
Closes #1856
Closes https://github.com/gitlabhq/gitlabhq/issues/9394
2015-06-23 04:39:49 -07:00
Dmitriy Zaporozhets 499154518a
You can not remove user if he/she is an only owner of group
To prevent loose of group data you need to transfer or remove group
first before you can remove user

Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
2015-05-28 12:00:02 +02:00
RICKETTM@uk.ibm.com fda55f9145 Change ordering so that confirm is removed from attrs before attempting to User.build_user 2015-03-24 15:52:26 +00:00
Dmitriy Zaporozhets 0d22b75b03 Merge branch 'master' into mmonaco/gitlab-ce-api-user-noconfirm
Conflicts:
	lib/api/users.rb
2015-02-27 13:01:57 -08:00
Valery Sizov 3a5ed5260b Supporting for multiple omniauth provider for the same user 2014-12-04 13:03:55 +02:00
Matthew Monaco 5f682094d9 Add 'confirm' option to users api 2014-11-03 15:37:13 -07:00
jubianchi 998cd3cb63 Improve error reporting on users API
* users (#6878, #3526, #4209): Validation error messages are now exposed through 400 responses, 409 response are sent in case of duplicate email or username
* MRs (#5335): 409 responses are sent in case of duplicate merge request (source/target branches), 422 responses are sent when submiting MR fo/from unrelated forks
* issues
* labels
* projects
2014-09-16 01:25:24 +02:00
Dmitriy Zaporozhets 4967c08786
Fix signup and project visibility
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
2014-06-30 16:43:32 +03:00
Dmitriy Zaporozhets 8fee5a0572
Make app works with strong params
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
2014-06-26 23:24:17 +03:00
Dmitriy Zaporozhets ae564c97d4
Dont expose user email via API
To prevent leaking of users info we reduce amount of user information
retrieved via API for normal users.

What user can get via API:

* if not admin: only id, state, name, username and avatar_url
* if admin: all user information
* about himself: all informaion

Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
2014-06-13 17:46:48 +03:00
Timm Friebe 05e792b4c4 Implement GET /users/:uid/keys for admin users
Complements POST operation added in gitlabhq/gitlabhq#3146

Implement DELETE /users/:uid/keys/:id for admin users

Fix "Line is too long. [83/80]"

Use single quotes as advised

Use single quotes as advised

Use single quotes as advised

Fix missing space around { and }

Fix typo in documentation

Only catch  ActiveRecord::RecordNotFound, let other exceptions propagate

Raise a "404 Not found" if key to be deleted cannot be found
As requested by @jvanbaarsen in https://github.com/gitlabhq/gitlabhq/pull/6781#discussion_r11735114

Remove tab
Unconfigured vim on this box, grrrr./
2014-04-18 14:16:19 +02:00
Dmitriy Zaporozhets 4d56c359d3 Merge pull request #6075 from skv-headless/remove_deprecated_finders
Remove deprecated finders
2014-01-22 11:04:56 -08:00
skv a3f645ef51 Remove deprecated finders 2014-01-19 23:39:56 +04:00
Jerome Dalbert 2e3f250d45 Add website url to user 2014-01-18 19:15:10 +00:00
skv d89527839e fix most of warnings 2013-12-15 00:05:10 +04:00
Boyan Tabakov 479631aafc Extended User API to expose admin and can_create_group for user creation/updating.
Also, is_admin and can_create_group are exposed in the user information.
Fixed attributes_for_keys to process properly keys with boolean values (since false.present? is false).
2013-09-29 11:47:29 +03:00
Izaak Alpert 5dae40f579 Update to only provide one way to get a default user
-calling build_user will now apply defaults and only override them if as: :admin is set

Change-Id: Id1d938c0967752ecc14370af54f2d88128d18c44
2013-09-11 14:04:15 -04:00
Izaak Alpert d4d4a78f83 Update User api to respect default settings
-API now respects default_projects_limit, default_can_create_group, and default_can_create_team

Change-Id: I059d060d576df1050e5371e707381c5e8c608a7a
2013-09-11 14:04:15 -04:00
Dmitriy Zaporozhets 634cbd7138 Refactor API classes. So api classes like Gitlab::Issues become API::Issues 2013-05-14 15:33:31 +03:00
Dmitriy Zaporozhets 4528fa9817 modify api to work with new deploy keys 2013-05-06 16:24:58 +03:00
Dmitriy Zaporozhets 880cb8aa48 Paginate users in users api 2013-04-16 09:26:01 +03:00
Dmitriy Zaporozhets 3b42c267a6 Dont show blocked users in autocomplete 2013-03-19 18:07:14 +02:00
Alex Denisov 28e7d1a8bf Abilities added to /user and /sign_in requests 2013-03-18 20:11:28 +00:00
Kevin Lyda 415bade302 Result of misspellings run.
Most of these are comments but a few are strings for users.

Might be an idea to run this from time to time:
https://github.com/lyda/misspell-check

It runs mostly clean now.
2013-03-17 19:46:54 +00:00
Dmitriy Zaporozhets bf17d976a7 add api users filter and integrate users select2 2013-03-13 23:19:09 +02:00
Sebastian Ziebell 3374027e3a Merge branch 'master' into fixes/api, code clean up and tests fixed
Conflicts:
	doc/api/projects.md
	spec/requests/api/projects_spec.rb
2013-03-07 14:51:56 +01:00
Angus MacArthur 61ffcab60f Additional Admin APIs 2013-03-05 10:38:43 -05:00
Sebastian Ziebell 7499f65014 API: extracted helper method to validate required parameters, code clean up
Added a helper method to check if required parameters are given in an API call. Can be used
to return a `400 Bad Request` return code if a required attribute is missing.
Code clean up and fixed tests.
2013-02-27 17:50:30 +01:00
Sebastian Ziebell 1b97a2eee8 API: fixes return codes, documentation updated with status codes, tests added
The users API updated with return codes, e.g. if required parameters are missing
a `400 Bad Request` error is returned instead of `404`. Fixes return codes of functions,
e.g. deletion of a ssh key is an idempotent function now.
The API documentation is updated to reflect the current status of the API. Descriptions
are more detailed and complete, infos to return values are added to all functions.
2013-02-20 12:23:56 +01:00
Boyan Tabakov e954438a1d Extended users API to support updating and deleting users.
Also added tests.
2012-12-18 21:24:31 +02:00
Cyril 63d9373aa8 Validates presence of User#name
The 2 reasons are :
- creation of user fail if name is empty : in after_save, it tries to create a
namespace with namespace.name = user.name and namespece validates presence
Namespace#name
- in the web app links to team members are broken with empty User#name because
they are of the form <a href'...'> user.name </a>
2012-12-12 17:53:43 +01:00
Dmitriy Zaporozhets 0693215c30 Fixed spinach and tests. Build should pass now 2012-11-23 22:55:38 +02:00
Nihad Abbasov 00325a733a name and password_confirmation not required to create a user via API 2012-10-19 03:34:18 -07:00
Nihad Abbasov c610206321 fix mass-assignment error in user create API 2012-10-19 03:23:10 -07:00
Valeriy Sizov d104df49e7 fix TYPO 2012-10-02 16:34:20 +03:00
Valeriy Sizov 825081174a #1585 Api for user creation: base implementation 2012-10-02 12:46:01 +03:00
Nihad Abbasov b62445813d API: SSH keys belong to user entity 2012-09-21 04:49:28 -07:00
Nihad Abbasov 76e4d94d43 add pagination to API 2012-09-03 04:46:29 -07:00
Robert Speicher 7754189187 Fully embrace Ruby 1.9 hash syntax
Didn't bother with files in db/, config/, or features/
2012-08-10 18:25:15 -04:00
Nihad Abbasov 0d67f209fc refactor API and improve docs 2012-06-29 03:46:01 -07:00