connfu-client 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. data/.rspec +3 -0
  2. data/.rvmrc +2 -0
  3. data/Gemfile +5 -0
  4. data/Gemfile.lock +120 -0
  5. data/LICENSE.txt +661 -0
  6. data/README.rdoc +398 -0
  7. data/Rakefile +38 -0
  8. data/bin/.DS_Store +0 -0
  9. data/bin/connfu-client +94 -0
  10. data/connfu-client.gemspec +41 -0
  11. data/examples/conference/application.rb +68 -0
  12. data/examples/conference/conference.rb +33 -0
  13. data/examples/conference/conference_app.rb +25 -0
  14. data/examples/conference/connfu.log +5 -0
  15. data/examples/conference/wall.rb +11 -0
  16. data/examples/provisioning/app/get.rb +29 -0
  17. data/examples/provisioning/channels/get.rb +34 -0
  18. data/examples/provisioning/rss/create.rb +28 -0
  19. data/examples/provisioning/rss/delete.rb +27 -0
  20. data/examples/provisioning/rss/get.rb +32 -0
  21. data/examples/provisioning/rss/put.rb +29 -0
  22. data/examples/provisioning/setup.rb +2 -0
  23. data/examples/provisioning/twitter/create.rb +31 -0
  24. data/examples/provisioning/twitter/delete.rb +27 -0
  25. data/examples/provisioning/twitter/get.rb +32 -0
  26. data/examples/provisioning/twitter/put.rb +29 -0
  27. data/examples/provisioning/voice/create.rb +26 -0
  28. data/examples/provisioning/voice/delete.rb +27 -0
  29. data/examples/provisioning/voice/get.rb +36 -0
  30. data/examples/provisioning/voice/phones/create.rb +26 -0
  31. data/examples/provisioning/voice/phones/delete.rb +28 -0
  32. data/examples/provisioning/voice/phones/get.rb +38 -0
  33. data/examples/provisioning/voice/put.rb +38 -0
  34. data/examples/provisioning/voice/whitelist/create.rb +26 -0
  35. data/examples/provisioning/voice/whitelist/delete.rb +27 -0
  36. data/examples/provisioning/voice/whitelist/get.rb +36 -0
  37. data/examples/provisioning/voice/whitelist/put.rb +27 -0
  38. data/lib/connfu.rb +134 -0
  39. data/lib/connfu/cli/generator.rb +71 -0
  40. data/lib/connfu/connfu_logger.rb +88 -0
  41. data/lib/connfu/connfu_message_formatter.rb +134 -0
  42. data/lib/connfu/connfu_stream.rb +182 -0
  43. data/lib/connfu/dispatcher.rb +164 -0
  44. data/lib/connfu/dsl.rb +84 -0
  45. data/lib/connfu/events.rb +32 -0
  46. data/lib/connfu/listener.rb +85 -0
  47. data/lib/connfu/listener_channel.rb +100 -0
  48. data/lib/connfu/message.rb +74 -0
  49. data/lib/connfu/provisioning.rb +12 -0
  50. data/lib/connfu/provisioning/application.rb +374 -0
  51. data/lib/connfu/provisioning/base.rb +95 -0
  52. data/lib/connfu/provisioning/channel.rb +79 -0
  53. data/lib/connfu/provisioning/phone.rb +55 -0
  54. data/lib/connfu/provisioning/rss.rb +21 -0
  55. data/lib/connfu/provisioning/twitter.rb +28 -0
  56. data/lib/connfu/provisioning/voice.rb +89 -0
  57. data/lib/connfu/provisioning/whitelist.rb +62 -0
  58. data/lib/connfu/version.rb +6 -0
  59. data/lib/rdoc/generator/template/connfu/_context.rhtml +209 -0
  60. data/lib/rdoc/generator/template/connfu/_head.rhtml +7 -0
  61. data/lib/rdoc/generator/template/connfu/class.rhtml +38 -0
  62. data/lib/rdoc/generator/template/connfu/file.rhtml +36 -0
  63. data/lib/rdoc/generator/template/connfu/index.rhtml +13 -0
  64. data/lib/rdoc/generator/template/connfu/resources/apple-touch-icon.png +0 -0
  65. data/lib/rdoc/generator/template/connfu/resources/css/github.css +129 -0
  66. data/lib/rdoc/generator/template/connfu/resources/css/main.css +339 -0
  67. data/lib/rdoc/generator/template/connfu/resources/css/panel.css +389 -0
  68. data/lib/rdoc/generator/template/connfu/resources/css/reset.css +53 -0
  69. data/lib/rdoc/generator/template/connfu/resources/favicon.ico +0 -0
  70. data/lib/rdoc/generator/template/connfu/resources/i/arrows.png +0 -0
  71. data/lib/rdoc/generator/template/connfu/resources/i/results_bg.png +0 -0
  72. data/lib/rdoc/generator/template/connfu/resources/i/tree_bg.png +0 -0
  73. data/lib/rdoc/generator/template/connfu/resources/js/highlight.pack.js +1 -0
  74. data/lib/rdoc/generator/template/connfu/resources/js/jquery-1.3.2.min.js +19 -0
  75. data/lib/rdoc/generator/template/connfu/resources/js/jquery-effect.js +593 -0
  76. data/lib/rdoc/generator/template/connfu/resources/js/main.js +20 -0
  77. data/lib/rdoc/generator/template/connfu/resources/js/searchdoc.js +628 -0
  78. data/lib/rdoc/generator/template/connfu/resources/panel/index.html +72 -0
  79. data/lib/rdoc/generator/template/connfu/se_index.rhtml +8 -0
  80. data/spec/connfu_message_formatter_spec.rb +88 -0
  81. data/spec/connfu_spec.rb +51 -0
  82. data/spec/connfu_stream_spec.rb +84 -0
  83. data/spec/dispatcher_spec.rb +227 -0
  84. data/spec/dsl_spec.rb +159 -0
  85. data/spec/listener_channel_spec.rb +130 -0
  86. data/spec/listener_spec.rb +67 -0
  87. data/spec/provisioning/application_spec.rb +47 -0
  88. data/spec/provisioning/channel_shared_examples.rb +52 -0
  89. data/spec/provisioning/channel_spec.rb +13 -0
  90. data/spec/provisioning/phone_spec.rb +88 -0
  91. data/spec/provisioning/voice_spec.rb +138 -0
  92. data/spec/provisioning_spec.rb +500 -0
  93. data/spec/spec_helper.rb +51 -0
  94. metadata +298 -0
data/README.rdoc ADDED
@@ -0,0 +1,398 @@
1
+
2
+ == Welcome to connFu
3
+
4
+ connFu gem provides an easy way to get access to connFu platform using the defined DSL and the provisioning API.
5
+
6
+ connFu is a platform of Telefonica delivered by Bluevia Labs.
7
+ Please, check out http://www.connfu.com and if you need further information do not hesitate to contact us at *support* *at* *connfu* *dot* *com*
8
+
9
+ === Why connFu?
10
+
11
+ * *Mash* *voice*, *data*, *text* *and* *social* *streams* like never before
12
+
13
+ * *Develop* *apps* *swiftly* – connFu does all the heavy lifting
14
+
15
+ * *Merge* social, voice and text channels into single streams
16
+
17
+ * *Global* *reach* – choose phone numbers from around the world
18
+
19
+ * *Economy* *of* *code* – do more with less
20
+
21
+ === Use connFu to build...
22
+
23
+ * Apps that turn *social* *signals* into calls and voice messages
24
+
25
+ * *Group* *communication* apps (voice, text, social)
26
+
27
+ * *Real*-*time* collaboration tools
28
+
29
+ * *Voice* *apps* controlled by Twitter
30
+
31
+ * *CRM* *applications* (including call recording)
32
+
33
+ == Getting started
34
+
35
+ You can download the connFu-client gem directly from rubygems:
36
+
37
+ gem install connfu-client
38
+
39
+ == Introduction
40
+
41
+ This gem has two different aims:
42
+
43
+ * *connFu* *DSL*: enables an easy way to create a connFu application.
44
+ * *connFu* *provisioning* *API* *client*: wrapper to REST connFu API to manage applications.
45
+
46
+ == connFu DSL
47
+
48
+ connFu DSL allows you to create really powerful applications in just a few lines of code.
49
+
50
+ === How to create an application
51
+
52
+ 1. Create an application using the connFu web portal
53
+ 2. Get the application token
54
+ 3. Create an application scaffold using the connfu-client CLI:
55
+
56
+ connfu-client scaffold hello-world
57
+
58
+ 4. Update the code generated in hello-world/application.rb with your valid application token:
59
+
60
+ token = "YOUR-VALID-CONNFU-TOKEN"
61
+
62
+ 4. Run the code:
63
+
64
+ ruby application.rb
65
+
66
+ 5. You'll get as output something like:
67
+
68
+ I, [2011-09-26T14:39:24.523208 #43421] INFO -- : Starting application with token 28d540c53b522e162d07baae0809115a
69
+ D, [2011-09-26T14:39:26.631370 #43421] DEBUG -- : The application devel-juan-1 has these channels: []
70
+ D, [2011-09-26T14:39:26.638779 #43421] DEBUG -- : Dispatcher initializer
71
+ D, [2011-09-26T14:39:26.638870 #43421] DEBUG -- : Dispatcher starts
72
+ D, [2011-09-26T14:39:26.639365 #43421] DEBUG -- : Dispatcher waiting for a message from the Listener
73
+ D, [2011-09-26T14:39:26.647047 #43421] DEBUG -- : Listener starts...
74
+ D, [2011-09-26T14:39:26.647200 #43421] DEBUG -- : Waiting for a message from connFu stream
75
+ D, [2011-09-26T14:39:26.647437 #43421] DEBUG -- : Connfu::ConnfuStream opening connection to stream.connfu.com:443
76
+ D, [2011-09-26T14:39:26.647535 #43421] DEBUG -- : Connfu::ConnfuStream start listening to stream /connfu-stream-devel-juan-1
77
+
78
+ === Handling channels
79
+
80
+ A connFu channel is the way to retrieve inbound events related to the resources mapped to the application.
81
+
82
+ Actually there are three available channel types:
83
+
84
+ * *Voice*: retrieves events related to calls and inbound sms to a specific number
85
+ * *Twitter*: retrieves tweets related to one or more twitter accounts
86
+ * *RSS*: retrieves new posts in a RSS feed
87
+
88
+ An application should listen at least one kind of channel.
89
+
90
+ === Handling voice channels
91
+
92
+ A voice channel has four related events:
93
+
94
+ * *voice*:*join*: a user joins a conference call
95
+ * *voice*:*leave*: a user leaves a conference call
96
+ * *voice*:*new**\_**topic*: the conference topic was changed
97
+ * *sms*:*new*: a sms sent by an user was received in the number
98
+
99
+ require 'connfu'
100
+
101
+ TOKEN = "<app-token>"
102
+
103
+ Connfu.application(TOKEN) {
104
+
105
+ listen(:voice) do |conference|
106
+ conference.on(:join) do |call|
107
+ puts "New inbound call from #{call[:from]} on number #{call[:to]}"
108
+ end
109
+
110
+ conference.on(:leave) do |call|
111
+ puts "#{call[:from]} has left the conference #{call[:channel_name]}"
112
+ end
113
+
114
+ conference.on(:new_topic) do |topic|
115
+ puts "New topic in the conference #{topic[:channel_name]}: #{topic[:content]}"
116
+ end
117
+ end
118
+
119
+ listen(:sms) do |sms|
120
+ sms.on(:new) do |message|
121
+ puts "New inbound sms"
122
+ puts "#{message}"
123
+ end
124
+ end
125
+ }
126
+
127
+
128
+ === Handling twitter channels
129
+
130
+ A twitter channel has one related event:
131
+
132
+ * *twitter*:*new*: a new tweet sent by an associated twitter account reached the application
133
+
134
+ require 'connfu'
135
+
136
+ TOKEN = "<app-token>"
137
+
138
+ Connfu.application(TOKEN) {
139
+
140
+ listen(:twitter) do |twitter|
141
+
142
+ twitter.on(:new) do |tweet|
143
+ puts "#{tweet[:channel_name]} just posted a new tweet in the application: #{tweet.content}"
144
+ end
145
+
146
+ end
147
+
148
+ }
149
+
150
+
151
+ === Examples
152
+
153
+ ==== Conference room
154
+
155
+ This application defines two channels, voice and twitter, and handles conference rooms using a predefined whitelist.
156
+
157
+ Conference attendees can also tweet information regarding the chat room using the hashtag #conference.
158
+
159
+ require 'connfu'
160
+
161
+ TOKEN = "<valid-app-token>"
162
+ NEW_CALL_MESSAGE = "new call received"
163
+
164
+ HANG_MESSAGE = "has left the call"
165
+
166
+ Connfu.application(TOKEN) {
167
+
168
+ listen(:voice) do
169
+ on(:join) do |call|
170
+ puts "#{NEW_CALL_MESSAGE} on number #{call[:destination]}"
171
+ conf = ConferenceApp::find_by_conference_number(call[:destination])
172
+ if conf.is_allowed?(call[:origin])
173
+ puts "whitelist number received"
174
+ else
175
+ puts "not whitelist number"
176
+ end
177
+ end
178
+
179
+ on(:hang) do |call|
180
+ puts "#{call[:origin]} #{HANG_MESSAGE} #{call[:destination]}"
181
+ ConferenceApp::find(call[:destination]).end(call[:origin])
182
+ end
183
+ end
184
+
185
+ listen(:twitter) do |channel|
186
+
187
+ channel.filter = "text has #conference"
188
+
189
+ on(:new) do |tweet|
190
+ puts "A new tweet arrived"
191
+ conf = ConferenceApp::find_by_twitter_user(tweet[:origin])
192
+ conf.wall.print("#{tweet[:origin]}: has tweeted #{tweet[:destination]}")
193
+ end
194
+
195
+ end
196
+
197
+ listen(:foo) do |channel|
198
+ on(:new) do |message|
199
+ puts "This is an unsupported channel"
200
+ end
201
+ end
202
+
203
+ }
204
+
205
+ == Provisioning API
206
+
207
+ With the provisioning API client you can manage your application channels.
208
+
209
+ All the requests should be signed using a specific application *api_key*
210
+
211
+ require 'connfu'
212
+
213
+ application = Connfu::Provisioning::Application.new(api_key)
214
+
215
+ Actually there are three available channel types:
216
+
217
+ * *Voice*: retrieves events related to calls and inbound sms to a specific number
218
+ * *Twitter*: retrieves tweets related to one or more twitter accounts
219
+ * *RSS*: retrieves new posts in a RSS feed
220
+
221
+ In the next subsections you can find examples about how to manage channels.
222
+
223
+ Please check the folder *examples* for deeper information
224
+
225
+ === Voice channels
226
+
227
+ The next sections show information about how to manage voice channels in an application.
228
+
229
+ ==== Create a Voice channel
230
+
231
+ This snippet of code creates a voice channel and associates a phone number to the application.
232
+
233
+ require 'connfu'
234
+
235
+ application = Connfu::Provisioning::Application.new(api_key)
236
+ application.create_voice_channel("my-voice-channel", "UK")
237
+
238
+ Optionally a third parameter can be used defining the channel privacy settings:
239
+
240
+ * Connfu::Provisioning::Voice::Channel::WHITELIST : only a specific set of phone numbers can join the conference
241
+ * Connfu::Provisioning::Voice::Channel::PUBLIC : any user can join the conference
242
+
243
+ Valid country codes are _UK_ and _US_
244
+
245
+ ==== Retrieve all Voice channels
246
+
247
+ This snippet of code retrieves information about the voice channels associated to the application.
248
+
249
+ require 'connfu'
250
+
251
+ application = Connfu::Provisioning::Application.new(api_key)
252
+ voice_channels = application.get_voice_channel
253
+
254
+ ==== Retrieve a Voice channel
255
+
256
+ This snippet of code retrieves information about a specific voice channel associated to the application.
257
+
258
+ require 'connfu'
259
+
260
+ application = Connfu::Provisioning::Application.new(api_key)
261
+ voice_channel = application.get_voice_channel("my-voice-channel")
262
+
263
+ ==== Update Voice channel
264
+
265
+ This snippet of code updates the topic, privacy setting, welcome\_message and rejected\_message associated to the voice channel.
266
+
267
+ require 'connfu'
268
+
269
+ application = Connfu::Provisioning::Application.new(api_key)
270
+ application.update_voice_channel("my-voice-channel",
271
+ {:topic =>"new topic",
272
+ :welcome_message => "Hello!",
273
+ :rejected_message => "You're not allowed to join the conference.",
274
+ :privacy => Connfu::Provisioning::Voice::Privacy::PUBLIC})
275
+
276
+ ==== Delete a Voice channel
277
+
278
+ This snippet of code deletes a voice channel previously created.
279
+
280
+ require 'connfu'
281
+
282
+ application = Connfu::Provisioning::Application.new(api_key)
283
+ application.delete_voice_channel("my-voice-channel")
284
+
285
+ ==== Voice Channel Whitelist
286
+
287
+ Only a predefined set of numbers can join a conference created using a voice channel. Numbers must be included in the conference whitelist before joining the conference.
288
+
289
+ ===== Add a number to the whitelist
290
+
291
+ This snippet of code adds a new user to the conference whitelist.
292
+
293
+ require 'connfu'
294
+
295
+ application = Connfu::Provisioning::Application.new(api_key)
296
+ application.add_whitelist("my-voice-channel", "paul", "0044654332")
297
+
298
+ ===== Retrieve a channel whitelist
299
+
300
+ This snippet of code retrieves a conference whitelist.
301
+
302
+ require 'connfu'
303
+
304
+ application = Connfu::Provisioning::Application.new(api_key)
305
+ whitelist = application.get_whitelist("my-voice-channel")
306
+
307
+ ===== Delete the Voice channel whitelist
308
+
309
+ This snippet of code deletes the whole conference whitelist.
310
+
311
+ require 'connfu'
312
+
313
+ application = Connfu::Provisioning::Application.new(api_key)
314
+ application.delete_whitelist("my-voice-channel")
315
+
316
+ ===== Delete a whitelist entry
317
+
318
+ This snippet of code deletes a specific whitelist item.
319
+
320
+ require 'connfu'
321
+
322
+ application = Connfu::Provisioning::Application.new(api_key)
323
+ application.delete_whitelist("my-voice-channel", "0044654332")
324
+
325
+ ==== Voice channel numbers
326
+
327
+ A voice channel can have more than one mapped phone number. This will enable users from different countries join a conference with local rates.
328
+
329
+ ===== Add a new number to a voice channel
330
+
331
+ This snippet of code adds a new phone number to the voice channel. The desired country must be supported.
332
+
333
+ require 'connfu'
334
+
335
+ application = Connfu::Provisioning::Application.new(api_key)
336
+ application.add_phone("my-voice-channel", "UK")
337
+
338
+ ===== Remove a number from a voice channel
339
+
340
+ This snippet of code removes a phone number from the voice channel and release the resource.
341
+
342
+ require 'connfu'
343
+
344
+ application = Connfu::Provisioning::Application.new(api_key)
345
+ application.delete_phone("my-voice-channel", "0044654332")
346
+
347
+ ===== Retrieve all the voice channel numbers
348
+
349
+ This snippet of code retrieves a voice channel phone lists.
350
+
351
+ require 'connfu'
352
+
353
+ application = Connfu::Provisioning::Application.new(api_key)
354
+ phones = application.get_phones("my-voice-channel")
355
+
356
+ === Twitter channels
357
+
358
+ ==== Create Twitter channel
359
+
360
+ This snippet of code creates a twitter channel with two twitter accounts and two hashtags to filter only those messages with a specific hashtag.
361
+
362
+ require 'connfu'
363
+
364
+ application = Connfu::Provisioning::Application.new(api_key)
365
+ application.create_twitter_channel("my-twitter-channel",
366
+ {:origin => "juandebravo", :hashtags => ["ruby", "rails]})
367
+
368
+ ==== Retrieve all Twitter channels
369
+
370
+ This snippet of code retrieves information about all the twitter channels previously created.
371
+
372
+ require 'connfu'
373
+
374
+ application = Connfu::Provisioning::Application.new(api_key)
375
+ twitter_channels = application.get_twitter_channel
376
+
377
+ ==== Retrieve a Twitter channel
378
+
379
+ This snippet of code retrieves information about a specific twitter channel previously created.
380
+
381
+ require 'connfu'
382
+
383
+ application = Connfu::Provisioning::Application.new(api_key)
384
+ twitter_channel = application.get_twitter_channel("my-twitter_channel")
385
+
386
+ ==== Delete a Twitter channel
387
+
388
+ This snippet of code deletes a specific twitter channel previously created.
389
+
390
+
391
+ require 'connfu'
392
+
393
+ application = Connfu::Provisioning::Application.new(api_key)
394
+ application.delete_twitter_channel("my-twitter_channel")
395
+
396
+ == License
397
+
398
+ Check the file License.txt with information about GNU AFFERO GENERAL PUBLIC LICENSE Version 3
data/Rakefile ADDED
@@ -0,0 +1,38 @@
1
+ require 'bundler'
2
+ require 'metric_fu'
3
+
4
+ Bundler::GemHelper.install_tasks
5
+
6
+ require 'rdoc/task'
7
+
8
+ require 'sdoc'
9
+
10
+ task :default => [:test]
11
+
12
+ require 'rspec/core/rake_task'
13
+
14
+ RSpec::Core::RakeTask.new(:test) do |spec|
15
+ spec.skip_bundler = true
16
+ spec.pattern = ['spec/*_spec.rb', 'spec/provisioning/*_spec.rb']
17
+ spec.rspec_opts = '--color --format doc'
18
+ end
19
+
20
+
21
+ RDoc::Task.new do |rdoc|
22
+ rdoc.rdoc_dir = 'doc/rdoc'
23
+ rdoc.title = "connFu DSL #{Connfu::VERSION} documentation"
24
+
25
+ rdoc.rdoc_files.include('README.rdoc', 'LICENSE.txt')
26
+
27
+ rdoc.rdoc_files.include('lib/**/*.rb')
28
+ #rdoc.rdoc_files.include('examples/**/*.rb')
29
+
30
+ rdoc.options << '-f' << 'sdoc'
31
+ rdoc.options << '-T' << 'connfu'
32
+ rdoc.options << '-c' << 'utf-8'
33
+ rdoc.options << '-g'
34
+ rdoc.options << '-m' << 'README.rdoc'
35
+
36
+ #rdoc.rdoc_files.include('README*')
37
+ end
38
+
data/bin/.DS_Store ADDED
Binary file
data/bin/connfu-client ADDED
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.expand_path(File.dirname(File.realpath(__FILE__)) + '/../lib'))
4
+
5
+ require "gli"
6
+
7
+ require "connfu/version"
8
+ require "connfu/cli/generator"
9
+
10
+ include GLI
11
+
12
+ program_desc "connfu-client provides an easy way to manage and the fetch events in any of your connFu applications."
13
+
14
+ version Connfu::VERSION
15
+
16
+ desc "Be verbose my friend"
17
+ switch :v
18
+
19
+ desc "Use scaffold to create a basic application that listens to all the available connFu channels"
20
+ long_desc <<EOS
21
+
22
+ Use scaffold to create a basic application that listens to all the available connFu channels.
23
+ A connFu application can listen to one or more channels.
24
+ Each channel will launch the application logic based on the event fetched using the streaming endpoint that belongs to the application.
25
+ You need a valid application token that can be retrieved in connFu web portal, http://www.connfu.com
26
+ \n
27
+ EOS
28
+
29
+ arg_name "project_name"
30
+ command :scaffold do |c|
31
+ c.desc 'Channels the application should listen to'
32
+ c.default_value ":all"
33
+ c.flag :c
34
+
35
+ c.desc 'Main file that will contain the application logic'
36
+ c.default_value 'application.rb'
37
+ c.flag :f
38
+
39
+ c.action do |global_options, options, args|
40
+ if args.length < 1
41
+ puts c.long_description
42
+ usage = "Usage:"
43
+ usage << "\n #{$0} #{c.name} <application-name>"
44
+ usage << "\n\nOptions:"
45
+
46
+ c.switches.each do |s|
47
+ usage << "\n -#{s[0]}: #{s[1].description}"
48
+ end
49
+
50
+ c.flags.each do |f|
51
+ usage << "\n -#{f[0]}: #{f[1].description}. Default value: #{f[1].default_value}"
52
+ end
53
+
54
+ usage << "\n\n"
55
+ puts usage
56
+ raise ""
57
+ end
58
+ puts " #{green("create")} #{args[0]}"
59
+
60
+ Connfu::Cli::Generator.run(args[0], nil, options[:f])
61
+
62
+ puts " #{green("create")} #{options[:f]}"
63
+
64
+ puts " #{green("Application created!!")}"
65
+ puts "\n"
66
+
67
+
68
+ # Your command logic here
69
+
70
+ # If you have any errors, just raise them
71
+ # raise "that command made no sense"
72
+ end
73
+ end
74
+
75
+ pre do |global, command, options, args|
76
+ puts "Executing #{command.name}" if global[:v]
77
+ true
78
+ end
79
+
80
+ post do |global, command, options, args|
81
+ puts "Executed #{command.name}" if global[:v]
82
+ end
83
+
84
+ on_error do |exception|
85
+ # Error logic here
86
+ # return false to skip default error handling
87
+ true
88
+ end
89
+
90
+ def green(text)
91
+ "\e[32m#{text}\e[0m"
92
+ end
93
+
94
+ exit GLI.run(ARGV)