blueprint-generators-rails 0.2.4 → 0.2.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 94b9c270d0dc340b6d3224eaff4f68fae3234276
4
- data.tar.gz: c23beb5acf381b2e0777f0680187189b46a28b27
3
+ metadata.gz: 1dd712f8f1b7539509b06b248346e9f472500de2
4
+ data.tar.gz: 1cf019fa7f46e990266eab413ba8928aafbb50e9
5
5
  SHA512:
6
- metadata.gz: 72405d03108a17cec0ffa95d4bd669845265d582b474bb6744e9248c5fde17a1f82afae5cdc863ccd1309107f24d4fe10d02d63957538c368adff6c9dd5bb6dc
7
- data.tar.gz: 5795e6366ebbe021d77d5b43decafe599e13eca57e6a3979cb6c39d10b26c4e9c7ba9c8081eedda64884ce104399ab2a16779951b52b9ea7b3fe72fe5e5ab018
6
+ metadata.gz: 8ded0b307aabc8783e5c61a33094f97e44429c1b00490a99f6ebe96241af2ad86bcf9b2bf649611f920f13ec021be92247bfea07c30dd90b4b8b4b6c9ddfa394
7
+ data.tar.gz: 361b070755dbbc05a24d2c8467a42d293cdb5e57302520a02d4d80a28f913e8ab3fc6591dac8efc7f79d9ef1d0ccd7c8e0d3e72eecf4eaa671902406921d671a
@@ -1,7 +1,7 @@
1
1
  module Blueprint
2
2
  module Generators
3
3
  module Rails
4
- VERSION = '0.2.4'
4
+ VERSION = '0.2.5'
5
5
  end
6
6
  end
7
7
  end
@@ -10,8 +10,9 @@ namespace :blueprint do
10
10
  end
11
11
  end
12
12
 
13
- SEQUENCE_TAG_REGEX = /#[\s]*(:seq[_up|down]*\(.*\))/
14
13
  CONCEPT_STATE_REGEX = /#[\s]*(:state*\(.*\))/
14
+ SEQUENCE_TAG_REGEX = /#[\s]*(:seq[_up|down]*\(.*\))/
15
+ ACTIVITY_TAG_REGEX = /#[\s]*(:act[_perform|decide|yes|no|end]*\(.*\))/
15
16
 
16
17
  PARAMS_REGEX = /(.*)\((.*?)\)/
17
18
 
@@ -117,20 +118,7 @@ namespace :blueprint do
117
118
  pogos << pogo.strip
118
119
  }
119
120
 
120
- puts ''
121
- puts 'Navigate to the link below and paste the provided script into the editor found at:'
122
- puts ''
123
- puts ' http://anaxim.io/#/scratchpad'
124
- puts ''
125
- puts '----'
126
- puts '~~~~'
127
- pogos.each { |pogo|
128
- puts pogo
129
- puts '~~~~'
130
- }
131
- puts '----'
132
- puts ''
133
-
121
+ print_results pogos
134
122
  end
135
123
  end
136
124
 
@@ -174,7 +162,7 @@ namespace :blueprint do
174
162
  tag = line.match(SEQUENCE_TAG_REGEX).try(:captures).try(:first)
175
163
 
176
164
  if tag
177
- print_debug step_count, "Found sequence start tag: '#{tag}'"
165
+ print_debug step_count, "Found sequence tag: '#{tag}'"
178
166
  step_count += 1
179
167
 
180
168
  # extract the tag type and parameters
@@ -226,20 +214,7 @@ namespace :blueprint do
226
214
  pogos << pogo
227
215
  }
228
216
 
229
- puts ''
230
- puts 'Navigate to the link below and paste the provided script into the editor found at:'
231
- puts ''
232
- puts ' http://anaxim.io/#/scratchpad'
233
- puts ''
234
- puts '----'
235
- puts '~~~~'
236
- pogos.each { |pogo|
237
- puts pogo
238
- puts '~~~~'
239
- }
240
- puts '----'
241
- puts ''
242
-
217
+ print_results pogos
243
218
  end
244
219
  end
245
220
 
@@ -247,6 +222,169 @@ namespace :blueprint do
247
222
  task :sequence => :seq do
248
223
  end
249
224
 
225
+ desc 'Generate Activity diagrams for the current Rails project (requires use of semantic tags)'
226
+ task :act, :root_dir, :debug do |t, args|
227
+ root_dir = args[:root_dir] || '.'
228
+ @debug = args[:debug]
229
+
230
+ if @debug
231
+ puts "Debug mode #{@debug}"
232
+ puts "Root directory for analysis is: #{root_dir}"
233
+ end
234
+
235
+ # check that this is actually a Rails projects
236
+ unless File.exist?(root_dir + '/Gemfile')
237
+ puts 'No Gemfile found. Is this a Rails project?'
238
+ next
239
+ end
240
+
241
+ # if we get here than all base sanity checks are passed
242
+
243
+ # for debugging purposes
244
+ step_count = 1
245
+
246
+ # find the remote git repository name (so that we can link to it directly in our diagrams)
247
+ repo_url = determine_remote_repository root_dir
248
+ remote_origin_found = repo_url.present?
249
+
250
+ print_debug step_count, remote_origin_found ? "Remote repository URL is #{repo_url}" : 'No remote repository URL found'
251
+ step_count += 1
252
+
253
+ model = { }
254
+
255
+ # otherwise continue analysis
256
+ Dir.chdir(root_dir) do
257
+ # list all files in the directory - we scan everything (but maybe we shouldn't)
258
+ Dir.glob('**/*.{rb,js,coffee}').each { |f|
259
+ file = File.stat f
260
+
261
+ if file.file?
262
+ line_no = 1
263
+
264
+ File.open(f).each do |line|
265
+
266
+ # we are scanning for things like this:
267
+ # # :act(Test, start)
268
+ # # :act_perform(Test, action)
269
+ # # :act_decide(Test, condition)
270
+ # # :act_yes(Test, good outcome)
271
+ # # :act_no(Test, bad outcome)
272
+ # # :act_end(Test, done)
273
+
274
+ tag = line.match(ACTIVITY_TAG_REGEX).try(:captures).try(:first)
275
+
276
+ if tag
277
+ print_debug step_count, "Found activity tag: '#{tag}'"
278
+ step_count += 1
279
+
280
+ # extract the tag type and parameters
281
+ type, parameters = tag.match(PARAMS_REGEX).try(:captures)
282
+
283
+ case type
284
+ when ':act'
285
+ name, start_state = parameters.split(',').map(&:strip)
286
+ model[name] ||= { }
287
+
288
+ if remote_origin_found
289
+ model[name][:start] ||= { :state => start_state, :at => "#{repo_url}/blob/master/#{f}#L#{line_no}" }
290
+ else
291
+ model[name][:start] ||= { :state => start_state }
292
+ end
293
+
294
+
295
+ when ':act_perform'
296
+ name, action = parameters.split(',').map(&:strip)
297
+ if remote_origin_found
298
+ (model[name][:actions] ||= [ ]) << { :type => 'action', :action => action, :at => "#{repo_url}/blob/master/#{f}#L#{line_no}" }
299
+ else
300
+ (model[name][:actions] ||= [ ]) << { :type => 'action', :action => action }
301
+ end
302
+
303
+ when ':act_decide'
304
+ name, condition = parameters.split(',').map(&:strip)
305
+ if remote_origin_found
306
+ (model[name][:actions] ||= [ ]) << { :type => 'decision', :condition => condition, :at => "#{repo_url}/blob/master/#{f}#L#{line_no}" }
307
+ else
308
+ (model[name][:actions] ||= [ ]) << { :type => 'decision', :condition => condition }
309
+ end
310
+
311
+ when ':act_yes'
312
+ name, action = parameters.split(',').map(&:strip)
313
+ if remote_origin_found
314
+ (model[name][:actions] ||= [ ]) << { :type => 'yes', :action => action, :at => "#{repo_url}/blob/master/#{f}#L#{line_no}" }
315
+ else
316
+ (model[name][:actions] ||= [ ]) << { :type => 'yes', :action => action }
317
+ end
318
+
319
+ when ':act_no'
320
+ name, action = parameters.split(',').map(&:strip)
321
+ if remote_origin_found
322
+ (model[name][:actions] ||= [ ]) << { :type => 'no', :action => action, :at => "#{repo_url}/blob/master/#{f}#L#{line_no}" }
323
+ else
324
+ (model[name][:actions] ||= [ ]) << { :type => 'no', :action => action }
325
+ end
326
+
327
+ when ':act_end'
328
+ name, state = parameters.split(',').map(&:strip)
329
+ if remote_origin_found
330
+ (model[name][:actions] ||= [ ]) << { :type => 'end', :state => state, :at => "#{repo_url}/blob/master/#{f}#L#{line_no}" }
331
+ else
332
+ (model[name][:actions] ||= [ ]) << { :type => 'end', :state => state }
333
+ end
334
+
335
+ else
336
+ raise "Tag type #{type} not recognised when generating activity diagram."
337
+ end
338
+ end
339
+
340
+ line_no += 1
341
+ end
342
+ end
343
+ }
344
+
345
+ # now generate the PogoScript - there may be more than one
346
+ pogos = [ ]
347
+
348
+ model.each { |key, value|
349
+ pogo = "activity \"#{key}\" starts with \"#{value[:start][:state]}\"\n"
350
+
351
+ unless value[:actions].nil?
352
+ value[:actions].each { |a|
353
+ case a[:type]
354
+ when 'action'
355
+ pogo += " perform \"#{a[:action]}\"\n"
356
+ pogo += " at \"#{a[:at]}\"\n" if a[:at].present?
357
+ when 'decision'
358
+ pogo += " decide \"#{a[:condition]}\"\n"
359
+ pogo += " at \"#{a[:at]}\"\n" if a[:at].present?
360
+ when 'yes'
361
+ pogo += " yes \"#{a[:action]}\"\n"
362
+ pogo += " at \"#{a[:at]}\"\n" if a[:at].present?
363
+ when 'no'
364
+ pogo += " no \"#{a[:action]}\"\n"
365
+ pogo += " at \"#{a[:at]}\"\n" if a[:at].present?
366
+ when 'end'
367
+ pogo += " end \"#{a[:state]}\"\n"
368
+ pogo += " at \"#{a[:at]}\"\n" if a[:at].present?
369
+ else
370
+ raise "Direction not recognised when generating PogoScript: #{a[:type]}"
371
+ end
372
+
373
+ pogo += "\n"
374
+ }
375
+ end
376
+
377
+ pogos << pogo.strip
378
+ }
379
+
380
+ print_results pogos
381
+ end
382
+ end
383
+
384
+ desc 'Alias for the \'act\' task'
385
+ task :activity => :act do
386
+ end
387
+
250
388
  desc 'Generate a Conceptual Model diagram for the current Rails project'
251
389
  task :cm, :root_dir, :debug do |t, args|
252
390
 
@@ -497,4 +635,20 @@ namespace :blueprint do
497
635
  end
498
636
  end
499
637
 
638
+ def self.print_results(pogos)
639
+ puts ''
640
+ puts 'Navigate to the link below and paste the provided script into the editor found at:'
641
+ puts ''
642
+ puts ' http://anaxim.io/#/scratchpad'
643
+ puts ''
644
+ puts '----'
645
+ puts '~~~~'
646
+ pogos.each { |pogo|
647
+ puts pogo
648
+ puts '~~~~'
649
+ }
650
+ puts '----'
651
+ puts ''
652
+ end
653
+
500
654
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blueprint-generators-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - benjii
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-01-11 00:00:00.000000000 Z
11
+ date: 2016-01-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler