red 3.3.0 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,14 @@
1
+ == 3.4.0 2008-08-09
2
+
3
+ * 2 major enhancements:
4
+ * Added functionality to "obj" of "class << obj" construct.
5
+ * Souped up -r and -u options for the Red executable.
6
+
7
+ * 3 bug fixes:
8
+ * Added <= and >= to the list of sugared Ruby operators.
9
+ * Fixed nested ternary operators.
10
+ * Fixed camelcasing of all_CAPS sections in identifiers.
11
+
1
12
  == 3.3.0 2008-08-08
2
13
 
3
14
  * 1 major enhancement:
@@ -9,6 +9,14 @@ module Red
9
9
  return [@variable_name, @expression].compile_nodes(:as_argument => true)
10
10
  end
11
11
 
12
+ def compile_increment(options = {})
13
+ return "%s%s" % [options[:receiver] || @variable_name.compile_node, @expression.increment_operator * 2]
14
+ end
15
+
16
+ def call_to_increment?
17
+ return @expression.increment_operator rescue false
18
+ end
19
+
12
20
  class ClassVariableNode < AssignmentNode # :nodoc:
13
21
  def compile_node(options = {})
14
22
  expression = @expression.compile_node(:as_argument => true)
@@ -17,6 +25,7 @@ module Red
17
25
  "%s: %s"
18
26
  else
19
27
  receiver = "%s.%s" % [@@red_class, @variable_name.compile_node]
28
+ return self.compile_increment(:receiver => receiver) if self.call_to_increment?
20
29
  "%s = %s"
21
30
  end % [receiver, expression]
22
31
  end
@@ -24,19 +33,23 @@ module Red
24
33
 
25
34
  class GlobalVariableNode < AssignmentNode # :nodoc:
26
35
  def compile_node(options = {})
36
+ return self.compile_increment if self.call_to_increment?
27
37
  return "%s = %s" % self.compile_internals
28
38
  end
29
39
  end
30
40
 
31
41
  class InstanceVariableNode < AssignmentNode # :nodoc:
32
42
  def compile_node(options = {})
33
- return "this.%s = %s" % self.compile_internals
43
+ receiver = "this.%s" % @variable_name.compile_node
44
+ return self.compile_increment(:receiver => receiver) if self.call_to_increment?
45
+ return "this.%s = %s" % [receiver, @expression.compile_node(:as_argument => true)]
34
46
  end
35
47
  end
36
48
 
37
49
  class LocalVariableNode < AssignmentNode # :nodoc:
38
50
  def compile_node(options = {})
39
- return (@variable_name.is_a?(LiteralNode::NamespaceNode) ? "%s = %s" : "var %s = %s") % self.compile_internals
51
+ return self.compile_increment if self.call_to_increment?
52
+ return (@variable_name.is_a?(LiteralNode::NamespaceNode) || options[:skip_var] ? "%s = %s" : "var %s = %s") % self.compile_internals
40
53
  end
41
54
  end
42
55
 
@@ -51,7 +64,8 @@ module Red
51
64
  end
52
65
 
53
66
  def compile_internals(options = {})
54
- variable_name, slot, expression = [@variable_name, @slot, @expression].compile_nodes(:quotes => '', :as_argument => true)
67
+ variable_name, slot = [@variable_name, @slot].compile_nodes(:quotes => '')
68
+ expression = @expression.compile_node(:as_argument => true)
55
69
  receiver = self.compile_receiver(variable_name, slot)
56
70
  return [receiver, expression]
57
71
  end
@@ -63,9 +77,17 @@ module Red
63
77
 
64
78
  class OperatorNode # :nodoc:
65
79
  def compile_node(options = {})
80
+ return self.compile_increment if self.call_to_increment?
66
81
  return "%s%s = %s %s %s" % self.compile_internals
67
82
  end
68
83
 
84
+ def compile_increment(options = {})
85
+ receiver, operation = [@receiver, @operation].compile_nodes
86
+ slot = @slot.compile_node(:quotes => '')
87
+ original = self.compile_receiver(receiver, slot)
88
+ return "%s%s" % [original, operation * 2]
89
+ end
90
+
69
91
  def compile_internals(options = {})
70
92
  receiver, operation = [@receiver, @operation].compile_nodes
71
93
  expression = @expression.compile_node(:as_argument => true)
@@ -75,6 +97,10 @@ module Red
75
97
  return [var, original, original, operation, expression]
76
98
  end
77
99
 
100
+ def call_to_increment?
101
+ return ['+', '-'].include?(@operation.compile_node) && @expression.compile_node == '1'
102
+ end
103
+
78
104
  class BracketNode < OperatorNode # :nodoc:
79
105
  def initialize(receiver, bracket_contents, operation, expression)
80
106
  @receiver, @slot, @operation, @expression = [receiver, bracket_contents.last, operation, expression].build_nodes
@@ -105,7 +131,7 @@ module Red
105
131
  end
106
132
 
107
133
  def var?
108
- return "var " unless [VariableNode::GlobalVariableNode, VariableNode::InstanceVariableNode].include?(@receiver.class)
134
+ return "var " unless [VariableNode::GlobalVariableNode, VariableNode::InstanceVariableNode, VariableNode::ClassVariableNode].include?(@receiver.class)
109
135
  end
110
136
  end
111
137
 
@@ -119,7 +145,7 @@ module Red
119
145
  end
120
146
 
121
147
  def var?
122
- return "var " unless [VariableNode::GlobalVariableNode, VariableNode::InstanceVariableNode].include?(@receiver.class)
148
+ return "var " unless [VariableNode::GlobalVariableNode, VariableNode::InstanceVariableNode, VariableNode::ClassVariableNode].include?(@receiver.class)
123
149
  end
124
150
  end
125
151
  end
@@ -40,17 +40,18 @@ module Red
40
40
  class MethodNode # :nodoc:
41
41
  def compile_node(options = {})
42
42
  call_to_returned_function = [DefinitionNode::InstanceMethodNode, CallNode::BlockNode].include?(@receiver.class) ? :call : false
43
- receiver = @receiver.compile_node
44
- function = @function.compile_node
43
+ receiver, function = [@receiver, @function].compile_nodes
45
44
  arguments = @arguments.compile_nodes(:as_argument => true, :quotes => "'")
46
45
  return ("$%s(%s)" % [receiver = ((receiver == '$-') || (receiver == 'id' && @@red_library == :Prototype) ? nil : receiver), arguments.first]).gsub('$$','$').gsub('$class','$$') if @receiver.is_a?(VariableNode::GlobalVariableNode) && function == '-'
47
46
  case function.to_sym
48
- when :-, :+, :<, :>, :%, :*, :/, :^, :==, :===, :instanceof
47
+ when :-, :+, :<, :>, :>=, :<=, :%, :*, :/, :^, :==, :===, :instanceof
49
48
  "%s %s %s" % [receiver, function, arguments.first]
50
49
  when :raise
51
50
  "throw(%s)" % [arguments.first]
52
51
  when :new
53
52
  "new %s(%s)" % [receiver, arguments.join(', ')]
53
+ when :var
54
+ "var %s" % [arguments.join(', ')]
54
55
  when :[]
55
56
  if ([:symbol, :string].include?(@arguments.first.data_type) rescue false)
56
57
  arguments = @arguments.compile_nodes(:quotes => "", :as_argument => true)
@@ -66,6 +67,10 @@ module Red
66
67
  end
67
68
  end
68
69
 
70
+ def increment_operator
71
+ return @function.compile_node if ['+', '-'].include?(@function.compile_node) && @arguments.first.compile_node == '1'
72
+ end
73
+
69
74
  class ExplicitNode < MethodNode # :nodoc:
70
75
  def initialize(receiver, function, arguments = [nil])
71
76
  @receiver, @function = [receiver, function].build_nodes
@@ -15,7 +15,7 @@ module Red
15
15
 
16
16
  def compile_internals(options = {})
17
17
  true_case, else_case, condition = [@true_case, @else_case, @condition].compile_nodes
18
- return [condition, (true_case.empty? ? 'null' : true_case), (else_case.empty? ? 'null' : else_case)] if options[:as_argument]
18
+ return [condition, (true_case.empty? ? 'null' : @true_case.compile_node(:as_argument => true)), (else_case.empty? ? 'null' : @else_case.compile_node(:as_argument => true))] if options[:as_argument]
19
19
  condition = (true_case.empty? ? "!(%s)" : "%s") % [condition]
20
20
  true_case = "{ %s; }" % [true_case] unless true_case.empty?
21
21
  join = " else " unless true_case.empty? || else_case.empty?
@@ -88,7 +88,8 @@ module Red
88
88
  end
89
89
 
90
90
  def compile_internals(options = {})
91
- condition, body = [@condition, @body].compile_nodes
91
+ condition = @condition.compile_node(:skip_var => true)
92
+ body = @body.compile_node
92
93
  return [condition, body]
93
94
  end
94
95
  end
@@ -108,7 +109,8 @@ module Red
108
109
  end
109
110
 
110
111
  def compile_internals(options = {})
111
- condition, body = [@condition, @body].compile_nodes
112
+ condition = @condition.compile_node(:skip_var => true)
113
+ body = @body.compile_node
112
114
  return [condition, body]
113
115
  end
114
116
  end
@@ -75,11 +75,12 @@ module Red
75
75
  return @value = @value.to_s unless camelize? && !disabled
76
76
  words = @value.to_s.gsub(/@|\$/,'').split(/_| /)
77
77
  underscore = words.shift if words.first.empty?
78
- @value = (underscore ? '_' : '') + words[0] + words[1..-1].map {|word| word.capitalize}.join
78
+ @value = (underscore ? '_' : '') + words[0] + words[1..-1].map {|word| word == word.upcase ? word : word.capitalize }.join
79
79
  end
80
80
 
81
81
  def camelize?
82
- is_not_a_constant_name = @value.to_s != @value.to_s.upcase
82
+ value = @value.to_s
83
+ is_not_a_constant_name = value != value.upcase || value =~ (/@|\$/)
83
84
  is_not_a_js_special_attribute = @value.to_s[0..1] != '__'
84
85
  return is_not_a_constant_name && is_not_a_js_special_attribute
85
86
  end
@@ -127,14 +127,20 @@ module Red
127
127
 
128
128
  class ObjectLiteralNode # :nodoc:
129
129
  def initialize(receiver, scope)
130
+ old_class = @@red_class
131
+ @@red_class = @class = receiver.build_node.compile_node
130
132
  block_node = scope.assoc(:block) || scope
131
133
  properties = block_node.select {|node| (node.first == :cvdecl) rescue false }
132
134
  functions = block_node.select {|node| ![:block, :scope].include?(node) }
133
135
  @slots = (properties | functions).build_nodes
136
+ @@red_class = old_class
134
137
  end
135
138
 
136
139
  def compile_node(options = {})
140
+ old_class = @@red_class
141
+ @@red_class = @class
137
142
  slots = @slots.compile_nodes(:as_prototype => true).compact.join(', ')
143
+ @@red_class = old_class
138
144
  return "{ %s }" % [slots]
139
145
  end
140
146
  end
@@ -1,26 +1,49 @@
1
1
  module Red # :nodoc:
2
- def build_red_plugin_for_rails
3
- self.make_rails_directory('vendor/plugins/red')
2
+ def build_red_plugin_for_rails(display_message = true)
3
+ @files ||= ''
4
+ self.make_rails_directory('vendor/plugins/red', true)
4
5
 
5
- File.open('vendor/plugins/red/init.rb', 'w') { |f| f.write("require 'rubygems'\nrequire 'red'\n\nRed.rails\n") }
6
+ self.create_plugin_file(:open, 'vendor/plugins/red/init.rb', "require 'rubygems'\nrequire 'red'\n\nRed.rails\n")
6
7
 
7
- puts "Red plugin added to project."
8
+ self.make_rails_directory('public/javascripts/red')
9
+
10
+ return unless display_message
11
+ puts RED_MESSAGES[:rails] % @files
8
12
  exit
9
13
  end
10
14
 
11
15
  def add_unobtrusive(library)
12
- red_directory_created = self.make_rails_directory('public/javascripts/red')
13
- File.copy(File.join(File.dirname(__FILE__), "../javascripts/#{(library || '').downcase}_dom_ready.js"), "public/javascripts/dom_ready.js")
14
- File.copy(File.join(File.dirname(__FILE__), "../javascripts/red/unobtrusive.red"), 'public/javascripts/red/unobtrusive.red')
16
+ @files ||= ''
17
+ self.build_red_plugin_for_rails(false)
18
+
19
+ self.create_plugin_file(:copy, 'public/javascripts/dom_ready.js', File.join(File.dirname(__FILE__), "../javascripts/#{(library || '').downcase}_dom_ready.js"))
20
+ self.create_plugin_file(:copy, 'public/javascripts/red/unobtrusive.red', File.join(File.dirname(__FILE__), "../javascripts/red/unobtrusive.red"))
15
21
 
16
- puts RED_MESSAGES[:unobtrusive]
17
- exit
18
22
  rescue Errno::ENOENT
19
23
  puts "There is no Unobtrusive Red support for #{library}"
20
- Dir.rmdir('public/javascripts/red') if red_directory_created
24
+ ensure
25
+ puts RED_MESSAGES[:unobtrusive] % @files
21
26
  exit
22
27
  end
23
28
 
29
+ def create_plugin_file(operation, filename, contents)
30
+ file_status = self.check_if_plugin_file_exists(filename)
31
+ case operation
32
+ when :open : File.open(filename, 'w') { |f| f.write(contents) } if file_status == 'created'
33
+ when :copy : File.copy(contents, filename)
34
+ end
35
+ @files << "\n%s %s" % [file_status, filename]
36
+ end
37
+
38
+ def check_if_plugin_file_exists(filename)
39
+ if File.exists?(filename)
40
+ print "File #{filename} exists. Overwrite [yN]? "
41
+ return (gets =~ /y/i ? 'created' : 'exists ')
42
+ else
43
+ return 'created'
44
+ end
45
+ end
46
+
24
47
  def direct_translate(string)
25
48
  js_output = hush_warnings { string.string_to_node }.compile_node
26
49
  print_js(js_output, 'test')
@@ -41,13 +64,10 @@ module Red # :nodoc:
41
64
  puts RED_MESSAGES[:output] % [("- #{filename}.js" unless filename == 'test'), js_output, @@red_errors ||= '']
42
65
  end
43
66
 
44
- def make_rails_directory(dir)
67
+ def make_rails_directory(dir, only_this_directory = false)
45
68
  parent_dir = File.dirname(dir)
46
- unless File.exists?(parent_dir)
47
- puts "Directory #{parent_dir} does not exist."
48
- exit
49
- end
50
- Dir.mkdir(dir) unless File.exists?(dir)
69
+ self.make_rails_directory(parent_dir) unless File.exists?(parent_dir) || only_this_directory
70
+ @files << (File.exists?(dir) ? "\nexists %s" : Dir.mkdir(dir) && "\ncreated %s") % dir
51
71
  rescue SystemCallError
52
72
  puts "Unable to create directory in #{parent_dir}"
53
73
  exit
@@ -116,12 +136,16 @@ Use red -h for help.
116
136
  MESSAGE
117
137
 
118
138
  RED_MESSAGES[:unobtrusive] = <<-MESSAGE
119
-
120
- public/javascripts/dom_ready.js
121
- public/javascripts/red
122
- public/javascripts/red/unobtrusive.red
139
+ %s
123
140
 
124
141
  Unobtrusive Red added to project.
125
142
 
126
143
  MESSAGE
144
+
145
+ RED_MESSAGES[:rails] = <<-MESSAGE
146
+ %s
147
+
148
+ Red plugin added to project.
149
+
150
+ MESSAGE
127
151
  end
data/lib/red/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Red
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 3
4
- MINOR = 3
4
+ MINOR = 4
5
5
  TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
data/lib/red.rb CHANGED
@@ -20,7 +20,7 @@ require 'red/wrap_nodes'
20
20
  module Red
21
21
  @@red_library = nil
22
22
  @@red_module = nil
23
- @@red_class = nil
23
+ @@red_class = :window
24
24
  @@rescue_is_safe = false
25
25
  @@exception_index = 0
26
26
 
@@ -1,10 +1,5 @@
1
1
  desc 'Release the website and new gem version'
2
- task :deploy => [:check_version, :release] do
3
- puts "Remember to create SVN tag:"
4
- puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
5
- "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
6
- puts "Suggested comment:"
7
- puts "Tagging release #{CHANGES}"
2
+ task :deploy => [:check_version, :publish_docs, :release] do
8
3
  end
9
4
 
10
5
  task :check_version do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: red
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 3.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jesse Sielaff
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-08-08 00:00:00 -04:00
12
+ date: 2008-08-10 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency