mortar 0.3.3 → 0.3.4

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.
@@ -129,7 +129,6 @@ module Mortar
129
129
  def self.prepare_run(cmd, args=[])
130
130
  command = parse(cmd)
131
131
 
132
-
133
132
  if args.include?('-h') || args.include?('--help') || args.include?('help')
134
133
  args.unshift(cmd) unless cmd =~ /^-.*/
135
134
  cmd = 'help'
@@ -0,0 +1,100 @@
1
+ #
2
+ # Copyright 2012 Mortar Data Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require "mortar/command/base"
18
+
19
+ # create a reusable fixture.
20
+ #
21
+ class Mortar::Command::Fixtures < Mortar::Command::Base
22
+
23
+ WARNING_NUM_ROWS = 50
24
+
25
+ #fixtures:head [INPUT_URL] [NUM_ROWS] [FIXTURE_NAME]
26
+ #
27
+ #Create a reusable fixture [FIXTURE_NAME] made up of [NUM_ROWS]
28
+ #number of rows from the head of the input file(s) at [INPUT_URL].
29
+ #
30
+ # Examples:
31
+ #
32
+ # $ mortar fixtures:head s3n://tbmmsd/*.tsv.* 100 samll_song_sample
33
+ #
34
+ def head
35
+ input_url = shift_argument
36
+ num_rows = shift_argument
37
+ fixture_name = shift_argument
38
+ unless input_url && num_rows && fixture_name
39
+ error("Usage: mortar fixtures:head INPUT_URL NUM_ROWS FIXTURE_NAME\nMust specifiy INPUT_URL, NUM_ROWS, and FIXTURE_NAME.")
40
+ end
41
+ if does_fixture_exist(fixture_name)
42
+ error("Fixture #{fixture_name} already exists.")
43
+ end
44
+ unless num_rows.to_i < WARNING_NUM_ROWS
45
+ warning("Creating fixtures with more than #{WARNING_NUM_ROWS} rows is not recommended. Large local fixtures may cause slowness when using Mortar.")
46
+ display
47
+ end
48
+ validate_arguments!
49
+ validate_git_based_project!
50
+
51
+ fixture_id = nil
52
+ action("Requesting fixture creation") do
53
+ fixture_id = api.post_fixture_limit(project.name, fixture_name, input_url, num_rows).body['fixture_id']
54
+ end
55
+
56
+ poll_for_fixture_results(fixture_id)
57
+ end
58
+
59
+
60
+
61
+ private
62
+
63
+ def does_fixture_exist(fixture_name)
64
+ fixture_path = File.join(project.fixtures_path, fixture_name)
65
+ File.exists?(fixture_path)
66
+ end
67
+
68
+ def poll_for_fixture_results(fixture_id)
69
+ fixture_result = nil
70
+ display
71
+ ticking(polling_interval) do |ticks|
72
+ fixture_result = api.get_fixture(fixture_id).body
73
+ is_finished =
74
+ Mortar::API::Fixtures::STATUSES_COMPLETE.include?(fixture_result["status_code"])
75
+
76
+ redisplay("Status: %s %s" % [
77
+ fixture_result['status_description'] + (is_finished ? "" : "..."),
78
+ is_finished ? "" : spinner(ticks)],
79
+ is_finished) # only display newline on last message
80
+ if is_finished
81
+ display
82
+ break
83
+ end
84
+ end
85
+
86
+ case fixture_result['status_code']
87
+ when Mortar::API::Fixtures::STATUS_FAILED
88
+ error_message = "Fixture generation failed with #{fixture_result['error_type'] || 'error'}"
89
+ error_context = get_error_message_context(fixture_result['error_message'] || "")
90
+ error_message += ":\n\n#{fixture_result['error_message']}\n\n#{error_context}"
91
+ error(error_message)
92
+ when Mortar::API::Fixtures::STATUS_CREATED
93
+ fixture_result['sample_s3_urls'].each do |u|
94
+ download_to_file(u['url'], "fixtures/#{fixture_result['name']}/#{u['name']}")
95
+ display
96
+ end
97
+ end
98
+ end
99
+
100
+ end
@@ -27,6 +27,7 @@ class Mortar::Command::Illustrate < Mortar::Command::Base
27
27
  #
28
28
  # Illustrate the effects and output of a pigscript.
29
29
  #
30
+ # -s, --skippruning # Don't try to reduce the illustrate results to the smallest size possible.
30
31
  # -p, --parameter NAME=VALUE # Set a pig parameter value in your script.
31
32
  # -f, --param-file PARAMFILE # Load pig parameter values from a file.
32
33
  # --no_browser # Don't open the illustrate results automatically in the browser.
@@ -38,6 +39,7 @@ class Mortar::Command::Illustrate < Mortar::Command::Base
38
39
  def index
39
40
  pigscript_name = shift_argument
40
41
  alias_name = shift_argument
42
+ skip_pruning = options[:skippruning] ||= false
41
43
  unless pigscript_name && alias_name
42
44
  error("Usage: mortar illustrate PIGSCRIPT ALIAS\nMust specify PIGSCRIPT and ALIAS.")
43
45
  end
@@ -48,7 +50,7 @@ class Mortar::Command::Illustrate < Mortar::Command::Base
48
50
 
49
51
  illustrate_id = nil
50
52
  action("Starting illustrate") do
51
- illustrate_id = api.post_illustrate(project.name, pigscript.name, alias_name, git_ref, :parameters => pig_parameters).body["illustrate_id"]
53
+ illustrate_id = api.post_illustrate(project.name, pigscript.name, alias_name, skip_pruning, git_ref, :parameters => pig_parameters).body["illustrate_id"]
52
54
  end
53
55
 
54
56
  illustrate_result = nil
@@ -44,6 +44,12 @@ module Mortar
44
44
  inside "macros" do
45
45
  copy_file "gitkeep", ".gitkeep"
46
46
  end
47
+
48
+ mkdir "fixtures"
49
+
50
+ inside "fixtures" do
51
+ copy_file "gitkeep", ".gitkeep"
52
+ end
47
53
 
48
54
  mkdir "udfs"
49
55
 
@@ -19,6 +19,7 @@
19
19
 
20
20
  require 'fileutils'
21
21
  require "vendor/mortar/okjson"
22
+ require "curb"
22
23
 
23
24
  module Mortar
24
25
  module Helpers
@@ -44,6 +45,13 @@ module Mortar
44
45
  File.open(path, "w"){|f| f.write(str_data)}
45
46
  end
46
47
 
48
+ def download_to_file(url, path, mkdir_p=true)
49
+ c = Curl::Easy.new(url)
50
+ c.on_progress {|dl_total, dl_now, ul_total, ul_now| redisplay("Downloading #{path}: #{dl_now.to_i} of #{dl_total.to_i}"); true }
51
+ c.perform
52
+ write_to_file(c.body_str, path, mkdir_p)
53
+ end
54
+
47
55
  def display(msg="", new_line=true)
48
56
  if new_line
49
57
  puts(msg)
@@ -53,6 +61,16 @@ module Mortar
53
61
  end
54
62
  end
55
63
 
64
+ def warning(msg="", new_line=true)
65
+ message = "WARNING: #{msg}"
66
+ if new_line
67
+ display(message)
68
+ else
69
+ print(msg)
70
+ $stdout.flush
71
+ end
72
+ end
73
+
56
74
  def redisplay(line, line_break = false)
57
75
  display("\r\e[0K#{line}", line_break)
58
76
  end
@@ -340,7 +358,7 @@ module Mortar
340
358
  Mortar::Helpers.error_with_failure = false
341
359
  end
342
360
  $stderr.puts(" ! #{message}.")
343
- $stderr.puts(" ! Search for help at: https://help.mortardata.com")
361
+ $stderr.puts(" ! Search for help at: http://help.mortardata.com")
344
362
  $stderr.puts(" ! Or report a bug at: https://github.com/mortardata/mortar/issues/new")
345
363
  $stderr.puts
346
364
  $stderr.puts(" Error: #{error.message} (#{error.class})")
@@ -65,6 +65,10 @@ module Mortar
65
65
  end
66
66
  path
67
67
  end
68
+
69
+ def fixtures_path
70
+ path = File.join(@root_path, "fixtures")
71
+ end
68
72
  end
69
73
 
70
74
  class ProjectEntity
@@ -4,4 +4,4 @@ Mortar is a platform-as-a-service for Hadoop. With Mortar, you can run jobs on
4
4
 
5
5
  # Getting Started
6
6
 
7
- For help getting started with Mortar, check out the [Mortar Help](http://preview.help.mortardata.com/) site.
7
+ For help getting started with Mortar, check out the [Mortar Help](http://help.mortardata.com/) site.
File without changes
@@ -16,5 +16,5 @@
16
16
 
17
17
  module Mortar
18
18
  # see http://semver.org/
19
- VERSION = "0.3.3"
19
+ VERSION = "0.3.4"
20
20
  end
@@ -0,0 +1,136 @@
1
+ #
2
+ # Copyright 2012 Mortar Data Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'spec_helper'
18
+ require 'fakefs/spec_helpers'
19
+ require 'mortar/command/fixtures'
20
+ require 'mortar/api/fixtures'
21
+
22
+ module Mortar::Command
23
+ describe Fixtures do
24
+ before(:each) do
25
+ stub_core
26
+ @git = Mortar::Git::Git.new
27
+ end
28
+
29
+ context("index") do
30
+
31
+ it "errors when missing command" do
32
+ with_git_initialized_project do |p|
33
+ stderr, stdout = execute("fixtures:head s3n://tbmmsd/*.tsv.* 5", p, @git)
34
+ stderr.should == <<-STDERR
35
+ ! Usage: mortar fixtures:head INPUT_URL NUM_ROWS FIXTURE_NAME
36
+ ! Must specifiy INPUT_URL, NUM_ROWS, and FIXTURE_NAME.
37
+ STDERR
38
+ end
39
+ end
40
+
41
+ it "requests and reports on a successful fixtures:head" do
42
+ with_git_initialized_project do |p|
43
+ fixture_id = "12345abcde"
44
+ name = "My_pet_fixture"
45
+ url = "s3://my_pet_fixture"
46
+ num_rows = "60"
47
+
48
+ sample_s3_urls = [ {'url' => "url1",
49
+ 'name' => "url1_name"}]
50
+
51
+ mock(Mortar::Auth.api).post_fixture_limit(p.name, name, url, num_rows) {Excon::Response.new(:body => {"fixture_id" => fixture_id})}
52
+ mock(Mortar::Auth.api).get_fixture(fixture_id).returns(Excon::Response.new(:body => {"status_code" => Mortar::API::Fixtures::STATUS_PENDING, "status_description" => "Pending"})).ordered
53
+ mock(Mortar::Auth.api).get_fixture(fixture_id).returns(Excon::Response.new(:body => {"status_code" => Mortar::API::Fixtures::STATUS_CREATING, "status_description" => "Creating"})).ordered
54
+ mock(Mortar::Auth.api).get_fixture(fixture_id).returns(Excon::Response.new(:body => {"status_code" => Mortar::API::Fixtures::STATUS_SAVING, "status_description" => "Uploading"})).ordered
55
+ mock(Mortar::Auth.api).get_fixture(fixture_id).returns(Excon::Response.new(:body => {"status_code" => Mortar::API::Fixtures::STATUS_CREATED, "status_description" => "Success", "name" => name, "sample_s3_urls" => sample_s3_urls})).ordered
56
+
57
+ any_instance_of(Mortar::Command::Fixtures) do |base|
58
+ mock(base).download_to_file(sample_s3_urls[0]['url'], "fixtures/#{name}/#{sample_s3_urls[0]['name']}")
59
+ end
60
+
61
+ stderr, stdout = execute("fixtures:head #{url} #{num_rows} #{name} --polling_interval 0.05", p, @git)
62
+
63
+ stdout.should == <<-STDOUT
64
+ WARNING: Creating fixtures with more than 50 rows is not recommended. Large local fixtures may cause slowness when using Mortar.
65
+
66
+ Requesting fixture creation... done
67
+
68
+ \r\e[0KStatus: Pending... /\r\e[0KStatus: Creating... -\r\e[0KStatus: Uploading... \\\r\e[0KStatus: Success \n\n
69
+ STDOUT
70
+
71
+ end
72
+ end
73
+
74
+ it "requests and reports on a failed fixtures:head" do
75
+ with_git_initialized_project do |p|
76
+ fixture_id = "12345abcde"
77
+ name = "My_pet_fixture"
78
+ url = "s3://my_pet_fixture"
79
+ num_rows = "60"
80
+
81
+ sample_s3_urls = [ {'url' => "url1",
82
+ 'name' => "url1_name"}]
83
+
84
+ mock(Mortar::Auth.api).post_fixture_limit(p.name, name, url, num_rows) {Excon::Response.new(:body => {"fixture_id" => fixture_id})}
85
+ mock(Mortar::Auth.api).get_fixture(fixture_id).returns(Excon::Response.new(:body => {"status_code" => Mortar::API::Fixtures::STATUS_PENDING, "status_description" => "Pending"})).ordered
86
+ mock(Mortar::Auth.api).get_fixture(fixture_id).returns(Excon::Response.new(:body => {"status_code" => Mortar::API::Fixtures::STATUS_CREATING, "status_description" => "Creating"})).ordered
87
+ mock(Mortar::Auth.api).get_fixture(fixture_id).returns(Excon::Response.new(:body => {"status_code" => Mortar::API::Fixtures::STATUS_SAVING, "status_description" => "Uploading"})).ordered
88
+ mock(Mortar::Auth.api).get_fixture(fixture_id).returns(Excon::Response.new(:body => {"status_code" => Mortar::API::Fixtures::STATUS_FAILED,
89
+ "status_description" => "Failed",
90
+ "name" => name,
91
+ "error_message" => "This is an error message.",
92
+ "error_type" => "UserError" })).ordered
93
+
94
+ stderr, stdout = execute("fixtures:head #{url} #{num_rows} #{name} --polling_interval 0.05", p, @git)
95
+
96
+ stdout.should == <<-STDOUT
97
+ WARNING: Creating fixtures with more than 50 rows is not recommended. Large local fixtures may cause slowness when using Mortar.
98
+
99
+ Requesting fixture creation... done
100
+
101
+ \r\e[0KStatus: Pending... /\r\e[0KStatus: Creating... -\r\e[0KStatus: Uploading... \\\r\e[0KStatus: Failed \n
102
+ STDOUT
103
+
104
+ stderr.should == <<-STDERR
105
+ ! Fixture generation failed with UserError:
106
+ !
107
+ ! This is an error message.
108
+ STDERR
109
+
110
+ end
111
+ end
112
+
113
+
114
+ it "tries to create a fixture in an existing directory" do
115
+ with_git_initialized_project do |p|
116
+ fixture_id = "12345abcde"
117
+ name = "My_pet_fixture"
118
+ url = "s3://my_pet_fixture"
119
+ num_rows = "60"
120
+
121
+ fixtures_dir = File.join(Dir.pwd, "fixtures", name)
122
+ FileUtils.mkdir_p(fixtures_dir)
123
+
124
+ stderr, stdout = execute("fixtures:head #{url} #{num_rows} #{name} --polling_interval 0.05", p, @git)
125
+
126
+ stderr.should == <<-STDERR
127
+ ! Fixture #{name} already exists.
128
+ STDERR
129
+ end
130
+ end
131
+
132
+
133
+
134
+ end
135
+ end
136
+ end
@@ -32,11 +32,13 @@ describe Mortar::Command::Generate do
32
32
  stderr, stdout = execute("generate:project Test")
33
33
  File.exists?("Test").should be_true
34
34
  File.exists?("Test/macros").should be_true
35
+ File.exists?("Test/fixtures").should be_true
35
36
  File.exists?("Test/pigscripts").should be_true
36
37
  File.exists?("Test/udfs").should be_true
37
38
  File.exists?("Test/README.md").should be_true
38
39
  File.exists?("Test/Gemfile").should be_false
39
40
  File.exists?("Test/macros/.gitkeep").should be_true
41
+ File.exists?("Test/fixtures/.gitkeep").should be_true
40
42
  File.exists?("Test/pigscripts/Test.pig").should be_true
41
43
  File.exists?("Test/udfs/python/Test.py").should be_true
42
44
 
@@ -82,11 +84,13 @@ STDERR
82
84
  stderr, stdout = execute("new Test")
83
85
  File.exists?("Test").should be_true
84
86
  File.exists?("Test/macros").should be_true
87
+ File.exists?("Test/fixtures").should be_true
85
88
  File.exists?("Test/pigscripts").should be_true
86
89
  File.exists?("Test/udfs").should be_true
87
90
  File.exists?("Test/README.md").should be_true
88
91
  File.exists?("Test/Gemfile").should be_false
89
92
  File.exists?("Test/macros/.gitkeep").should be_true
93
+ File.exists?("Test/fixtures/.gitkeep").should be_true
90
94
  File.exists?("Test/pigscripts/Test.pig").should be_true
91
95
  File.exists?("Test/udfs/python/Test.py").should be_true
92
96
 
@@ -71,7 +71,7 @@ STDERR
71
71
  parameters = ["name"=>"key", "value"=>"value" ]
72
72
 
73
73
  # These don't test the validity of the error message, it only tests that the CLI can handle a message returned from the server
74
- mock(Mortar::Auth.api).post_illustrate("myproject", "my_script", "my_alias", is_a(String), :parameters => parameters) {Excon::Response.new(:body => {"illustrate_id" => illustrate_id})}
74
+ mock(Mortar::Auth.api).post_illustrate("myproject", "my_script", "my_alias", false, is_a(String), :parameters => parameters) {Excon::Response.new(:body => {"illustrate_id" => illustrate_id})}
75
75
  mock(Mortar::Auth.api).get_illustrate(illustrate_id, :exclude_result => true).returns(Excon::Response.new(:body => {"status_code" => Mortar::API::Illustrate::STATUS_QUEUED, "status_description" => "Pending"})).ordered
76
76
  mock(Mortar::Auth.api).get_illustrate(illustrate_id, :exclude_result => true).returns(Excon::Response.new(:body => {"status_code" => Mortar::API::Illustrate::STATUS_GATEWAY_STARTING, "status_description" => "GATEWAY_STARTING"})).ordered
77
77
  mock(Mortar::Auth.api).get_illustrate(illustrate_id, :exclude_result => true).returns(Excon::Response.new(:body => {"status_code" => Mortar::API::Illustrate::STATUS_PROGRESS, "status_description" => "In progress"})).ordered
@@ -105,7 +105,7 @@ STDOUT
105
105
  parameters = ["name"=>"key", "value"=>"value" ]
106
106
 
107
107
  # These don't test the validity of the error message, it only tests that the CLI can handle a message returned from the server
108
- mock(Mortar::Auth.api).post_illustrate("myproject", "my_script", "my_alias", is_a(String), :parameters => parameters) {Excon::Response.new(:body => {"illustrate_id" => illustrate_id})}
108
+ mock(Mortar::Auth.api).post_illustrate("myproject", "my_script", "my_alias", false, is_a(String), :parameters => parameters) {Excon::Response.new(:body => {"illustrate_id" => illustrate_id})}
109
109
  mock(Mortar::Auth.api).get_illustrate(illustrate_id, :exclude_result => true).returns(Excon::Response.new(:body => {"status_code" => Mortar::API::Illustrate::STATUS_QUEUED, "status_description" => "Pending"})).ordered
110
110
  mock(Mortar::Auth.api).get_illustrate(illustrate_id, :exclude_result => true).returns(Excon::Response.new(:body => {"status_code" => Mortar::API::Illustrate::STATUS_SUCCESS, "status_description" => "Succeeded", "web_result_url" => illustrate_url})).ordered
111
111
 
@@ -118,6 +118,33 @@ Starting illustrate... done
118
118
 
119
119
  \r\e[0KStatus: Pending... /\r\e[0KStatus: Succeeded
120
120
 
121
+ Results available at https://api.mortardata.com/illustrates/c571a8c7f76a4fd4a67c103d753e2dd5
122
+ STDOUT
123
+ end
124
+ end
125
+
126
+
127
+ it "requests and reports on a successful illustrate that skips pruning" do
128
+ with_git_initialized_project do |p|
129
+ # stub api requests
130
+ illustrate_id = "c571a8c7f76a4fd4a67c103d753e2dd5"
131
+ illustrate_url = "https://api.mortardata.com/illustrates/#{illustrate_id}"
132
+ parameters = ["name"=>"key", "value"=>"value" ]
133
+
134
+ # These don't test the validity of the error message, it only tests that the CLI can handle a message returned from the server
135
+ mock(Mortar::Auth.api).post_illustrate("myproject", "my_script", "my_alias", true, is_a(String), :parameters => parameters) {Excon::Response.new(:body => {"illustrate_id" => illustrate_id})}
136
+ mock(Mortar::Auth.api).get_illustrate(illustrate_id, :exclude_result => true).returns(Excon::Response.new(:body => {"status_code" => Mortar::API::Illustrate::STATUS_QUEUED, "status_description" => "Pending"})).ordered
137
+ mock(Mortar::Auth.api).get_illustrate(illustrate_id, :exclude_result => true).returns(Excon::Response.new(:body => {"status_code" => Mortar::API::Illustrate::STATUS_SUCCESS, "status_description" => "Succeeded", "web_result_url" => illustrate_url})).ordered
138
+
139
+ write_file(File.join(p.pigscripts_path, "my_script.pig"))
140
+ stderr, stdout = execute("illustrate my_script my_alias --polling_interval 0.05 -p key=value -s --no_browser", p, @git)
141
+ stdout.should == <<-STDOUT
142
+ Taking code snapshot... done
143
+ Sending code snapshot to Mortar... done
144
+ Starting illustrate... done
145
+
146
+ \r\e[0KStatus: Pending... /\r\e[0KStatus: Succeeded
147
+
121
148
  Results available at https://api.mortardata.com/illustrates/c571a8c7f76a4fd4a67c103d753e2dd5
122
149
  STDOUT
123
150
  end
@@ -134,7 +161,7 @@ STDOUT
134
161
  error_type = 'PigError'
135
162
 
136
163
  # These don't test the validity of the error message, it only tests that the CLI can handle a message returned from the server
137
- mock(Mortar::Auth.api).post_illustrate("myproject", "my_script", "my_alias", is_a(String), :parameters => []) {Excon::Response.new(:body => {"illustrate_id" => illustrate_id})}
164
+ mock(Mortar::Auth.api).post_illustrate("myproject", "my_script", "my_alias", false, is_a(String), :parameters => []) {Excon::Response.new(:body => {"illustrate_id" => illustrate_id})}
138
165
  mock(Mortar::Auth.api).get_illustrate(illustrate_id, :exclude_result => true).returns(Excon::Response.new(:body => {"status_code" => Mortar::API::Illustrate::STATUS_QUEUED, "status_description" => "Pending"})).ordered
139
166
  mock(Mortar::Auth.api).get_illustrate(illustrate_id, :exclude_result => true).returns(Excon::Response.new(:body => {"status_code" => Mortar::API::Illustrate::STATUS_FAILURE,
140
167
  "error_message" => error_message,
@@ -419,7 +419,7 @@ STDOUT
419
419
  "parameters" => parameters,
420
420
  "outputs" => outputs
421
421
  }))
422
- stderr, stdout = execute("jobs:status c571a8c7f76a4fd4a67c103d753e2dd5 -p", p, @git)
422
+ stderr, stdout = execute("jobs:status c571a8c7f76a4fd4a67c103d753e2dd5 -p --polling_interval 0.05", p, @git)
423
423
  stdout.should == <<-STDOUT
424
424
  \r[/] Status: [=> ] 0% Complete (0.00 / 4.00 MapReduce jobs finished)\r\e[0K=== myproject: my_script (job_id: c571a8c7f76a4fd4a67c103d753e2dd5)
425
425
  cluster_id: e2790e7e8c7d48e39157238d58191346
@@ -279,6 +279,8 @@ STASH
279
279
  end
280
280
 
281
281
  =begin
282
+ #TODO: Fix this.
283
+
282
284
  context "clone" do
283
285
  it "clones repo successfully" do
284
286
  with_no_git_directory do
metadata CHANGED
@@ -1,165 +1,183 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: mortar
3
- version: !ruby/object:Gem::Version
4
- hash: 21
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.4
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 3
9
- - 3
10
- version: 0.3.3
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Mortar Data
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-10-17 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2012-10-25 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: mortar-api-ruby
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
18
+ requirements:
26
19
  - - ~>
27
- - !ruby/object:Gem::Version
28
- hash: 19
29
- segments:
30
- - 0
31
- - 3
32
- - 0
33
- version: 0.3.0
20
+ - !ruby/object:Gem::Version
21
+ version: 0.3.1
34
22
  type: :runtime
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
37
- name: netrc
38
23
  prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 0.3.1
30
+ - !ruby/object:Gem::Dependency
31
+ name: netrc
32
+ requirement: !ruby/object:Gem::Requirement
40
33
  none: false
41
- requirements:
34
+ requirements:
42
35
  - - ~>
43
- - !ruby/object:Gem::Version
44
- hash: 9
45
- segments:
46
- - 0
47
- - 7
48
- - 5
36
+ - !ruby/object:Gem::Version
49
37
  version: 0.7.5
50
38
  type: :runtime
51
- version_requirements: *id002
52
- - !ruby/object:Gem::Dependency
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 0.7.5
46
+ - !ruby/object:Gem::Dependency
53
47
  name: launchy
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 2.1.1
54
+ type: :runtime
54
55
  prerelease: false
55
- requirement: &id003 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
56
57
  none: false
57
- requirements:
58
+ requirements:
58
59
  - - ~>
59
- - !ruby/object:Gem::Version
60
- hash: 9
61
- segments:
62
- - 2
63
- - 1
64
- - 1
60
+ - !ruby/object:Gem::Version
65
61
  version: 2.1.1
62
+ - !ruby/object:Gem::Dependency
63
+ name: curb
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 0.8.1
66
70
  type: :runtime
67
- version_requirements: *id003
68
- - !ruby/object:Gem::Dependency
69
- name: excon
70
71
  prerelease: false
71
- requirement: &id004 !ruby/object:Gem::Requirement
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 0.8.1
78
+ - !ruby/object:Gem::Dependency
79
+ name: excon
80
+ requirement: !ruby/object:Gem::Requirement
72
81
  none: false
73
- requirements:
82
+ requirements:
74
83
  - - ~>
75
- - !ruby/object:Gem::Version
76
- hash: 43
77
- segments:
78
- - 0
79
- - 15
80
- - 4
84
+ - !ruby/object:Gem::Version
81
85
  version: 0.15.4
82
86
  type: :development
83
- version_requirements: *id004
84
- - !ruby/object:Gem::Dependency
85
- name: fakefs
86
87
  prerelease: false
87
- requirement: &id005 !ruby/object:Gem::Requirement
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 0.15.4
94
+ - !ruby/object:Gem::Dependency
95
+ name: fakefs
96
+ requirement: !ruby/object:Gem::Requirement
88
97
  none: false
89
- requirements:
90
- - - ">="
91
- - !ruby/object:Gem::Version
92
- hash: 3
93
- segments:
94
- - 0
95
- version: "0"
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
96
102
  type: :development
97
- version_requirements: *id005
98
- - !ruby/object:Gem::Dependency
99
- name: gem-release
100
103
  prerelease: false
101
- requirement: &id006 !ruby/object:Gem::Requirement
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: gem-release
112
+ requirement: !ruby/object:Gem::Requirement
102
113
  none: false
103
- requirements:
104
- - - ">="
105
- - !ruby/object:Gem::Version
106
- hash: 3
107
- segments:
108
- - 0
109
- version: "0"
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
110
118
  type: :development
111
- version_requirements: *id006
112
- - !ruby/object:Gem::Dependency
113
- name: rake
114
119
  prerelease: false
115
- requirement: &id007 !ruby/object:Gem::Requirement
120
+ version_requirements: !ruby/object:Gem::Requirement
116
121
  none: false
117
- requirements:
118
- - - ">="
119
- - !ruby/object:Gem::Version
120
- hash: 3
121
- segments:
122
- - 0
123
- version: "0"
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: rake
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
124
134
  type: :development
125
- version_requirements: *id007
126
- - !ruby/object:Gem::Dependency
127
- name: rr
128
135
  prerelease: false
129
- requirement: &id008 !ruby/object:Gem::Requirement
136
+ version_requirements: !ruby/object:Gem::Requirement
130
137
  none: false
131
- requirements:
132
- - - ">="
133
- - !ruby/object:Gem::Version
134
- hash: 3
135
- segments:
136
- - 0
137
- version: "0"
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: rr
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
138
150
  type: :development
139
- version_requirements: *id008
140
- - !ruby/object:Gem::Dependency
141
- name: rspec
142
151
  prerelease: false
143
- requirement: &id009 !ruby/object:Gem::Requirement
152
+ version_requirements: !ruby/object:Gem::Requirement
144
153
  none: false
145
- requirements:
146
- - - ">="
147
- - !ruby/object:Gem::Version
148
- hash: 3
149
- segments:
150
- - 0
151
- version: "0"
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: rspec
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
152
166
  type: :development
153
- version_requirements: *id009
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
154
174
  description: Client library and command-line tool to interact with the Mortar service.
155
175
  email: support@mortardata.com
156
- executables:
176
+ executables:
157
177
  - mortar
158
178
  extensions: []
159
-
160
179
  extra_rdoc_files: []
161
-
162
- files:
180
+ files:
163
181
  - README.md
164
182
  - bin/mortar
165
183
  - lib/mortar.rb
@@ -170,6 +188,7 @@ files:
170
188
  - lib/mortar/command/base.rb
171
189
  - lib/mortar/command/clusters.rb
172
190
  - lib/mortar/command/describe.rb
191
+ - lib/mortar/command/fixtures.rb
173
192
  - lib/mortar/command/generate.rb
174
193
  - lib/mortar/command/help.rb
175
194
  - lib/mortar/command/illustrate.rb
@@ -192,6 +211,7 @@ files:
192
211
  - lib/mortar/templates/pigscript/pigscript.pig
193
212
  - lib/mortar/templates/pigscript/python_udf.py
194
213
  - lib/mortar/templates/project/README.md
214
+ - lib/mortar/templates/project/fixtures/gitkeep
195
215
  - lib/mortar/templates/project/gitignore
196
216
  - lib/mortar/templates/project/macros/gitkeep
197
217
  - lib/mortar/templates/project/pigscripts/pigscript.pig
@@ -205,6 +225,7 @@ files:
205
225
  - spec/mortar/command/base_spec.rb
206
226
  - spec/mortar/command/clusters_spec.rb
207
227
  - spec/mortar/command/describe_spec.rb
228
+ - spec/mortar/command/fixtures_spec.rb
208
229
  - spec/mortar/command/generate_spec.rb
209
230
  - spec/mortar/command/illustrate_spec.rb
210
231
  - spec/mortar/command/jobs_spec.rb
@@ -221,38 +242,26 @@ files:
221
242
  - spec/support/display_message_matcher.rb
222
243
  homepage: http://mortardata.com/
223
244
  licenses: []
224
-
225
245
  post_install_message:
226
246
  rdoc_options: []
227
-
228
- require_paths:
247
+ require_paths:
229
248
  - lib
230
- required_ruby_version: !ruby/object:Gem::Requirement
249
+ required_ruby_version: !ruby/object:Gem::Requirement
231
250
  none: false
232
- requirements:
233
- - - ">="
234
- - !ruby/object:Gem::Version
235
- hash: 57
236
- segments:
237
- - 1
238
- - 8
239
- - 7
251
+ requirements:
252
+ - - ! '>='
253
+ - !ruby/object:Gem::Version
240
254
  version: 1.8.7
241
- required_rubygems_version: !ruby/object:Gem::Requirement
255
+ required_rubygems_version: !ruby/object:Gem::Requirement
242
256
  none: false
243
- requirements:
244
- - - ">="
245
- - !ruby/object:Gem::Version
246
- hash: 3
247
- segments:
248
- - 0
249
- version: "0"
257
+ requirements:
258
+ - - ! '>='
259
+ - !ruby/object:Gem::Version
260
+ version: '0'
250
261
  requirements: []
251
-
252
262
  rubyforge_project:
253
263
  rubygems_version: 1.8.24
254
264
  signing_key:
255
265
  specification_version: 3
256
266
  summary: Client library and CLI to interact with the Mortar service.
257
267
  test_files: []
258
-