clj 0.0.2 → 0.0.3
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.
- data/lib/clj.rb +2 -2
- data/lib/clj/parser.rb +25 -22
- data/lib/clj/types.rb +28 -12
- metadata +5 -6
    
        data/lib/clj.rb
    CHANGED
    
    | @@ -16,9 +16,9 @@ class Clojure | |
| 16 16 | 
             
            		Clojure::Parser.new(*args).parse
         | 
| 17 17 | 
             
            	end
         | 
| 18 18 |  | 
| 19 | 
            -
            	def self.dump (what)
         | 
| 19 | 
            +
            	def self.dump (what, options = {})
         | 
| 20 20 | 
             
            		raise ArgumentError, 'cannot convert the passed value to clojure' unless what.respond_to? :to_clj
         | 
| 21 21 |  | 
| 22 | 
            -
            		what.to_clj
         | 
| 22 | 
            +
            		what.to_clj(options)
         | 
| 23 23 | 
             
            	end
         | 
| 24 24 | 
             
            end
         | 
    
        data/lib/clj/parser.rb
    CHANGED
    
    | @@ -13,6 +13,23 @@ require 'strscan' | |
| 13 13 | 
             
            class Clojure
         | 
| 14 14 |  | 
| 15 15 | 
             
            class Parser < StringScanner
         | 
| 16 | 
            +
            	UNPARSED = Object.new
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            	IGNORE = %r(
         | 
| 19 | 
            +
            		(?:
         | 
| 20 | 
            +
            			//[^\n\r]*[\n\r]| # line comments
         | 
| 21 | 
            +
            			/\* # c-style comments
         | 
| 22 | 
            +
            			(?:
         | 
| 23 | 
            +
            				[^*/]| # normal chars
         | 
| 24 | 
            +
            				/[^*]| # slashes that do not start a nested comment
         | 
| 25 | 
            +
            				\*[^/]| # asterisks that do not end this comment
         | 
| 26 | 
            +
            				/(?=\*/) # single slash before this comment's end
         | 
| 27 | 
            +
            			)*
         | 
| 28 | 
            +
            			\*/ # the End of this comment
         | 
| 29 | 
            +
            			|[ \t\r\n,]+ # whitespaces: space, horicontal tab, lf, cr, and comma
         | 
| 30 | 
            +
            		)
         | 
| 31 | 
            +
            	)mx
         | 
| 32 | 
            +
             | 
| 16 33 | 
             
            	STRING = /" ((?:[^\x0-\x1f"\\] |
         | 
| 17 34 | 
             
            		# escaped special characters:
         | 
| 18 35 | 
             
            		\\["\\\/bfnrt] |
         | 
| @@ -38,6 +55,8 @@ class Parser < StringScanner | |
| 38 55 |  | 
| 39 56 | 
             
            	REGEXP = /#"((\\.|[^"])+)"/
         | 
| 40 57 |  | 
| 58 | 
            +
            	INSTANT = /#inst#{IGNORE}*"(.*?)"/
         | 
| 59 | 
            +
             | 
| 41 60 | 
             
            	VECTOR_OPEN  = /\[/
         | 
| 42 61 | 
             
            	VECTOR_CLOSE = /\]/
         | 
| 43 62 |  | 
| @@ -54,23 +73,6 @@ class Parser < StringScanner | |
| 54 73 | 
             
            	FALSE = /false/
         | 
| 55 74 | 
             
            	NIL   = /nil/
         | 
| 56 75 |  | 
| 57 | 
            -
            	IGNORE = %r(
         | 
| 58 | 
            -
            		(?:
         | 
| 59 | 
            -
            		 //[^\n\r]*[\n\r]| # line comments
         | 
| 60 | 
            -
            		 /\* # c-style comments
         | 
| 61 | 
            -
            		 (?:
         | 
| 62 | 
            -
            			[^*/]| # normal chars
         | 
| 63 | 
            -
            			/[^*]| # slashes that do not start a nested comment
         | 
| 64 | 
            -
            			\*[^/]| # asterisks that do not end this comment
         | 
| 65 | 
            -
            			/(?=\*/) # single slash before this comment's end
         | 
| 66 | 
            -
            		 )*
         | 
| 67 | 
            -
            			 \*/ # the End of this comment
         | 
| 68 | 
            -
            			 |[ \t\r\n,]+ # whitespaces: space, horicontal tab, lf, cr, and comma
         | 
| 69 | 
            -
            		)+
         | 
| 70 | 
            -
            	)mx
         | 
| 71 | 
            -
             | 
| 72 | 
            -
            	UNPARSED = Object.new
         | 
| 73 | 
            -
             | 
| 74 76 | 
             
            	def initialize (source, options = {})
         | 
| 75 77 | 
             
            		super(source)
         | 
| 76 78 |  | 
| @@ -115,6 +117,7 @@ class Parser < StringScanner | |
| 115 117 | 
             
            			when scan(FLOAT)    then Float(self[1])
         | 
| 116 118 | 
             
            			when scan(INTEGER)  then Integer(self[1])
         | 
| 117 119 | 
             
            			when scan(REGEXP)   then /#{self[1]}/
         | 
| 120 | 
            +
            			when scan(INSTANT)  then DateTime.rfc3339(self[1])
         | 
| 118 121 | 
             
            			when scan(STRING)   then parse_string
         | 
| 119 122 | 
             
            			when scan(KEYWORD)  then self[1].to_sym
         | 
| 120 123 | 
             
            			when scan(TRUE)     then true
         | 
| @@ -165,7 +168,7 @@ class Parser < StringScanner | |
| 165 168 | 
             
            				result << value
         | 
| 166 169 | 
             
            			when scan(VECTOR_CLOSE)
         | 
| 167 170 | 
             
            				break
         | 
| 168 | 
            -
            			when skip(IGNORE)
         | 
| 171 | 
            +
            			when skip(/#{IGNORE}+/)
         | 
| 169 172 | 
             
            				;
         | 
| 170 173 | 
             
            			else
         | 
| 171 174 | 
             
            				raise SyntaxError, 'wat do'
         | 
| @@ -184,7 +187,7 @@ class Parser < StringScanner | |
| 184 187 | 
             
            				result << value
         | 
| 185 188 | 
             
            			when scan(LIST_CLOSE)
         | 
| 186 189 | 
             
            				break
         | 
| 187 | 
            -
            			when skip(IGNORE)
         | 
| 190 | 
            +
            			when skip(/#{IGNORE}+/)
         | 
| 188 191 | 
             
            				;
         | 
| 189 192 | 
             
            			else
         | 
| 190 193 | 
             
            				raise SyntaxError, 'wat do'
         | 
| @@ -203,7 +206,7 @@ class Parser < StringScanner | |
| 203 206 | 
             
            				result << value
         | 
| 204 207 | 
             
            			when scan(SET_CLOSE)
         | 
| 205 208 | 
             
            				break
         | 
| 206 | 
            -
            			when skip(IGNORE)
         | 
| 209 | 
            +
            			when skip(/#{IGNORE}+/)
         | 
| 207 210 | 
             
            				;
         | 
| 208 211 | 
             
            			else
         | 
| 209 212 | 
             
            				raise SyntaxError, 'wat do'
         | 
| @@ -223,7 +226,7 @@ class Parser < StringScanner | |
| 223 226 | 
             
            		until eos?
         | 
| 224 227 | 
             
            			case
         | 
| 225 228 | 
             
            			when (key = parse(false)) != UNPARSED
         | 
| 226 | 
            -
            				skip(IGNORE)
         | 
| 229 | 
            +
            				skip(/#{IGNORE}*/)
         | 
| 227 230 |  | 
| 228 231 | 
             
            				if (value = parse(false)) == UNPARSED
         | 
| 229 232 | 
             
            					raise SyntaxError, 'no value for the hash'
         | 
| @@ -232,7 +235,7 @@ class Parser < StringScanner | |
| 232 235 | 
             
            				result[key] = value
         | 
| 233 236 | 
             
            			when scan(HASH_CLOSE)
         | 
| 234 237 | 
             
            				break
         | 
| 235 | 
            -
            			when skip(IGNORE)
         | 
| 238 | 
            +
            			when skip(/#{IGNORE}+/)
         | 
| 236 239 | 
             
            				;
         | 
| 237 240 | 
             
            			else
         | 
| 238 241 | 
             
            				raise SyntaxError, 'wat do'
         | 
    
        data/lib/clj/types.rb
    CHANGED
    
    | @@ -8,50 +8,66 @@ | |
| 8 8 | 
             
            #  0. You just DO WHAT THE FUCK YOU WANT TO.
         | 
| 9 9 | 
             
            #++
         | 
| 10 10 |  | 
| 11 | 
            +
            require 'date'
         | 
| 12 | 
            +
             | 
| 11 13 | 
             
            [String, Symbol, Numeric, TrueClass, FalseClass, NilClass].each {|klass|
         | 
| 12 14 | 
             
            	klass.instance_eval {
         | 
| 13 | 
            -
            		 | 
| 15 | 
            +
            		define_method :to_clj do |options = {}|
         | 
| 16 | 
            +
            			inspect
         | 
| 17 | 
            +
            		end
         | 
| 14 18 | 
             
            	}
         | 
| 15 19 | 
             
            }
         | 
| 16 20 |  | 
| 17 21 | 
             
            class Rational
         | 
| 18 | 
            -
            	 | 
| 22 | 
            +
            	def to_clj (options = {})
         | 
| 23 | 
            +
            		to_s
         | 
| 24 | 
            +
            	end
         | 
| 19 25 | 
             
            end
         | 
| 20 26 |  | 
| 21 27 | 
             
            class Regexp
         | 
| 22 | 
            -
            	def to_clj
         | 
| 28 | 
            +
            	def to_clj (options = {})
         | 
| 23 29 | 
             
            		'#"' + inspect[1 .. -2] + '"'
         | 
| 24 30 | 
             
            	end
         | 
| 25 31 | 
             
            end
         | 
| 26 32 |  | 
| 33 | 
            +
            class DateTime
         | 
| 34 | 
            +
            	def to_clj (options = {})
         | 
| 35 | 
            +
            		if options[:alpha]
         | 
| 36 | 
            +
            			'#inst "' + rfc3339 + '"'
         | 
| 37 | 
            +
            		else
         | 
| 38 | 
            +
            			to_time.to_i.to_s
         | 
| 39 | 
            +
            		end
         | 
| 40 | 
            +
            	end
         | 
| 41 | 
            +
            end
         | 
| 42 | 
            +
             | 
| 27 43 | 
             
            class Date
         | 
| 28 | 
            -
            	def to_clj
         | 
| 29 | 
            -
            		 | 
| 44 | 
            +
            	def to_clj (options = {})
         | 
| 45 | 
            +
            		to_datetime.to_clj(options)
         | 
| 30 46 | 
             
            	end
         | 
| 31 47 | 
             
            end
         | 
| 32 48 |  | 
| 33 49 | 
             
            class Time
         | 
| 34 | 
            -
            	def to_clj
         | 
| 35 | 
            -
            		 | 
| 50 | 
            +
            	def to_clj (options = {})
         | 
| 51 | 
            +
            		to_datetime.to_clj(options)
         | 
| 36 52 | 
             
            	end
         | 
| 37 53 | 
             
            end
         | 
| 38 54 |  | 
| 39 55 | 
             
            if defined? BigDecimal
         | 
| 40 56 | 
             
            	class BigDecimal
         | 
| 41 | 
            -
            		def to_clj
         | 
| 57 | 
            +
            		def to_clj (options = {})
         | 
| 42 58 | 
             
            			inspect + 'M'
         | 
| 43 59 | 
             
            		end
         | 
| 44 60 | 
             
            	end
         | 
| 45 61 | 
             
            end
         | 
| 46 62 |  | 
| 47 63 | 
             
            class Array
         | 
| 48 | 
            -
            	def to_clj
         | 
| 49 | 
            -
            		'[' + map { |o| o.to_clj }.join(' ') + ']'
         | 
| 64 | 
            +
            	def to_clj (options = {})
         | 
| 65 | 
            +
            		'[' + map { |o| o.to_clj(options) }.join(' ') + ']'
         | 
| 50 66 | 
             
            	end
         | 
| 51 67 | 
             
            end
         | 
| 52 68 |  | 
| 53 69 | 
             
            class Hash
         | 
| 54 | 
            -
            	def to_clj
         | 
| 55 | 
            -
            		'{' + map { |k, v| k.to_clj + ' ' + v.to_clj }.join(' ') + '}'
         | 
| 70 | 
            +
            	def to_clj (options = {})
         | 
| 71 | 
            +
            		'{' + map { |k, v| k.to_clj(options) + ' ' + v.to_clj(options) }.join(' ') + '}'
         | 
| 56 72 | 
             
            	end
         | 
| 57 73 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: clj
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.3
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -13,7 +13,7 @@ date: 2012-02-03 00:00:00.000000000 Z | |
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: rake
         | 
| 16 | 
            -
              requirement: & | 
| 16 | 
            +
              requirement: &20555460 !ruby/object:Gem::Requirement
         | 
| 17 17 | 
             
                none: false
         | 
| 18 18 | 
             
                requirements:
         | 
| 19 19 | 
             
                - - ! '>='
         | 
| @@ -21,10 +21,10 @@ dependencies: | |
| 21 21 | 
             
                    version: '0'
         | 
| 22 22 | 
             
              type: :development
         | 
| 23 23 | 
             
              prerelease: false
         | 
| 24 | 
            -
              version_requirements: * | 
| 24 | 
            +
              version_requirements: *20555460
         | 
| 25 25 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 26 26 | 
             
              name: rspec
         | 
| 27 | 
            -
              requirement: & | 
| 27 | 
            +
              requirement: &20554680 !ruby/object:Gem::Requirement
         | 
| 28 28 | 
             
                none: false
         | 
| 29 29 | 
             
                requirements:
         | 
| 30 30 | 
             
                - - ! '>='
         | 
| @@ -32,7 +32,7 @@ dependencies: | |
| 32 32 | 
             
                    version: '0'
         | 
| 33 33 | 
             
              type: :development
         | 
| 34 34 | 
             
              prerelease: false
         | 
| 35 | 
            -
              version_requirements: * | 
| 35 | 
            +
              version_requirements: *20554680
         | 
| 36 36 | 
             
            description: 
         | 
| 37 37 | 
             
            email: meh@paranoici.org
         | 
| 38 38 | 
             
            executables: []
         | 
| @@ -67,4 +67,3 @@ signing_key: | |
| 67 67 | 
             
            specification_version: 3
         | 
| 68 68 | 
             
            summary: Like json, but with clojure sexps.
         | 
| 69 69 | 
             
            test_files: []
         | 
| 70 | 
            -
            has_rdoc: 
         |