artifactory 2.7.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 36a57d1a8d8f2897585a0e123efbc5fd0b179577
4
- data.tar.gz: 7b9b819091f946ef7be601b36a87b0dd126199da
3
+ metadata.gz: 25479b749ea49c38799479ba12df5373efdf77a0
4
+ data.tar.gz: 52732e8ba49c9b1e29ad2180aa1e4ff8175d1798
5
5
  SHA512:
6
- metadata.gz: cef02ee8889eea9693ac3442f1c3922acd6d99da9aa40438e452902fe1cc62fa4d3ddea91f096b81c647ddf5c63b14ee03eb79a4485a998760bedc878b16563f
7
- data.tar.gz: d227fd12f179a45d6bd934418a90c3a3f0465f3e0de6c3a0cc694d96f71a0bdf93a9f8b681ba3b2ae3c3c1e6dd81cc9e2faffea4a7460e51d51566e173fe0b67
6
+ metadata.gz: e111db3109a4598677fd2ba3b1cbe7d5cb26c087e43690c06ca97cc3ced0b0fc776e1736dfadf87ee5d8683ba1d6a369dbd0c416ae27055d41dfa0ca69d58c6f
7
+ data.tar.gz: c76f8078e1829439fb4673a284842c954d8aa859b9ac16cad3535f508f568309c196e587df1d43946bcc1725e97211c5460d0797bd27717054124687ff4449f2
@@ -3,6 +3,10 @@ Artifactory Client CHANGELOG
3
3
  This file is used to document the changes between releases of the Artifactory
4
4
  Ruby client.
5
5
 
6
+ v2.8.0 (03-17-2017)
7
+ -------------------
8
+ - Include statuses in Build resource
9
+
6
10
  v2.7.0 (02-21-2017)
7
11
  -------------------
8
12
  - Include statuses in Build resource
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  Artifactory Client
2
2
  ==================
3
- [![Gem Version](http://img.shields.io/gem/v/artifactory.svg)][gem] [![Travis Build Status](http://img.shields.io/travis/chef/artifactory-client.svg?label=Travis CI)][travis] [![AppVeyor Build Status](http://img.shields.io/appveyor/ci/chef/artifactory-client.svg?label=AppVeyor)][appveyor]
3
+ [![Gem Version](http://img.shields.io/gem/v/artifactory.svg)][gem] [![Travis Build Status](http://img.shields.io/travis/chef/artifactory-client.svg?label=Travis%20CI)][travis] [![AppVeyor Build Status](http://img.shields.io/appveyor/ci/chef/artifactory-client.svg?label=AppVeyor)][appveyor]
4
4
 
5
5
  A 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.
6
6
 
@@ -115,6 +115,8 @@ artifact #=> "#<Artifactory::Resource::Artifact md5: 'ABCD1234'>"
115
115
  # Get the properties of an artifact
116
116
  artifact.md5 #=> "ABCD1234"
117
117
  artifact.properties #=> { ... }
118
+ # Set the properties of an artifact
119
+ artifact.properties({prop1: 'value1', 'prop2': 'value2'}) #=> { ... }
118
120
 
119
121
  # Download the artifact to disk
120
122
  artifact.download #=> /tmp/folders-a38b0decf038201/package.deb
@@ -430,16 +430,27 @@ module Artifactory
430
430
  end
431
431
 
432
432
  #
433
- # The list of properties for this object.
433
+ # Set properties for this object. If no properties are given it lists the properties for this object.
434
434
  #
435
435
  # @example List all properties for an artifact
436
- # artifact.properties #=> { 'artifactory.licenses'=>['Apache-2.0'] }
436
+ # artifact.properties #=> { 'licenses'=>['Apache-2.0'] }
437
+ #
438
+ # @example Set new properties for an artifact
439
+ # artifact.properties(maintainer: 'SuperStartup01') #=> { 'licenses'=>['Apache-2.0'], 'maintainer'=>'SuperStartup01' }
440
+ #
441
+ # @param [Hash<String, Object>] props (default: +nil+)
442
+ # A hash of properties and corresponding values to set for the artifact
437
443
  #
438
444
  # @return [Hash<String, Object>]
439
445
  # the list of properties
440
446
  #
441
- def properties
442
- @properties ||= client.get(File.join("/api/storage", relative_path), properties: nil)["properties"]
447
+ def properties(props = nil)
448
+ if props.nil? || props.empty?
449
+ get_properties
450
+ else
451
+ set_properties(props)
452
+ get_properties(true)
453
+ end
443
454
  end
444
455
 
445
456
  #
@@ -619,6 +630,45 @@ module Artifactory
619
630
 
620
631
  private
621
632
 
633
+ #
634
+ # Helper method for reading artifact properties
635
+ #
636
+ # @example List all properties for an artifact
637
+ # artifact.get_properties #=> { 'artifactory.licenses'=>['Apache-2.0'] }
638
+ #
639
+ # @param [TrueClass, FalseClass] refresh_cache (default: +false+)
640
+ # wether or not to use the locally cached value if it exists and is not nil
641
+ #
642
+ # @return [Hash<String, Object>]
643
+ # the list of properties
644
+ #
645
+ def get_properties(refresh_cache = false)
646
+ if refresh_cache || @properties.nil?
647
+ @properties = client.get(File.join("/api/storage", relative_path), properties: nil)["properties"]
648
+ end
649
+
650
+ @properties
651
+ end
652
+
653
+ #
654
+ # Helper method for setting artifact properties
655
+ #
656
+ # @example Set properties for an artifact
657
+ # artifact.set_properties({ prop1: 'value1', 'prop2' => 'value2' })
658
+ #
659
+ # @param [Hash<String, Object>] properties
660
+ # A hash of properties and corresponding values to set for the artifact
661
+ #
662
+ # @return [Hash]
663
+ # the parsed JSON response from the server
664
+ #
665
+ def set_properties(properties)
666
+ matrix = to_matrix_properties(properties)
667
+ endpoint = File.join("/api/storage", relative_path) + "?properties=#{matrix}"
668
+
669
+ client.put(endpoint, nil)
670
+ end
671
+
622
672
  #
623
673
  # Helper method for extracting the relative (repo) path, since it's not
624
674
  # returned as part of the API.
@@ -15,5 +15,5 @@
15
15
  #
16
16
 
17
17
  module Artifactory
18
- VERSION = "2.7.0"
18
+ VERSION = "2.8.0"
19
19
  end
@@ -32,6 +32,20 @@ module Artifactory
32
32
  end
33
33
  end
34
34
 
35
+ describe ".properties" do
36
+ let(:artifact) do
37
+ artifact = described_class.send(:search, repos: "libs-properties-local", name: "artifact.deb").first
38
+ end
39
+
40
+ it "returns artifact properties when reading" do
41
+ expect(artifact.properties).to include({ "licenses" => [ "Apache 2" ] })
42
+ end
43
+
44
+ it "writes artifact properties" do
45
+ expect(artifact.properties({ author: "Jörg", "status" => "public" })).to eq({ "licenses" => [ "Apache 2" ], "author" => "Jörg", "status" => "public" })
46
+ end
47
+ end
48
+
35
49
  describe ".search" do
36
50
  it_behaves_like "an artifact search endpoint", :search, name: "artifact.deb"
37
51
  end
@@ -1,6 +1,8 @@
1
1
  module Artifactory
2
2
  module APIServer::ArtifactEndpoints
3
3
  def self.registered(app)
4
+ artifact_properties = { "licenses" => [ "Apache 2" ] }
5
+
4
6
  app.get("/api/search/artifact") do
5
7
  content_type "application/vnd.org.jfrog.artifactory.search.ArtifactSearchResult+json"
6
8
  artifacts_for_conditions do
@@ -86,6 +88,22 @@ module Artifactory
86
88
  )
87
89
  end
88
90
 
91
+ app.get("/api/storage/libs-properties-local/org/acme/artifact.deb") do
92
+ content_type "application/vnd.org.jfrog.artifactory.storage.ItemProperties+json"
93
+ JSON.fast_generate(
94
+ "properties" => artifact_properties,
95
+ "uri" => server_url.join("/api/storage/libs-properties-local/org/acme/artifact.deb")
96
+ )
97
+ end
98
+
99
+ app.put("/api/storage/libs-properties-local/org/acme/artifact.deb") do
100
+ props = params["properties"].split(";").reject(&:empty?).map { |e| e.split("=") }.to_h
101
+ artifact_properties.merge!(props)
102
+
103
+ status 204
104
+ body ""
105
+ end
106
+
89
107
  app.get("/api/storage/ext-release-local/org/acme/artifact.deb") do
90
108
  content_type "application/vnd.org.jfrog.artifactory.storage.FileInfo+json"
91
109
  JSON.fast_generate(
@@ -145,6 +163,12 @@ module Artifactory
145
163
  { "uri" => server_url.join("/api/storage/libs-release-local/org/acme/artifact.deb") },
146
164
  ]
147
165
  )
166
+ elsif params["repos"] == "libs-properties-local"
167
+ JSON.fast_generate(
168
+ "results" => [
169
+ { "uri" => server_url.join("/api/storage/libs-properties-local/org/acme/artifact.deb") },
170
+ ]
171
+ )
148
172
  else
149
173
  JSON.fast_generate(
150
174
  "results" => [
@@ -482,10 +482,15 @@ module Artifactory
482
482
  let(:response) do
483
483
  { "properties" => properties }
484
484
  end
485
+
485
486
  let(:client) { double(get: response) }
486
487
  let(:relative_path) { "/api/storage/some-repo/path/artifact.deb" }
487
488
  let(:artifact_uri) { File.join("http://33.33.33.11", relative_path) }
488
489
 
490
+ let(:property_set_path) { "#{relative_path}?properties=;author=J%C3%B6rg;status=public" }
491
+ let(:new_properties) { { author: "Jörg", "status" => "public" } }
492
+ let(:client) { double(put: nil ) }
493
+
489
494
  before do
490
495
  subject.client = client
491
496
  subject.uri = artifact_uri
@@ -500,6 +505,16 @@ module Artifactory
500
505
  subject.properties
501
506
  expect(subject.instance_variable_get(:@properties)).to eq(properties)
502
507
  end
508
+
509
+ it "sets the properties on the server" do
510
+ expect(client).to receive(:put).with(property_set_path, nil).once
511
+ subject.properties(new_properties)
512
+ end
513
+
514
+ it "updates the chache" do
515
+ expect(subject).to receive(:get_properties).with(true).once
516
+ subject.properties(new_properties)
517
+ end
503
518
  end
504
519
 
505
520
  describe "#compliance" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: artifactory
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.0
4
+ version: 2.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Seth Vargo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-21 00:00:00.000000000 Z
11
+ date: 2017-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler