xiki 0.5.1a → 0.5.3a
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -11
- data/README.markdown +67 -43
- data/bin/xiki +2 -15
- data/etc/command/xiki_command.rb +115 -41
- data/etc/command/xiki_process.rb +3 -7
- data/etc/install/el4r_setup.sh +5 -0
- data/etc/themes/Black_BG.notes +8 -0
- data/etc/themes/Dark_Metal.notes +0 -6
- data/etc/themes/Default.notes +24 -0
- data/etc/themes/Fall_Fonts.notes +6 -0
- data/etc/themes/Light_Gray_BG_Theme.notes +6 -0
- data/etc/themes/Orange_Path.notes +1 -1
- data/etc/themes/Pastel_Fonts.notes +6 -0
- data/etc/themes/Path_Mode_Line.notes +36 -0
- data/etc/themes/Rainbow_Fonts.notes +20 -0
- data/etc/themes/Shiny_Blue.notes +14 -18
- data/etc/themes/Shiny_Green.notes +0 -6
- data/etc/themes/White_BG.notes +5 -0
- data/etc/vim/vim_status.notes +32 -0
- data/etc/vim/xiki.vim +16 -0
- data/etc/wrappers/wrapper.rb +2 -2
- data/etc/www/index.rb +1 -1
- data/etc/www/public/error.html +47 -0
- data/etc/www/sinatra_server.rb +353 -0
- data/etc/www/web_server.rb +0 -252
- data/lib/xiki.rb +94 -26
- data/lib/{block.rb → xiki/block.rb} +0 -0
- data/lib/{bookmarks.rb → xiki/bookmarks.rb} +11 -10
- data/lib/{buffers.rb → xiki/buffers.rb} +10 -10
- data/lib/{clipboard.rb → xiki/clipboard.rb} +2 -2
- data/lib/{code.rb → xiki/code.rb} +3 -7
- data/lib/{code_tree.rb → xiki/code_tree.rb} +3 -3
- data/lib/{color.rb → xiki/color.rb} +4 -14
- data/lib/{console.rb → xiki/console.rb} +6 -0
- data/lib/{control_lock.rb → xiki/control_lock.rb} +5 -1
- data/lib/{control_tab.rb → xiki/control_tab.rb} +3 -1
- data/lib/{core_ext.rb → xiki/core_ext.rb} +7 -3
- data/lib/{cursor.rb → xiki/cursor.rb} +4 -5
- data/lib/{deletes.rb → xiki/deletes.rb} +0 -0
- data/lib/{diff_log.rb → xiki/diff_log.rb} +4 -4
- data/lib/{effects.rb → xiki/effects.rb} +5 -2
- data/lib/{environment.rb → xiki/environment.rb} +0 -0
- data/lib/{file_tree.rb → xiki/file_tree.rb} +34 -24
- data/lib/{files.rb → xiki/files.rb} +15 -5
- data/lib/{hide.rb → xiki/hide.rb} +0 -0
- data/lib/{history.rb → xiki/history.rb} +1 -0
- data/lib/{image.rb → xiki/image.rb} +0 -0
- data/lib/{incrementer.rb → xiki/incrementer.rb} +0 -0
- data/lib/{insert.rb → xiki/insert.rb} +0 -0
- data/lib/{irc.rb → xiki/irc.rb} +0 -0
- data/lib/{key_bindings.rb → xiki/key_bindings.rb} +7 -4
- data/lib/{keys.rb → xiki/keys.rb} +32 -36
- data/lib/{launcher.rb → xiki/launcher.rb} +42 -23
- data/lib/{line.rb → xiki/line.rb} +1 -1
- data/lib/{links.rb → xiki/links.rb} +0 -0
- data/lib/{location.rb → xiki/location.rb} +0 -0
- data/lib/{macros.rb → xiki/macros.rb} +0 -0
- data/lib/{man.rb → xiki/man.rb} +0 -0
- data/lib/{menu.rb → xiki/menu.rb} +62 -11
- data/lib/{merb.rb → xiki/merb.rb} +1 -1
- data/lib/{message.rb → xiki/message.rb} +0 -0
- data/lib/{meths.rb → xiki/meths.rb} +0 -0
- data/lib/{mode.rb → xiki/mode.rb} +0 -0
- data/lib/{move.rb → xiki/move.rb} +1 -1
- data/lib/{notes.rb → xiki/notes.rb} +41 -37
- data/lib/{numbers.rb → xiki/numbers.rb} +0 -0
- data/lib/{ol.rb → xiki/ol.rb} +2 -3
- data/lib/{ol_helper.rb → xiki/ol_helper.rb} +0 -0
- data/lib/{overlay.rb → xiki/overlay.rb} +0 -0
- data/lib/{pause_means_space.rb → xiki/pause_means_space.rb} +2 -2
- data/lib/{php.rb → xiki/php.rb} +0 -0
- data/lib/{projects.rb → xiki/projects.rb} +8 -1
- data/lib/{relinquish_exception.rb → xiki/relinquish_exception.rb} +0 -0
- data/lib/{remote.rb → xiki/remote.rb} +2 -2
- data/lib/{requirer.rb → xiki/requirer.rb} +3 -3
- data/lib/{rest_tree.rb → xiki/rest_tree.rb} +0 -0
- data/lib/{ruby.rb → xiki/ruby.rb} +0 -0
- data/lib/{ruby_console.rb → xiki/ruby_console.rb} +0 -0
- data/lib/{search.rb → xiki/search.rb} +7 -8
- data/lib/{search_term.rb → xiki/search_term.rb} +0 -0
- data/lib/{snippet.rb → xiki/snippet.rb} +0 -0
- data/lib/{specs.rb → xiki/specs.rb} +0 -0
- data/lib/{styles.rb → xiki/styles.rb} +8 -72
- data/lib/{svn.rb → xiki/svn.rb} +0 -0
- data/lib/{text_util.rb → xiki/text_util.rb} +2 -2
- data/lib/{tree.rb → xiki/tree.rb} +40 -32
- data/lib/{tree_cursor.rb → xiki/tree_cursor.rb} +0 -0
- data/lib/{trouble_shooting.rb → xiki/trouble_shooting.rb} +0 -0
- data/lib/{url_tree.rb → xiki/url_tree.rb} +0 -0
- data/lib/{view.rb → xiki/view.rb} +39 -16
- data/lib/xiki/vim/line.rb +8 -0
- data/lib/xiki/vim/tree.rb +9 -0
- data/lib/{window.rb → xiki/window.rb} +0 -0
- data/menus/address_book.rb +6 -4
- data/menus/agenda.rb +3 -3
- data/menus/amazon.rb +2 -2
- data/menus/applescript.rb +21 -10
- data/menus/black.menu +1 -0
- data/menus/bootstrap.rb +2 -7
- data/menus/browser.rb +8 -5
- data/menus/cassandra_db.rb +2 -2
- data/menus/chmod.rb +1 -1
- data/menus/conf.rb +5 -0
- data/menus/cookies.rb +1 -1
- data/menus/css.rb +2 -2
- data/menus/deck.rb +1 -1
- data/menus/dimensions_config.menu +30 -0
- data/menus/dimensions_config.rb +5 -0
- data/menus/docs.rb +33 -34
- data/menus/dotsies.rb +1 -0
- data/menus/emacs.rb +7 -2
- data/menus/firefox.rb +25 -25
- data/menus/git.rb +1 -1
- data/menus/gito.rb +2 -2
- data/menus/headings.rb +3 -3
- data/menus/ip.rb +2 -4
- data/menus/itunes.rb +9 -2
- data/menus/javascript.rb +3 -1
- data/menus/local_storage.rb +4 -4
- data/menus/mac.rb +2 -1
- data/menus/maps.rb +2 -2
- data/menus/models.rb +31 -0
- data/menus/mongo.rb +2 -2
- data/menus/piano.rb +47 -23
- data/menus/r.rb +57 -0
- data/menus/rails.rb +89 -27
- data/menus/redmine.rb +1 -1
- data/menus/sass.rb +1 -1
- data/menus/settings.menu +2 -0
- data/menus/technologies.rb +4 -1
- data/menus/web_interface.rb +58 -0
- data/menus/welcome.menu +18 -0
- data/menus/white.menu +1 -0
- data/menus/youtube.rb +32 -0
- data/spec/code_tree_spec.rb +1 -1
- data/spec/diff_log_spec.rb +4 -4
- data/spec/file_tree_spec.rb +2 -2
- data/spec/line_spec.rb +2 -2
- data/spec/menu_spec.rb +5 -5
- data/spec/ol_spec.rb +3 -3
- data/spec/remote_spec.rb +2 -2
- data/spec/search_spec.rb +2 -2
- data/spec/text_util_spec.rb +1 -1
- data/spec/tree_cursor_spec.rb +3 -3
- data/spec/tree_spec.rb +3 -3
- data/xiki.gemspec +22 -6
- metadata +311 -76
- data/menus/dir.rb +0 -8
data/menus/git.rb
CHANGED
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
|
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
data/menus/ip.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
class Ip
|
2
2
|
def self.menu
|
3
|
-
|
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
|
-
|
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 =
|
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
|
-
|
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
|
data/menus/local_storage.rb
CHANGED
@@ -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.
|
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.
|
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.
|
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.
|
63
|
+
txt = Firefox.exec "localStorage[\"#{key}\"] = #{val.inspect}"
|
64
64
|
View.flash "- Saved!"
|
65
65
|
end
|
66
66
|
|
data/menus/mac.rb
CHANGED
data/menus/maps.rb
CHANGED
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
|
-
|
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 '
|
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 =
|
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
|
399
|
+
adjustment = @@mode
|
397
400
|
|
398
401
|
letter.next! if @@pentatonic && (letter == "b" || letter == "e")
|
399
402
|
|
400
|
-
number = letter[0].
|
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
|
-
|
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
|
-
|
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
|
-
|
667
|
-
else # Else auto-generate seed
|
668
|
-
|
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
|
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
|
-
|
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
|
-
|
44
|
+
> No rails app in #{dir} yet. Generate it?
|
46
45
|
- generate/app/
|
47
46
|
|
48
|
-
|
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.
|
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.
|
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.
|
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
|
-
|
|
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.
|
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.
|
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.
|
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.
|
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.
|
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
|