mortar 0.9.3 → 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/lib/mortar/auth.rb +0 -8
  2. data/lib/mortar/command/local.rb +14 -2
  3. data/lib/mortar/generators/characterize_generator.rb +105 -0
  4. data/lib/mortar/generators/generator_base.rb +1 -1
  5. data/lib/mortar/generators/project_generator.rb +0 -4
  6. data/lib/mortar/helpers.rb +13 -0
  7. data/lib/mortar/local/controller.rb +11 -3
  8. data/lib/mortar/local/installutil.rb +66 -6
  9. data/lib/mortar/local/jython.rb +11 -5
  10. data/lib/mortar/local/pig.rb +6 -9
  11. data/lib/mortar/local/python.rb +43 -23
  12. data/lib/mortar/plugin.rb +1 -0
  13. data/lib/mortar/templates/characterize/README.md +7 -0
  14. data/lib/mortar/templates/characterize/controlscripts/lib/__init__.py +0 -0
  15. data/lib/mortar/templates/characterize/controlscripts/lib/characterize_control.py +27 -0
  16. data/lib/mortar/templates/characterize/fixtures/gitkeep +0 -0
  17. data/lib/mortar/templates/characterize/gitignore +8 -0
  18. data/lib/mortar/templates/{project → characterize}/macros/characterize_macro.pig +0 -0
  19. data/lib/mortar/templates/characterize/macros/gitkeep +0 -0
  20. data/lib/mortar/templates/{project → characterize}/pigscripts/characterize.pig +0 -0
  21. data/lib/mortar/templates/characterize/pigscripts/pigscript.pig +38 -0
  22. data/lib/mortar/templates/characterize/udfs/java/gitkeep +0 -0
  23. data/lib/mortar/templates/characterize/udfs/jython/gitkeep +0 -0
  24. data/lib/mortar/templates/{project → characterize}/udfs/jython/top_5_tuple.py +0 -0
  25. data/lib/mortar/templates/characterize/udfs/python/python_udf.py +13 -0
  26. data/lib/mortar/templates/characterize/vendor/controlscripts/lib/__init__.py +0 -0
  27. data/lib/mortar/templates/characterize/vendor/macros/gitkeep +0 -0
  28. data/lib/mortar/templates/characterize/vendor/pigscripts/gitkeep +0 -0
  29. data/lib/mortar/templates/characterize/vendor/udfs/java/gitkeep +0 -0
  30. data/lib/mortar/templates/characterize/vendor/udfs/jython/gitkeep +0 -0
  31. data/lib/mortar/templates/characterize/vendor/udfs/python/gitkeep +0 -0
  32. data/lib/mortar/version.rb +1 -1
  33. data/spec/mortar/command/local_spec.rb +29 -2
  34. data/spec/mortar/command/projects_spec.rb +0 -4
  35. data/spec/mortar/local/installutil_spec.rb +69 -1
  36. data/spec/mortar/local/pig_spec.rb +2 -2
  37. metadata +173 -132
  38. data/lib/mortar/templates/project/controlscripts/lib/characterize_control.py +0 -23
data/lib/mortar/plugin.rb CHANGED
@@ -55,6 +55,7 @@ module Mortar
55
55
  # TODO: Deal with the bundler as a runtime dependency issue
56
56
  # before moving these require statements to the top.
57
57
  begin
58
+ require 'bundler'
58
59
  require 'bundler/cli'
59
60
  require 'bundler/friendly_errors'
60
61
  require 'monkey_patch/bundler/bundler'
@@ -0,0 +1,7 @@
1
+ # Welcome to Mortar!
2
+
3
+ Mortar is a platform-as-a-service for Hadoop. With Mortar, you can run jobs on Hadoop using Apache Pig and Python without any special training. You create your project using the Mortar Development Framework, deploy code using the Git revision control system, and Mortar does the rest.
4
+
5
+ # Getting Started
6
+
7
+ For help getting started with Mortar, check out the [Mortar Help](http://help.mortardata.com/) site.
@@ -0,0 +1,27 @@
1
+ from org.apache.pig.scripting import Pig
2
+ import os
3
+ import sys
4
+
5
+ if __name__ == "__main__":
6
+ params = Pig.getParameters()
7
+ loader = params["LOADER"]
8
+ input_source = params["INPUT_SRC"]
9
+ output_path = params["OUTPUT_PATH"]
10
+ infer_types = params["INFER_TYPES"]
11
+
12
+ if os.path.exists("../%s" % output_path):
13
+ sys.stderr.write("ERROR: Output directory file: %s exists...Aborting!\n" % output_path)
14
+ else:
15
+ Pig.compileFromFile("../pigscripts/characterize.pig").bind({
16
+ "LOADER" : loader,
17
+ "INPUT_SRC" : input_source,
18
+ "OUTPUT_PATH" : output_path,
19
+ "INFER_TYPES" : infer_types
20
+ }).runSingle()
21
+
22
+ for root, _, files in os.walk("../%s" % output_path):
23
+ for f in files:
24
+ if f[0] != '.':
25
+ fullpath = os.path.join(root, f)
26
+ copypath = os.path.join(root, f + '.csv')
27
+ os.system ("cp %s %s" % (fullpath, copypath))
@@ -0,0 +1,8 @@
1
+ Gemfile.lock
2
+ *.pyc
3
+ *.class
4
+ *.log
5
+ tmp
6
+ .mortar-local
7
+ logs
8
+ illustrate-output
File without changes
@@ -0,0 +1,38 @@
1
+ /**
2
+ * <%= project_name %>
3
+ */
4
+
5
+ /**
6
+ * Parameters - set default values here; you can override with -p on the command-line.
7
+ */
8
+
9
+ <%= '%default'%> INPUT_PATH 's3n://mortar-example-data/tutorial/excite.log.bz2'
10
+ <%= '%default'%> OUTPUT_PATH 's3n://my-output-bucket/$MORTAR_EMAIL_S3_ESCAPED/<%= project_name %>'
11
+
12
+ /**
13
+ * User-Defined Functions (UDFs)
14
+ */
15
+
16
+ REGISTER '../udfs/python/<%= project_name %>.py' USING streaming_python AS <%= project_name_alias %>;
17
+
18
+ -- This is an example of loading up input data
19
+ my_input_data = LOAD '$INPUT_PATH'
20
+ USING PigStorage('\t')
21
+ AS (field0:chararray, field1:chararray, field2:chararray);
22
+
23
+ -- This is an example pig operation
24
+ filtered = FILTER my_input_data
25
+ BY field0 IS NOT NULL;
26
+
27
+ -- This is an example call to a python user-defined function
28
+ with_udf_output = FOREACH filtered
29
+ GENERATE field0..field2,
30
+ <%= project_name_alias %>.example_udf(field0) AS example_udf_field;
31
+
32
+ -- remove any existing data
33
+ rmf $OUTPUT_PATH;
34
+
35
+ -- store the results
36
+ STORE with_udf_output
37
+ INTO '$OUTPUT_PATH'
38
+ USING PigStorage('\t');
@@ -0,0 +1,13 @@
1
+ from pig_util import outputSchema
2
+
3
+ #
4
+ # This is where we write python UDFs (User-Defined Functions) that we can call from pig.
5
+ # Pig needs to know the schema of the data coming out of the function,
6
+ # which we specify using the @outputSchema decorator.
7
+ #
8
+ @outputSchema('example_udf:int')
9
+ def example_udf(input_str):
10
+ """
11
+ A simple example function that just returns the length of the string passed in.
12
+ """
13
+ return len(input_str) if input_str else None
@@ -16,5 +16,5 @@
16
16
 
17
17
  module Mortar
18
18
  # see http://semver.org/
19
- VERSION = "0.9.3"
19
+ VERSION = "0.9.4"
20
20
  end
@@ -18,6 +18,7 @@ require 'spec_helper'
18
18
  require 'fakefs/spec_helpers'
19
19
  require 'mortar/command/local'
20
20
  require 'launchy'
21
+ require 'fileutils'
21
22
 
22
23
  module Mortar::Command
23
24
  describe Local do
@@ -104,6 +105,33 @@ STDERR
104
105
  # run
105
106
  end
106
107
 
108
+ context("characterize") do
109
+ # TODO - oleiman: some tests for characterize should go here
110
+
111
+ it "should clean up after itself" do
112
+ @tmpdir = Dir.mktmpdir
113
+ Dir.chdir(@tmpdir)
114
+
115
+ File.open("test.params", 'w') do |file|
116
+ file.write(<<PARAMS
117
+ LOADER=org.apache.pig.piggybank.storage.JsonLoader()
118
+ INPUT_SRC=s3n://twitter-gardenhose-mortar/example
119
+ OUTPUT_PATH=twitter_char
120
+ INFER_TYPES=true
121
+ PARAMS
122
+ )
123
+ end
124
+ stderr, stdout = execute("generate:project Test")
125
+ stderr, stdout = execute("local:characterize -f test.params --project_root Test")
126
+ File.exists?("Test/pigscripts/characterize.pig").should be_false
127
+ File.exists?("Test/macros/characterize_macro.pig").should be_false
128
+ File.exists?("Test/udfs/jython/top_5_tuple.py").should be_false
129
+ File.exists?("Test/controlscripts/lib/characterize_control.py").should be_false
130
+ File.delete("test.params")
131
+ end
132
+
133
+ end
134
+
107
135
  context("configure") do
108
136
 
109
137
  it "errors if the project root doesn't exist or we can't cd there" do
@@ -142,8 +170,7 @@ STDERR
142
170
  end
143
171
  any_instance_of(Mortar::Local::Python) do |j|
144
172
  mock(j).check_or_install.returns(true)
145
- end
146
- any_instance_of(Mortar::Local::Python) do |j|
173
+ mock(j).check_virtualenv.returns(true)
147
174
  mock(j).setup_project_python_environment.returns(true)
148
175
  end
149
176
  any_instance_of(Mortar::Local::Jython) do |j|
@@ -130,14 +130,11 @@ STDOUT
130
130
  \e[1;32m create\e[0m .gitignore
131
131
  \e[1;32m create\e[0m pigscripts
132
132
  \e[1;32m create\e[0m pigscripts/some_new_project.pig
133
- \e[1;32m create\e[0m pigscripts/characterize.pig
134
133
  \e[1;32m create\e[0m controlscripts
135
134
  \e[1;32m create\e[0m controlscripts/lib
136
135
  \e[1;32m create\e[0m controlscripts/lib/__init__.py
137
- \e[1;32m create\e[0m controlscripts/lib/characterize_control.py
138
136
  \e[1;32m create\e[0m macros
139
137
  \e[1;32m create\e[0m macros/.gitkeep
140
- \e[1;32m create\e[0m macros/characterize_macro.pig
141
138
  \e[1;32m create\e[0m fixtures
142
139
  \e[1;32m create\e[0m fixtures/.gitkeep
143
140
  \e[1;32m create\e[0m udfs
@@ -145,7 +142,6 @@ STDOUT
145
142
  \e[1;32m create\e[0m udfs/python/some_new_project.py
146
143
  \e[1;32m create\e[0m udfs/jython
147
144
  \e[1;32m create\e[0m udfs/jython/.gitkeep
148
- \e[1;32m create\e[0m udfs/jython/top_5_tuple.py
149
145
  \e[1;32m create\e[0m udfs/java
150
146
  \e[1;32m create\e[0m udfs/java/.gitkeep
151
147
  \e[1;32m create\e[0m vendor
@@ -106,7 +106,11 @@ module Mortar::Local
106
106
 
107
107
  it "returns an epoch" do
108
108
  excon_response = Excon::Response.new(:headers => {"Last-Modified" => "Mon, 11 Mar 2013 15:03:55 GMT"})
109
- mock(Excon).head("http://foo/bar").returns(excon_response)
109
+ mock(Excon).head("http://foo/bar",
110
+ :headers => {"User-Agent"=>Mortar::USER_AGENT},
111
+ :query => {}
112
+ ).returns(excon_response)
113
+
110
114
  actual_epoch = @installutil.url_date("http://foo/bar")
111
115
  expect(actual_epoch).to eq(1363014235)
112
116
  end
@@ -122,5 +126,69 @@ module Mortar::Local
122
126
 
123
127
  end
124
128
 
129
+ context "download_file" do
130
+
131
+ it "follows redirect" do
132
+ excon_first_response = Excon::Response.new(:headers => {"Location" => "http://foo/bar2"}, :status => 302)
133
+ mock(Excon).get("http://foo/bar",
134
+ :headers => {'User-Agent' => Mortar::USER_AGENT},
135
+ :query => {}
136
+ ).returns(excon_first_response)
137
+
138
+ excon_second_response = Excon::Response.new(:status => 200, :body => "content")
139
+ mock(Excon).get("http://foo/bar2",
140
+ :headers => {'User-Agent' => Mortar::USER_AGENT},
141
+ :query => {}
142
+ ).returns(excon_second_response)
143
+
144
+ local_install_directory = @installutil.local_install_directory
145
+ expected_file_path = File.join(local_install_directory, 'bar2')
146
+ FakeFS do
147
+ FileUtils.mkdir_p(local_install_directory)
148
+ @installutil.download_file('http://foo/bar', expected_file_path)
149
+ expect(File.exists?(expected_file_path)).to be_true
150
+ end
151
+ end
152
+
153
+ end
154
+
155
+ context "get_resource" do
156
+ it "too many redirects" do
157
+ response = Excon::Response.new(:headers => {"Location" => "http://foo/bar"}, :status => 302)
158
+ mock(Excon).get("http://foo/bar",
159
+ :headers => {'User-Agent' => Mortar::USER_AGENT},
160
+ :query => {}
161
+ ).times(5).returns(response)
162
+
163
+ lambda { @installutil.get_resource("http://foo/bar") }.should raise_error(RuntimeError, /Too many redirects/)
164
+ end
165
+
166
+ it "too many errors" do
167
+ response = Excon::Response.new(:status => 500)
168
+ mock(@installutil).make_call_sleep_seconds().times(5).returns(0)
169
+ mock(Excon).get("http://foo/bar",
170
+ :headers => {'User-Agent' => Mortar::USER_AGENT},
171
+ :query => {}
172
+ ).times(5).returns(response)
173
+
174
+ lambda { @installutil.get_resource("http://foo/bar") }.should raise_error(RuntimeError, /Server Error/)
175
+ end
176
+
177
+ end
178
+
179
+ context "head_resource" do
180
+ it "too many redirects" do
181
+ ENV['MORTAR_TEST_NAME'] = "Unit Testor"
182
+ response = Excon::Response.new(:headers => {"Location" => "http://foo/bar"}, :status => 302)
183
+ mock(Excon).head("http://foo/bar",
184
+ :headers => {'User-Agent' => Mortar::USER_AGENT},
185
+ :query => { :test_name => "Unit Testor" }
186
+ ).times(5).returns(response)
187
+
188
+ lambda { @installutil.head_resource("http://foo/bar") }.should raise_error(RuntimeError, /Too many redirects/)
189
+ end
190
+ end
191
+
192
+
125
193
  end
126
194
  end
@@ -34,8 +34,8 @@ module Mortar::Local
34
34
  # chmods bin/pig, removes tgz, and notes the installation
35
35
  FakeFS do
36
36
  pig = Mortar::Local::Pig.new
37
- local_pig_archive = File.join(pig.local_install_directory, pig.pig_archive_file)
38
- mock(pig).download_file(pig.pig_archive_url, pig.local_install_directory) do
37
+ local_pig_archive = File.join(pig.local_install_directory, Mortar::Local::Pig::PIG_TGZ_NAME)
38
+ mock(pig).download_file(pig.pig_archive_url, local_pig_archive) do
39
39
  # Simulate the tgz file being downloaded, this should be deleted
40
40
  # before the method finishes executing
41
41
  FileUtils.touch(local_pig_archive)
metadata CHANGED
@@ -1,167 +1,180 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: mortar
3
- version: !ruby/object:Gem::Version
4
- version: 0.9.3
3
+ version: !ruby/object:Gem::Version
4
+ hash: 51
5
5
  prerelease:
6
+ segments:
7
+ - 0
8
+ - 9
9
+ - 4
10
+ version: 0.9.4
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Mortar Data
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2013-07-23 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: mortar-api-ruby
16
- requirement: !ruby/object:Gem::Requirement
17
+
18
+ date: 2013-08-02 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rdoc
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
17
24
  none: false
18
- requirements:
19
- - - ~>
20
- - !ruby/object:Gem::Version
21
- version: 0.6.3
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 63
29
+ segments:
30
+ - 4
31
+ - 0
32
+ - 0
33
+ version: 4.0.0
22
34
  type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: mortar-api-ruby
23
38
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
39
+ requirement: &id002 !ruby/object:Gem::Requirement
25
40
  none: false
26
- requirements:
41
+ requirements:
27
42
  - - ~>
28
- - !ruby/object:Gem::Version
43
+ - !ruby/object:Gem::Version
44
+ hash: 1
45
+ segments:
46
+ - 0
47
+ - 6
48
+ - 3
29
49
  version: 0.6.3
30
- - !ruby/object:Gem::Dependency
31
- name: netrc
32
- requirement: !ruby/object:Gem::Requirement
33
- none: false
34
- requirements:
35
- - - ~>
36
- - !ruby/object:Gem::Version
37
- version: '0.7'
38
50
  type: :runtime
51
+ version_requirements: *id002
52
+ - !ruby/object:Gem::Dependency
53
+ name: netrc
39
54
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
55
+ requirement: &id003 !ruby/object:Gem::Requirement
41
56
  none: false
42
- requirements:
57
+ requirements:
43
58
  - - ~>
44
- - !ruby/object:Gem::Version
45
- version: '0.7'
46
- - !ruby/object:Gem::Dependency
47
- name: launchy
48
- requirement: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - ~>
52
- - !ruby/object:Gem::Version
53
- version: '2.1'
59
+ - !ruby/object:Gem::Version
60
+ hash: 5
61
+ segments:
62
+ - 0
63
+ - 7
64
+ version: "0.7"
54
65
  type: :runtime
66
+ version_requirements: *id003
67
+ - !ruby/object:Gem::Dependency
68
+ name: launchy
55
69
  prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
70
+ requirement: &id004 !ruby/object:Gem::Requirement
57
71
  none: false
58
- requirements:
72
+ requirements:
59
73
  - - ~>
60
- - !ruby/object:Gem::Version
61
- version: '2.1'
62
- - !ruby/object:Gem::Dependency
74
+ - !ruby/object:Gem::Version
75
+ hash: 1
76
+ segments:
77
+ - 2
78
+ - 1
79
+ version: "2.1"
80
+ type: :runtime
81
+ version_requirements: *id004
82
+ - !ruby/object:Gem::Dependency
63
83
  name: excon
64
- requirement: !ruby/object:Gem::Requirement
65
- none: false
66
- requirements:
67
- - - ~>
68
- - !ruby/object:Gem::Version
69
- version: '0.15'
70
- type: :development
71
84
  prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
85
+ requirement: &id005 !ruby/object:Gem::Requirement
73
86
  none: false
74
- requirements:
87
+ requirements:
75
88
  - - ~>
76
- - !ruby/object:Gem::Version
77
- version: '0.15'
78
- - !ruby/object:Gem::Dependency
79
- name: fakefs
80
- requirement: !ruby/object:Gem::Requirement
81
- none: false
82
- requirements:
83
- - - ~>
84
- - !ruby/object:Gem::Version
85
- version: 0.4.2
89
+ - !ruby/object:Gem::Version
90
+ hash: 21
91
+ segments:
92
+ - 0
93
+ - 15
94
+ version: "0.15"
86
95
  type: :development
96
+ version_requirements: *id005
97
+ - !ruby/object:Gem::Dependency
98
+ name: fakefs
87
99
  prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
100
+ requirement: &id006 !ruby/object:Gem::Requirement
89
101
  none: false
90
- requirements:
102
+ requirements:
91
103
  - - ~>
92
- - !ruby/object:Gem::Version
104
+ - !ruby/object:Gem::Version
105
+ hash: 11
106
+ segments:
107
+ - 0
108
+ - 4
109
+ - 2
93
110
  version: 0.4.2
94
- - !ruby/object:Gem::Dependency
95
- name: gem-release
96
- requirement: !ruby/object:Gem::Requirement
97
- none: false
98
- requirements:
99
- - - ! '>='
100
- - !ruby/object:Gem::Version
101
- version: '0'
102
111
  type: :development
112
+ version_requirements: *id006
113
+ - !ruby/object:Gem::Dependency
114
+ name: gem-release
103
115
  prerelease: false
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: rake
112
- requirement: !ruby/object:Gem::Requirement
116
+ requirement: &id007 !ruby/object:Gem::Requirement
113
117
  none: false
114
- requirements:
115
- - - ! '>='
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ hash: 3
122
+ segments:
123
+ - 0
124
+ version: "0"
118
125
  type: :development
126
+ version_requirements: *id007
127
+ - !ruby/object:Gem::Dependency
128
+ name: rake
119
129
  prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
- requirements:
123
- - - ! '>='
124
- - !ruby/object:Gem::Version
125
- version: '0'
126
- - !ruby/object:Gem::Dependency
127
- name: rr
128
- requirement: !ruby/object:Gem::Requirement
130
+ requirement: &id008 !ruby/object:Gem::Requirement
129
131
  none: false
130
- requirements:
131
- - - ! '>='
132
- - !ruby/object:Gem::Version
133
- version: '0'
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ hash: 3
136
+ segments:
137
+ - 0
138
+ version: "0"
134
139
  type: :development
140
+ version_requirements: *id008
141
+ - !ruby/object:Gem::Dependency
142
+ name: rr
135
143
  prerelease: false
136
- version_requirements: !ruby/object:Gem::Requirement
144
+ requirement: &id009 !ruby/object:Gem::Requirement
137
145
  none: false
138
- requirements:
139
- - - ! '>='
140
- - !ruby/object:Gem::Version
141
- version: '0'
142
- - !ruby/object:Gem::Dependency
143
- name: rspec
144
- requirement: !ruby/object:Gem::Requirement
145
- none: false
146
- requirements:
147
- - - ! '>='
148
- - !ruby/object:Gem::Version
149
- version: '0'
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ hash: 3
150
+ segments:
151
+ - 0
152
+ version: "0"
150
153
  type: :development
154
+ version_requirements: *id009
155
+ - !ruby/object:Gem::Dependency
156
+ name: rspec
151
157
  prerelease: false
152
- version_requirements: !ruby/object:Gem::Requirement
158
+ requirement: &id010 !ruby/object:Gem::Requirement
153
159
  none: false
154
- requirements:
155
- - - ! '>='
156
- - !ruby/object:Gem::Version
157
- version: '0'
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ hash: 3
164
+ segments:
165
+ - 0
166
+ version: "0"
167
+ type: :development
168
+ version_requirements: *id010
158
169
  description: Client library and command-line tool to interact with the Mortar service.
159
170
  email: support@mortardata.com
160
- executables:
171
+ executables:
161
172
  - mortar
162
173
  extensions: []
174
+
163
175
  extra_rdoc_files: []
164
- files:
176
+
177
+ files:
165
178
  - README.md
166
179
  - bin/mortar
167
180
  - css/illustrate.css
@@ -192,6 +205,7 @@ files:
192
205
  - lib/mortar/command/validate.rb
193
206
  - lib/mortar/command/version.rb
194
207
  - lib/mortar/errors.rb
208
+ - lib/mortar/generators/characterize_generator.rb
195
209
  - lib/mortar/generators/controlscript_generator.rb
196
210
  - lib/mortar/generators/generator_base.rb
197
211
  - lib/mortar/generators/macro_generator.rb
@@ -208,22 +222,37 @@ files:
208
222
  - lib/mortar/local/python.rb
209
223
  - lib/mortar/plugin.rb
210
224
  - lib/mortar/project.rb
225
+ - lib/mortar/templates/characterize/README.md
226
+ - lib/mortar/templates/characterize/controlscripts/lib/__init__.py
227
+ - lib/mortar/templates/characterize/controlscripts/lib/characterize_control.py
228
+ - lib/mortar/templates/characterize/fixtures/gitkeep
229
+ - lib/mortar/templates/characterize/gitignore
230
+ - lib/mortar/templates/characterize/macros/characterize_macro.pig
231
+ - lib/mortar/templates/characterize/macros/gitkeep
232
+ - lib/mortar/templates/characterize/pigscripts/characterize.pig
233
+ - lib/mortar/templates/characterize/pigscripts/pigscript.pig
234
+ - lib/mortar/templates/characterize/udfs/java/gitkeep
235
+ - lib/mortar/templates/characterize/udfs/jython/gitkeep
236
+ - lib/mortar/templates/characterize/udfs/jython/top_5_tuple.py
237
+ - lib/mortar/templates/characterize/udfs/python/python_udf.py
238
+ - lib/mortar/templates/characterize/vendor/controlscripts/lib/__init__.py
239
+ - lib/mortar/templates/characterize/vendor/macros/gitkeep
240
+ - lib/mortar/templates/characterize/vendor/pigscripts/gitkeep
241
+ - lib/mortar/templates/characterize/vendor/udfs/java/gitkeep
242
+ - lib/mortar/templates/characterize/vendor/udfs/jython/gitkeep
243
+ - lib/mortar/templates/characterize/vendor/udfs/python/gitkeep
211
244
  - lib/mortar/templates/controlscript/controlscript.py
212
245
  - lib/mortar/templates/macro/macro.pig
213
246
  - lib/mortar/templates/pigscript/pigscript.pig
214
247
  - lib/mortar/templates/pigscript/python_udf.py
215
248
  - lib/mortar/templates/project/README.md
216
249
  - lib/mortar/templates/project/controlscripts/lib/__init__.py
217
- - lib/mortar/templates/project/controlscripts/lib/characterize_control.py
218
250
  - lib/mortar/templates/project/fixtures/gitkeep
219
251
  - lib/mortar/templates/project/gitignore
220
- - lib/mortar/templates/project/macros/characterize_macro.pig
221
252
  - lib/mortar/templates/project/macros/gitkeep
222
- - lib/mortar/templates/project/pigscripts/characterize.pig
223
253
  - lib/mortar/templates/project/pigscripts/pigscript.pig
224
254
  - lib/mortar/templates/project/udfs/java/gitkeep
225
255
  - lib/mortar/templates/project/udfs/jython/gitkeep
226
- - lib/mortar/templates/project/udfs/jython/top_5_tuple.py
227
256
  - lib/mortar/templates/project/udfs/python/python_udf.py
228
257
  - lib/mortar/templates/project/vendor/controlscripts/lib/__init__.py
229
258
  - lib/mortar/templates/project/vendor/macros/gitkeep
@@ -268,26 +297,38 @@ files:
268
297
  - spec/support/display_message_matcher.rb
269
298
  homepage: http://mortardata.com/
270
299
  licenses: []
300
+
271
301
  post_install_message:
272
302
  rdoc_options: []
273
- require_paths:
303
+
304
+ require_paths:
274
305
  - lib
275
- required_ruby_version: !ruby/object:Gem::Requirement
306
+ required_ruby_version: !ruby/object:Gem::Requirement
276
307
  none: false
277
- requirements:
278
- - - ! '>='
279
- - !ruby/object:Gem::Version
308
+ requirements:
309
+ - - ">="
310
+ - !ruby/object:Gem::Version
311
+ hash: 57
312
+ segments:
313
+ - 1
314
+ - 8
315
+ - 7
280
316
  version: 1.8.7
281
- required_rubygems_version: !ruby/object:Gem::Requirement
317
+ required_rubygems_version: !ruby/object:Gem::Requirement
282
318
  none: false
283
- requirements:
284
- - - ! '>='
285
- - !ruby/object:Gem::Version
286
- version: '0'
319
+ requirements:
320
+ - - ">="
321
+ - !ruby/object:Gem::Version
322
+ hash: 3
323
+ segments:
324
+ - 0
325
+ version: "0"
287
326
  requirements: []
327
+
288
328
  rubyforge_project:
289
- rubygems_version: 1.8.23
329
+ rubygems_version: 1.8.25
290
330
  signing_key:
291
331
  specification_version: 3
292
332
  summary: Client library and CLI to interact with the Mortar service.
293
333
  test_files: []
334
+