itunes_store_transporter 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f7127018124d73b10742187cbd8ca283b2d70fe6
4
- data.tar.gz: 9967d8bab13f0c965e383522491227cf7bfac5e6
3
+ metadata.gz: 603cbf0b2fe54965a1fcd25315fc2434f9987188
4
+ data.tar.gz: 4c197138304f80f540f508c8a8f09910532ceef6
5
5
  SHA512:
6
- metadata.gz: edef7e176540218a6b572e27c8f1a23dba40f51e2fbc7cc637f00db563033293fd38ad957957d386e08acdce8c14960078493fc85e4c89a7522e811d9a4972a3
7
- data.tar.gz: caac988d22b3d8dc46ba05d7692c86eeb97790bda4f546a7f0562eeaec897f6746341e0e6e3cbb56fff046331e6da26256045cb0ff072edd4f927f5d2a1678e3
6
+ metadata.gz: 57b4de9c4cc1571829c9151ec91e8b0773d094299454252ff40d348faed32100d65e242a1dcd322c014347d4167e5c9a3f93a6373e3ba7f7e8578d1ebda769af
7
+ data.tar.gz: 812887659a510890d27f5e4a497b96463dca4ffe371e281e9be9b50a613e0bff3d2cd4a2df53eae8b82bd395ec4990f5240a6639b22b986efe58d975fb829809
data/Changes CHANGED
@@ -1,3 +1,8 @@
1
+ v0.1.3 2015-03-31
2
+ --------------------
3
+ Enhancements:
4
+ * Add the :batch option to support batch operations (thanks to press9 media solutions berlin - press9.de)
5
+
1
6
  v0.1.2 2015-03-07
2
7
  --------------------
3
8
  Changes:
@@ -1,7 +1,7 @@
1
1
  = iTunes::Store::Transporter
2
2
 
3
- {<img src="https://secure.travis-ci.org/sshaw/itunes_store_transporter.png"/>}[http://travis-ci.org/sshaw/itunes_store_transporter]
4
- {<img src="https://codeclimate.com/github/sshaw/itunes_store_transporter.png" />}[https://codeclimate.com/github/sshaw/itunes_store_transporter]
3
+ {<img src="https://secure.travis-ci.org/sshaw/itunes_store_transporter.svg"/>}[http://travis-ci.org/sshaw/itunes_store_transporter]
4
+ {<img src="https://codeclimate.com/github/sshaw/itunes_store_transporter.svg" />}[https://codeclimate.com/github/sshaw/itunes_store_transporter]
5
5
 
6
6
  Upload and manage your assets in the iTunes Store using the iTunes Store's Transporter (+iTMSTransporter+).
7
7
 
@@ -9,6 +9,7 @@ require "itunes/store/transporter/command/version"
9
9
 
10
10
  module ITunes
11
11
  module Store
12
+ # See ITunes::Store::Transporter::ITMSTransporter
12
13
  module Transporter
13
14
  def self.new(options = nil)
14
15
  ITMSTransporter.new(options)
@@ -43,6 +43,7 @@ module ITunes
43
43
  end
44
44
 
45
45
  protected
46
+
46
47
  attr :config
47
48
  attr :default_options
48
49
 
@@ -86,6 +87,8 @@ module ITunes
86
87
  options.on *SHORTNAME
87
88
  end
88
89
 
90
+ protected
91
+
89
92
  def create_transporter_options(optz)
90
93
  optz[:mode] = mode
91
94
  super
@@ -96,6 +99,41 @@ module ITunes
96
99
  end
97
100
  end
98
101
 
102
+ class BatchMode < Mode
103
+ BatchOption = Optout::Option.create(:package, "-f", :required => true, :validator => Optout::Dir.exists)
104
+ PackageOption = Optout::Option.create(:package, "-f", :required => true, :validator => Optout::Dir.exists.named(/\.itmsp\z/))
105
+
106
+ protected
107
+
108
+ def create_transporter_options(optz)
109
+ batch = optz.delete(:batch)
110
+ package = optz.delete(:package)
111
+
112
+ argv = super
113
+
114
+ klass = if batch == true
115
+ BatchOption
116
+ else
117
+ if package !~ /\.itmsp\z/
118
+ warn "WARNING: In version 0.3.0 directories without an itmsp extension be treated as a batch upload. " \
119
+ "This will result in the processing of all child directories with an itmsp extension. " \
120
+ "To prevent this behavior in 0.3.0 you must set the :batch option to false"
121
+ end
122
+
123
+ PackageOption
124
+ end
125
+
126
+ opt = klass.new(package)
127
+
128
+ begin
129
+ opt.validate!
130
+ rescue Optout::OptionError => e
131
+ raise OptionError, e.message
132
+ end
133
+
134
+ argv.concat(opt.to_a)
135
+ end
136
+ end
99
137
  end
100
138
  end
101
139
  end
@@ -9,12 +9,12 @@ module ITunes
9
9
  module Command
10
10
 
11
11
  ##
12
- # Retrieve the metadata for a previously delivered package.
12
+ # Retrieve the metadata for a previously delivered package.
13
13
  #
14
14
  class Lookup < Mode
15
15
  def initialize(*config)
16
16
  super
17
- # These 2 are mutually exclusive, and one is required.
17
+ # These 2 are mutually exclusive, and one is required.
18
18
  # Optout has no way to denote this
19
19
  options.on *VENDOR_ID
20
20
  options.on *APPLE_ID
@@ -23,12 +23,13 @@ module ITunes
23
23
 
24
24
  def run(options = {})
25
25
  options[:destination] = Dir.mktmpdir
26
- super
26
+ super
27
27
  ensure
28
28
  FileUtils.rm_rf(options[:destination]) if options[:destination]
29
29
  end
30
30
 
31
31
  protected
32
+
32
33
  def handle_success(stdout_lines, stderr_lines, options)
33
34
  id = options[:apple_id] || options[:vendor_id]
34
35
  path = File.join(options[:destination], "#{id}.itmsp", "metadata.xml")
@@ -37,8 +38,8 @@ module ITunes
37
38
  raise TransporterError, "No metadata file exists at #{path}"
38
39
  end
39
40
 
40
- begin
41
- metadata = File.read(path)
41
+ begin
42
+ metadata = File.read(path)
42
43
  rescue StandardError => e
43
44
  raise TransporterError, "Failed to read metadata file #{path}: #{e}"
44
45
  end
@@ -11,9 +11,8 @@ module ITunes
11
11
  SHORTNAME = [ :shortname, "-s", /\w/ ]
12
12
  TRANSPORT = [ :transport, "-t", %w|Aspera Signiant DAV| ]
13
13
  SUCCESS = [ :success, "-success", Optout::Dir.exists ]
14
- FAILURE = [ :failure, "-failure", Optout::Dir.exists ]
15
- PACKAGE = [ :package, "-f", Optout::Dir.exists.named(/\.itmsp\z/), { :required => true } ]
16
- DESTINATION = [ :destination, "-destination" ]
14
+ FAILURE = [ :failure, "-failure", Optout::Dir.exists ]
15
+ DESTINATION = [ :destination, "-destination" ]
17
16
  end
18
17
  end
19
18
  end
@@ -9,10 +9,9 @@ module ITunes
9
9
  ##
10
10
  # Upload a package to the iTunes Store
11
11
  #
12
- class Upload < Mode
12
+ class Upload < BatchMode
13
13
  def initialize(*config)
14
14
  super
15
- options.on *PACKAGE
16
15
  options.on *TRANSPORT
17
16
  options.on *SUCCESS
18
17
  options.on *FAILURE
@@ -11,11 +11,9 @@ module ITunes
11
11
  ##
12
12
  # Validate the contents of a package's metadata and assets.
13
13
  #
14
-
15
- class Verify < Mode
14
+ class Verify < BatchMode
16
15
  def initialize(*config)
17
16
  super
18
- options.on *PACKAGE
19
17
  options.on :verify_assets, "-disableAssetVerification", Optout::Boolean # If false verify MD only no assets
20
18
  end
21
19
 
@@ -143,6 +143,7 @@ module ITunes
143
143
  # [:delete (Boolean)] Delete the package if the upload succeeds. Defaults to +false+.
144
144
  # [:log_history (String)] Write an +iTMSTransporter+ log to this directory. Off by default.
145
145
  # [:streams (Integer)] Number of data streams to use. Optional, only used with +Signiant+
146
+ # [:batch (Boolean)] Allow batch uploads if +package+ is a regular directory. Optional, defaults to +false+ but <b>will default to +true+ in <code>v0.3.0</code></b>.
146
147
  #
147
148
  # === Errors
148
149
  #
@@ -169,6 +170,7 @@ module ITunes
169
170
  #
170
171
  # === Options
171
172
  #
173
+ # [:batch (Boolean)] Allow batch verification if +package+ is a regular directory. Optional, defaults to +false+ but <b>will default to +true+ in <code>v0.3.0</code></b>.
172
174
  # [:verify_assets (Boolean)] If false the assets will not be verified. Defaults to +true+.
173
175
  #
174
176
  # === Errors
@@ -1,7 +1,7 @@
1
1
  module ITunes
2
2
  module Store
3
3
  module Transporter
4
- VERSION = "0.1.2"
4
+ VERSION = "0.1.3"
5
5
  end
6
6
  end
7
7
  end
@@ -195,6 +195,7 @@ shared_examples_for "a transporter mode" do
195
195
  end
196
196
 
197
197
  shared_examples_for "a command that requires a package argument" do
198
+ # TODO: it_should_behave_like "a transporter option", {:package => "xxx"}, "f", "xxx"
198
199
  it_should_behave_like "a required option", :package
199
200
 
200
201
  context "when a directory" do
@@ -208,16 +209,48 @@ shared_examples_for "a command that requires a package argument" do
208
209
 
209
210
  it "must end in .itmsp" do
210
211
  options = create_options(:package => @tmpdir)
211
- lambda { subject.run(options) }.should raise_error(ITunes::Store::Transporter::OptionError, /must match/i)
212
+ expect { subject.run(options) }.to raise_error(ITunes::Store::Transporter::OptionError, /must match/i)
212
213
 
213
214
  mock_output(:exit => 0)
214
215
  options = create_options(:package => @pkgdir)
215
- lambda { subject.run(options) }.should_not raise_error
216
+ expect { subject.run(options) }.not_to raise_error
216
217
  end
217
218
 
218
219
  it "must exist" do
219
220
  options = create_options(:package => File.join(@tmpdir, "badpkg.itmsp"))
220
- lambda { subject.run(options) }.should raise_error(ITunes::Store::Transporter::OptionError, /does not exist/i)
221
+ expect { subject.run(options) }.to raise_error(ITunes::Store::Transporter::OptionError, /does not exist/i)
222
+ end
223
+
224
+ context "when it does not end in .itmsp" do
225
+ before do
226
+ @realerr = $stderr
227
+ $stderr = StringIO.new
228
+ end
229
+
230
+ after { $stderr = @realerr }
231
+
232
+ it "prints a deprecation warning to stderr" do
233
+ options = create_options(:package => @tmpdir)
234
+ subject.run(options) rescue nil
235
+ expect($stderr.string).to match(/^WARNING:/)
236
+ end
237
+
238
+ context "and :batch is true" do
239
+ before do
240
+ mock_output
241
+ @options = create_options(:package => @tmpdir, :batch => true)
242
+ end
243
+
244
+ it "does not raise an exception" do
245
+ expect { subject.run(@options) }.to_not raise_error
246
+ end
247
+
248
+ it "does not print a deprecation warning to stderr" do
249
+ options = create_options(:package => @tmpdir)
250
+ subject.run(@options)
251
+ expect($stderr.string).not_to match(/^WARNING:/)
252
+ end
253
+ end
221
254
  end
222
255
  end
223
256
 
@@ -10,8 +10,8 @@ shared_examples_for "a transporter method" do
10
10
  :print_stdout => true
11
11
  }
12
12
 
13
- s = stub(command)
14
- s.should_receive(:run)
13
+ s = double(command)
14
+ allow(s).to receive(:run)
15
15
 
16
16
  klass = ITunes::Store::Transporter::Command.const_get(command)
17
17
  klass.should_receive(:new).with(config, defaults).and_return(s)
@@ -20,7 +20,7 @@ shared_examples_for "a transporter method" do
20
20
  end
21
21
  end
22
22
 
23
- shared_examples_for "a transporter method without a package argument" do
23
+ shared_examples_for "a transporter method without a package argument" do
24
24
  it_behaves_like "a transporter method"
25
25
 
26
26
  it "executes the underlying command" do
@@ -29,7 +29,7 @@ shared_examples_for "a transporter method without a package argument" do
29
29
  end
30
30
  end
31
31
 
32
- shared_examples_for "a transporter method with a package argument" do
32
+ shared_examples_for "a transporter method with a package argument" do
33
33
  it_behaves_like "a transporter method"
34
34
 
35
35
  it "executes the underlying command" do
@@ -94,13 +94,13 @@ describe ITunes::Store::Transporter::ITMSTransporter do
94
94
  let(:method) { :verify }
95
95
  let(:command) { "Verify" }
96
96
 
97
- it_behaves_like "a transporter method with a package argument"
97
+ it_behaves_like "a transporter method with a package argument"
98
98
  end
99
99
 
100
100
  describe "#version" do
101
101
  let(:method) { :version }
102
102
  let(:command) { "Version" }
103
103
 
104
- it_behaves_like "a transporter method without a package argument"
104
+ it_behaves_like "a transporter method without a package argument"
105
105
  end
106
106
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itunes_store_transporter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Skye Shaw
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-07 00:00:00.000000000 Z
11
+ date: 2015-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: childprocess
@@ -136,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
136
  version: '0'
137
137
  requirements: []
138
138
  rubyforge_project:
139
- rubygems_version: 2.4.5
139
+ rubygems_version: 2.4.3
140
140
  signing_key:
141
141
  specification_version: 4
142
142
  summary: Upload and manage your assets in the iTunes Store using the iTunes Store's