{"id":228,"name":null,"description":"A simple, lightweight Ruby client for interacting with the Artifactory API.","url":"https://github.com/chef/artifactory-client","last_synced_at":"2026-04-30T17:00:23.114Z","repository":{"id":13296678,"uuid":"15982734","full_name":"chef/artifactory-client","owner":"chef","description":"A simple, lightweight Ruby client for interacting with the Artifactory API.","archived":false,"fork":false,"pushed_at":"2026-04-17T17:04:56.000Z","size":555,"stargazers_count":67,"open_issues_count":36,"forks_count":47,"subscribers_count":68,"default_branch":"main","last_synced_at":"2026-04-29T21:44:21.921Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chef.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2014-01-16T22:17:24.000Z","updated_at":"2026-04-20T23:30:40.000Z","dependencies_parsed_at":"2026-01-18T09:01:40.056Z","dependency_job_id":null,"html_url":"https://github.com/chef/artifactory-client","commit_stats":{"total_commits":334,"total_committers":36,"mean_commits":9.277777777777779,"dds":0.7005988023952097,"last_synced_commit":"782ea2a30ab6a912799dc429d448258ab38a891d"},"previous_names":["opscode/artifactory-client"],"tags_count":45,"template":false,"template_full_name":null,"purl":"pkg:github/chef/artifactory-client","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chef%2Fartifactory-client","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chef%2Fartifactory-client/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chef%2Fartifactory-client/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chef%2Fartifactory-client/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chef","download_url":"https://codeload.github.com/chef/artifactory-client/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chef%2Fartifactory-client/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32470879,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-30T13:12:12.517Z","status":"ssl_error","status_checked_at":"2026-04-30T13:12:06.837Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"owner":{"login":"chef","name":"Progress Chef","uuid":"29740","kind":"organization","description":"","email":"ops@chef.io","website":"https://www.chef.io/","location":"United States of America","twitter":"chef","company":null,"icon_url":"https://avatars.githubusercontent.com/u/29740?v=4","repositories_count":245,"last_synced_at":"2023-04-10T00:51:04.360Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/chef","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2022-11-02T16:35:03.574Z","updated_at":"2023-04-10T00:51:05.076Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chef","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chef/repositories"},"packages":[],"commits":{"id":854227,"full_name":"chef/artifactory-client","default_branch":"main","total_commits":336,"total_committers":36,"total_bot_commits":4,"total_bot_committers":2,"mean_commits":9.333333333333334,"dds":0.7023809523809523,"past_year_total_commits":2,"past_year_total_committers":2,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":1.0,"past_year_dds":0.5,"last_synced_at":"2026-04-29T21:43:57.371Z","last_synced_commit":"77939d8d4046d442eec87c66effee1383b1849bf","created_at":"2023-03-09T20:05:40.895Z","updated_at":"2026-04-29T21:43:41.542Z","committers":[{"name":"Seth Vargo","email":"sethvargo@gmail.com","login":"sethvargo","count":100},{"name":"Yvonne Lam","email":"yvonne@opscode.com","login":null,"count":70},{"name":"Seth Chisamore","email":"schisamo@chef.io","login":"schisamo","count":54},{"name":"Tim Smith","email":"tsmith@chef.io","login":"tas50","count":26},{"name":"Chef Expeditor","email":"chef-ci@chef.io","login":"chef-ci","count":16},{"name":"Chef Expeditor","email":"expeditor@chef.io","login":null,"count":13},{"name":"Rasmus Bergholdt","email":"rasmus.bergholdt@gmail.com","login":"bergholdt","count":7},{"name":"Rasmus Bergholdt","email":"rasmus.bergholdt@siemens.com","login":null,"count":5},{"name":"jayashri garud","email":"jgarud@msystechnologies.com","login":"jayashrig158","count":5},{"name":"Jörg Herzinger","email":"joerg.herzinger+rbi@bytesource.net","login":null,"count":4},{"name":"Yvonne Lam","email":"yvonne@chef.io","login":null,"count":4},{"name":"dependabot-preview[bot]","email":"27856297+dependabot-preview[bot]","login":"dependabot-preview[bot]","count":3},{"name":"Swati Keshari","email":"skeshari@msystechnologies.com","login":"skeshari12","count":3},{"name":"Jeff Fairley","email":"jfairley@levelsbeyond.com","login":null,"count":2},{"name":"Dylan Lacey","email":"github@dylanlacey.com","login":"DylanLacey","count":2},{"name":"Jonathan Niesen","email":"jon.neisen@gmail.com","login":null,"count":2},{"name":"Ryan Hass","email":"rhass@chef.io","login":null,"count":1},{"name":"Patrick Wright","email":"patrick@getchef.com","login":null,"count":1},{"name":"Matt Bajor","email":"mbajor@rallydev.com","login":null,"count":1},{"name":"Martin Mosegaard Amdisen","email":"martin.amdisen@praqma.com","login":null,"count":1},{"name":"Ben Jansen","email":"bjansen@tripwire.com","login":null,"count":1},{"name":"Addison Payden","email":"acpppf@mail.missouri.edu","login":null,"count":1},{"name":"cgunasree08","email":"Chintha.Gunasree@progress.com","login":"cgunasree08","count":1},{"name":"chef-expeditor[bot]","email":"49165653+chef-expeditor[bot]","login":"chef-expeditor[bot]","count":1},{"name":"curiositycasualty","email":"isa@getchef.com","login":null,"count":1},{"name":"Vadim Zaytsev","email":"vadzay@gmail.com","login":"vadzay","count":1},{"name":"Tom Duffield","email":"tom@chef.io","login":"tduffield","count":1},{"name":"Orgad Shaneh","email":"orgads@gmail.com","login":"orgads","count":1},{"name":"Nandan Hegde","email":"220186393+nandanhegde73","login":"nandanhegde73","count":1},{"name":"Matt Dainty","email":"matt@bodgit-n-scarper.com","login":"bodgit","count":1},{"name":"Antonio Beyah","email":"antoniobeyah@gmail.com","login":"antoniobeyah","count":1},{"name":"Dave Bell","email":"dave.bell@hubblehome.com","login":"dbell-hubble","count":1},{"name":"Eric Helgeson","email":"erichelgeson@gmail.com","login":"erichelgeson","count":1},{"name":"John LaBarge","email":"johnlabarge@gmail.com","login":"johnlabarge","count":1},{"name":"Joseph Rivera","email":"jrivera@vistaprint.com","login":"PrototypeGoneProd","count":1},{"name":"Josh Gitlin","email":"jgitlin@pinnacle21.com","login":"jgitlin-p21","count":1}],"past_year_committers":[{"name":"cgunasree08","email":"Chintha.Gunasree@progress.com","login":"cgunasree08","count":1},{"name":"Nandan Hegde","email":"220186393+nandanhegde73","login":"nandanhegde73","count":1}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/chef%2Fartifactory-client/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-30T00:00:07.427Z","repositories_count":6223650,"commits_count":899978483,"contributors_count":34901312,"owners_count":1147619,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"chef/artifactory-client","html_url":"https://github.com/chef/artifactory-client","last_synced_at":"2026-04-24T14:00:27.065Z","status":"error","issues_count":31,"pull_requests_count":86,"avg_time_to_close_issue":28578023.23529412,"avg_time_to_close_pull_request":6380640.5,"issues_closed_count":17,"pull_requests_closed_count":68,"pull_request_authors_count":30,"issue_authors_count":28,"avg_comments_per_issue":1.0,"avg_comments_per_pull_request":1.0813953488372092,"merged_pull_requests_count":38,"bot_issues_count":0,"bot_pull_requests_count":33,"past_year_issues_count":0,"past_year_pull_requests_count":4,"past_year_avg_time_to_close_issue":null,"past_year_avg_time_to_close_pull_request":11789512.0,"past_year_issues_closed_count":0,"past_year_pull_requests_closed_count":2,"past_year_pull_request_authors_count":3,"past_year_issue_authors_count":0,"past_year_avg_comments_per_issue":null,"past_year_avg_comments_per_pull_request":0.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":2,"created_at":"2023-05-12T07:51:31.372Z","updated_at":"2026-04-24T14:00:27.065Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/chef%2Fartifactory-client","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/chef%2Fartifactory-client/issues","issue_labels_count":{"Status: Untriaged":8,"Type: Bug":4,"Type: Enhancement":1},"pull_request_labels_count":{"dependencies":33,"Expeditor: Skip All":6,"oss-standards":4},"issue_author_associations_count":{"NONE":23,"CONTRIBUTOR":8},"pull_request_author_associations_count":{"CONTRIBUTOR":43,"NONE":42,"COLLABORATOR":1},"issue_authors":{"jgitlin-p21":2,"bergholdt":2,"xbeta":2,"apayden-mylo":1,"yzl":1,"sethvargo":1,"bodgit":1,"jmccure":1,"ralian":1,"i-takuya":1,"tnaroska":1,"crmckenzie":1,"alan-schwarzenberger":1,"gVien":1,"ebranecky":1,"jniesen":1,"gerry-c-wd":1,"cowboy-cod3r":1,"mblythe86":1,"Yvangelist01":1,"matt-rean":1,"kedean":1,"russroy":1,"aae42":1,"joemillerr":1,"xrlin":1,"dolan":1,"antoniobeyah":1},"pull_request_authors":{"dependabot[bot]":24,"tas50":13,"dependabot-preview[bot]":9,"schisamo":6,"cgunasree08":2,"jgitlin-p21":2,"mblythe86":2,"bergholdt":2,"tpowell-progress":2,"skeshari12":2,"ralian":2,"apayden-mylo":2,"aae42":1,"antoniobeyah":1,"joerg":1,"jasonwbarnett":1,"jayashrig158":1,"vadzay":1,"clintoncwolfe":1,"Fs00":1,"johnlabarge":1,"tduffield":1,"e-gris":1,"jniesen":1,"bodgit":1,"nandanhegde73":1,"orgads":1,"snowman78":1,"rreyes":1,"xrlin":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-30T00:00:06.639Z","repositories_count":14451099,"issues_count":34192146,"pull_requests_count":112144725,"authors_count":11249630,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{},"past_year_pull_request_labels_count":{"oss-standards":4,"Expeditor: Skip All":3},"past_year_issue_author_associations_count":{},"past_year_pull_request_author_associations_count":{"CONTRIBUTOR":2,"NONE":2},"past_year_issue_authors":{},"past_year_pull_request_authors":{"cgunasree08":2,"clintoncwolfe":1,"nandanhegde73":1},"maintainers":[{"login":"tpowell-progress","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/tpowell-progress"}],"active_maintainers":[]},"events":{"total":{"PullRequestEvent":2,"ForkEvent":2,"IssuesEvent":1,"IssueCommentEvent":1,"PushEvent":1,"PullRequestReviewCommentEvent":1,"PullRequestReviewEvent":1,"CreateEvent":2},"last_year":{"PushEvent":1,"CreateEvent":2}},"keywords":[],"dependencies":[{"ecosystem":"rubygems","filepath":"Gemfile","sha":null,"kind":"manifest","created_at":"2022-08-29T00:50:59.928Z","updated_at":"2022-08-29T00:50:59.928Z","repository_link":"https://github.com/chef/artifactory-client/blob/main/Gemfile","dependencies":[{"id":3078297025,"package_name":"chefstyle","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false},{"id":3078297026,"package_name":"sinatra","ecosystem":"rubygems","requirements":"~\u003e 1.4","direct":true,"kind":"development","optional":false},{"id":3078297027,"package_name":"rspec","ecosystem":"rubygems","requirements":"~\u003e 3.0","direct":true,"kind":"development","optional":false},{"id":3078297028,"package_name":"webmock","ecosystem":"rubygems","requirements":"~\u003e 3.7","direct":true,"kind":"development","optional":false},{"id":3078297029,"package_name":"rspec-mocks","ecosystem":"rubygems","requirements":"= 3.9.0","direct":true,"kind":"development","optional":false},{"id":3078297030,"package_name":"simplecov","ecosystem":"rubygems","requirements":"~\u003e 0.18.5","direct":true,"kind":"development","optional":false},{"id":3078297031,"package_name":"simplecov-console","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false},{"id":3078297032,"package_name":"rake","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false},{"id":3078297033,"package_name":"parallel","ecosystem":"rubygems","requirements":"~\u003e 1.20.1","direct":true,"kind":"development","optional":false},{"id":3078297034,"package_name":"rubocop-ast","ecosystem":"rubygems","requirements":"= 1.4.1","direct":true,"kind":"development","optional":false},{"id":3078297035,"package_name":"docile","ecosystem":"rubygems","requirements":"= 1.3.5","direct":true,"kind":"development","optional":false}]},{"ecosystem":"rubygems","filepath":"artifactory.gemspec","sha":null,"kind":"manifest","created_at":"2024-03-04T16:15:41.346Z","updated_at":"2024-03-04T16:15:41.346Z","repository_link":"https://github.com/chef/artifactory-client/blob/main/artifactory.gemspec","dependencies":[]}],"score":8.218247926685745,"created_at":"2024-12-15T21:38:07.351Z","updated_at":"2026-04-30T17:00:23.114Z","avatar_url":"https://github.com/chef.png","language":"Ruby","monthly_downloads":0,"readme":"# Artifactory Client\n\n[![Build status](https://badge.buildkite.com/a5156457906e25cbde53c408598d233a202c675c670f4c768d.svg?branch=master)](https://buildkite.com/chef-oss/chef-artifactory-client-master-verify)\n[![Gem Version](http://img.shields.io/gem/v/artifactory.svg)][gem]\n\nA Ruby client and interface to the Artifactory API. **The majority of API endpoints are only exposed for Artifactory Pro customers!** As such, many of the resources and actions exposed by this gem also require Artifactory Pro.\n\nThe Artifactory gem offers a convienent interface for managing various parts of the Artifactory API. It is not a complete API implementation, and should still be considered a work in progress.\n\nQuick start\n-----------\nInstall via Rubygems:\n\n    $ gem install artifactory\n\nor add it to your Gemfile if you're using Bundler:\n\n```ruby\ngem 'artifactory', '~\u003e 3.0.5'\n```\n\nIn your library or project, you wil likely want to include the `Artifactory::Resource` namespace:\n\n```ruby\ninclude Artifactory::Resource\n```\n\nThis will given you \"Rails-like\" access to the top-level Artifactory resources like:\n\n```ruby\nSystem.info\nRepository.all\n```\n\nIf you choose not to include the module (for namespacing reasons), you will need to specify the full module path to access resources:\n\n```ruby\nArtifactory::Resource::System.info\nArtifactory::Resource::Repository.all\n```\n\n### Create a connection\nBefore you can make a request, you must give Artifactory your connection information.\n\n```ruby\nArtifactory.configure do |config|\n  # The endpoint for the Artifactory server. If you are running the \"default\"\n  # Artifactory installation using tomcat, don't forget to include the\n  # +/artifactoy+ part of the URL.\n  config.endpoint = 'https://my.storage.server/artifactory'\n\n  # The basic authentication information. Since this uses HTTP Basic Auth, it\n  # is highly recommended that you run Artifactory over SSL.\n  config.username = 'admin'\n  config.password = 'password'\n\n  # You can also use an API key for authentication, username and password\n  # take precedence so leave them off if you are using an API key.\n  config.api_key = 'XXXXXXXXXXXXXXXXXX'\n\n  # Speaking of SSL, you can specify the path to a pem file with your custom\n  # certificates and the gem will wire it all up for you (NOTE: it must be a\n  # valid PEM file).\n  config.ssl_pem_file = '/path/to/my.pem'\n\n  # Or if you are feelying frisky, you can always disable SSL verification\n  config.ssl_verify = false\n\n  # You can specify any proxy information, including any authentication\n  # information in the URL.\n  config.proxy_username = 'user'\n  config.proxy_password = 'password'\n  config.proxy_address  = 'my.proxy.server'\n  config.proxy_port     = '8080'\nend\n```\n\nAll of these parameters are also configurable via the top-level `Artifactory` object. For example:\n\n```ruby\nArtifactory.endpoint = '...'\n```\n\nOr, if you want to be really Unixy, these parameters are all configurable via environment variables:\n\n```bash\n# Artifactory will use these values for the defaults\nexport ARTIFACTORY_ENDPOINT=http://my.storage.server/artifactory\nexport ARTIFACTORY_USERNAME=admin\nexport ARTIFACTORY_PASSWORD=password\nexport ARTIFACTORY_API_KEY=XXXXXXXXXXXXXXXXXX\nexport ARTIFACTORY_SSL_PEM_FILE=/path/to/my.pem\n```\n\nYou can also create a full `Client` object with hash parameters:\n\n```ruby\nclient = Artifactory::Client.new(endpoint: '...', username: '...')\n```\n\n### Making requests\nThe Artifactory gem attempts to make the Artifactory API as object-oriented and Ruby-like as possible. All of the methods and API calls are heavily documented with examples inline using YARD. In order to keep the examples versioned with the code, the README only lists a few examples for using the Artifactory gem. Please see the inline documentation for the full API documentation. The tests in the 'spec' directory are an additional source of examples.\n\n#### Artifacts\n```ruby\n# Upload an artifact to a repository whose key is 'repo_key'\nartifact.upload('/local/path/to/file', 'repo_key', param_1: 'foo')\n\n# Search for an artifact by name\nartifact = Artifact.search(name: 'package.deb').first\nartifact #=\u003e \"#\u003cArtifactory::Resource::Artifact md5: 'ABCD1234'\u003e\"\n\n# Get the properties of an artifact\nartifact.md5 #=\u003e \"ABCD1234\"\nartifact.properties #=\u003e { ... }\n# Set the properties of an artifact\nartifact.properties({prop1: 'value1', 'prop2': 'value2'}) #=\u003e { ... }\n\n# Download the artifact to disk\nartifact.download #=\u003e /tmp/folders-a38b0decf038201/package.deb\nartifact.download('~/Desktop', filename: 'software.deb') #=\u003e /Users/you/Desktop/software.deb\n\n# Delete the artifact from the Artifactory server\nartifact.delete #=\u003e true\n```\n\n#### Builds\n```ruby\n# Show all components\nBuildComponent.all #=\u003e [#\u003cBuildComponent ...\u003e]\n\n# Show all builds for a components\nBuild.all('wicket') #=\u003e [#\u003cBuild ...\u003e]\n\n# Find a build component by name\ncomponent = BuildComponent.find('wicket')\n\n# Delete some builds for a component\ncomponent.delete(build_numbers: %w( 51 52)) #=\u003e true\n\n# Delete all builds for a component\ncomponent.delete(delete_all: true) #=\u003e true\n\n# Delete a component and all of its associated data (including artifacts)\ncomponent.delete(artifacts: true, delete_all: true) #=\u003e true\n\n# Get a list of all buld records for a component\ncomponent.builds #=\u003e #=\u003e [#\u003cArtifactory::Resource::Build ...\u003e, ...]\n\n# Create a new build record\nbuild = Build.new(name: 'fricket', number: '51', properties: {...}, modules: [...])\nbuild.save\n\n# Find a build\nbuild = Build.find('wicket', '51')\n\n# Promote a build\nbuild.promote('libs-release-local', status: 'staged', comment: 'Tested on all target platforms.')\n```\n\n#### Plugins\n```ruby\n# Show all plugins\nPlugin.all #=\u003e [#\u003cPlugin ...\u003e]\n```\n\n#### Repository\n```ruby\n# Find a repository by name\nrepo = Repository.find(name: 'libs-release-local')\nrepo #=\u003e #\u003cArtifactory::Resource::Repository ...\u003e\n\n# Get information about the repository\nrepo.description =\u003e \"The default storage mechanism for...\"\n\n# Change the repository\nrepo.description = \"This is a new description\"\nrepo.save\n\n# Upload an artifact to the repo\nrepo.upload('/local/path/to/file', param_1: 'foo', param_2: 'bar')\n\n# Get a list of artifacts in this repository\nrepo.artifacts #=\u003e [#\u003cArtifactory::Resource::Artifact ...\u003e, ...]\n```\n\n#### System\n```ruby\n# Get the system information\nSystem.info #=\u003e \"...\"\n\n# See if artifactory is running\nSystem.ping #=\u003e true\n\n# Get the Artifactory server version and other information\nSystem.version #=\u003e { ... }\n```\n\n#### Raw requests\nIf there's a specific endpoint or path you need to hit that is not implemented by this gem, you can execute a \"raw\" request:\n\n```ruby\n# Using the top-level Artifactory module\nArtifactory.get('/some/special/path', param_1: 'foo', param_2: 'bar')\n\n# Using an Artifactory::Client object\nclient.get('/some/special/path', param_1: 'foo', param_2: 'bar')\n```\n\nFor more information on the methods available, please see the [`Artifactory::Client` class](https://github.com/opscode/artifactory-client/blob/master/lib/artifactory/client.rb).\n\n### Threadsafety\nIf you plan to use the Artifactory gem in a library, you should be aware that _certain_ pathways for accessing resources are **not** threadsafe. In order to deliver a \"Rails-like\" experience, accessing a resource without a client object uses a global shared state. Other threads may modify this state, and therefore we do **not** recommend using the Rails-like approach if you are concerned about threadsafety. The following code snippet may better explain the differences:\n\n```ruby\n# In our current thread...\nArtifactory.endpoint = 'http://foo.com/artifactory'\n\n# Meanwhile, in another thread...\nThread.new do\n  Artifactory.endpoint = 'http://bar.com/artifactory'\nend\n\n# You have a 50/50 chance of which endpoint is used, depending on the order in\n# which the threads execute on the CPU.\nArtifactory.endpoint #=\u003e 'http://foo.com/artifactory'\nArtifactory.endpoint #=\u003e 'http://bar.com/artifactory'\n```\n\nTo avoid this potential headache, the Artifactory gem offers a less Rails-like API in which the `Artifactory::Client` object becomes the pivot for all resources. First, you must create a client object (you cannot use the global namespace):\n\n```ruby\nclient = Artifactory::Client.new(endpoint: 'http://foo.com/artifactory')\n```\n\nAnd then execute all requests using this client object, with the general pattern `resource_method`:\n\n```ruby\n# Search for artifacts\nclient.artifact_search(name: '...') #=\u003e [...]\n\n# Get all plugins\nclient.all_plugins #=\u003e [...]\n```\n\nThis pattern is slightly less eye-appealing, but it will ensure that your code is threadsafe.\n\nDevelopment\n-----------\n1. Clone the project on GitHub\n2. Create a feature branch\n3. Submit a Pull Request\n\nArtifactory uses a built-in Sinatra server that \"acts like\" a real Artifactory Pro server. Since we cannot bundle a full Artifactory Pro server with the gem, we have re-implemented various pieces of their API. If you are writing a feature that accesses a new endpoint, you will likely need to add that endpoint to the vendored Sinatra app, using the [API documentation for Artifactory](http://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API).\n\nImportant Notes:\n\n- **All new features must include test coverage.** At a bare minimum, Unit tests are required. It is preferred if you include acceptance tests as well.\n- **The tests must be be idempotent.** The HTTP calls made during a test should be able to be run over and over.\n- **Tests are order independent.** The default RSpec configuration randomizes the test order, so this should not be a problem.\n\n## Maintainer\n\nThis project is maintained by Chef's Release Engineering Team (releng@chef.io).\n\n## License\n\n```text\nCopyright 2013-2019 Chef Software, Inc.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```\n\n[gem]: https://rubygems.org/gems/artifactory\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["chef","cfgmgt","deployment","configuration-management","discovery","ohai"],"project_url":"https://ruby.ecosyste.ms/api/v1/projects/228","html_url":"https://ruby.ecosyste.ms/projects/228"}