MuranoCLI 2.1.1 → 2.2.1

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: 81958886e83634f8569dff4b70ecf0da208fb766
4
- data.tar.gz: 87ff30809fa161c0bda2195d4126853ad2f2c4bf
3
+ metadata.gz: b78d9ce452b2b23947f59e64fc31dc8d9b8b577e
4
+ data.tar.gz: 87bc747d1e7e6cb6e053bfaa6880e81c537abf85
5
5
  SHA512:
6
- metadata.gz: b87848e244f4b440ead85a6bed2b44bd50158006070896ab6aff25049b9815653ca5ace4140e7fff85aa8d9956cc680ac1657cee417990741c927c920c0551d6
7
- data.tar.gz: b1e9d33bf529c1c95210057a559afeb6a9db98ac506eb4b43aab6bd8d1bf8ca43f3b606c8a901b1ac35b35ef2aa16b9532e9e44eddfa85dadb407e537b03d1b4
6
+ metadata.gz: 063e8c71e99d835b8432a9616d660a98dea0610e5d8e42f4903acf723b6115fc99c004afc9bf8476854f6d6b0c37b7c3ff6c95b09e48b2b62a56e45f6568867d
7
+ data.tar.gz: 9f380017ea3d6c31b411efe6a5cd55413cd3e9d3415a17131c99b231e872ca9189b7a3ebea04e0b598fecbdd3607b4bfaee1e465b03bffe0e63d4f7c877e4b2e
data/README.markdown CHANGED
@@ -39,8 +39,8 @@ There are a few steps and pieces to getting a solution with a product up and
39
39
  running in Murano. Here is the list.
40
40
 
41
41
  - Pick a business: `murano business list`
42
- If this is the first time you've run `murano` it will ask for your Murano username
43
- and password.
42
+ If this is the first time you've run `murano` it will ask for your Murano username
43
+ and password.
44
44
  - Set it: `murano config business.id ZZZZZZZZZ`
45
45
  - Create a product: `murano product create myawesomeproduct --save`
46
46
  - Add resource aliases to specs/resources.yaml
@@ -58,24 +58,24 @@ Then deploy with `murano syncup`
58
58
 
59
59
  When upgrading from a 1.\* version to a 2.0, you should uninstall the old versions
60
60
  first.
61
- ```
62
- > gem uninstall MuranoCLI
61
+ ```sh
62
+ > gem uninstall MuranoCLI MrMurano
63
63
  ```
64
64
 
65
65
  And then install:
66
66
 
67
- ```
67
+ ```sh
68
68
  > gem install MuranoCLI
69
69
  ```
70
70
  Or
71
- ```
71
+ ```sh
72
72
  > gem update MuranoCLI
73
73
  ```
74
74
 
75
75
  You will likely need to be root for the above commands. If you would rather not
76
76
  install as root, you can install gems in the user directory.
77
77
 
78
- ```
78
+ ```sh
79
79
  > gem install MuranoCLI --user-install
80
80
  ```
81
81
 
@@ -128,12 +128,12 @@ CORS options inline.
128
128
 
129
129
  ```yaml
130
130
  routes:
131
- cors: my_cors_file.json
131
+ cors: my_cors_file.json
132
132
  ```
133
133
  OR:
134
134
  ```yaml
135
135
  routes:
136
- cors: {"origin": true}
136
+ cors: {"origin": true}
137
137
  ```
138
138
 
139
139
  Then use `murano cors set` to push these options up to your solution.
@@ -191,12 +191,12 @@ could be:
191
191
  --#EVENT device datapoint
192
192
  local stamped = nil
193
193
  if data.api == "record" then
194
- stamped = tostring(data.value[1]) .. 's'
194
+ stamped = tostring(data.value[1]) .. 's'
195
195
  end
196
196
  Tsdb.write{
197
- tags = {sn=data.device_sn},
198
- metrics = {[data.alias] = tonumber(data.value[2])},
199
- ts = stamped
197
+ tags = {sn=data.device_sn},
198
+ metrics = {[data.alias] = tonumber(data.value[2])},
199
+ ts = stamped
200
200
  }
201
201
  ```
202
202
 
@@ -211,7 +211,7 @@ and `.murano.prod`. Then write the `.env` file to point at the system you're
211
211
  currently working on.
212
212
 
213
213
  The files for this are then:
214
- ```
214
+ ```sh
215
215
  cat >> .murano.dev <<EOF
216
216
  [solution]
217
217
  id=AAAAAAAA
@@ -295,9 +295,9 @@ the shell and are for testing the user facing components. A subset of the comma
295
295
  tests work with the live Murano servers (`--tag needs_password`).
296
296
 
297
297
  To use the live tests, the following environment variables need to be set:
298
- - `MURANO_USER` : User name to log into Murano with
299
- - `MURANO_PASSWORD` : Password for that user
300
- - `MURANO_BUSINESS` : Business id to run tests within.
298
+ - `MURANO_CONFIGFILE` : A Config with the user.name, business.id, and net.host for
299
+ the intergration tests.
300
+ - `MURANO_PASSWORD` : Password for the user.name above.
301
301
 
302
302
  A free account on Murano is sufficient for these tests.
303
303
 
data/Rakefile CHANGED
@@ -23,6 +23,20 @@ task :echo do
23
23
  puts builtGem
24
24
  end
25
25
 
26
+ desc "display remind of how to release"
27
+ task :release_reminder do
28
+ puts <<EOR
29
+ git flow release start <newversion>
30
+ gvim lib/MrMurano/version.rb
31
+ git commit -a -m 'version bump'
32
+ git flow release finish <newversion>
33
+ # When editing message for tag, add release notes.
34
+ rake git:all
35
+ # Wait for all tests to complete.
36
+ # if all passed: rake gemit
37
+ EOR
38
+ end
39
+
26
40
  desc "Prints a cmd to test this in another directory"
27
41
  task :testwith do
28
42
  pwd=Dir.pwd.sub(Dir.home, '~')
@@ -33,26 +47,24 @@ desc 'Run RSpec'
33
47
  task :rspec do
34
48
  Dir.mkdir("report") unless File.directory?("report")
35
49
  rv=RUBY_VERSION.gsub(/\./,'_')
36
- sh %{rspec --format html --out report/index-#{rv}.html --format progress}
50
+ sh %{rspec --format html --out report/index-#{rv}.html --format documentation}
37
51
  end
38
52
  task :test => [:test_clean_up, :rspec]
39
53
 
40
54
  desc "Clean out junk from prior hot tests"
41
55
  task :test_clean_up do
42
- if not ENV['MURANO_USER'].nil? and
43
- not ENV['MURANO_BUSINESS'].nil? and
44
- not ENV['MURANO_PASSWORD'].nil? then
56
+ if not ENV['MURANO_CONFIGFILE'].nil? then
45
57
 
46
- ids = `ruby -Ilib bin/murano product list --idonly -c "user.name=#{ENV['MURANO_USER']}" -c net.host=bizapi.hosted.exosite.io -c business.id=#{ENV['MURANO_BUSINESS']}`.chomp
58
+ ids = `ruby -Ilib bin/murano product list --idonly`.chomp
47
59
  puts "Found prodcuts #{ids}; deleteing"
48
60
  ids.split.each do |id|
49
- sh %{ruby -Ilib bin/murano product delete #{id} -c user.name=#{ENV['MURANO_USER']} -c net.host=bizapi.hosted.exosite.io -c business.id=#{ENV['MURANO_BUSINESS']}}
61
+ sh %{ruby -Ilib bin/murano product delete #{id}}
50
62
  end
51
63
 
52
- ids = `ruby -Ilib bin/murano solution list --idonly -c user.name=#{ENV['MURANO_USER']} -c net.host=bizapi.hosted.exosite.io -c business.id=#{ENV['MURANO_BUSINESS']}`.chomp
64
+ ids = `ruby -Ilib bin/murano solution list --idonly`.chomp
53
65
  puts "Found solutions #{ids}; deleteing"
54
66
  ids.split.each do |id|
55
- sh %{ruby -Ilib bin/murano solution delete #{id} -c user.name=#{ENV['MURANO_USER']} -c net.host=bizapi.hosted.exosite.io -c business.id=#{ENV['MURANO_BUSINESS']}}
67
+ sh %{ruby -Ilib bin/murano solution delete #{id}}
56
68
  end
57
69
  end
58
70
  end
@@ -153,7 +165,7 @@ if Gem.win_platform? then
153
165
  task :murano_exe_test => ['murano.exe'] do
154
166
  Dir.mkdir("report") unless File.directory?("report")
155
167
  ENV['CI_MR_EXE'] = '1'
156
- sh %{rspec --format html --out report/murano_exe.html --format progress --tag cmd}
168
+ sh %{rspec --format html --out report/murano_exe.html --format documentation --tag cmd}
157
169
  end
158
170
  task :test => [:murano_exe_test]
159
171
 
data/TODO.taskpaper CHANGED
@@ -3,6 +3,9 @@ Readme:
3
3
  - Look into using VCR for testing. @pri(low)
4
4
 
5
5
  Commands:
6
+ - Add hooks. @done(2017-03-31)
7
+ - Add default options for commands. @done(2017-03-31)
8
+ So you can say to always -V syncup, and nothing else.
6
9
  - Init command. @done(2016-11-28)
7
10
  - Empty sub-commands should return help. @done(2016-11-21)
8
11
  There are a bunch of empty sub-commands that prefix another layer. Such as
@@ -86,13 +89,12 @@ Config:
86
89
  - Think about adding dev,staging,prod system; how would that work? @done(2016-09-16)
87
90
 
88
91
  SyncUpDown:
89
- - Document the hash keys for an item. @pri(high)
92
+ - Document the hash keys for an item. @pri(high) @done(2017-03-30)
90
93
  Also consider turning that hash into a Struct
91
94
  - Allow specifying local files to limit actions to. @done(2017-03-03)
92
95
 
93
96
  SolutionBase:
94
- - All network traffic is serialized. Make some parallel.
95
- This might break some things.
97
+ - All network traffic is serialized. Make some parallel. not doing this. @done(2017-03-30)
96
98
  - Errors from the server should be displayed prettier. @done(2016-09-26)
97
99
  - JSON parse should use symbols for keys. @done(2016-09-01)
98
100
  - Add the --curl verbose option. @done(2016-08-12)
@@ -103,8 +105,7 @@ Windows:
103
105
  - Look into http://ocra.rubyforge.org for building an exec. @pri(high) @done(2016-12-21)
104
106
 
105
107
  Bundles:
106
- - Revisit this idea. Its complexity may not be worth its value.
107
- - Test syncdown behavor.
108
+ - Revisit this idea. Its complexity may not be worth its value. @done(2017-03-30)
108
109
  - Work on design @done(2016-08-09)
109
110
  Thinking of something like VIM bundles. A directory of directories. Each with a
110
111
  manafest file? (maybe) A Bundle is a group of modules, endpoints, static files
data/bin/murano CHANGED
@@ -52,8 +52,8 @@ $project.load
52
52
 
53
53
  # Basic command support is:
54
54
  # - read/write config file in [Project, User, System] (all are optional)
55
- # - Introspection for tab completion.
56
- # - Look for tools in PATH that are +x and "mr-foo..."
55
+ # - TODO: Introspection for tab completion.
56
+ # - TODO: Look for tools in PATH that are +x and "mr-foo..."
57
57
 
58
58
 
59
59
  # Look for plug-ins
@@ -143,7 +143,7 @@ module MrMurano
143
143
  end
144
144
 
145
145
  def new_account(email, name, company="")
146
- post('/key/', {
146
+ post('key/', {
147
147
  :email=>email,
148
148
  :name=>name,
149
149
  :company=>company,
@@ -152,11 +152,11 @@ module MrMurano
152
152
  end
153
153
 
154
154
  def reset_account(email)
155
- post('/key/', { :email=>email, :source=>'reset' })
155
+ post('key/', { :email=>email, :source=>'reset' })
156
156
  end
157
157
 
158
158
  def accept_account(token, password)
159
- post("/key/#{token}", {:password=>password})
159
+ post("key/#{token}", {:password=>password})
160
160
  end
161
161
 
162
162
  def businesses
@@ -165,11 +165,21 @@ module MrMurano
165
165
  end
166
166
 
167
167
  def new_business(name)
168
- post('/business/', {:name=>name})
168
+ post('business/', {:name=>name})
169
169
  end
170
170
 
171
171
  def delete_business(id)
172
- delete("/business/#{id}")
172
+ delete("business/#{id}")
173
+ end
174
+
175
+ def has_projects?(id)
176
+ ret = get("business/#{id}/overview")
177
+ return false unless ret.kind_of? Hash
178
+ return false unless ret.has_key? :tier
179
+ tier = ret[:tier]
180
+ return false unless tier.kind_of? Hash
181
+ return false unless tier.has_key? :enableProjects
182
+ return tier[:enableProjects]
173
183
  end
174
184
 
175
185
  def products
@@ -0,0 +1,52 @@
1
+
2
+ module MrMurano
3
+ class Hooked
4
+ include Verbose
5
+ attr :section
6
+
7
+ def initialize(section)
8
+ @section = section
9
+ end
10
+
11
+ def check_run_pre_hook
12
+ prehook = $cfg["#{section}.pre-hook"]
13
+ return if prehook.nil?
14
+ return if prehook.empty?
15
+ verbose "calling pre-hook: #{prehook}"
16
+ system(prehook)
17
+ end
18
+
19
+ def check_run_post_hook
20
+ posthook = $cfg["#{section}.post-hook"]
21
+ return if posthook.nil?
22
+ return if posthook.empty?
23
+ verbose "calling post-hook: #{posthook}"
24
+ system(posthook)
25
+ end
26
+
27
+ end
28
+ end
29
+
30
+ module Commander
31
+ class Runner
32
+ alias :old_run_active_command :run_active_command
33
+ def run_active_command
34
+ section = active_command.name
35
+ hooked = MrMurano::Hooked.new(section)
36
+ hooked.check_run_pre_hook
37
+
38
+ old_run_active_command
39
+
40
+ hooked.check_run_post_hook
41
+ end
42
+
43
+ alias :old_parse_global_options :parse_global_options
44
+ def parse_global_options
45
+ defopts = ($cfg["#{active_command.name}.options"] or '').split
46
+ @args.push( *defopts )
47
+ old_parse_global_options
48
+ end
49
+ end
50
+ end
51
+
52
+ # vim: set ai et sw=2 ts=2 :
@@ -93,7 +93,7 @@ module MrMurano
93
93
  # Most of these pull into ram. So maybe just go with that. Would guess that
94
94
  # truely large static content is rare, and we can optimize/fix that later.
95
95
 
96
- file = HTTP::FormData::File.new(local.to_s, {:mime_type=>remote[:mime_type]})
96
+ file = HTTP::FormData::File.new(local.to_s, {:content_type=>remote[:mime_type]})
97
97
  form = HTTP::FormData.create(:file=>file)
98
98
  req = Net::HTTP::Put.new(uri)
99
99
  set_def_headers(req)
@@ -10,6 +10,10 @@ module MrMurano
10
10
  def query(query)
11
11
  call(:query, :post, {:sql=>query})
12
12
  end
13
+
14
+ def queries(query)
15
+ call(:queries, :post, {:sql=>query})
16
+ end
13
17
  end
14
18
  end
15
19
 
@@ -17,11 +21,23 @@ command :postgresql do |c|
17
21
  c.syntax = %{murano postgresql <SQL Commands>}
18
22
  c.summary = %{Query the relational database}
19
23
 
24
+ c.option '-f', '--file FILE', %{File of SQL commands}
20
25
  c.option '-o', '--output FILE', %{Download to file instead of STDOUT}
21
26
 
22
27
  c.action do |args,options|
23
28
  pg = MrMurano::Postgresql.new
24
- ret = pg.query args.join(' ')
29
+ if options.file then
30
+ sqls = File.read(options.file)
31
+
32
+ ret = pg.queries sqls
33
+ else
34
+ ret = pg.query args.join(' ')
35
+ end
36
+
37
+ unless ret[:error].nil? then
38
+ pg.error "Returned error: #{ret[:error]}"
39
+ exit 1
40
+ end
25
41
 
26
42
  io=nil
27
43
  if options.output then
@@ -29,6 +45,7 @@ command :postgresql do |c|
29
45
  end
30
46
 
31
47
  pg.outf(ret, io) do |dd, ios|
48
+ dd = dd[:result]
32
49
  pg.tabularize({
33
50
  :headers=>dd[:columns],
34
51
  :rows=>dd[:rows]
@@ -38,4 +55,101 @@ command :postgresql do |c|
38
55
 
39
56
  end
40
57
  end
58
+
59
+ command 'postgresql migrate' do |c|
60
+ c.syntax = %{murano postgresql migrate (up|down) <level>}
61
+ c.summary = %{Run database migration scripts.
62
+
63
+
64
+ The names of the script files must be in the "<level>-<name>-<up|down>.sql"
65
+ format.
66
+
67
+ The current version of the migrations (last <level> ran) will be stored in an
68
+ extra table in your database. (__murano_cli_migrate__)
69
+
70
+ }
71
+
72
+ c.option '--dir DIR', %{Directory where migrations live}
73
+
74
+ c.action do |args,options|
75
+ options.default :dir => File.join($cfg['location.base'], 'sql-migrations')
76
+
77
+ direction = args.shift
78
+ if direction =~ /down/i then
79
+ direction = 'down'
80
+ else
81
+ direction = 'up'
82
+ end
83
+
84
+ want_version = args.first
85
+
86
+ pg = MrMurano::Postgresql.new
87
+
88
+ # get current version of DB.
89
+ ret = pg.queries %{
90
+ CREATE TABLE IF NOT EXISTS __murano_cli_migrate__ (version integer);
91
+ SELECT version FROM __murano_cli_migrate__;
92
+ }.gsub(/^\s+/,'')
93
+ unless ret[:error].nil? then
94
+ pp ret
95
+ exit 1
96
+ end
97
+ pg.debug "create/select: #{ret}"
98
+ current_version = (((((ret[:result] or []).last or {})[:rows] or []).first or []).first or 0).to_i
99
+
100
+ # Get migrations
101
+ migrations = Dir[File.join(options.dir, "*-#{direction}.sql")].sort
102
+ if migrations.empty? then
103
+ pg.error "No migrations to run."
104
+ exit 1
105
+ end
106
+ migrations.reverse! if direction == 'down'
107
+
108
+ if want_version.nil? then
109
+ want_version, _ = File.basename(migrations.last).split('-')
110
+ end
111
+ want_version = want_version.to_i
112
+ pg.verbose "Will migrate from version #{current_version} to #{want_version}"
113
+ if direction == 'down' then
114
+ if want_version >= current_version then
115
+ say "Nothing to do."
116
+ exit 0
117
+ end
118
+ else
119
+ if want_version <= current_version then
120
+ say "Nothing to do."
121
+ exit 0
122
+ end
123
+ end
124
+
125
+ # Select migrations between current and desired
126
+ migrations.select! do |m|
127
+ mvrs, _ = File.basename(m).split('-')
128
+ mvrs = mvrs.to_i
129
+ mvrs > current_version and mvrs <= want_version
130
+ end
131
+
132
+
133
+ # Run migrations.
134
+ migrations.each do |m|
135
+ mvrs, _ = File.basename(m).split('-')
136
+ pg.verbose "Running migration: #{File.basename(m)}"
137
+ unless $cfg['tool.dry'] then
138
+ pg.query 'BEGIN;'
139
+ ret = pg.queries File.read(m)
140
+ unless ret[:error].nil? then
141
+ pg.query 'ROLLBACK;'
142
+ pg.error "Migrations failed at level #{mvrs}"
143
+ pg.error "Because: #{ret[:error]}"
144
+ exit 5
145
+ else
146
+ pg.queries %{INSERT INTO __murano_cli_migrate__ values (#{mvrs});
147
+ DELETE FROM __murano_cli_migrate__ WHERE version <> #{mvrs};
148
+ COMMIT;}.gsub(/^\s+/,'')
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
154
+
41
155
  # vim: set ai et sw=2 ts=2 :
@@ -33,6 +33,7 @@ command 'product device read' do |c|
33
33
 
34
34
  end
35
35
  end
36
+ alias_command 'device list', 'product device list'
36
37
 
37
38
  command 'product device twee' do |c|
38
39
  c.syntax = %{murano product device twee <identifier>}
@@ -64,6 +65,7 @@ command 'product device twee' do |c|
64
65
  io.close unless io.nil?
65
66
  end
66
67
  end
68
+ alias_command 'device twee', 'product device twee'
67
69
 
68
70
  command 'product device delete' do |c|
69
71
  c.syntax = %{murano product device delete <identifier>}
@@ -77,6 +79,7 @@ command 'product device delete' do |c|
77
79
  prd.outf ret unless ret.empty?
78
80
  end
79
81
  end
82
+ alias_command 'device delete', 'product device delete'
80
83
 
81
84
  # XXX cannot call this here, since 'sn list' doesn't exist yet.
82
85
  #alias_command 'product device list', 'sn list'
@@ -25,6 +25,7 @@ command 'product device list' do |c|
25
25
  io.close unless io.nil?
26
26
  end
27
27
  end
28
+ alias_command 'device list', 'product device list'
28
29
 
29
30
  command 'product device enable' do |c|
30
31
  c.syntax = %{murano product device enable [<sn>|--file <sns>]}
@@ -52,6 +53,7 @@ the activation call within this time, it will need to be enabled again.
52
53
  end
53
54
  end
54
55
  end
56
+ alias_command 'device enable', 'product device enable'
55
57
 
56
58
  command 'product device activate' do |c|
57
59
  c.syntax = %{murano product device activate <sn>}
@@ -78,6 +80,7 @@ CIK again.
78
80
 
79
81
  end
80
82
  end
83
+ alias_command 'device activate', 'product device activate'
81
84
 
82
85
  alias_command 'sn list', 'product device list'
83
86
  alias_command 'sn enable', 'product device enable'
data/lib/MrMurano/http.rb CHANGED
@@ -7,7 +7,8 @@ module MrMurano
7
7
  module Http
8
8
  def token
9
9
  return @token unless @token.nil?
10
- @token = Account.new.token
10
+ acc = Account.new
11
+ @token = acc.token
11
12
  raise "Not logged in!" if @token.nil?
12
13
  @token
13
14
  end
@@ -108,6 +109,12 @@ module MrMurano
108
109
  end
109
110
  else
110
111
  showHttpError(request, response)
112
+ return {} if response.body.nil?
113
+ begin
114
+ return JSON.parse(response.body, json_opts)
115
+ rescue
116
+ return response.body
117
+ end
111
118
  end
112
119
  end
113
120
  end
@@ -1,4 +1,4 @@
1
1
  module MrMurano
2
- VERSION = '2.1.1'.freeze
2
+ VERSION = '2.2.1'.freeze
3
3
  end
4
4
 
data/lib/MrMurano.rb CHANGED
@@ -17,4 +17,5 @@ require 'MrMurano/Product'
17
17
  require 'MrMurano/Product-1P-Device'
18
18
  require 'MrMurano/Product-Resources'
19
19
 
20
+ require 'MrMurano/ReCommander'
20
21
  require 'MrMurano/commands'
data/spec/Http_spec.rb CHANGED
@@ -191,7 +191,7 @@ RSpec.describe MrMurano::Http do
191
191
  idhttp = instance_double('Net::HTTP')
192
192
  expect(idhttp).to receive(:request).once.and_return(@rsp)
193
193
  expect(@tst).to receive(:http).once.and_return(idhttp)
194
- expect(@rsp).to receive(:body).and_return(%{{"statusCode": 123, "message": "gone"}})
194
+ expect(@rsp).to receive(:body).exactly(3).times.and_return(%{{"statusCode": 123, "message": "gone"}})
195
195
 
196
196
  @tst.workit(@req)
197
197
  expect($stdout.string).to eq('')
data/spec/cmd_common.rb CHANGED
@@ -45,18 +45,6 @@ RSpec.shared_context "CI_CMD" do
45
45
  ENV['HOME'] = hdir
46
46
  Dir.chdir(hdir) do
47
47
  Dir.mkdir('.murano')
48
- unless ENV['MURANO_USER'].nil? then
49
- File.open(File.join('.murano', 'config'), 'a') do |io|
50
- io << "[user]\n"
51
- io << "name = #{ENV['MURANO_USER']}\n"
52
- end
53
- end
54
- unless ENV['MURANO_BUSINESS'].nil? then
55
- File.open(File.join('.murano', 'config'), 'a') do |io|
56
- io << "[business]\n"
57
- io << "id = #{ENV['MURANO_BUSINESS']}\n"
58
- end
59
- end
60
48
  @tmpdir = File.join(hdir, 'project')
61
49
  Dir.mkdir(@tmpdir)
62
50
  Dir.chdir(@tmpdir) do
@@ -0,0 +1,25 @@
1
+ require 'fileutils'
2
+ require 'open3'
3
+ require 'pathname'
4
+ require 'cmd_common'
5
+
6
+ RSpec.describe 'murano help', :cmd do
7
+ include_context "CI_CMD"
8
+
9
+ it "no args" do
10
+ out, err, status = Open3.capture3(capcmd('murano'))
11
+ expect(err).to eq('')
12
+ expect(out).to_not eq('')
13
+ expect(status.exitstatus).to eq(0)
14
+ end
15
+
16
+ it "as --help" do
17
+ out, err, status = Open3.capture3(capcmd('murano', '--help'))
18
+ expect(err).to eq('')
19
+ expect(out).to_not eq('')
20
+ expect(status.exitstatus).to eq(0)
21
+ end
22
+
23
+ end
24
+
25
+ # vim: set ai et sw=2 ts=2 :
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: MuranoCLI
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.1
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Conrad Tadpol Tilstra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-17 00:00:00.000000000 Z
11
+ date: 2017-05-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: commander
@@ -268,6 +268,7 @@ files:
268
268
  - lib/MrMurano/Product-Resources.rb
269
269
  - lib/MrMurano/Product.rb
270
270
  - lib/MrMurano/ProjectFile.rb
271
+ - lib/MrMurano/ReCommander.rb
271
272
  - lib/MrMurano/Solution-Cors.rb
272
273
  - lib/MrMurano/Solution-Endpoint.rb
273
274
  - lib/MrMurano/Solution-File.rb
@@ -357,6 +358,7 @@ files:
357
358
  - spec/cmd_cors_spec.rb
358
359
  - spec/cmd_device_spec.rb
359
360
  - spec/cmd_domain_spec.rb
361
+ - spec/cmd_help_spec.rb
360
362
  - spec/cmd_init_spec.rb
361
363
  - spec/cmd_keystore_spec.rb
362
364
  - spec/cmd_password_spec.rb
@@ -457,6 +459,7 @@ test_files:
457
459
  - spec/cmd_cors_spec.rb
458
460
  - spec/cmd_device_spec.rb
459
461
  - spec/cmd_domain_spec.rb
462
+ - spec/cmd_help_spec.rb
460
463
  - spec/cmd_init_spec.rb
461
464
  - spec/cmd_keystore_spec.rb
462
465
  - spec/cmd_password_spec.rb