Giter Site home page Giter Site logo

gitlab.cr's Introduction

๐Ÿ’Ž Gitlab.cr

Language Tag Build Status

Gitlab.cr is a GitLab API wrapper writes with Crystal Language. Inspired from gitlab gem for ruby version. No support GraphQL API

Build in crystal version >= v1.0.0, Docs Generated in latest commit.

Installation

dependencies:
  gitlab:
    github: icyleaf/gitlab.cr

Usage

require "gitlab"

# configuration
endpoint = "http://domain.com/api/v3"
token = "<token>"

# initialize a new client
g = Gitlab.client(endpoint, token)
# => #<Gitlab::Client:0x101653f20 @endpoint="http://localhost:10080/api/v3", @token="xxx">

# get the authenticated user
user = g.user
# => {"name" => "icyleaf", "username" => "icyleaf", "id" => 34, "state" => "active", "avatar_url" => "http://www.gravatar.com/avatar/38e1b2eb5d0a3fff4fb0ab8363c8f874?s=80&d=identicon", "web_url" => "http://gitlab.docker:10080/u/icyleaf", "created_at" => "2016-05-14T09:23:42.594+05:30", "is_admin" => true, "bio" => nil, "location" => nil, "skype" => "", "linkedin" => "", "twitter" => "", "website_url" => "", "last_sign_in_at" => "2016-05-14T09:24:00.575+05:30", "confirmed_at" => "2016-05-14T09:23:42.457+05:30", "email" => "[email protected]", "theme_id" => 2, "color_scheme_id" => 1, "projects_limit" => 8, "current_sign_in_at" => "2016-06-18T20:11:15.609+05:30", "identities" => [], "can_create_group" => true, "can_create_project" => true, "two_factor_enabled" => false, "external" => false, "private_token" => "xxx"}

# get the user's email
email = user["email"]
# => "[email protected]"

# get list of projects
projects = g.projects({ "per_page" => 5 })

# handle the exception
begin
  pp g.delete_group(999)
rescue ex
  pp ex.message
  # Here has one variable "response" instance of Gitlab::HTTP::Response
  # Friendly for developer to debug and control expressions.
  pp ex.response.code
  pp ex.response.body
end

# request not handled APIs
# example: request a GET method to call "/application/settings"

# get gitlab settings
g.get("/application/settings")

# update gitlab settings
g.put("/application/settings", { "signup_enabled" => "false" })

For more information, refer to API Documentation.

Progress

Built-in

  • Http Client - Halite
  • Exceptions
  • Gitlab wrapper
  • Authentication
  • 100% Rspec Coveraged

Gitlab

Completed

  • Service Status (Not Gitlab API)
    • Check service available - available?
  • Users
    • List Users - users
    • Single user - user(user_id)
    • User creation - create_user
    • User modification - edit_user
    • User deletion - delete_user
    • Current user - user
    • User deletion - delete_user
    • List custom attributes for given user - user_custom_attributes(user_id)
    • Add custom attribute for given user - user_add_custom_attribute(user_id, key)
    • Delete custom attribute for given user - user_delete_custom_attribute(user_id, key)
    • Block user - block_user(user_id)
    • Unblock user - unblock_user(user_id)
    • List SSH keys - ssh_keys
    • List SSH keys for user - ssh_keys(user_id)
    • Single SSH key ssh_key(ssh_key_id)
    • Add SSH key - create_ssh_key
    • Add SSH key for user - create_ssh_key(user_id)
    • Delete SSH key for current user - delete_ssh_key
    • Delete SSH key for given user - delete_ssh_key(user_id)
    • List emails - emails
    • List emails for user - emails(user_id)
    • Single email - email
    • Add email - add_email
    • Add email for user - add_email(user_id)
    • Delete email for current user - delete_email
    • Delete email for given user - delete_email(user_id)
  • Session
    • Login session - session
  • Projects (including setting Webhooks)
    • Uploads
      • Upload a file - upload_file
    • List projects - projects
      • List owned projects - owned_projects
      • List starred projects - starred_projects
      • List ALL projects - all_projects
      • Get single project - project
      • Get project events - project_events
      • Create project - create_project
      • Create project for user - create_project(user_id)
      • Edit project - edit_project
      • Fork project - fork_project
      • Star a project - star_project
      • Unstar a project - unstar_project
      • Archive a project - archive_project
      • Unarchive a project - unarchive_project
      • Remove project - delete_project
    • Team members
      • List project team members - project_members
      • Get project team member - project_member
      • Add project team member - add_project_member
      • Edit project team member - edit_project_member
      • Remove project team member - remove_project_member
      • Share project with group - share_project
    • Pages Domains
      • List project pages domains - project_pages_domains
      • Get project pages domain - project_pages_domain
      • Add project pages domain - add_project_pages_domain
      • Edit project pages domain edit_project_pages_domain
      • Remove project pages domain - remove_project_pages_domain
    • Hooks
      • List project hooks - project_hooks
      • Get project hook - project_hook
      • Add project hook - add_project_hook
      • Edit project hook - edit_project_hook
      • Delete project hook - remove_project_hook
    • Branches
      • List branches - project_branchs
      • List single branch - project_branch
      • Protect single branch - protect_project_branch
      • Unprotect single branch - unprotect_project_branch
    • Admin fork relation
      • Create a forked from/to relation between existing projects. - create_fork_from
      • Delete an existing forked from relationship - remove_fork_from
    • Search for projects by name - project_search
  • Repositories
    • List repository tree - tree
    • Raw blob content - blow
    • Get an archive of the repository - archive_project
    • Compare branches, tags or commits - compare
    • Contributors - contributors
  • Repository File
    • Gets a repository file - get_file
    • Get raw file content - file_contents
    • Create a file
    • Edit a file
    • Remove a file
  • Commits
    • List repository commits - commits
    • Get a single commit - commit
    • Get the diff of a commit - commit_diff
    • Get the comments of a commit - commit_coments
    • Post comment to commit - create_commit_comment
    • Commit status
      • Get the status of a commit - commit_status
      • Post the build status to a commit - update_commit_status
  • Branches
    • List repository branches - branches
    • Get single repository branch - branch
    • Protect repository branch - protect_branch
    • Unprotect repository branch - unprotect_branch
    • Create repository branch - create_branch
    • Delete repository branch - delete_branch
  • Merge Requests
    • List merge requests - merge_requests
    • Get single MR - merge_request
    • Get single MR commits - merge_request_commit
    • Get single MR changes - merge_request_changes
    • Create MR - create_merge_request
    • Update MR - edit_merge_request
    • Delete a merge request - delete_merge_request
    • Accept MR - accept_merge_request
    • Cancel Merge When Build Succeeds - cancel_merge_request_when_build_succeed
    • Comments on merge requests - merge_request_comments
    • List issues that will close on merge - merge_request_closed_issues
    • Subscribe to a merge request - subscribe_merge_request
    • Unsubscribe from a merge request - unsubscribe_merge_request
  • Issues
    • List issues - issues
    • List project issues - issues(project_id)
    • Single issue - issue
    • New issue - create_issue
    • Edit issue - edit_issue / close_issue / reopen_issue
    • Delete an issue - delete_issue
    • Move an issue - move_issue
    • Subscribe to an issue - subscribe_issue
    • Unsubscribe from an issue - unsubscribe_issue
    • Comments on issues - Comments are done via the notes resource
  • Keys
    • Get SSH key with user by ID of an SSH key - key
  • Labels
    • List labels - labels
    • Create a new label - create_label
    • Delete a label - delete_label
    • Edit an existing label - edit_labe
    • Subscribe to a label - subscribe_label
    • Unsubscribe from a label - unsubscribe_label
  • Milestones
    • List project milestones - milestones
    • Get single milestone - milestone
    • Create new milestone - create_milestone
    • Edit milestone - edit_milestone
    • Get all issues assigned to a single milestone - milestone_issues
    • Get all merge requests of a given milestone. - milestone_merge_requests
  • Notes (comments)
    • Issues
      • List project issue notes - issue_notes
      • Get single issue note - issue_note
      • Create new issue note - create_issue_note
      • Modify existing issue note - edit_issue_note
      • Delete an issue note - delete_issue_note
    • Snippets
      • List all snippet notes - snippet_notes
      • Get single snippet note - snippet_note
      • Create new snippet note - create_snippet_note
      • Modify existing snippet note - edit_snippet_note
      • Delete a snippet note - delete_snippet_note
    • Merge Requests
      • List all merge request notes - merge_request_notes
      • Get single merge request note - merge_request_note
      • Create new merge request note - create_merge_request_note
      • Modify existing merge request note - edit_merge_request_note
      • Delete a merge request note - delete_merge_request_note
  • Deploy Keys
    • List deploy keys - deploy_keys
    • Single deploy key - deploy_key
    • Add deploy key - create_deploy_key
    • Delete deploy key - remove_deploy_key
  • Groups
    • List groups - groups
    • List a group's projects - group_projects
    • Details of a group - group
    • New group - create_group
    • Transfer project to group - transfer_project_to_group
    • Update group - edit_group
    • Remove group - delete_group
    • Search for group - group_search
    • Group members
      • List group members - group_members
      • Get member detail of group - group_member
      • Add group member - add_member_to_group
      • Edit group team member - edit_member_to_group
      • Remove user team member - remove_member_to_group
    • Namespaces in groups - same as List group
  • Tags
    • List project repository tags - tags
    • Get a single repository tag - tag
    • Create a new tag - create_tag
    • Delete a tag - delete_tag
    • Create a new release - create_release_notes
    • Update a release - update_release_notes
  • Version
    • Get Gitlab version - version

Todo (optional)

  • Award Emoji
  • Project Snippets
  • Services
  • System Hooks
  • Settings
  • Boards
  • Gitlab CI
    • Builds
    • Jobs
    • Runners
    • Pipelines

Help and Discussion

You can browse the API documents:

http://icyleaf.github.io/gitlab.cr/

You can browse the Changelog:

https://github.com/icyleaf/gitlab.cr/blob/master/CHANGELOG.md

If you have found a bug, please create a issue here:

https://github.com/icyleaf/gitlab.cr/issues/new

How to Contribute

Your contributions are always welcome! Please submit a pull request or create an issue to add a new question, bug or feature to the list.

All Contributors are on the wall.

You may also like

  • halite - HTTP Requests Client with a chainable REST API, built-in sessions and loggers.
  • markd - Yet another markdown parser built for speed, Compliant to CommonMark specification.
  • poncho - A .env parser/loader improved for performance.
  • popcorn - Easy and Safe casting from one type to another.
  • fast-crystal - ๐Ÿ’จ Writing Fast Crystal ๐Ÿ˜ -- Collect Common Crystal idioms.

License

MIT License ยฉ icyleaf

gitlab.cr's People

Contributors

icyleaf avatar kalinon avatar mipmip avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

gitlab.cr's Issues

fix correct response to get file archive in repository api

For now, in gitlab.cr api client.file_archive will always throw exception:

Unexpected byte 0x8b at position 1, malformed UTF-8 (InvalidByteSequenceError)
[4462170210] *CallStack::unwind:Array(Pointer(Void)) +82
[4462170113] *CallStack#initialize:Array(Pointer(Void)) +17
[4462170072] *CallStack::new:CallStack +40
[4462129593] *raise<InvalidByteSequenceError>:NoReturn +25
[4462357812] *Char::Reader#invalid_byte_sequence<UInt32, Int32>:NoReturn +148
[4462356825] *Char::Reader#decode_current_char:Char +153
[4462357894] *Char::Reader#next_char:Char +54
[4462203146] *String#inspect<IO::FileDescriptor>:IO::FileDescriptor +266
[4462152813] *p<String>:String +29
[4462090810] __crystal_main +1370
[4462141208] main +40
"\u{1f}%

This is because the "Content-Type" of HTTP::Response is "application/octet-stream", but code just return it as String.

Support Project API

Document: http://docs.gitlab.com/ce/api/projects.html

  • List projects - projects
    • List owned projects - owned_projects
    • List starred projects - starred_projects
    • List ALL projects - all_projects
    • Get single project - project
    • Get project events - project_events
    • Create project - create_project
    • Create project for user - create_project(user_id)
    • Edit project - edit_project
    • Fork project - fork_project
    • Star a project - star_project
    • Unstar a project - unstar_project
    • Archive a project - archive_project
    • Unarchive a project - unarchive_project
    • Remove project - delete_project
  • Team members
    • List project team members - project_members
    • Get project team member - project_member
    • Add project team member - add_project_member
    • Edit project team member - edit_project_member
    • Remove project team member - remove_project_member
    • Share project with group - share_project
  • Hooks
    • List project hooks - project_hooks
    • Get project hook - project_hook
    • Add project hook - add_project_hook
    • Edit project hook - edit_project_hook
    • Delete project hook - remove_project_hook
  • Branches
    • List branches - project_branchs
    • List single branch - project_branch
    • Protect single branch - protect_project_branch
    • Unprotect single branch - unprotect_project_branch
  • Admin fork relation
    • Create a forked from/to relation between existing projects. - create_fork_from
    • Delete an existing forked from relationship - remove_fork_from
  • Search for projects by name - project_search

100% pass rspec

  • branch
  • commit
  • deploy_keys
  • group
  • issue
  • key
  • label
  • merge_request
  • milestone
  • note
  • project
  • repository
  • session
  • tag
  • user

Support Merge Requests API

http://docs.gitlab.com/ce/api/merge_requests.html

  • List merge requests - merge_requests
  • Get single MR - merge_request
  • Get single MR commits - merge_request_commit
  • Get single MR changes - merge_request_changes
  • Create MR - create_merge_request
  • Update MR - edit_merge_request
  • Delete a merge request - delete_merge_request
  • Accept MR - accept_merge_request
  • Cancel Merge When Build Succeeds - cancel_merge_request_when_build_succeed
  • Comments on merge requests - merge_request_comments
  • List issues that will close on merge - merge_request_closed_issues
  • Subscribe to a merge request - subscribe_merge_request
  • Unsubscribe from a merge request - unsubscribe_merge_request

Support Commits API

http://docs.gitlab.com/ce/api/commits.html

  • List repository commits - commits
  • Get a single commit - commit
  • Get the diff of a commit - commit_diff
  • Get the comments of a commit - commit_coments
  • Post comment to commit - create_commit_comment
  • Commit status
    • Get the status of a commit - commit_status
    • Post the build status to a commit - update_commit_status

Support Group API

  • List groups - groups
  • List a group's projects - group_projects
  • Details of a group - group
  • New group - create_group
  • Transfer project to group - transfer_project_to_group
  • Update group - edit_group
  • Remove group - delete_group
  • Search for group - search_groups
  • Group members
    • List group members - group_members
    • Add group member - add_member_to_group
    • Edit group team member - edit_member_to_group
    • Remove user team member - remove_member_to_group
  • Namespaces in groups - same as List group

Halite error on deletion caused by 204 "No Content"

When deleting a user a halite error is raised...

Unhandled exception: Missing media type (Halite::Exception::Error)
  from lib/halite/src/halite/response.cr:84:9 in 'parse'

The GitLab API documentation says it User deletion returns with 204 No Content on success. I made a bypass by changing the response type to Halite::Response and removing parse() but this does not feel right.

What should be a proper way to handle 204 reponses? Add an exception for 204's in de parse() method?

I'm happy to apply a solution as PR and search the code for more cases like this.

Support Issues API

http://docs.gitlab.com/ce/api/issues.html

  • List issues - issues
  • List project issues - issues(project_id)
  • Single issue - issue
  • New issue - create_issue
  • Edit issue - edit_issue / close_issue / reopen_issue
  • Delete an issue - delete_issue
  • Move an issue - move_issue
  • Subscribe to an issue - subscribe_issue
  • Unsubscribe from an issue - unsubscribe_issue
  • Comments on issues - Comments are done via the notes(#11) resource

Support Notes API

http://docs.gitlab.com/ce/api/notes.html

  • Issues (#7)
    • List project issue notes - issue_notes
    • Get single issue note - issue_note
    • Create new issue note - create_issue_note
    • Modify existing issue note - edit_issue_note
    • Delete an issue note - delete_issue_note
  • Snippets
    • List all snippet notes - snippet_notes
    • Get single snippet note - snippet_note
    • Create new snippet note - create_snippet_note
    • Modify existing snippet note - edit_snippet_note
    • Delete a snippet note - delete_snippet_note
  • Merge Requests
    • List all merge request notes - merge_request_notes
    • Get single merge request note - merge_request_note
    • Create new merge request note - create_merge_request_note
    • Modify existing merge request note - edit_merge_request_note
    • Delete a merge request note - delete_merge_request_note

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.