nrser-rash 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +104 -0
  3. data/.gitmodules +4 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +4 -0
  6. data/.yardopts +7 -0
  7. data/Gemfile +10 -0
  8. data/README.md +4 -0
  9. data/Rakefile +6 -0
  10. data/bash/source-profile.sh +17 -0
  11. data/dev/bin/.gitkeep +0 -0
  12. data/dev/bin/console +33 -0
  13. data/dev/bin/rake +3 -0
  14. data/dev/bin/rash +16 -0
  15. data/dev/bin/rspec +3 -0
  16. data/dev/ref/autocomplete.rb +62 -0
  17. data/dev/scratch/apps.AppleScript +14 -0
  18. data/dev/scratch/blocks.rb +232 -0
  19. data/dev/scratch/decorating_methods.rb +18 -0
  20. data/dev/scratch/functions.sh +80 -0
  21. data/dev/scratch/if.sh +16 -0
  22. data/dev/scratch/inc.rb +3 -0
  23. data/dev/scratch/inheriting_env/main.rb +44 -0
  24. data/dev/scratch/inheriting_env/sub.rb +9 -0
  25. data/dev/scratch/load_main.rb +5 -0
  26. data/dev/scratch/load_module.rb +19 -0
  27. data/dev/scratch/lsregister-dump.txt +30165 -0
  28. data/dev/scratch/main.rb +4 -0
  29. data/dev/scratch/optparse.rb +43 -0
  30. data/dev/scratch/overridding-cd.sh +53 -0
  31. data/dev/scratch/path.sh +22 -0
  32. data/dev/scratch/pirating_methods.rb +62 -0
  33. data/dev/scratch/profile.sh +624 -0
  34. data/dev/scratch/return.sh +5 -0
  35. data/dev/scratch/source_rvm.sh +11 -0
  36. data/dev/scratch/stub-names/project/test +3 -0
  37. data/exe/rash +4 -0
  38. data/lib/nrser/rash/cli/call.rb +137 -0
  39. data/lib/nrser/rash/cli/help.rb +29 -0
  40. data/lib/nrser/rash/cli/list.rb +36 -0
  41. data/lib/nrser/rash/cli/run.rb +54 -0
  42. data/lib/nrser/rash/cli.rb +21 -0
  43. data/lib/nrser/rash/config.rb +172 -0
  44. data/lib/nrser/rash/core_ext/object.rb +55 -0
  45. data/lib/nrser/rash/formatters.rb +105 -0
  46. data/lib/nrser/rash/functions.rb +154 -0
  47. data/lib/nrser/rash/helpers.rb +53 -0
  48. data/lib/nrser/rash/testing.rb +305 -0
  49. data/lib/nrser/rash/util.rb +260 -0
  50. data/lib/nrser/rash/version.rb +17 -0
  51. data/lib/nrser/rash.rb +40 -0
  52. data/nrser-rash.gemspec +48 -0
  53. data/tmp/.gitkeep +0 -0
  54. metadata +248 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3d0f57a64fe559654975e0fc3d90ad753cd0dec7
4
+ data.tar.gz: e4109821d0a8d6f44b8462be4e1ed838554f2a8b
5
+ SHA512:
6
+ metadata.gz: 31577bfde3938e07e52e9127be4a20258233f966f8e50d28698bdab042369741b7e1693a69355a268696331f03f229cc3180380045c01ca8ef52fa5069bdfae2
7
+ data.tar.gz: 261ebf0901fdc034ab7e5019ec4329a3259820a331ec9bba5bb5a57f93d3a854fa60c79ab59d01fe913276caf4298ec72b88ca5dca670af1321190bdfa77e8c5
data/.gitignore ADDED
@@ -0,0 +1,104 @@
1
+ ##############################################################################
2
+ # BEGIN Ruby.gitignore
3
+ #
4
+ /*.gem
5
+ *.rbc
6
+ /.config
7
+ /coverage/
8
+ /InstalledFiles
9
+ /pkg/
10
+ /spec/reports/
11
+ /spec/examples.txt
12
+ /test/tmp/
13
+ /test/version_tmp/
14
+ /tmp/
15
+
16
+ ## Specific to RubyMotion:
17
+ .dat*
18
+ .repl_history
19
+ build/
20
+
21
+ ## Documentation cache and generated files:
22
+ /.yardoc/
23
+ /_yardoc/
24
+ /doc/
25
+ /rdoc/
26
+
27
+ ## Environment normalization:
28
+ /.bundle/
29
+ /vendor/bundle
30
+ /lib/bundler/man/
31
+
32
+ # for a library or gem, you might want to ignore these files since the code is
33
+ # intended to run in multiple environments; otherwise, check them in:
34
+ # Gemfile.lock
35
+ # .ruby-version
36
+ # .ruby-gemset
37
+
38
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
39
+ .rvmrc
40
+ #
41
+ # END Ruby.gitignore
42
+ ##############################################################################
43
+
44
+ ##############################################################################
45
+ # BEGIN Gem.gitignore
46
+ #
47
+ /Gemfile.lock
48
+ /.ruby-version
49
+ /.ruby-gemset
50
+ #
51
+ # END Gem.gitignore
52
+ ##############################################################################
53
+
54
+ ##############################################################################
55
+ # BEGIN Global/OSX.gitignore
56
+ #
57
+ .DS_Store
58
+ .AppleDouble
59
+ .LSOverride
60
+
61
+ # Icon must end with two
62
+ Icon
63
+
64
+
65
+ # Thumbnails
66
+ ._*
67
+
68
+ # Files that might appear in the root of a volume
69
+ .DocumentRevisions-V100
70
+ .fseventsd
71
+ .Spotlight-V100
72
+ .TemporaryItems
73
+ .Trashes
74
+ .VolumeIcon.icns
75
+
76
+ # Directories potentially created on remote AFP share
77
+ .AppleDB
78
+ .AppleDesktop
79
+ Network Trash Folder
80
+ Temporary Items
81
+ .apdisk
82
+ #
83
+ # END Global/OSX.gitignore
84
+ ##############################################################################
85
+
86
+ ##############################################################################
87
+ # BEGIN QB.gitingore
88
+ #
89
+ # generated qb playbooks
90
+ .qb-playbook.yml
91
+
92
+ # ansible retry files
93
+ .qb-playbook.retry
94
+ #
95
+ # END QB.gitingore
96
+ ##############################################################################
97
+
98
+
99
+ # Project
100
+ # ============================================================================
101
+
102
+ /tmp
103
+ !/doc/
104
+ /doc/site/
data/.gitmodules ADDED
@@ -0,0 +1,4 @@
1
+ [submodule "dev/packages/gems/nrser"]
2
+ path = dev/packages/gems/nrser
3
+ url = git@github.com:nrser/nrser.rb.git
4
+ branch = v0.2.0.pre
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.2
4
+ before_install: gem install bundler -v 1.10.6
data/.yardopts ADDED
@@ -0,0 +1,7 @@
1
+ --markup-provider commonmarker
2
+ --markup markdown
3
+ --output-dir doc/site
4
+ --plugin yard-commonmarker
5
+ -
6
+ doc/**/*.md
7
+ README.md
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Install my user functions' deps too
4
+ eval_gemfile File.join( ENV['ENV_SUPPORT_DIR'], 'rash', 'Gemfile' )
5
+
6
+ # Use dev versions
7
+ # gem 'nrser', path: './dev/packages/gems/nrser'
8
+
9
+ # Specify your gem's dependencies in rash.gemspec
10
+ gemspec
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ NRSER::Rash
2
+ ==============================================================================
3
+
4
+ A dumb idea that just keeps getting better!
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,17 @@
1
+ # this file is sourced from `.bash_profile` to eval the rash profile
2
+ # source in the environment
3
+
4
+ # figure out what dir we're in
5
+ # from http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in
6
+ SOURCE="${BASH_SOURCE[0]}"
7
+ while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
8
+ DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
9
+ SOURCE="$(readlink "$SOURCE")"
10
+ [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
11
+ done
12
+ DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
13
+
14
+ # run the script
15
+ RASH_OUTPUT="$($DIR/../bin/rash profile)"
16
+ # TODO: should we check the exit code here?
17
+ eval "$RASH_OUTPUT"
data/dev/bin/.gitkeep ADDED
File without changes
data/dev/bin/console ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+
5
+ # Load `nrser` gem and use refinements if it's available
6
+ begin
7
+ require 'nrser'
8
+ rescue LoadError => error
9
+ puts "WARN -- Failed to load `nrser` gem."
10
+ puts "WARN -- Add it do your dependencies or edit #{ __FILE__ }"
11
+ else
12
+ using NRSER
13
+ using NRSER::Types
14
+ end
15
+
16
+ require 'nrser/rash'
17
+
18
+ # You can add fixtures and/or initialization code here to make experimenting
19
+ # with your gem easier. You can also use a different console, if you like.
20
+
21
+ # Load `pry` if it's available, falling back to `irb`
22
+ begin
23
+ require "pry"
24
+ rescue LoadError => error
25
+ puts "WARN -- Failed to load `pry` gem."
26
+ puts "WARN -- Add it do your dependencies or edit #{ __FILE__ }"
27
+ puts "INFO -- Starting `IRB`..."
28
+
29
+ require "irb"
30
+ IRB.start
31
+ else
32
+ Pry.start
33
+ end
data/dev/bin/rake ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bash
2
+
3
+ bundle exec rake "$@"
data/dev/bin/rash ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ ##
3
+ # Run the local dev version
4
+ ##
5
+
6
+ # Uncomment to override with a different `RASH_HOME` (which is where functions
7
+ # load from)
8
+ # ENV['RASH_HOME'] = File.join( ENV['RASH_HOME'], 'dev', 'v0.2' )
9
+
10
+ root = File.dirname(File.realpath(File.join(__FILE__, '..', '..')))
11
+
12
+ Dir.chdir root do
13
+ require 'bundler/setup'
14
+ end
15
+
16
+ load File.join(root, 'exe', 'rash')
data/dev/bin/rspec ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bash
2
+
3
+ bundle exec rspec "$@"
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # NOTE 2018.02.22
4
+ # This was a start at implementing Bash autocomplete, obviously copied
5
+ # over from Boxen. Keep around for ref 'cause I really want autocomplete
6
+ # ASAP.
7
+ #
8
+
9
+ require_relative '../lib/rash'
10
+
11
+ module Rash; end
12
+
13
+ module Rash::Autocomplete
14
+ COMMANDS = ['profile', 'call', 'test', 'help']
15
+
16
+ # refresh options via: ruby -e 'puts `boxen -h 2>/dev/null`.scan(/\-+[a-z\?-]+/).inspect'
17
+ # OPTIONS = ["--debug", "--pretend", "--noop", "--report", "--env", "-h", "-?", "--help", "--disable-service", "--enable-service", "--restart-service", "--disable-services", "--enable-services", "--restart-services", "--list-services", "--homedir", "--logfile", "--login", "--no-fde", "--no-pull", "--no-issue", "--stealth", "--token", "--profile", "--future-parser", "--projects", "--srcdir", "--user", "--no-color"]
18
+ # SERVICE_OPTIONS = OPTIONS.select { |o| o.end_with?("-service") }
19
+ # DIR_OPTIONS = ["--logfile", "--homedir"]
20
+
21
+ class << self
22
+ def functions
23
+ Rash.load_functions
24
+ Rash.function_names
25
+ end
26
+
27
+ def complete typed
28
+ # return ['a', 'b', 'c']
29
+ if part = after(typed, COMMANDS)
30
+ if after(typed, ['call'])
31
+ functions.select {|name|
32
+ name.downcase.start_with? part.downcase
33
+ }
34
+ else
35
+ ['x']
36
+ end
37
+ # elsif after(typed, DIR_OPTIONS)
38
+ # []
39
+ else
40
+ COMMANDS.select { |o| o.start_with?(typed[/([a-z-]*)$/,1].to_s) }
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ def after typed, kind
47
+ escaped = kind.map {|str| Regexp.escape str}
48
+ typed[/(#{escaped.join("|")})\s+([^\s]*)?$/, 2]
49
+ end
50
+
51
+ # keep in sync with boxen/service.rb
52
+ def available_services
53
+ Dir["/Library/LaunchDaemons/dev.*.plist"].map { |f| f[/dev\.(.*)\.plist/, 1] }
54
+ end
55
+ end
56
+ end
57
+
58
+ if $0 == __FILE__
59
+ puts Rash::Autocomplete.complete(ENV["COMP_LINE"])
60
+ end
61
+
62
+ # complete -o default -C "${GH}/nrser/rash/bin/autocomplete.rb" rash
@@ -0,0 +1,14 @@
1
+ -- from http://stackoverflow.com/questions/3444326/list-all-applications-output-as-text-file
2
+ -- seems to work, but takes 3.2s to run for some reason, which is an issue
3
+ property pLSRegisterPath : "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister"
4
+
5
+ set theAppPaths to every paragraph of (do shell script pLSRegisterPath & " -dump | grep --after-context 1 \"^bundle\" | grep --only-matching \"/.*\\.app\"")
6
+
7
+ set theNames to {}
8
+ repeat with thePath in theAppPaths
9
+ try
10
+ copy displayed name of (info for (thePath as POSIX file)) to end of theNames
11
+ end try
12
+ end repeat
13
+ -- choose from list theNames
14
+ return theNames
@@ -0,0 +1,232 @@
1
+ class Writer
2
+ def initialize(out)
3
+ @out = out
4
+ @level = 0
5
+ @indent = ' ' * 2
6
+ end
7
+
8
+ def indent(&b)
9
+ @level += 1
10
+ if b
11
+ yield
12
+ dedent
13
+ end
14
+ end
15
+
16
+ def dedent
17
+ @level -= 1
18
+ end
19
+
20
+ def puts(s)
21
+ @out.puts (@indent * @level) + s
22
+ end
23
+
24
+ def block(start, finish)
25
+ puts start if start
26
+ indent
27
+ yield
28
+ dedent
29
+ puts finish if finish
30
+ end
31
+
32
+ def finish_if_block(rtn)
33
+ if rtn.is_a?(Hash) && rtn.key?(:type)
34
+ if rtn[:type] == :else_if
35
+ puts "elif #{rtn[:cond]}\nthen"
36
+ indent
37
+ new_rtn = rtn[:block].call
38
+ dedent
39
+ finish_if_block new_rtn
40
+ elsif rtn[:type] == :else
41
+ puts "else"
42
+ indent
43
+ rtn[:block].call
44
+ dedent
45
+ puts 'fi'
46
+ end
47
+ else
48
+ puts 'fi'
49
+ end
50
+ end
51
+
52
+ def else_if_block(cond, &b)
53
+ {:type => :else_if, :cond => cond, :block => b}
54
+ end
55
+
56
+ def else_block(&b)
57
+ {:type => :else, :block => b}
58
+ end
59
+
60
+ def if_block(cond, &b)
61
+ puts "if #{cond}\nthen"
62
+ indent
63
+ rtn = yield
64
+ dedent
65
+ finish_if_block rtn
66
+ end
67
+ end
68
+
69
+ w = Writer.new($stdout)
70
+ w.if_block 'x=1' do
71
+ w.puts 'blah'
72
+ end
73
+
74
+ w.puts ''
75
+
76
+ # works, but kinda sucks to read
77
+ w.if_block 'x == 1' do
78
+ w.puts 'x is 1'
79
+ w.else_if_block 'x == 2' do
80
+ w.puts 'x is 2'
81
+ w.else_if_block 'x == 3' do
82
+ w.puts 'x is 3'
83
+ w.else_block do
84
+ w.puts 'fuck knows.'
85
+ end
86
+ end
87
+ end
88
+ end
89
+
90
+ # this would be better
91
+ # if false
92
+ # w.if_block 'x == 1' {
93
+ # w.puts 'x is 1'
94
+ # }.elsif_block 'x == 2' {
95
+ # w.puts 'x is 2'
96
+ # }.else_block {
97
+ # w.puts 'fuck knows.'
98
+ # }
99
+ # end
100
+
101
+ # but this would require either delaying the output somehow until we
102
+ # figured out if there was a subsquent call or having a terminator,
103
+ # which is an easy solution, but kinda leaky:
104
+ # if false
105
+ # w.if_block 'x == 1' {
106
+ # w.puts 'x is 1'
107
+ # }.elsif_block 'x == 2' {
108
+ # w.puts 'x is 2'
109
+ # }.else_block {
110
+ # w.puts 'fuck knows.'
111
+ # }.fi
112
+ # end
113
+
114
+ # hmmm, some sort of invoking call might fix it
115
+ # def test(x)
116
+ # puts x.inspect
117
+ # end
118
+ # w.if_block w.if_clause('x == 1') {
119
+ # w.puts 'x is 1'
120
+ # }.else_clause {
121
+ # w.puts 'who knows.'
122
+ # }
123
+
124
+ class Writer
125
+
126
+ class IfBlock
127
+ attr_accessor :if_b, :else_if_bs, :else_b
128
+
129
+ def initialize
130
+ @if_b = nil
131
+ @else_if_bs = []
132
+ @else_b = nil
133
+ end
134
+
135
+ def if(cond, &b)
136
+ @if_b = [cond, b]
137
+ self
138
+ end
139
+
140
+ def else_if(cond, &b)
141
+ @else_if_bs << [cond, b]
142
+ self
143
+ end
144
+
145
+ def else(&b)
146
+ @else_b = b
147
+ self
148
+ end
149
+ end
150
+
151
+ def if_block_2
152
+ block = IfBlock.new
153
+ yield block
154
+ puts "if #{block.if_b[0]}\nthen"
155
+ indent do
156
+ block.if_b[1].call
157
+ end
158
+ block.else_if_bs.each do |else_if_b|
159
+ puts "elif #{else_if_b[0]}\nthen"
160
+ indent do
161
+ else_if_b[1].call
162
+ end
163
+ end
164
+ if block.else_b
165
+ puts "else"
166
+ indent do
167
+ block.else_b.call
168
+ end
169
+ end
170
+ puts "fi"
171
+ end
172
+ end
173
+
174
+ # maybe this:
175
+ puts "\n\nhere:\n"
176
+ w.if_block_2 do |block|
177
+ block.if 'x == 1' do
178
+ w.puts 'x is 1'
179
+ end
180
+ block.else_if 'x == 2' do
181
+ w.puts 'x is 2'
182
+ end
183
+ block.else_if 'x == 3' do
184
+ w.puts 'x is 3'
185
+ end
186
+ block.else do
187
+ w.puts 'fuck knows'
188
+ end
189
+ end
190
+
191
+ # or this:
192
+ puts "\n\nthere:\n"
193
+ w.if_block_2 do |block|
194
+ block.if('x == 1') {
195
+ w.puts 'x is 1'
196
+ }.else_if('x == 2') {
197
+ w.puts 'x is 2'
198
+ }.else_if('x == 3') {
199
+ w.puts 'x is 3'
200
+ }.else {
201
+ w.puts 'fuck knows'
202
+ }
203
+ end
204
+
205
+ w.if_block_2 do
206
+ if_ 'x == 1' do
207
+ w.puts 'x is 1'
208
+ end
209
+ elsif_ 'x == 2' do
210
+ w.puts 'x is 2'
211
+ end
212
+ elsif_ 'x == 3' do
213
+ w.puts 'x is 3'
214
+ end
215
+ else_ do
216
+ w.puts 'fuck knows'
217
+ end
218
+ end
219
+
220
+ class Writer
221
+ def function(name)
222
+ puts "#{ name } ()\n{"
223
+ indent do
224
+ yield
225
+ end
226
+ puts "}"
227
+ end
228
+ end
229
+
230
+ w.function "f" do
231
+ w.puts "echo 'BLAH'"
232
+ end
@@ -0,0 +1,18 @@
1
+ # i want to programatically decorate methods
2
+
3
+ class A
4
+ def f(x, y)
5
+ puts "f called with #{x}, #{y}"
6
+ end
7
+ end
8
+
9
+ class B < A
10
+ [:f].each do |sym|
11
+ define_method(sym) do
12
+ puts 'decorated'
13
+ super
14
+ end
15
+ end
16
+ end
17
+
18
+ B.new.f 1, 2
@@ -0,0 +1,80 @@
1
+ function test {
2
+ # `$@` is an array of all the args?
3
+ echo "$@";
4
+ }
5
+
6
+ # test 1 2 3
7
+
8
+ # definitions
9
+ # -----------
10
+
11
+ RUN_DEFS=1
12
+ if [[ "$RUN_DEFS" -ne "0" ]]; then
13
+
14
+ # both seem to work fine in bash and sh
15
+ #
16
+ # function keyword style:
17
+ function test1 {
18
+ echo "test1 called"
19
+ }
20
+ test1
21
+
22
+ # empty args style:
23
+ test2 () {
24
+ echo "test2 called"
25
+ }
26
+ test2
27
+
28
+ # you can add empty args to the keyword style:
29
+ function test3 () {
30
+ echo "test3 called"
31
+ }
32
+ test3
33
+
34
+ # but you must have the empty args without the keyword,
35
+ # this does not work in bash or sh:
36
+ # test4 {
37
+ # echo "test4 called"
38
+ # }
39
+ # test4
40
+
41
+ # i kinda like the function keyword style 'cause i don't think you can
42
+ # put argument names in the empty args list, so it's kinda confusing
43
+ #
44
+ # doesn't work:
45
+ # test5 (X, Y) {
46
+ # echo $X
47
+ # echo $Y
48
+ # }
49
+ # test5 "hey" "ho"
50
+
51
+ fi
52
+
53
+ # function names
54
+ # --------------
55
+
56
+ RUN_NAMES=0
57
+ if [[ "$RUN_NAMES" -ne "0" ]]; then
58
+
59
+ # dots in names work fine in bash, but fail in sh 'cause
60
+ # the '.' makes in an invalid identifier. i don't have internet right now,
61
+ # but i *think* that '_' was the only seperator legal in an sh function name
62
+ function names.1 {
63
+ echo "names 1 called"
64
+ }
65
+ names.1
66
+
67
+ names.2 () {
68
+ echo "names 2 called"
69
+ }
70
+ names.2
71
+
72
+ # in sh, would need to do something like
73
+ function names__3 {
74
+ echo "names 3 called"
75
+ }
76
+ names__3
77
+
78
+ # ugh
79
+
80
+ fi
data/dev/scratch/if.sh ADDED
@@ -0,0 +1,16 @@
1
+ # X='hey'
2
+ if [[ -z $X ]]; then
3
+ echo 'x not set'
4
+ if [[ $Y ]]; then
5
+ echo 'y set'
6
+ else
7
+ echo 'y not set'
8
+ fi
9
+ else
10
+ echo 'x set'
11
+ if [[ $Y ]]; then
12
+ echo 'y set'
13
+ else
14
+ echo 'y not set'
15
+ fi
16
+ fi
@@ -0,0 +1,3 @@
1
+ def f(x)
2
+ puts "here with #{x}"
3
+ end