MuranoCLI 2.0.0

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.
Files changed (151) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +28 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +21 -0
  5. data/Gemfile +27 -0
  6. data/LICENSE.txt +19 -0
  7. data/MuranoCLI.gemspec +50 -0
  8. data/MuranoCLI.iss +50 -0
  9. data/README.markdown +208 -0
  10. data/Rakefile +188 -0
  11. data/TODO.taskpaper +122 -0
  12. data/bin/mr +8 -0
  13. data/bin/murano +84 -0
  14. data/docs/demo.md +109 -0
  15. data/lib/MrMurano/Account.rb +211 -0
  16. data/lib/MrMurano/Config-Migrate.rb +47 -0
  17. data/lib/MrMurano/Config.rb +286 -0
  18. data/lib/MrMurano/Mock.rb +63 -0
  19. data/lib/MrMurano/Product-1P-Device.rb +145 -0
  20. data/lib/MrMurano/Product-Resources.rb +195 -0
  21. data/lib/MrMurano/Product.rb +358 -0
  22. data/lib/MrMurano/ProjectFile.rb +349 -0
  23. data/lib/MrMurano/Solution-Cors.rb +46 -0
  24. data/lib/MrMurano/Solution-Endpoint.rb +177 -0
  25. data/lib/MrMurano/Solution-File.rb +150 -0
  26. data/lib/MrMurano/Solution-ServiceConfig.rb +140 -0
  27. data/lib/MrMurano/Solution-Services.rb +326 -0
  28. data/lib/MrMurano/Solution-Users.rb +129 -0
  29. data/lib/MrMurano/Solution.rb +59 -0
  30. data/lib/MrMurano/SubCmdGroupContext.rb +49 -0
  31. data/lib/MrMurano/SyncUpDown.rb +565 -0
  32. data/lib/MrMurano/commands/assign.rb +57 -0
  33. data/lib/MrMurano/commands/businessList.rb +45 -0
  34. data/lib/MrMurano/commands/completion.rb +152 -0
  35. data/lib/MrMurano/commands/config.rb +67 -0
  36. data/lib/MrMurano/commands/content.rb +130 -0
  37. data/lib/MrMurano/commands/cors.rb +30 -0
  38. data/lib/MrMurano/commands/domain.rb +17 -0
  39. data/lib/MrMurano/commands/gb.rb +33 -0
  40. data/lib/MrMurano/commands/init.rb +138 -0
  41. data/lib/MrMurano/commands/keystore.rb +157 -0
  42. data/lib/MrMurano/commands/logs.rb +78 -0
  43. data/lib/MrMurano/commands/mock.rb +63 -0
  44. data/lib/MrMurano/commands/password.rb +88 -0
  45. data/lib/MrMurano/commands/postgresql.rb +41 -0
  46. data/lib/MrMurano/commands/product.rb +14 -0
  47. data/lib/MrMurano/commands/productCreate.rb +39 -0
  48. data/lib/MrMurano/commands/productDelete.rb +33 -0
  49. data/lib/MrMurano/commands/productDevice.rb +84 -0
  50. data/lib/MrMurano/commands/productDeviceIdCmds.rb +86 -0
  51. data/lib/MrMurano/commands/productList.rb +45 -0
  52. data/lib/MrMurano/commands/productWrite.rb +27 -0
  53. data/lib/MrMurano/commands/show.rb +80 -0
  54. data/lib/MrMurano/commands/solution.rb +14 -0
  55. data/lib/MrMurano/commands/solutionCreate.rb +39 -0
  56. data/lib/MrMurano/commands/solutionDelete.rb +34 -0
  57. data/lib/MrMurano/commands/solutionList.rb +45 -0
  58. data/lib/MrMurano/commands/status.rb +92 -0
  59. data/lib/MrMurano/commands/sync.rb +60 -0
  60. data/lib/MrMurano/commands/timeseries.rb +115 -0
  61. data/lib/MrMurano/commands/tsdb.rb +271 -0
  62. data/lib/MrMurano/commands/usage.rb +23 -0
  63. data/lib/MrMurano/commands/zshcomplete.erb +112 -0
  64. data/lib/MrMurano/commands.rb +32 -0
  65. data/lib/MrMurano/hash.rb +20 -0
  66. data/lib/MrMurano/http.rb +153 -0
  67. data/lib/MrMurano/makePretty.rb +75 -0
  68. data/lib/MrMurano/schema/pf-v1.0.0.yaml +114 -0
  69. data/lib/MrMurano/schema/sf-v0.2.0.yaml +77 -0
  70. data/lib/MrMurano/schema/sf-v0.3.0.yaml +78 -0
  71. data/lib/MrMurano/template/mock.erb +9 -0
  72. data/lib/MrMurano/template/projectFile.murano.erb +81 -0
  73. data/lib/MrMurano/verbosing.rb +99 -0
  74. data/lib/MrMurano/version.rb +4 -0
  75. data/lib/MrMurano.rb +20 -0
  76. data/spec/Account-Passwords_spec.rb +242 -0
  77. data/spec/Account_spec.rb +272 -0
  78. data/spec/ConfigFile_spec.rb +50 -0
  79. data/spec/ConfigMigrate_spec.rb +89 -0
  80. data/spec/Config_spec.rb +409 -0
  81. data/spec/Http_spec.rb +204 -0
  82. data/spec/MakePretties_spec.rb +118 -0
  83. data/spec/Mock_spec.rb +53 -0
  84. data/spec/ProductBase_spec.rb +113 -0
  85. data/spec/ProductContent_spec.rb +162 -0
  86. data/spec/ProductResources_spec.rb +329 -0
  87. data/spec/Product_1P_Device_spec.rb +202 -0
  88. data/spec/Product_1P_RPC_spec.rb +175 -0
  89. data/spec/Product_spec.rb +153 -0
  90. data/spec/ProjectFile_spec.rb +324 -0
  91. data/spec/Solution-Cors_spec.rb +164 -0
  92. data/spec/Solution-Endpoint_spec.rb +581 -0
  93. data/spec/Solution-File_spec.rb +212 -0
  94. data/spec/Solution-ServiceConfig_spec.rb +202 -0
  95. data/spec/Solution-ServiceDevice_spec.rb +176 -0
  96. data/spec/Solution-ServiceEventHandler_spec.rb +385 -0
  97. data/spec/Solution-ServiceModules_spec.rb +465 -0
  98. data/spec/Solution-UsersRoles_spec.rb +207 -0
  99. data/spec/Solution_spec.rb +92 -0
  100. data/spec/SyncRoot_spec.rb +83 -0
  101. data/spec/SyncUpDown_spec.rb +495 -0
  102. data/spec/Verbosing_spec.rb +279 -0
  103. data/spec/_workspace.rb +27 -0
  104. data/spec/cmd_assign_spec.rb +51 -0
  105. data/spec/cmd_business_spec.rb +59 -0
  106. data/spec/cmd_common.rb +72 -0
  107. data/spec/cmd_config_spec.rb +68 -0
  108. data/spec/cmd_content_spec.rb +71 -0
  109. data/spec/cmd_cors_spec.rb +50 -0
  110. data/spec/cmd_device_spec.rb +96 -0
  111. data/spec/cmd_domain_spec.rb +32 -0
  112. data/spec/cmd_init_spec.rb +30 -0
  113. data/spec/cmd_keystore_spec.rb +97 -0
  114. data/spec/cmd_password_spec.rb +62 -0
  115. data/spec/cmd_status_spec.rb +239 -0
  116. data/spec/cmd_syncdown_spec.rb +86 -0
  117. data/spec/cmd_syncup_spec.rb +62 -0
  118. data/spec/cmd_usage_spec.rb +36 -0
  119. data/spec/fixtures/.mrmuranorc +9 -0
  120. data/spec/fixtures/ProjectFiles/invalid.yaml +9 -0
  121. data/spec/fixtures/ProjectFiles/only_meta.yaml +24 -0
  122. data/spec/fixtures/ProjectFiles/with_routes.yaml +27 -0
  123. data/spec/fixtures/SolutionFiles/0.2.0.json +20 -0
  124. data/spec/fixtures/SolutionFiles/0.2.0_invalid.json +18 -0
  125. data/spec/fixtures/SolutionFiles/0.2.json +21 -0
  126. data/spec/fixtures/SolutionFiles/0.3.0.json +20 -0
  127. data/spec/fixtures/SolutionFiles/0.3.0_invalid.json +19 -0
  128. data/spec/fixtures/SolutionFiles/0.3.json +20 -0
  129. data/spec/fixtures/SolutionFiles/basic.json +20 -0
  130. data/spec/fixtures/SolutionFiles/secret.json +6 -0
  131. data/spec/fixtures/configfile +9 -0
  132. data/spec/fixtures/dumped_config +42 -0
  133. data/spec/fixtures/mrmuranorc_deleted_bob +8 -0
  134. data/spec/fixtures/mrmuranorc_tool_bob +3 -0
  135. data/spec/fixtures/product_spec_files/example.exoline.spec.yaml +116 -0
  136. data/spec/fixtures/product_spec_files/example.murano.spec.yaml +14 -0
  137. data/spec/fixtures/product_spec_files/gwe.exoline.spec.yaml +21 -0
  138. data/spec/fixtures/product_spec_files/gwe.murano.spec.yaml +16 -0
  139. data/spec/fixtures/product_spec_files/lightbulb-no-state.yaml +11 -0
  140. data/spec/fixtures/product_spec_files/lightbulb.yaml +14 -0
  141. data/spec/fixtures/roles-three.yaml +11 -0
  142. data/spec/fixtures/syncable_content/assets/icon.png +0 -0
  143. data/spec/fixtures/syncable_content/assets/index.html +0 -0
  144. data/spec/fixtures/syncable_content/assets/js/script.js +0 -0
  145. data/spec/fixtures/syncable_content/modules/table_util.lua +58 -0
  146. data/spec/fixtures/syncable_content/routes/manyRoutes.lua +11 -0
  147. data/spec/fixtures/syncable_content/routes/singleRoute.lua +5 -0
  148. data/spec/fixtures/syncable_content/services/devdata.lua +18 -0
  149. data/spec/fixtures/syncable_content/services/timers.lua +4 -0
  150. data/spec/spec_helper.rb +119 -0
  151. metadata +498 -0
@@ -0,0 +1,115 @@
1
+ require 'csv'
2
+ require 'MrMurano/Solution-ServiceConfig'
3
+
4
+ module MrMurano
5
+ class Timeseries < ServiceConfig
6
+ def initialize
7
+ super
8
+ @serviceName = 'timeseries'
9
+ end
10
+
11
+ def query(query)
12
+ call(:query, :post, {:q=>query})
13
+ end
14
+
15
+ def write(writestr)
16
+ call(:write, :post, { :query=>writestr })
17
+ end
18
+
19
+ def command(cmd)
20
+ call(:command, :post, { :q=>cmd})
21
+ end
22
+
23
+ end
24
+ end
25
+
26
+ command :timeseries do |c|
27
+ c.syntax = %{murano timeseries}
28
+ c.summary = %{About Timeseries}
29
+ c.description = %{These commands are deprecated.
30
+
31
+ The timeseries sub-commands let you interact directly with the Timeseries
32
+ instance in a solution. This allows for easier debugging, being able to
33
+ quickly try out different queries or write test data.}
34
+
35
+ c.action do |args, options|
36
+ ::Commander::UI.enable_paging
37
+ say MrMurano::SubCmdGroupHelp.new(c).get_help
38
+ end
39
+ end
40
+
41
+ command 'timeseries query' do |c|
42
+ c.syntax = %{murano timeseries query <query string>}
43
+ c.summary = %{Query the timeseries database}
44
+ c.description = %{This command is deprecated.
45
+
46
+ Query the timeseries database}
47
+ c.option '-o', '--output FILE', %{Download to file instead of STDOUT}
48
+ c.option '--[no-]json', %{Display results as raw json}
49
+ c.option '--[no-]csv', %{Display results as CSV}
50
+
51
+ c.action do |args,options|
52
+ options.defalts :json=>false, :csv=>false
53
+ sol = MrMurano::Timeseries.new
54
+ ret = sol.query args.join(' ')
55
+
56
+ $cfg['tool.outformat'] = 'json' if options.json
57
+ $cfg['tool.outformat'] = 'best csv' if options.csv
58
+
59
+ io=nil
60
+ if options.output then
61
+ io = File.open(options.output, 'w')
62
+ end
63
+
64
+ sol.outf(ret, io) do |dd, ios|
65
+ (ret[:results] or []).each do |res|
66
+ (res[:series] or []).each do |ser|
67
+ sol.tabularize({
68
+ :title=>ser[:name],
69
+ :headers=>ser[:columns],
70
+ :rows=>ser[:values]
71
+ }, ios)
72
+ end
73
+ end
74
+ end
75
+ io.close unless io.nil?
76
+
77
+ end
78
+ end
79
+ alias_command :tsq, 'timeseries query'
80
+
81
+ command 'timeseries write' do |c|
82
+ c.syntax = %{murano timeseries <write string>}
83
+ c.summary = %{Write data into the timeseries database}
84
+ c.description = %{This command is deprecated.
85
+
86
+ Write data into the timeseries database}
87
+ c.option '--[no-]json', %{Display results as raw json}
88
+ c.action do |args,options|
89
+ options.defalts :json=>false
90
+ $cfg['tool.outformat'] = 'json' if options.json
91
+ sol = MrMurano::Timeseries.new
92
+ ret = sol.write args.join(' ')
93
+ sol.outf ret
94
+ end
95
+ end
96
+ alias_command :tsw, 'timeseries write'
97
+
98
+ command 'timeseries command' do |c|
99
+ c.syntax = %{murano timeseries command <db command>}
100
+ c.summary = %{Execute a non-query command in the database}
101
+ c.description = %{This command is deprecated.
102
+
103
+ Execute a non-query command in the database}
104
+ c.option '--[no-]json', %{Display results as raw json}
105
+ c.action do |args,options|
106
+ options.defalts :json=>false
107
+ $cfg['tool.outformat'] = 'json' if options.json
108
+ sol = MrMurano::Timeseries.new
109
+ ret = sol.command args.join(' ')
110
+ sol.outf ret
111
+ end
112
+ end
113
+
114
+
115
+ # vim: set ai et sw=2 ts=2 :
@@ -0,0 +1,271 @@
1
+ require 'date'
2
+ require 'MrMurano/Solution-ServiceConfig'
3
+ require 'MrMurano/SubCmdGroupContext'
4
+
5
+ module MrMurano
6
+ module ServiceConfigs
7
+ class Tsdb < ServiceConfig
8
+ def initialize
9
+ super
10
+ @serviceName = 'tsdb'
11
+ end
12
+
13
+ def write(data)
14
+ call(:write, :post, data)
15
+ end
16
+
17
+ def query(query)
18
+ call(:query, :post, query)
19
+ end
20
+
21
+ def listTags
22
+ call(:listTags)
23
+ end
24
+
25
+ def listMetrics
26
+ call(:listMetrics)
27
+ end
28
+
29
+
30
+ def str_to_timestamp(str)
31
+ if str =~ /^\d+(u|ms|s)?$/ then
32
+ str
33
+ else
34
+ dt = DateTime.parse(str)
35
+ (dt.to_time.to_f * 1000000).to_i
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ command 'tsdb write' do |c|
43
+ c.syntax = %{murano tsdb write [options] <metric=value>|@<tag=value> … }
44
+ c.summary = %{write data}
45
+ c.description = %{Write data
46
+
47
+ TIMESTAMP is microseconds since unix epoch, or can be suffixed with units.
48
+ Units are u (microseconds), ms (milliseconds), s (seconds)
49
+
50
+ Also, many date-time formats can be parsed and will be converted to microseconds
51
+ }
52
+ c.option '--when TIMESTAMP', %{When this data happened. (defaults to now)}
53
+ # TODO: add option to take data from STDIN.
54
+ c.example 'murano tsdb write hum=45 lux=12765 @sn=44', %{Write two metrics (hum and lux) with a tag (sn)}
55
+
56
+ c.action do |args, options|
57
+ sol = MrMurano::ServiceConfigs::Tsdb.new
58
+
59
+ # we have hash of tags, hash of metrics, optional timestamp.
60
+ metrics = {}
61
+ tags = {}
62
+ args.each do |item|
63
+ key, value = item.split('=', 2)
64
+ if key[0] == '@' then
65
+ tags[key[1..-1]] = value.to_s #tags are always strings.
66
+ else
67
+ value = value.to_i if value == value.to_i.to_s
68
+ metrics[key] = value
69
+ end
70
+ end
71
+
72
+ data = {:tags=>tags, :metrics=>metrics}
73
+ if not options.when.nil? and options.when != 'now' then
74
+ data[:ts] = sol.str_to_timestamp(options.when)
75
+ end
76
+
77
+ ret = sol.write(data)
78
+ if ret != {} then
79
+ sol.error ret
80
+ end
81
+ end
82
+ end
83
+
84
+ command 'tsdb query' do |c|
85
+ c.syntax = %{murano tsdb query [options] <metric>|@<tag=value> …}
86
+ c.summary = %{query data}
87
+ c.description =%{Query data from the TSDB.
88
+
89
+ FUNCS is a comma seperated list of the aggregate functions.
90
+ Currently: avg, min, max, count, sum. For string metrics, only count.
91
+
92
+ FILL is null, none, any integer, previous
93
+
94
+ DURATION is an integer with time unit to indicate relative time before now.
95
+ Units are u (microseconds), ms (milliseconds), s (seconds), m (minutes),
96
+ h (hours), d (days), w (weeks)
97
+
98
+ TIMESTAMP is microseconds since unix epoch, or can be suffixed with units.
99
+ Units are u (microseconds), ms (milliseconds), s (seconds)
100
+
101
+ Also, many date-time formats can be parsed and will be converted to microseconds
102
+ }
103
+ c.option '--start_time TIMESTAMP', %{Start time range}
104
+ c.option '--end_time TIMESTAMP', %{End time range; defaults to now}
105
+ c.option '--relative_start DURATION', %{Start time relative from now}
106
+ c.option '--relative_end DURATION', %{End time relative from now}
107
+ c.option '--sampling_size DURATION', %{The size of time slots used for downsampling}
108
+ c.option '--limit NUM', Integer, %{Limit number of data points returned}
109
+ c.option '--epoch UNIT', ['u','ms','s'], %{Set size of returned timestamps}
110
+ c.option '--mode MODE', ['merge','split'], %{Merge or split each returned metric}
111
+ c.option '--fill FILL', %{Value to fill for time slots with no data points exist in merge mode}
112
+ c.option '--order_by ORDER', ['desc','asc'], %{Return results in ascending or descending time order}
113
+ c.option '--aggregate FUNCS', %{Aggregation functions to apply}
114
+
115
+ c.option '-o', '--output FILE', %{Download to file instead of STDOUT}
116
+
117
+ c.example 'murano tsdb query hum', 'Get all hum metric entries'
118
+ c.example 'murano tsdb query hum @sn=45', 'Get all hum metric entries for tag sn=45'
119
+ c.example 'murano tsdb query hum --limit 1', 'Get just the most recent entry'
120
+ c.example 'murano tsdb query hum --relative_start 1h', 'Get last hour of hum entries'
121
+ c.example 'murano tsdb query hum --relative_start -1h', 'Get last hour of hum entries'
122
+ c.example 'murano tsdb query hum --relative_start 2h --relative_end 1h', 'Get hum entries of two hours ago, but not the last hours'
123
+ c.example 'murano tsdb query hum --sampling_size 30m', 'Get one hum entry from each 30 minute chunk of time'
124
+ c.example 'murano tsdb query hum --sampling_size 30m --aggregate avg', 'Get average hum entry from each 30 minute chunk of time'
125
+
126
+
127
+ c.action do |args, options|
128
+ sol = MrMurano::ServiceConfigs::Tsdb.new
129
+
130
+ query = {}
131
+ tags = {}
132
+ metrics = []
133
+ args.each do |arg|
134
+ if arg =~ /=/ then
135
+ # a tag.
136
+ k,v = arg.split('=', 2)
137
+ k = k[1..-1] if k[0] == '@'
138
+ tags[k] = v
139
+ else
140
+ metrics << arg
141
+ end
142
+ end
143
+ query[:tags] = tags unless tags.empty?
144
+ query[:metrics] = metrics unless metrics.empty?
145
+
146
+ # A query without any metrics is invalid. So if the user didn't provide any,
147
+ # look up all of them (well, frist however many) and use that list.
148
+ if query[:metrics].nil? or query[:metrics].empty? then
149
+ ret = sol.listMetrics
150
+ query[:metrics] = ret[:metrics]
151
+ end
152
+
153
+ unless options.start_time.nil? then
154
+ query[:start_time] = sol.str_to_timestamp(options.start_time)
155
+ end
156
+ unless options.end_time.nil? then
157
+ query[:end_time] = sol.str_to_timestamp(options.end_time)
158
+ end
159
+
160
+ unless options.relative_start.nil? then
161
+ o = options.relative_start
162
+ o = "-#{o}" unless o[0] == '-'
163
+ query[:relative_start] = o
164
+ end
165
+ unless options.relative_end.nil? then
166
+ o = options.relative_end
167
+ o = "-#{o}" unless o[0] == '-'
168
+ query[:relative_end] = o
169
+ end
170
+ query[:sampling_size] = options.sampling_size unless options.sampling_size.nil?
171
+
172
+ query[:limit] = options.limit unless options.limit.nil?
173
+ query[:epoch] = options.epoch unless options.epoch.nil?
174
+ query[:mode] = options.mode unless options.mode.nil?
175
+ query[:order_by] = options.order_by unless options.order_by.nil?
176
+
177
+ query[:fill] = options.fill unless options.fill.nil?
178
+ unless options.aggregate.nil? then
179
+ query[:aggregate] = options.aggregate.split(',')
180
+ end
181
+
182
+ io=nil
183
+ if options.output then
184
+ io = File.open(options.output, 'w')
185
+ end
186
+ sol.outf sol.query(query) do |dd, ios|
187
+ # If aggregated, then we need to break up the columns. since each is now a
188
+ # hash of the aggregated functions
189
+ unless options.aggregate.nil? then
190
+ dd[:values].map! do |row|
191
+ row.map do |value|
192
+ if value.kind_of? Hash then
193
+ query[:aggregate].map{|qa| value[qa.to_sym]}
194
+ else
195
+ value
196
+ end
197
+ end.flatten
198
+ end
199
+ dd[:columns].map! do |col|
200
+ if col == 'time' then
201
+ col
202
+ else
203
+ query[:aggregate].map{|qa| "#{col}.#{qa.to_s}"}
204
+ end
205
+ end.flatten!
206
+ end
207
+ sol.tabularize({
208
+ :headers=>dd[:columns],
209
+ :rows=>dd[:values]
210
+ }, ios)
211
+ end
212
+ io.close unless io.nil?
213
+ end
214
+ end
215
+
216
+ command 'tsdb list tags' do |c|
217
+ c.syntax = %{murano tsdb list tags [options]}
218
+ c.summary = %{List tags}
219
+ c.option '--values', %{Also return the known tag values}
220
+
221
+ c.action do |args, options|
222
+ options.default :values=>false
223
+
224
+ sol = MrMurano::ServiceConfigs::Tsdb.new
225
+ ret = sol.listTags
226
+ # TODO: handle looping if :next != nil
227
+
228
+ if options.values then
229
+ sol.outf(ret[:tags]) do |dd, ios|
230
+ data={}
231
+ data[:headers] = dd.keys
232
+ data[:rows] = dd.keys.map{|k| dd[k]}
233
+ len = data[:rows].map{|i| i.length}.max
234
+ data[:rows].each{|r| r.fill(nil, r.length, len - r.length)}
235
+ data[:rows] = data[:rows].transpose
236
+ sol.tabularize(data, ios)
237
+ end
238
+ else
239
+ sol.outf ret[:tags].keys
240
+ end
241
+
242
+
243
+ end
244
+ end
245
+
246
+ command 'tsdb list metrics' do |c|
247
+ c.syntax = %{murano tsdb list metrics}
248
+ c.summary = %{List metrics}
249
+
250
+ c.action do |args, options|
251
+ sol = MrMurano::ServiceConfigs::Tsdb.new
252
+ ret = sol.listMetrics
253
+ # TODO: handle looping if :next != nil
254
+ sol.outf ret[:metrics]
255
+ end
256
+ end
257
+
258
+ command :tsdb do |c|
259
+ c.syntax = %{murano tsdb}
260
+ c.summary = %{About TSDB}
261
+ c.description = %{The tsdb sub-commands let you interact directly with the TSDB instance in a
262
+ solution. This allows for easier debugging, being able to quickly try out
263
+ different queries or write test data.}
264
+
265
+ c.action do |args, options|
266
+ ::Commander::UI.enable_paging
267
+ say MrMurano::SubCmdGroupHelp.new(c).get_help
268
+ end
269
+ end
270
+
271
+ # vim: set ai et sw=2 ts=2 :
@@ -0,0 +1,23 @@
1
+ require 'MrMurano/Solution'
2
+
3
+ command :usage do |c|
4
+ c.syntax = %{murano usage}
5
+ c.summary = %{Get usage info for project}
6
+ c.description = %{Get usage info for project}
7
+
8
+ c.action do |args,options|
9
+ sol = MrMurano::Solution.new
10
+ sol.outf(sol.usage) do |dd,ios|
11
+ headers = ['', :Quota, :Daily, :Monthly, :Total]
12
+ rows = []
13
+ dd.each_pair do |key,value|
14
+ quota = value[:quota] or {}
15
+ usage = value[:usage] or {}
16
+ rows << [key, quota[:daily], usage[:calls_daily], usage[:calls_monthly], usage[:calls_total]]
17
+ end
18
+ sol.tabularize({:headers=>headers,:rows=>rows}, ios)
19
+ end
20
+ end
21
+ end
22
+
23
+ # vim: set ai et sw=2 ts=2 :
@@ -0,0 +1,112 @@
1
+ #compdef <%= program :name %>
2
+
3
+ __<%= program :name %>_common_options=(
4
+ <% for option in @options -%>
5
+ <%- if flatswitches(option).count > 1 -%>
6
+ {<%= flatswitches(option).join(',') %>}<%= takesArg(option) %>:"<%= optionDesc option %>"
7
+ <%- else -%>
8
+ "<%= flatswitches(option).first %><%= takesArg(option) %>:<%= optionDesc option %>"
9
+ <%- end -%>
10
+ <% end %>
11
+ )
12
+
13
+ _<%= program :name %> () {
14
+ local curcontext="$curcontext" state line
15
+ typeset -A opt_args
16
+
17
+ # except this fails when a command only has one arg and then options.
18
+ _arguments -C \
19
+ ':command:->command' \
20
+ '*::options:->options'
21
+ #echo "\n=$curcontext=$state=$words=\n"
22
+ case $state in
23
+ (command)
24
+ local -a list
25
+ list=(
26
+ <%- for name, subs in cmdTree -%>
27
+ <%- cmd = subs["\0cmd"] -%>
28
+ <%- if cmd.nil? -%>
29
+ <%= name %>:' '
30
+ <%-else-%>
31
+ <%= name %>:'<%= cmd.summary || cmd.description.lines[0] -%>'
32
+ <%-end-%>
33
+ <%-end-%>
34
+ )
35
+ _describe -t firstArg 'firstArg' list
36
+ _describe -t options 'global options' __<%= program :name %>_common_options
37
+ ;;
38
+ (options)
39
+ case $line[1] in
40
+ <%- for name, subs in cmdTree -%>
41
+ (<%= name %>)
42
+ __<%=program :name%>-<%= name %>
43
+ ;;
44
+ <%-end-%>
45
+ esac
46
+ ;;
47
+ esac
48
+ }
49
+
50
+ <%- for name, subs in cmdTree -%>
51
+ <%- command = subs["\0cmd"]; subs = subs.reject{|k,_| k == "\0cmd"} -%>
52
+ __<%=program :name%>-<%= name %> () {
53
+ local curcontext="$curcontext" state line
54
+ typeset -A opt_args
55
+
56
+ _arguments -C \
57
+ ':command:->command' \
58
+ '*::options:->options'
59
+
60
+ case $state in
61
+ (command)
62
+ <%- unless subs.empty? -%>
63
+ local -a subcommands
64
+ subcommands=(
65
+ <%- for sname, ssubs in subs -%>
66
+ <%- command = ssubs["\0cmd"] -%>
67
+ <%- if command.nil? then -%>
68
+ <%=sname%>:''
69
+ <%-else-%>
70
+ <%=sname%>:'<%= command.summary || command.description.lines[0] -%>'
71
+ <%-end-%>
72
+ <%-end-%>
73
+ )
74
+ _describe -t commands 'subcommand' subcommands
75
+ <%-end-%>
76
+ _describe -t options 'global options' __<%= program :name %>_common_options
77
+ <%- unless command.nil? or command.options.empty? then -%>
78
+ _arguments \
79
+ <%- for option in command.options -%>
80
+ <%- if flatswitches(option).count > 1 -%>
81
+ {<%= flatswitches(option).join(',') %>}<%= takesArg(option) %>"[<%= optionDesc option %>]: :" \
82
+ <%- else -%>
83
+ "<%= flatswitches(option).first %><%= takesArg(option) %>[<%= optionDesc option %>]: :" \
84
+ <%- end -%>
85
+ <%- end -%>
86
+ <%- end %>
87
+ ;;
88
+ (options)
89
+ case $line[1] in
90
+ <%- for sname, ssubs in subs -%>
91
+ <%- command = ssubs["\0cmd"]; subs = ssubs.reject{|k,_| k == "\0cmd"} -%>
92
+ (<%=sname%>)
93
+ _describe -t options 'global options' __<%= program :name %>_common_options
94
+ <%- unless command.nil? or command.options.empty? then -%>
95
+ _arguments \
96
+ <%- for option in command.options -%>
97
+ <%- if flatswitches(option).count > 1 -%>
98
+ {<%= flatswitches(option).join(',') %>}<%= takesArg(option) %>"[<%= optionDesc option %>]: :" \
99
+ <%- else -%>
100
+ "<%= flatswitches(option).first %><%= takesArg(option) %>[<%= optionDesc option %>]: :" \
101
+ <%- end -%>
102
+ <%- end -%>
103
+ <%- end %>
104
+ ;;
105
+ <%-end-%>
106
+ esac
107
+ ;;
108
+ esac
109
+ }
110
+ <%- end -%>
111
+
112
+ # vim: set ai et sw=2 ts=2 :