wexpr 0.1.0

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.
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # injections into Object
4
+ class Object
5
+
6
+ #
7
+ # to_wexpr(writeFlags = [])
8
+ # Convert an object to Wexpr. See Wexpr.dump for more information.
9
+ #
10
+ def to_wexpr(writeFlags = [])
11
+ Wexpr.dump self, writeFlags
12
+ end
13
+ end
@@ -0,0 +1,38 @@
1
+
2
+ module Wexpr
3
+ #
4
+ # Internal class which manges the parser state when parsing
5
+ #
6
+ class PrivateParserState
7
+ attr_accessor :line
8
+ attr_accessor :column
9
+ attr_accessor :internalReferenceMap
10
+ attr_accessor :externalReferenceMap
11
+
12
+ def initialize()
13
+ # start at beginning of file
14
+ @line = 1
15
+ @column = 1
16
+ @internalReferenceMap = {}
17
+ @externalReferenceMap = {}
18
+ end
19
+
20
+ def move_forward_based_on_string(str)
21
+ str.each_char do |c|
22
+ if c == '\n' # newline
23
+ @line += 1
24
+ @column = 1
25
+ else
26
+ @column = 1
27
+ end
28
+ end
29
+ end
30
+
31
+ # --- MEMBERS
32
+
33
+ # @line - The line number
34
+ # @column - The column
35
+ # @internalReferenceMap - The internal reference map from within the file. Takes priority.
36
+ # @externalReferenceMap - The external reference map provided by the user.
37
+ end
38
+ end
@@ -0,0 +1,70 @@
1
+
2
+ module Wexpr
3
+ #
4
+ # Helpers for managing VLQ 64bit binary
5
+ #
6
+ module UVLQ64
7
+ #
8
+ # Return the number of bytes which is needed to store a number in the UVLQ64
9
+ #
10
+ def self.byte_size(value)
11
+ # we get 7 bits per byte. 2^7 for each.
12
+ case value
13
+ when 0 ... 128 then return 1 # 2^7
14
+ when 128 ... 16384 then return 2 # 2^14
15
+ when 16384 ... 2097152 then return 3 # 2^21
16
+ when 2097152 ... 268435456 then return 4 # 2^28
17
+ when 268435456 ... 34359738368 then return 5 # 2^35
18
+ when 34359738368 ... 4398046511104 then return 6 # 2^42
19
+ when 4398046511104 ... 562949953421312 then return 7 # 2^49
20
+ when 562949953421312 ... 72057594037927936 then return 8 # 2^56
21
+ when 72057594037927936 ... 9223372036854775808 then return 9 # 2^63
22
+ else
23
+ return 10 # 2^64+
24
+ end
25
+ end
26
+
27
+ #
28
+ # Write a UVLQ64 (big endian) to a buffer. value -> binary.
29
+ #
30
+ def self.write(value)
31
+ bytesNeeded = byte_size(value)
32
+
33
+ buf = []
34
+
35
+ i = bytesNeeded - 1
36
+ for j in 0 .. i
37
+ buf << (((value >> ((i - j) * 7)) & 127) | 128)
38
+ end
39
+
40
+ buf[i] ^= 128
41
+
42
+ return buf.pack('C*')
43
+ end
44
+
45
+ #
46
+ # Read a UVLQ64 big endian from the given buffer. binary -> value
47
+ # Returns the result along with the rest of the buffer not processed
48
+ #
49
+ def self.read(buffer)
50
+ r = 0
51
+ bufferPos = 0
52
+ bufferLen = buffer.size
53
+
54
+ loop do
55
+ if bufferPos == bufferLen
56
+ raise StandardError("Ran out of buffer processing UVLQ64")
57
+ end
58
+
59
+ c = buffer[bufferPos].unpack('C')[0]
60
+ r = (r << 7) | (c & 127)
61
+
62
+ isEnd = (c & 128) == 0
63
+ bufferPos += 1
64
+ break if isEnd
65
+ end
66
+
67
+ return r, buffer[bufferPos..-1]
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,3 @@
1
+ module Wexpr
2
+ VERSION = "0.1.0"
3
+ end
data/wexpr.gemspec ADDED
@@ -0,0 +1,39 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "wexpr/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "wexpr"
8
+ spec.version = Wexpr::VERSION
9
+ spec.authors = ["Kenneth Perry (thothonegan)"]
10
+ spec.email = ["thothonegan@gmail.com"]
11
+
12
+ spec.summary = %q{Wexpr parser and emitter for ruby}
13
+ spec.description = %q{
14
+ Wexpr is a simple configuration language, similar to lisps's S expressions or JSON. Designed to be readable, while being quick and easy to parse.
15
+ This is a ruby library to parse and emit wexpr.
16
+ }
17
+ spec.homepage = "https://github.com/thothonegan/ruby-wexpr"
18
+ spec.license = "MIT"
19
+
20
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
21
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
22
+ #if spec.respond_to?(:metadata)
23
+ # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
24
+ #else
25
+ # raise "RubyGems 2.0 or newer is required to protect against " \
26
+ # "public gem pushes."
27
+ #end
28
+
29
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
30
+ f.match(%r{^(test|spec|features)/})
31
+ end
32
+ spec.bindir = "exe"
33
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
34
+ spec.require_paths = ["lib"]
35
+
36
+ spec.add_development_dependency "bundler", "~> 1.16"
37
+ spec.add_development_dependency "rake", "~> 10.0"
38
+ spec.add_development_dependency "minitest", "~> 5.0"
39
+ end
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: wexpr
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Kenneth Perry (thothonegan)
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-04-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.0'
55
+ description: "\n\tWexpr is a simple configuration language, similar to lisps's S expressions
56
+ or JSON. Designed to be readable, while being quick and easy to parse.\n\tThis is
57
+ a ruby library to parse and emit wexpr.\n "
58
+ email:
59
+ - thothonegan@gmail.com
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - ".gitignore"
65
+ - ".travis.yml"
66
+ - Gemfile
67
+ - Gemfile.lock
68
+ - LICENSE.txt
69
+ - README.md
70
+ - Rakefile
71
+ - bin/console
72
+ - bin/setup
73
+ - bin/wexprTool
74
+ - lib/wexpr.rb
75
+ - lib/wexpr/exception.rb
76
+ - lib/wexpr/expression.rb
77
+ - lib/wexpr/object_ext.rb
78
+ - lib/wexpr/private_parser_state.rb
79
+ - lib/wexpr/uvlq64.rb
80
+ - lib/wexpr/version.rb
81
+ - wexpr.gemspec
82
+ homepage: https://github.com/thothonegan/ruby-wexpr
83
+ licenses:
84
+ - MIT
85
+ metadata: {}
86
+ post_install_message:
87
+ rdoc_options: []
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubyforge_project:
102
+ rubygems_version: 2.7.3
103
+ signing_key:
104
+ specification_version: 4
105
+ summary: Wexpr parser and emitter for ruby
106
+ test_files: []