xiki 0.5.1a → 0.5.3a

Sign up to get free protection for your applications and to get access to all the features.
Files changed (148) hide show
  1. data/Gemfile +1 -11
  2. data/README.markdown +67 -43
  3. data/bin/xiki +2 -15
  4. data/etc/command/xiki_command.rb +115 -41
  5. data/etc/command/xiki_process.rb +3 -7
  6. data/etc/install/el4r_setup.sh +5 -0
  7. data/etc/themes/Black_BG.notes +8 -0
  8. data/etc/themes/Dark_Metal.notes +0 -6
  9. data/etc/themes/Default.notes +24 -0
  10. data/etc/themes/Fall_Fonts.notes +6 -0
  11. data/etc/themes/Light_Gray_BG_Theme.notes +6 -0
  12. data/etc/themes/Orange_Path.notes +1 -1
  13. data/etc/themes/Pastel_Fonts.notes +6 -0
  14. data/etc/themes/Path_Mode_Line.notes +36 -0
  15. data/etc/themes/Rainbow_Fonts.notes +20 -0
  16. data/etc/themes/Shiny_Blue.notes +14 -18
  17. data/etc/themes/Shiny_Green.notes +0 -6
  18. data/etc/themes/White_BG.notes +5 -0
  19. data/etc/vim/vim_status.notes +32 -0
  20. data/etc/vim/xiki.vim +16 -0
  21. data/etc/wrappers/wrapper.rb +2 -2
  22. data/etc/www/index.rb +1 -1
  23. data/etc/www/public/error.html +47 -0
  24. data/etc/www/sinatra_server.rb +353 -0
  25. data/etc/www/web_server.rb +0 -252
  26. data/lib/xiki.rb +94 -26
  27. data/lib/{block.rb → xiki/block.rb} +0 -0
  28. data/lib/{bookmarks.rb → xiki/bookmarks.rb} +11 -10
  29. data/lib/{buffers.rb → xiki/buffers.rb} +10 -10
  30. data/lib/{clipboard.rb → xiki/clipboard.rb} +2 -2
  31. data/lib/{code.rb → xiki/code.rb} +3 -7
  32. data/lib/{code_tree.rb → xiki/code_tree.rb} +3 -3
  33. data/lib/{color.rb → xiki/color.rb} +4 -14
  34. data/lib/{console.rb → xiki/console.rb} +6 -0
  35. data/lib/{control_lock.rb → xiki/control_lock.rb} +5 -1
  36. data/lib/{control_tab.rb → xiki/control_tab.rb} +3 -1
  37. data/lib/{core_ext.rb → xiki/core_ext.rb} +7 -3
  38. data/lib/{cursor.rb → xiki/cursor.rb} +4 -5
  39. data/lib/{deletes.rb → xiki/deletes.rb} +0 -0
  40. data/lib/{diff_log.rb → xiki/diff_log.rb} +4 -4
  41. data/lib/{effects.rb → xiki/effects.rb} +5 -2
  42. data/lib/{environment.rb → xiki/environment.rb} +0 -0
  43. data/lib/{file_tree.rb → xiki/file_tree.rb} +34 -24
  44. data/lib/{files.rb → xiki/files.rb} +15 -5
  45. data/lib/{hide.rb → xiki/hide.rb} +0 -0
  46. data/lib/{history.rb → xiki/history.rb} +1 -0
  47. data/lib/{image.rb → xiki/image.rb} +0 -0
  48. data/lib/{incrementer.rb → xiki/incrementer.rb} +0 -0
  49. data/lib/{insert.rb → xiki/insert.rb} +0 -0
  50. data/lib/{irc.rb → xiki/irc.rb} +0 -0
  51. data/lib/{key_bindings.rb → xiki/key_bindings.rb} +7 -4
  52. data/lib/{keys.rb → xiki/keys.rb} +32 -36
  53. data/lib/{launcher.rb → xiki/launcher.rb} +42 -23
  54. data/lib/{line.rb → xiki/line.rb} +1 -1
  55. data/lib/{links.rb → xiki/links.rb} +0 -0
  56. data/lib/{location.rb → xiki/location.rb} +0 -0
  57. data/lib/{macros.rb → xiki/macros.rb} +0 -0
  58. data/lib/{man.rb → xiki/man.rb} +0 -0
  59. data/lib/{menu.rb → xiki/menu.rb} +62 -11
  60. data/lib/{merb.rb → xiki/merb.rb} +1 -1
  61. data/lib/{message.rb → xiki/message.rb} +0 -0
  62. data/lib/{meths.rb → xiki/meths.rb} +0 -0
  63. data/lib/{mode.rb → xiki/mode.rb} +0 -0
  64. data/lib/{move.rb → xiki/move.rb} +1 -1
  65. data/lib/{notes.rb → xiki/notes.rb} +41 -37
  66. data/lib/{numbers.rb → xiki/numbers.rb} +0 -0
  67. data/lib/{ol.rb → xiki/ol.rb} +2 -3
  68. data/lib/{ol_helper.rb → xiki/ol_helper.rb} +0 -0
  69. data/lib/{overlay.rb → xiki/overlay.rb} +0 -0
  70. data/lib/{pause_means_space.rb → xiki/pause_means_space.rb} +2 -2
  71. data/lib/{php.rb → xiki/php.rb} +0 -0
  72. data/lib/{projects.rb → xiki/projects.rb} +8 -1
  73. data/lib/{relinquish_exception.rb → xiki/relinquish_exception.rb} +0 -0
  74. data/lib/{remote.rb → xiki/remote.rb} +2 -2
  75. data/lib/{requirer.rb → xiki/requirer.rb} +3 -3
  76. data/lib/{rest_tree.rb → xiki/rest_tree.rb} +0 -0
  77. data/lib/{ruby.rb → xiki/ruby.rb} +0 -0
  78. data/lib/{ruby_console.rb → xiki/ruby_console.rb} +0 -0
  79. data/lib/{search.rb → xiki/search.rb} +7 -8
  80. data/lib/{search_term.rb → xiki/search_term.rb} +0 -0
  81. data/lib/{snippet.rb → xiki/snippet.rb} +0 -0
  82. data/lib/{specs.rb → xiki/specs.rb} +0 -0
  83. data/lib/{styles.rb → xiki/styles.rb} +8 -72
  84. data/lib/{svn.rb → xiki/svn.rb} +0 -0
  85. data/lib/{text_util.rb → xiki/text_util.rb} +2 -2
  86. data/lib/{tree.rb → xiki/tree.rb} +40 -32
  87. data/lib/{tree_cursor.rb → xiki/tree_cursor.rb} +0 -0
  88. data/lib/{trouble_shooting.rb → xiki/trouble_shooting.rb} +0 -0
  89. data/lib/{url_tree.rb → xiki/url_tree.rb} +0 -0
  90. data/lib/{view.rb → xiki/view.rb} +39 -16
  91. data/lib/xiki/vim/line.rb +8 -0
  92. data/lib/xiki/vim/tree.rb +9 -0
  93. data/lib/{window.rb → xiki/window.rb} +0 -0
  94. data/menus/address_book.rb +6 -4
  95. data/menus/agenda.rb +3 -3
  96. data/menus/amazon.rb +2 -2
  97. data/menus/applescript.rb +21 -10
  98. data/menus/black.menu +1 -0
  99. data/menus/bootstrap.rb +2 -7
  100. data/menus/browser.rb +8 -5
  101. data/menus/cassandra_db.rb +2 -2
  102. data/menus/chmod.rb +1 -1
  103. data/menus/conf.rb +5 -0
  104. data/menus/cookies.rb +1 -1
  105. data/menus/css.rb +2 -2
  106. data/menus/deck.rb +1 -1
  107. data/menus/dimensions_config.menu +30 -0
  108. data/menus/dimensions_config.rb +5 -0
  109. data/menus/docs.rb +33 -34
  110. data/menus/dotsies.rb +1 -0
  111. data/menus/emacs.rb +7 -2
  112. data/menus/firefox.rb +25 -25
  113. data/menus/git.rb +1 -1
  114. data/menus/gito.rb +2 -2
  115. data/menus/headings.rb +3 -3
  116. data/menus/ip.rb +2 -4
  117. data/menus/itunes.rb +9 -2
  118. data/menus/javascript.rb +3 -1
  119. data/menus/local_storage.rb +4 -4
  120. data/menus/mac.rb +2 -1
  121. data/menus/maps.rb +2 -2
  122. data/menus/models.rb +31 -0
  123. data/menus/mongo.rb +2 -2
  124. data/menus/piano.rb +47 -23
  125. data/menus/r.rb +57 -0
  126. data/menus/rails.rb +89 -27
  127. data/menus/redmine.rb +1 -1
  128. data/menus/sass.rb +1 -1
  129. data/menus/settings.menu +2 -0
  130. data/menus/technologies.rb +4 -1
  131. data/menus/web_interface.rb +58 -0
  132. data/menus/welcome.menu +18 -0
  133. data/menus/white.menu +1 -0
  134. data/menus/youtube.rb +32 -0
  135. data/spec/code_tree_spec.rb +1 -1
  136. data/spec/diff_log_spec.rb +4 -4
  137. data/spec/file_tree_spec.rb +2 -2
  138. data/spec/line_spec.rb +2 -2
  139. data/spec/menu_spec.rb +5 -5
  140. data/spec/ol_spec.rb +3 -3
  141. data/spec/remote_spec.rb +2 -2
  142. data/spec/search_spec.rb +2 -2
  143. data/spec/text_util_spec.rb +1 -1
  144. data/spec/tree_cursor_spec.rb +3 -3
  145. data/spec/tree_spec.rb +3 -3
  146. data/xiki.gemspec +22 -6
  147. metadata +311 -76
  148. data/menus/dir.rb +0 -8
data/menus/git.rb CHANGED
@@ -107,7 +107,7 @@ class Git
107
107
  end
108
108
 
109
109
  Gito.push branch, "project - #{Dir.pwd}"
110
- nil
110
+ ".flash - pushed!"
111
111
  end
112
112
 
113
113
  def self.branch_name dir=nil
data/menus/gito.rb CHANGED
@@ -448,7 +448,7 @@ class Gito
448
448
  hash = Gito.status_to_hash(Gito.status_internal(txt))
449
449
 
450
450
  untracked = hash[:untracked].map{|i| i[1]}
451
- untracked.map!{|i| "+ untracked) #{i}\n"}
451
+ untracked.map!{|i| "+ ignore untracked) #{i}\n"}
452
452
 
453
453
  option = is_unadded ? "- .add\n" : "- .commit/\n"
454
454
  if expand # If showing diffs right away
@@ -673,7 +673,7 @@ class Gito
673
673
 
674
674
  siblings = Tree.siblings :include_label=>true
675
675
  # Remove "untracked (ignore)"
676
- siblings = siblings.select{|i| i !~ /^. untracked \(ignore\)/}.map{|i| Line.without_label(:line=>i)}
676
+ siblings = siblings.select{|i| i !~ /^. ignore untracked\)/}.map{|i| Line.without_label(:line=>i)}
677
677
  siblings = self.remove_options siblings
678
678
 
679
679
  unless siblings.any? # Error if no siblings
data/menus/headings.rb CHANGED
@@ -1,6 +1,6 @@
1
- require 'view'
2
- require 'line'
3
- require 'effects'
1
+ require 'xiki/view'
2
+ require 'xiki/line'
3
+ require 'xiki/effects'
4
4
 
5
5
  class Headings
6
6
 
data/menus/ip.rb CHANGED
@@ -1,10 +1,8 @@
1
1
  class Ip
2
2
  def self.menu
3
- return '111.1.1.111' # TMP: hard-coded for presentation
4
-
5
- inet = `ifconfig`.grep(/\binet\b/)
3
+ inet = `ifconfig`.split("\n").grep(/\binet\b/)
6
4
 
7
5
  return "| #{inet[0][/[\d.]+/]}" if inet.length < 2
8
- "- #{inet[1][/[\d.]+/]}"
6
+ inet[1][/[\d.]+/]
9
7
  end
10
8
  end
data/menus/itunes.rb CHANGED
@@ -7,6 +7,7 @@ class Itunes
7
7
  - .previous/
8
8
  - .artists/
9
9
  - .songs/
10
+ - .current/
10
11
  - .playlist/
11
12
  - api/
12
13
  > Play a song
@@ -21,12 +22,14 @@ class Itunes
21
22
  "
22
23
  end
23
24
 
25
+ @@use_pipe_delimiter = "set Applescript's text item delimiters to \"|\""
26
+
24
27
  def self.songs name=nil
25
28
 
26
29
  # If nothing passed, list all songs
27
30
  if name.nil?
28
- tracks = Applescript.run "iTunes", "get the name of every track of library playlist 1"
29
- tracks = JSON[tracks.sub(/^\{(.+)\}$/, "[\\1]")]
31
+ tracks = Applescript.run "iTunes", "get the name of every track of library playlist 1 as string", :delimiter=>"|"
32
+ tracks = tracks.split("|")
30
33
  return tracks.sort.uniq.select{|o| o != "" && o !~ /^ /}.map{|o| "- #{o}/\n"}.join
31
34
  return
32
35
  end
@@ -35,6 +38,10 @@ class Itunes
35
38
 
36
39
  end
37
40
 
41
+ def self.current
42
+ Applescript.run "iTunes", "get name of current track"
43
+ end
44
+
38
45
  def self.playlist name=nil
39
46
  return View.prompt("Enter a name") if name.nil?
40
47
  Applescript.run "iTunes", "play playlist \"#{name}\""
data/menus/javascript.rb CHANGED
@@ -13,7 +13,9 @@ class Javascript
13
13
 
14
14
  txt << "
15
15
  function p(txt) {
16
- print(JSON.stringify(txt));
16
+ var json = JSON.stringify(txt);
17
+ if(json == undefined && txt) json = txt; // Sometimes JSON.stringify returns undefined when something there (like functions)
18
+ print(json);
17
19
  }";
18
20
 
19
21
  result = self.run_internal txt
@@ -28,7 +28,7 @@ class LocalStorage
28
28
  for (var key in localStorage) { result.push(key) }
29
29
  JSON.stringify(result);
30
30
  `
31
- txt = Firefox.run js, #:jquery=>1 #, :jquery_extra=>ls_function
31
+ txt = Firefox.exec js #:jquery=>1 #, :jquery_extra=>ls_function
32
32
  array = JSON[txt]
33
33
  return "
34
34
  | None found. Create a few test records?
@@ -39,7 +39,7 @@ class LocalStorage
39
39
  end
40
40
 
41
41
  if Keys.delete?
42
- Firefox.run "localStorage.removeItem(\"#{key}\")" #, :jquery=>1
42
+ Firefox.exec "localStorage.removeItem(\"#{key}\")"
43
43
  Tree.to_parent if val
44
44
  Tree.kill_under
45
45
  View.flash "- deleted!"
@@ -51,7 +51,7 @@ class LocalStorage
51
51
  end
52
52
 
53
53
  if val.nil? # If just key passed, show val
54
- txt = Firefox.run "localStorage[\"#{key}\"]" #, :jquery=>1
54
+ txt = Firefox.exec "localStorage[\"#{key}\"]"
55
55
  return self.docs if txt.blank? && key =~ /docs\/?/
56
56
  return self.api if txt.blank? && key =~ /api\/?/
57
57
  return Tree.quote txt
@@ -60,7 +60,7 @@ class LocalStorage
60
60
  Tree.unquote! val
61
61
 
62
62
  val = ENV['txt']
63
- txt = Firefox.run "localStorage[\"#{key}\"] = #{val.inspect}" #, :jquery=>1
63
+ txt = Firefox.exec "localStorage[\"#{key}\"] = #{val.inspect}"
64
64
  View.flash "- Saved!"
65
65
  end
66
66
 
data/menus/mac.rb CHANGED
@@ -10,7 +10,8 @@ class Mac
10
10
  @/Users/
11
11
  @/Applications/
12
12
  @/Applications/Utilities/
13
- @ ~/Library/Fonts/
13
+ @~/Library/Fonts/
14
+ @/System/Library/CoreServices/
14
15
  - api/
15
16
  | Define standard mac shortcuts
16
17
  @ Mac.define_keys
data/menus/maps.rb CHANGED
@@ -1,5 +1,5 @@
1
- require 'view'
2
- require 'effects'
1
+ require 'xiki/view'
2
+ require 'xiki/effects'
3
3
 
4
4
  class Maps
5
5
 
data/menus/models.rb ADDED
@@ -0,0 +1,31 @@
1
+ class Models
2
+ def self.menu
3
+ "
4
+ - .list/
5
+ - .relationships/
6
+ "
7
+ # - structure/
8
+ # - diagram/
9
+ end
10
+
11
+ def self.list
12
+ dir = Projects.default
13
+ models_dir = "#{dir}app/models/"
14
+ models = Dir.new(models_dir).entries.select{|o| o !~ /^\./}
15
+ models.map{|o| "@r/#{o[/\w+/].camelize}.first"}
16
+ end
17
+
18
+ def self.relationships
19
+ dir = Projects.default
20
+ models_dir = "#{dir}app/models/"
21
+ txt = "
22
+ @#{models_dir}
23
+ - ##^ *(has_|belongs_to )/
24
+ "
25
+ Tree.<< txt, :no_search=>1
26
+ Line.next
27
+ Launcher.launch
28
+ nil
29
+ end
30
+
31
+ end
data/menus/mongo.rb CHANGED
@@ -1,4 +1,4 @@
1
- class Mongo
1
+ module Mongo
2
2
  def self.menu # bucket=nil
3
3
  %`
4
4
  - .collections/
@@ -35,7 +35,7 @@ class Mongo
35
35
 
36
36
  def self.run command
37
37
  command << ".forEach(printjson)" if command =~ /.find\(/
38
- txt = `mongo --eval '#{command}'`
38
+ txt = `mongo admin --eval '#{command}'`
39
39
 
40
40
  if txt =~ /couldn't connect to server/
41
41
  raise "> Mongo isn't running. Start it?
data/menus/piano.rb CHANGED
@@ -1,14 +1,19 @@
1
- Requirer.require_gem 'midiator', :optional=>1
1
+ Requirer.require_gem 'unimidi', :optional=>1
2
+
3
+ require 'xiki/mode'
2
4
 
3
- require "mode"
4
5
 
5
6
  class Piano
6
7
 
7
8
  include MIDIator::Notes rescue nil
8
9
  include MIDIator::Drums rescue nil
9
10
 
11
+ @@unimidi = nil
12
+
13
+ @@held_down = []
14
+
10
15
  @@midi = nil
11
- @@velocity = 126
16
+ @@velocity = 100
12
17
  @@tempo = 120
13
18
  @@probability = 100
14
19
  @@melodic = 0
@@ -362,6 +367,8 @@ class Piano
362
367
  end
363
368
  end
364
369
 
370
+ self.clear
371
+
365
372
  nil
366
373
  end
367
374
 
@@ -383,21 +390,18 @@ class Piano
383
390
  end
384
391
  end
385
392
 
386
- def self.clear channel=1
387
- self.driver.control_change 123, channel, 123
388
- end
389
-
390
393
  def self.<< letter
391
394
  self.note letter
392
395
  end
393
396
 
394
397
  def self.letter_to_number letter, options={}
395
398
 
396
- adjustment =@@mode
399
+ adjustment = @@mode
397
400
 
398
401
  letter.next! if @@pentatonic && (letter == "b" || letter == "e")
399
402
 
400
- number = letter[0].to_i
403
+ number = letter[0,1].sum
404
+
401
405
  number = case letter
402
406
  when "a".."z"; number - 96
403
407
  when "A".."G"; number - 71
@@ -428,7 +432,6 @@ class Piano
428
432
  if @@climb == 0
429
433
  random *= ((-1) ** rand(2)) # Half of the time, make it decrease note
430
434
  end
431
- # Ol << "random: #{random.inspect}"
432
435
 
433
436
  if @@melodic == 1
434
437
  track = options[:track]
@@ -449,7 +452,6 @@ class Piano
449
452
  number
450
453
  end
451
454
 
452
-
453
455
  def self.note letter='a', options={}
454
456
 
455
457
  return if letter.nil? || letter == "#"
@@ -486,21 +488,44 @@ class Piano
486
488
  number += 1 if options[:sharp]
487
489
  number += (@@octave * 12)
488
490
 
489
- self.driver.note_on(number, channel, velocity) unless number == 0
491
+ channel = 143 + channel
492
+ @@held_down << number
493
+ self.unimidi.puts(channel, number, velocity) # note on message
490
494
 
491
- return if options[:no_sit]
495
+ return if options[:no_sit] # Don't sit if other tracks have same beat
492
496
 
493
497
  self.pause
494
498
  nil
495
499
  end
496
500
 
501
+ def self.unimidi
502
+ @@unimidi ||= UniMIDI::Output.open(0).open
503
+ end
504
+
505
+ def self.send channel, number, value
506
+
507
+ output = UniMIDI::Output.open(0)
508
+
509
+ output.open do |output|
510
+ output.puts(channel, number, 90) # note on message
511
+ end
512
+ end
513
+
497
514
  def self.pause
515
+ # Ol << "!"
498
516
  pause = @@tempo * 4
499
517
  pause = pause / 60.0
500
518
  pause = 1 / pause
501
519
  $el ? $el.sit_for(pause) : sleep(pause)
502
520
  Piano.clear
503
- Piano.clear 10
521
+ end
522
+
523
+ def self.clear chan=1
524
+ chan = (chan + 143) - 16
525
+
526
+ while number = @@held_down.shift do
527
+ self.unimidi.puts(chan, number, 90) # note on message
528
+ end
504
529
  end
505
530
 
506
531
  def self.keydef letter, note, channel=1, velocity=126
@@ -620,7 +645,6 @@ class Piano
620
645
  end
621
646
 
622
647
  def self.reset
623
- self.connect
624
648
 
625
649
  @@velocity = 126
626
650
  @@tempo = 120
@@ -636,7 +660,7 @@ class Piano
636
660
  @@octave = 0
637
661
  @@program = 1
638
662
  @@repeat = 1
639
- @@seed = nil
663
+ # @@seed = nil
640
664
 
641
665
  ".flash - success!"
642
666
  end
@@ -662,13 +686,13 @@ class Piano
662
686
  def self.probability txt="50"; @@probability = txt.to_s.sub('%', '').to_i; ".flash - updated!"; end
663
687
  def self.variation txt="2"
664
688
  @@variation = txt.to_i
665
- if @@seed # If seed set manually, just use it
666
- seed = @@seed
667
- else # Else auto-generate seed
668
- seed = rand 999_999_999_999_999_999_999
669
- end
689
+ # if @@seed # If seed set manually, just use it
690
+ # seed = @@seed
691
+ # else # Else auto-generate seed
692
+ # seed = rand 999_999_999_999_999_999_999
693
+ # end
670
694
 
671
- srand seed
695
+ # srand seed
672
696
 
673
697
  ".flash - updated!"
674
698
  end
@@ -678,7 +702,7 @@ class Piano
678
702
  def self.consistency txt="50"; @@consistency = txt.to_s.sub('%', '').to_i; ".flash - updated!"; end
679
703
  def self.octave txt="0"; @@octave = txt.to_i; ".flash - updated!"; end
680
704
  def self.repeat txt="4"; @@repeat = txt.to_i; ".flash - updated!"; end
681
- def self.seed txt; @@seed = txt.to_i; ".flash - updated!"; end
705
+ # def self.seed txt; @@seed = txt.to_i; ".flash - updated!"; end
682
706
 
683
707
  def self.mode txt=nil
684
708
  return @@mode if txt.nil?
data/menus/r.rb ADDED
@@ -0,0 +1,57 @@
1
+ gem 'httparty'; require 'httparty'
2
+
3
+ #
4
+ # Runs code in a rails app. Implants xiki_dev_controller.rb into the
5
+ # app, so it can pass messages to it to eval.
6
+ #
7
+ # For security it only works in dev mode, only accepts local requests,
8
+ # and reads input from a file on disk.
9
+ #
10
+ class R
11
+ def self.menu code=nil, yaml=nil
12
+
13
+ # If nothing passed, show last r/... commands...
14
+
15
+ if ! code
16
+ txt = Launcher.last "r", :exclude_path=>1
17
+ txt.gsub! /^- (\| )?/, '| '
18
+ txt = txt.split("\n").uniq.join("\n")
19
+ return txt
20
+ end
21
+
22
+ ENV['no_slash'] = "1"
23
+
24
+ if yaml
25
+ txt = ENV['txt']
26
+ txt = Rails.run_in_app txt, :yaml=>1
27
+ else
28
+ txt = Rails.run_in_app ENV['txt']
29
+ txt = Tree.quote(txt) if txt !~ /^\s+>/
30
+ end
31
+
32
+ txt
33
+ end
34
+
35
+ def self.suggest_creating_controller
36
+ %`
37
+ | This rails app may not have the xiki dev controller
38
+ | installed to let xiki evaluate code in it in dev mode.
39
+ | Create it?
40
+ @#{Projects.default}
41
+ - app/controllers/
42
+ - xiki_dev_controller.rb
43
+ | class XikiDevController < ApplicationController
44
+ | def index
45
+ | return render(:text=>"Disabled unless development and called locally.") if ! Rails.env.development? || request.remote_ip != "127.0.0.1"
46
+ | code = File.read "/tmp/rails_run_tmp.txt"
47
+ | txt = eval code
48
+ | render :text=>txt.to_yaml
49
+ | end
50
+ | end
51
+ - config/routes.rb
52
+ |+ match 'xiki_dev' => 'xiki_dev#index'
53
+ | end
54
+ `
55
+ end
56
+
57
+ end
data/menus/rails.rb CHANGED
@@ -1,4 +1,4 @@
1
- require "ruby_console"
1
+ require 'xiki/ruby_console'
2
2
 
3
3
  class Rails
4
4
 
@@ -19,14 +19,14 @@ class Rails
19
19
  - .interact/
20
20
  - .rails console/
21
21
  - .sqlite console/
22
- - .models/
22
+ - @models/
23
23
  - .setup/
24
24
  - .db/
25
25
  - .migrate/
26
26
  - .use rspec/
27
- - .general/
28
27
  - .rails version/
29
28
  "
29
+ # - .eval/
30
30
  end
31
31
 
32
32
  def self.menu_after txt, *args
@@ -34,18 +34,17 @@ class Rails
34
34
  end
35
35
 
36
36
  def self.menu_before *path
37
-
38
- dir = Projects.current # Returns dir in tree, or current project (top of projects.menu)
37
+ dir = Projects.default # Returns dir in tree, or current project (top of projects.menu)
39
38
 
40
39
  # Don't intercede if already rails app or trying to generate
41
40
  return nil if ["generate", "general"].member?(path[0]) || File.exists?("#{dir}app")
42
41
 
43
42
  # If not a rails dir, give option to generate
44
43
  return "
45
- | No rails app in #{dir} yet. Generate it?
44
+ > No rails app in #{dir} yet. Generate it?
46
45
  - generate/app/
47
46
 
48
- | Not project-specific
47
+ > Non project-specific options
49
48
  - general/
50
49
  "
51
50
  end
@@ -55,7 +54,7 @@ class Rails
55
54
  end
56
55
 
57
56
  def self.use_rspec
58
- dir = Projects.current
57
+ dir = Projects.default
59
58
 
60
59
  txt = "
61
60
  @ #{dir}
@@ -74,22 +73,13 @@ class Rails
74
73
  "
75
74
  end
76
75
 
77
-
78
- def self.models
79
- dir = Projects.current
80
- dir = "#{dir}app/models/"
81
-
82
- entries = Dir.new(dir).entries.select{|o| o =~ /^\w/}
83
- entries.map{|o| "@r/#{TextUtil.camel_case o[/\w+/]}.first/"}.join("\n")
84
- end
85
-
86
76
  def self.sqlite_console
87
- Console.run "sqlite3 db/development.sqlite3", :dir=>Projects.current, :buffer=>"sqlite console"
77
+ Console.run "sqlite3 db/development.sqlite3", :dir=>Projects.default, :buffer=>"sqlite console"
88
78
  ".flash - opened console!"
89
79
  end
90
80
 
91
81
  def self.rails_console
92
- Console.run "rails c", :dir=>Projects.current, :buffer=>"rails console"
82
+ Console.run "rails c", :dir=>Projects.default, :buffer=>"rails console"
93
83
  ".flash - opened console!"
94
84
  end
95
85
 
@@ -97,30 +87,30 @@ class Rails
97
87
 
98
88
  examples = "
99
89
  > Example fields
100
- | id:primary_key
101
90
  | name:string
102
- | description:text
91
+ | details:text
92
+ | summary:text
103
93
  | quantity:integer
104
94
  | price:decimal
105
- | purchased_at:datetime
106
95
  | delivery:boolean
96
+ | purchased_at:datetime
107
97
  | user:references
108
98
  ".unindent
109
99
 
110
100
  case what
111
101
  when "app"
112
- Console.run "rails new . --skip-bundle", :dir=>Projects.current
102
+ Console.run "rails new . --skip-bundle", :dir=>Projects.default
113
103
  return "- generating rails app..."
114
104
  when "model", "resource", "scaffold"
115
105
  return View.prompt "Enter a name" if ! name
116
106
  return examples if ! detail
117
107
  fields = ENV['txt'].gsub("\n", ' ').strip
118
- Console.run "rails g #{what} #{name} #{fields}", :dir=>Projects.current
108
+ Console.run "rails g #{what} #{name} #{fields}", :dir=>Projects.default
119
109
  return "- generating #{what}..."
120
110
  when "controller"
121
111
  return View.prompt "Enter a name" if ! name
122
112
  return View.prompt "Enter an action" if ! detail
123
- Console.run "rails g controller #{name} #{detail}", :dir=>Projects.current
113
+ Console.run "rails g controller #{name} #{detail}", :dir=>Projects.default
124
114
  return "- generating controller..."
125
115
  end
126
116
 
@@ -141,7 +131,7 @@ class Rails
141
131
  command = "rails s"
142
132
  command << " -p #{port}" if port
143
133
 
144
- Console.run command, :dir=>Projects.current, :buffer=>"rails server"
134
+ Console.run command, :dir=>Projects.default, :buffer=>"rails server"
145
135
 
146
136
  # Check whether it's already running
147
137
  "| Rails app was already running\n- browse/"
@@ -150,11 +140,83 @@ class Rails
150
140
  end
151
141
 
152
142
  def self.command txt
153
- Console.run txt, :dir=>Projects.current
143
+ Console.run txt, :dir=>Projects.default
154
144
  end
155
145
 
156
146
  def self.migrate
157
147
  self.command "rake db:migrate"
158
148
  end
159
149
 
150
+ def self.eval *args
151
+
152
+ if args.blank?
153
+ return "
154
+ > Put some code here, to run it in the context of a controller
155
+ | request.methods
156
+ "
157
+ end
158
+
159
+ # Text passed, so run put in controller method and call
160
+
161
+ # Start server if necessary
162
+ # And install the dev controller?
163
+
164
+ txt = ENV['txt']
165
+
166
+ "- TODO) implement calling dev_controller"
167
+ end
168
+
169
+ def self.run_in_app txt, options={}
170
+
171
+ # If just code passed, run it...
172
+
173
+ if options[:yaml]
174
+ # If yaml passed, deduce code to save model, and run...
175
+
176
+ txt = "
177
+ txt = #{txt.inspect}
178
+ mods = YAML::load(txt)
179
+
180
+ mods = [mods] if ! mods.is_a?(Array)
181
+ mods.each do |mod|
182
+ mod.partial_updates = false
183
+
184
+ existing = mod.class.where :id=>mod.id
185
+ mod.instance_variable_set('@new_record', true) if existing.empty?
186
+
187
+ mod.save
188
+ end
189
+ "
190
+ end
191
+
192
+ File.open("/tmp/rails_run_tmp.txt", "w") { |f| f << txt }
193
+ response = HTTParty.get("http://localhost:3000/xiki_dev") rescue :exception
194
+
195
+ return "| The rails server doesn't appear to be running. Start default server?\n@rails/start/" if response == :exception
196
+
197
+ return self.suggest_creating_controller if response.response.is_a?(Net::HTTPNotFound)
198
+
199
+ return ".flash - saved!" if options[:yaml]
200
+
201
+ txt = response.body
202
+ txt.gsub!(/ +$/, '')
203
+
204
+ # If is error, delete html at top
205
+ txt.sub!(/.+?<h1>/m, '<h1>') if txt =~ /<div id="traces">/ && txt =~ /<h1>/
206
+
207
+ # If file not found, suggest generating it
208
+ if txt =~ /uninitialized constant XikiDevController::(\w+)/
209
+ clazz = $1
210
+ return "
211
+ > Class '#{clazz}' doesn't exist. Generate it as a model?
212
+ @#{Projects.default}
213
+ @rails/generate/model/#{clazz}
214
+ "
215
+
216
+ end
217
+
218
+ txt
219
+
220
+ end
221
+
160
222
  end