mortar 0.6.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,70 @@
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/local/installutil'
20
+ require 'launchy'
21
+
22
+ module Mortar::Local
23
+ describe InstallUtil do
24
+ include FakeFS::SpecHelpers
25
+
26
+ class InstallUtilClass
27
+ end
28
+
29
+ before(:each) do
30
+ @installutil = InstallUtilClass.new
31
+ @installutil.extend(Mortar::Local::InstallUtil)
32
+ end
33
+
34
+ context("install_date") do
35
+
36
+ it "nil if never installed" do
37
+ expect(@installutil.install_date('foo')).to be_nil
38
+ end
39
+
40
+ it "contents of file if present, converted to int" do
41
+ install_file_path = @installutil.install_file_for("foo")
42
+ install_date = 123456
43
+ FakeFS do
44
+ FileUtils.mkdir_p(File.dirname(install_file_path))
45
+ File.open(install_file_path, "w") do |file|
46
+ file.puts(install_date.to_s)
47
+ end
48
+ expect(@installutil.install_date('foo')).to eq(install_date)
49
+ end
50
+ end
51
+
52
+ end
53
+
54
+ context("note-install") do
55
+
56
+ it "creates a file in the directory with the current time" do
57
+ install_file_path = @installutil.install_file_for("foo")
58
+ current_date = 123456
59
+ stub(Time).now.returns(current_date)
60
+ FakeFS do
61
+ FileUtils.mkdir_p(File.dirname(install_file_path))
62
+ @installutil.note_install("foo")
63
+ expect(File.exists?(install_file_path)).to be_true
64
+ end
65
+ end
66
+
67
+ end
68
+
69
+ end
70
+ end
@@ -0,0 +1,62 @@
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/local/java'
20
+ require 'launchy'
21
+
22
+
23
+ class Mortar::Local::Java
24
+ attr_reader :command
25
+ end
26
+
27
+
28
+ module Mortar::Local
29
+ describe Java do
30
+
31
+ context("check_install") do
32
+
33
+ it "sets java command if JAVA_HOME is present and exists" do
34
+ java_home = "/foo/bar/jvm"
35
+ ENV['JAVA_HOME'] = java_home
36
+ j = Mortar::Local::Java.new
37
+ FakeFS do
38
+ FileUtils.mkdir_p(java_home + "/bin")
39
+ FileUtils.touch(java_home + "/bin/java")
40
+ j.check_install
41
+ expect(j.command).to eq("/foo/bar/jvm/bin/java")
42
+ end
43
+ end
44
+
45
+ it "calls java_home if present and no JAVA_HOME" do
46
+ ENV.delete('JAVA_HOME')
47
+ j = Mortar::Local::Java.new
48
+ exec_path = "/usr/libexec/java_home"
49
+ FakeFS do
50
+ FileUtils.mkdir_p(File.dirname(exec_path))
51
+ FileUtils.touch(exec_path)
52
+ mock(j).run_java_home.returns("/foo/bar/other-jvm")
53
+ j.check_install
54
+ expect(j.command).to eq("/foo/bar/other-jvm/bin/java")
55
+ end
56
+ end
57
+
58
+ end
59
+
60
+
61
+ end
62
+ end
@@ -0,0 +1,157 @@
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/local/pig'
20
+ require 'launchy'
21
+
22
+
23
+ class Mortar::Local::Pig
24
+ attr_reader :command
25
+ end
26
+
27
+
28
+ module Mortar::Local
29
+ describe Pig do
30
+
31
+ context("install") do
32
+
33
+ it "does nothing if told not to" do
34
+ pig = Mortar::Local::Pig.new
35
+ mock(pig).should_do_pig_install?.returns(false)
36
+ FakeFS do
37
+ FileUtils.mkdir_p(File.dirname(pig.local_install_directory))
38
+ FileUtils.rm_rf(pig.local_install_directory, :force => true)
39
+ pig.install
40
+ expect(File.exists?(pig.local_install_directory)).to be_false
41
+ end
42
+ end
43
+
44
+ it "handles necessary installation steps" do
45
+ # creates the parent directory, downloads the tgz, extracts it,
46
+ # chmods bin/pig, removes tgz, and notes the installation
47
+ FakeFS do
48
+ pig = Mortar::Local::Pig.new
49
+ local_pig_archive = File.join(pig.local_install_directory, pig.pig_archive_file)
50
+ mock(pig).should_do_pig_install?.returns(true)
51
+ mock(pig).download_file(pig.pig_archive_url, pig.local_install_directory) do
52
+ # Simulate the tgz file being downloaded, this should be deleted
53
+ # before the method finishes executing
54
+ FileUtils.touch(local_pig_archive)
55
+ end
56
+ mock(pig).extract_tgz(local_pig_archive, pig.local_install_directory)
57
+ mock(pig).note_install("pig")
58
+ begin
59
+ previous_stdout, $stdout = $stdout, StringIO.new
60
+ pig.install
61
+ ensure
62
+ $stdout = previous_stdout
63
+ end
64
+ expect(File.exists?(local_pig_archive)).to be_false
65
+ end
66
+ end
67
+
68
+ end
69
+
70
+ context "show_illustrate_output" do
71
+
72
+ it "takes a path to a json file, renders the html template, and opens it" do
73
+ fake_illustrate_data = {
74
+ "tables" => [
75
+ {
76
+ "Op" => "LOStore",
77
+ "alias" => "some_relation",
78
+ "notices" => ["things are fouled up", "no just kidding, it's fine"],
79
+ "fields" => ["person_id", "first_name", "last_name"],
80
+ "data" => [
81
+ ["1", "mike", "jones"],
82
+ ["2", "cleopatra", "jones"],
83
+ ["3", "john paul", "jones"],
84
+ ],
85
+ },
86
+ ],
87
+ "udf_output" => "hey, I'm a udf",
88
+ }
89
+ pig = Mortar::Local::Pig.new
90
+ template_location = pig.resource_locations["illustrate_template"]
91
+ template_contents = File.read(template_location)
92
+ output_path = pig.resource_destinations["illustrate_html"]
93
+ mock(pig).decode_illustrate_input_file("foo/bar/file.json").returns(fake_illustrate_data)
94
+
95
+ # TODO: test that these files are copied
96
+ ["illustrate_css",
97
+ "jquery", "jquery_transit", "jquery_stylestack",
98
+ "mortar_table", "zeroclipboard", "zeroclipboard_swf"].each { |resource|
99
+ mock(pig).copy_if_not_present_at_dest.with(
100
+ File.expand_path(pig.resource_locations[resource]),
101
+ pig.resource_destinations[resource]
102
+ ).returns(nil)
103
+ }
104
+
105
+ mock(Launchy).open(File.expand_path(output_path))
106
+ FakeFS do
107
+ FileUtils.mkdir_p(File.dirname(template_location))
108
+ File.open(template_location, 'w') { |f| f.write(template_contents) }
109
+ begin
110
+ previous_stdout, $stdout = $stdout, StringIO.new
111
+ pig.show_illustrate_output("foo/bar/file.json")
112
+ ensure
113
+ $stdout = previous_stdout
114
+ end
115
+ expect(File.exists?(output_path)).to be_true
116
+ end
117
+ end
118
+
119
+ end
120
+
121
+ context "decode_illustrate_input_file" do
122
+
123
+ it "decodes the contents of the file" do
124
+ json = %{[{"alias": "some_relation", "Op": "LOStore"}]}
125
+ expected_data = [ {
126
+ "Op" => "LOStore",
127
+ "alias" => "some_relation",
128
+ }
129
+ ]
130
+ pig = Mortar::Local::Pig.new
131
+ illustrate_output_file = 'illustrate-output.json'
132
+ FakeFS do
133
+ File.open(illustrate_output_file, 'w') { |f| f.write(json) }
134
+ actual_data = pig.decode_illustrate_input_file(illustrate_output_file)
135
+ expect(actual_data).to eq(expected_data)
136
+ end
137
+ end
138
+
139
+ it "handles invalid unicode characters" do
140
+ json = %{{"tables": [ "hi \255"], "udf_output": [ ]}}
141
+ expected_data = {
142
+ 'tables' => ['hi '],
143
+ 'udf_output' => [],
144
+ }
145
+ pig = Mortar::Local::Pig.new
146
+ illustrate_output_file = 'illustrate-output.json'
147
+ FakeFS do
148
+ File.open(illustrate_output_file, 'w') { |f| f.write(json) }
149
+ actual_data = pig.decode_illustrate_input_file(illustrate_output_file)
150
+ expect(actual_data).to eq(expected_data)
151
+ end
152
+ end
153
+
154
+ end
155
+
156
+ end
157
+ end
@@ -32,6 +32,17 @@ module Mortar
32
32
  end
33
33
  end
34
34
 
35
+ context "controlscripts" do
36
+
37
+ it "does not raise an error when unable to find controlscripts dir" do
38
+ with_blank_project do |p|
39
+ FileUtils.rm_rf p.controlscripts_path
40
+ lambda { p.controlscripts_path }.should_not raise_error(Mortar::Project::ProjectError)
41
+ end
42
+ end
43
+
44
+ end
45
+
35
46
  context "pigscripts" do
36
47
 
37
48
  it "raise when unable to find pigscripts dir" do
data/spec/spec_helper.rb CHANGED
@@ -160,6 +160,7 @@ def with_blank_project(&block)
160
160
  FileUtils.mkdir_p(project_path)
161
161
 
162
162
  # setup project subdirectories
163
+ FileUtils.mkdir_p(File.join(project_path, "controlscripts"))
163
164
  FileUtils.mkdir_p(File.join(project_path, "pigscripts"))
164
165
  FileUtils.mkdir_p(File.join(project_path, "macros"))
165
166
 
metadata CHANGED
@@ -1,167 +1,164 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: mortar
3
- version: !ruby/object:Gem::Version
4
- version: 0.6.2
3
+ version: !ruby/object:Gem::Version
4
+ hash: 3
5
5
  prerelease:
6
+ segments:
7
+ - 0
8
+ - 7
9
+ - 0
10
+ version: 0.7.0
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-03-04 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
17
+
18
+ date: 2013-03-14 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
15
21
  name: mortar-api-ruby
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ~>
20
- - !ruby/object:Gem::Version
21
- version: 0.5.2
22
- type: :runtime
23
22
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ~>
28
- - !ruby/object:Gem::Version
29
- version: 0.5.2
30
- - !ruby/object:Gem::Dependency
31
- name: netrc
32
- requirement: !ruby/object:Gem::Requirement
23
+ requirement: &id001 !ruby/object:Gem::Requirement
33
24
  none: false
34
- requirements:
25
+ requirements:
35
26
  - - ~>
36
- - !ruby/object:Gem::Version
37
- version: '0.7'
27
+ - !ruby/object:Gem::Version
28
+ hash: 7
29
+ segments:
30
+ - 0
31
+ - 6
32
+ - 0
33
+ version: 0.6.0
38
34
  type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: netrc
39
38
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
39
+ requirement: &id002 !ruby/object:Gem::Requirement
41
40
  none: false
42
- requirements:
41
+ requirements:
43
42
  - - ~>
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'
43
+ - !ruby/object:Gem::Version
44
+ hash: 5
45
+ segments:
46
+ - 0
47
+ - 7
48
+ version: "0.7"
54
49
  type: :runtime
50
+ version_requirements: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ name: launchy
55
53
  prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
54
+ requirement: &id003 !ruby/object:Gem::Requirement
57
55
  none: false
58
- requirements:
56
+ requirements:
59
57
  - - ~>
60
- - !ruby/object:Gem::Version
61
- version: '2.1'
62
- - !ruby/object:Gem::Dependency
58
+ - !ruby/object:Gem::Version
59
+ hash: 1
60
+ segments:
61
+ - 2
62
+ - 1
63
+ version: "2.1"
64
+ type: :runtime
65
+ version_requirements: *id003
66
+ - !ruby/object:Gem::Dependency
63
67
  name: excon
64
- requirement: !ruby/object:Gem::Requirement
68
+ prerelease: false
69
+ requirement: &id004 !ruby/object:Gem::Requirement
65
70
  none: false
66
- requirements:
71
+ requirements:
67
72
  - - ~>
68
- - !ruby/object:Gem::Version
69
- version: '0.15'
73
+ - !ruby/object:Gem::Version
74
+ hash: 21
75
+ segments:
76
+ - 0
77
+ - 15
78
+ version: "0.15"
70
79
  type: :development
80
+ version_requirements: *id004
81
+ - !ruby/object:Gem::Dependency
82
+ name: fakefs
71
83
  prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
84
+ requirement: &id005 !ruby/object:Gem::Requirement
73
85
  none: false
74
- requirements:
86
+ requirements:
75
87
  - - ~>
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'
88
+ - !ruby/object:Gem::Version
89
+ hash: 11
90
+ segments:
91
+ - 0
92
+ - 4
93
+ - 2
94
+ version: 0.4.2
86
95
  type: :development
87
- prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
91
- - - ! '>='
92
- - !ruby/object:Gem::Version
93
- version: '0'
94
- - !ruby/object:Gem::Dependency
96
+ version_requirements: *id005
97
+ - !ruby/object:Gem::Dependency
95
98
  name: gem-release
96
- requirement: !ruby/object:Gem::Requirement
97
- none: false
98
- requirements:
99
- - - ! '>='
100
- - !ruby/object:Gem::Version
101
- version: '0'
102
- type: :development
103
99
  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
100
+ requirement: &id006 !ruby/object:Gem::Requirement
113
101
  none: false
114
- requirements:
115
- - - ! '>='
116
- - !ruby/object:Gem::Version
117
- version: '0'
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ hash: 3
106
+ segments:
107
+ - 0
108
+ version: "0"
118
109
  type: :development
110
+ version_requirements: *id006
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake
119
113
  prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
114
+ requirement: &id007 !ruby/object:Gem::Requirement
121
115
  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
129
- none: false
130
- requirements:
131
- - - ! '>='
132
- - !ruby/object:Gem::Version
133
- version: '0'
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ hash: 3
120
+ segments:
121
+ - 0
122
+ version: "0"
134
123
  type: :development
124
+ version_requirements: *id007
125
+ - !ruby/object:Gem::Dependency
126
+ name: rr
135
127
  prerelease: false
136
- version_requirements: !ruby/object:Gem::Requirement
128
+ requirement: &id008 !ruby/object:Gem::Requirement
137
129
  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'
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ hash: 3
134
+ segments:
135
+ - 0
136
+ version: "0"
150
137
  type: :development
138
+ version_requirements: *id008
139
+ - !ruby/object:Gem::Dependency
140
+ name: rspec
151
141
  prerelease: false
152
- version_requirements: !ruby/object:Gem::Requirement
142
+ requirement: &id009 !ruby/object:Gem::Requirement
153
143
  none: false
154
- requirements:
155
- - - ! '>='
156
- - !ruby/object:Gem::Version
157
- version: '0'
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ hash: 3
148
+ segments:
149
+ - 0
150
+ version: "0"
151
+ type: :development
152
+ version_requirements: *id009
158
153
  description: Client library and command-line tool to interact with the Mortar service.
159
154
  email: support@mortardata.com
160
- executables:
155
+ executables:
161
156
  - mortar
162
157
  extensions: []
158
+
163
159
  extra_rdoc_files: []
164
- files:
160
+
161
+ files:
165
162
  - README.md
166
163
  - bin/mortar
167
164
  - lib/mortar.rb
@@ -177,6 +174,7 @@ files:
177
174
  - lib/mortar/command/help.rb
178
175
  - lib/mortar/command/illustrate.rb
179
176
  - lib/mortar/command/jobs.rb
177
+ - lib/mortar/command/local.rb
180
178
  - lib/mortar/command/pigscripts.rb
181
179
  - lib/mortar/command/projects.rb
182
180
  - lib/mortar/command/validate.rb
@@ -189,6 +187,11 @@ files:
189
187
  - lib/mortar/generators/udf_generator.rb
190
188
  - lib/mortar/git.rb
191
189
  - lib/mortar/helpers.rb
190
+ - lib/mortar/local/controller.rb
191
+ - lib/mortar/local/installutil.rb
192
+ - lib/mortar/local/java.rb
193
+ - lib/mortar/local/pig.rb
194
+ - lib/mortar/local/python.rb
192
195
  - lib/mortar/project.rb
193
196
  - lib/mortar/templates/macro/macro.pig
194
197
  - lib/mortar/templates/pigscript/pigscript.pig
@@ -199,6 +202,8 @@ files:
199
202
  - lib/mortar/templates/project/macros/gitkeep
200
203
  - lib/mortar/templates/project/pigscripts/pigscript.pig
201
204
  - lib/mortar/templates/project/udfs/python/python_udf.py
205
+ - lib/mortar/templates/report/illustrate-report.html
206
+ - lib/mortar/templates/script/runpig.sh
202
207
  - lib/mortar/templates/udf/python_udf.py
203
208
  - lib/mortar/updater.rb
204
209
  - lib/mortar/version.rb
@@ -213,12 +218,17 @@ files:
213
218
  - spec/mortar/command/generate_spec.rb
214
219
  - spec/mortar/command/illustrate_spec.rb
215
220
  - spec/mortar/command/jobs_spec.rb
221
+ - spec/mortar/command/local_spec.rb
216
222
  - spec/mortar/command/pigscripts_spec.rb
217
223
  - spec/mortar/command/projects_spec.rb
218
224
  - spec/mortar/command/validate_spec.rb
219
225
  - spec/mortar/command_spec.rb
220
226
  - spec/mortar/git_spec.rb
221
227
  - spec/mortar/helpers_spec.rb
228
+ - spec/mortar/local/controller_spec.rb
229
+ - spec/mortar/local/installutil_spec.rb
230
+ - spec/mortar/local/java_spec.rb
231
+ - spec/mortar/local/pig_spec.rb
222
232
  - spec/mortar/project_spec.rb
223
233
  - spec/mortar/updater_spec.rb
224
234
  - spec/spec.opts
@@ -226,26 +236,38 @@ files:
226
236
  - spec/support/display_message_matcher.rb
227
237
  homepage: http://mortardata.com/
228
238
  licenses: []
239
+
229
240
  post_install_message:
230
241
  rdoc_options: []
231
- require_paths:
242
+
243
+ require_paths:
232
244
  - lib
233
- required_ruby_version: !ruby/object:Gem::Requirement
245
+ required_ruby_version: !ruby/object:Gem::Requirement
234
246
  none: false
235
- requirements:
236
- - - ! '>='
237
- - !ruby/object:Gem::Version
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ hash: 57
251
+ segments:
252
+ - 1
253
+ - 8
254
+ - 7
238
255
  version: 1.8.7
239
- required_rubygems_version: !ruby/object:Gem::Requirement
256
+ required_rubygems_version: !ruby/object:Gem::Requirement
240
257
  none: false
241
- requirements:
242
- - - ! '>='
243
- - !ruby/object:Gem::Version
244
- version: '0'
258
+ requirements:
259
+ - - ">="
260
+ - !ruby/object:Gem::Version
261
+ hash: 3
262
+ segments:
263
+ - 0
264
+ version: "0"
245
265
  requirements: []
266
+
246
267
  rubyforge_project:
247
268
  rubygems_version: 1.8.24
248
269
  signing_key:
249
270
  specification_version: 3
250
271
  summary: Client library and CLI to interact with the Mortar service.
251
272
  test_files: []
273
+