steamd 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.
- checksums.yaml +7 -0
- data/.gitignore +5 -0
- data/.rspec +2 -0
- data/.rubocop.yml +4 -0
- data/.ruby-version +1 -0
- data/.travis.yml +6 -0
- data/Gemfile +3 -0
- data/LICENSE +21 -0
- data/README.md +51 -0
- data/Rakefile +22 -0
- data/bin/console +6 -0
- data/bin/setup +6 -0
- data/bin/steamd +6 -0
- data/grammar/class.treetop +63 -0
- data/grammar/enums.treetop +44 -0
- data/grammar/import.treetop +11 -0
- data/grammar/shared.treetop +62 -0
- data/grammar/steamd.treetop +15 -0
- data/language/emsg.steamd +1802 -0
- data/language/enums.steamd +989 -0
- data/language/eresult.steamd +119 -0
- data/language/gamecoordinator.steamd +17 -0
- data/language/header.steamd +37 -0
- data/language/netheader.steamd +62 -0
- data/language/steammsg.steamd +357 -0
- data/lib/ext/string.rb +33 -0
- data/lib/steamd.rb +40 -0
- data/lib/steamd/cli.rb +24 -0
- data/lib/steamd/cli_options.rb +58 -0
- data/lib/steamd/code_generator.rb +41 -0
- data/lib/steamd/generated/emsg.rb +3464 -0
- data/lib/steamd/generated/enums.rb +1750 -0
- data/lib/steamd/generated/eresult.rb +236 -0
- data/lib/steamd/generated/gamecoordinator.rb +119 -0
- data/lib/steamd/generated/header.rb +261 -0
- data/lib/steamd/generated/netheader.rb +315 -0
- data/lib/steamd/generated/steammsg.rb +2527 -0
- data/lib/steamd/generator.rb +6 -0
- data/lib/steamd/generator/generated_class.rb +128 -0
- data/lib/steamd/generator/generated_enum.rb +60 -0
- data/lib/steamd/generator/generated_import.rb +21 -0
- data/lib/steamd/generator/implementation.rb +83 -0
- data/lib/steamd/generator/ruby/class.erb +39 -0
- data/lib/steamd/generator/ruby/enum.erb +14 -0
- data/lib/steamd/generator/ruby/import.erb +1 -0
- data/lib/steamd/generator/ruby/ruby.rb +54 -0
- data/lib/steamd/generator/ruby/serializable_constant.rb +20 -0
- data/lib/steamd/generator/ruby/serializable_type.rb +93 -0
- data/lib/steamd/generator/ruby/serializable_variable.rb +85 -0
- data/lib/steamd/generator/ruby/steam_serializable.rb +89 -0
- data/lib/steamd/nodes/block_node.rb +14 -0
- data/lib/steamd/nodes/class_statement_node.rb +46 -0
- data/lib/steamd/nodes/class_type_node.rb +12 -0
- data/lib/steamd/nodes/enum_statement_node.rb +50 -0
- data/lib/steamd/nodes/enum_variable_node.rb +24 -0
- data/lib/steamd/nodes/import_statement_node.rb +26 -0
- data/lib/steamd/nodes/node.rb +3 -0
- data/lib/steamd/nodes/nodes.rb +10 -0
- data/lib/steamd/nodes/variable_node.rb +106 -0
- data/lib/steamd/parser.rb +157 -0
- data/lib/steamd/version.rb +14 -0
- data/steamd.gemspec +38 -0
- data/tasks/language.rake +11 -0
- metadata +220 -0
@@ -0,0 +1,157 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'treetop'
|
3
|
+
require 'steamd/nodes/nodes'
|
4
|
+
|
5
|
+
module Steamd
|
6
|
+
# Parses steam language files. Give access to the parsed data
|
7
|
+
# via #classes, #imports and #enums methods.
|
8
|
+
#
|
9
|
+
# @example Parsing a Steam Language file
|
10
|
+
# parser = Parser.new
|
11
|
+
# parser.load! # loads the grammars, sets up the parser
|
12
|
+
# parser.parse(File.open('./message.steamd'))
|
13
|
+
class Parser
|
14
|
+
# The base Parser error
|
15
|
+
Error = Class.new(StandardError)
|
16
|
+
|
17
|
+
# Thrown if there was any non specific Parse error.
|
18
|
+
ParseError = Class.new(Error)
|
19
|
+
|
20
|
+
# Thrown if the the parse method is called before the parser is loaded
|
21
|
+
NotLoadedError = Class.new(Error)
|
22
|
+
|
23
|
+
# Thrown if the callee tries to access the parsed data before parse is
|
24
|
+
# called
|
25
|
+
StreamNotParsed = Class.new(Error)
|
26
|
+
|
27
|
+
# Load the grammars
|
28
|
+
#
|
29
|
+
# @return [Bool] returns true unless an exception is thrown
|
30
|
+
def load!
|
31
|
+
return if loaded?
|
32
|
+
|
33
|
+
Treetop.load("#{Steamd.grammar_dir}/shared.treetop")
|
34
|
+
|
35
|
+
Dir.glob("#{Steamd.grammar_dir}/*.treetop") do |file|
|
36
|
+
Treetop.load(file)
|
37
|
+
end
|
38
|
+
|
39
|
+
@parser = SteamdParser.new
|
40
|
+
true
|
41
|
+
end
|
42
|
+
|
43
|
+
# Parses an IO stream.
|
44
|
+
#
|
45
|
+
# @param io [#read, #rewind] An IO stream containing the Steam Language
|
46
|
+
# data.
|
47
|
+
# @return [Bool] returns true unless an error is thrown
|
48
|
+
def parse(io)
|
49
|
+
io.rewind
|
50
|
+
raise NotLoadedError, 'load before parsing (#load!)' if @parser.nil?
|
51
|
+
|
52
|
+
data = strip_comments_and_obsolete_tags!(io)
|
53
|
+
|
54
|
+
@tree = @parser.parse(data)
|
55
|
+
raise_parser_error! if @tree.nil?
|
56
|
+
|
57
|
+
true
|
58
|
+
end
|
59
|
+
|
60
|
+
# An array of hashes containing the imports found in the parsed
|
61
|
+
# Steam Language file.
|
62
|
+
#
|
63
|
+
# The hash is the hash version of ImportStatement
|
64
|
+
#
|
65
|
+
# @example Accessing imports
|
66
|
+
# parser.imports # => [{filename: 'test'}]
|
67
|
+
#
|
68
|
+
# @return [Array<Hash>] an array of hashes representing the imports found
|
69
|
+
# @see ImportStatement
|
70
|
+
def imports
|
71
|
+
raise StreamNotParsed, 'you must parse first' if @tree.nil?
|
72
|
+
|
73
|
+
imports = statements.select do |node|
|
74
|
+
node.is_a?(ImportStatement)
|
75
|
+
end
|
76
|
+
|
77
|
+
imports.map(&:to_hash)
|
78
|
+
end
|
79
|
+
|
80
|
+
# Returns an array of classes parsed from the IO stream. The array
|
81
|
+
# contains hashes with class information and variables.
|
82
|
+
#
|
83
|
+
# The hash is the hash form of ClassStatement
|
84
|
+
#
|
85
|
+
# @example Accessing the classes
|
86
|
+
# parser.classes # => [{ name: 'test', variables: [], ...]
|
87
|
+
#
|
88
|
+
# @return [Array<Hash>] an array of hashes representing the class
|
89
|
+
# @see ClassStatement
|
90
|
+
def classes
|
91
|
+
raise StreamNotParsed, 'you must parse first' if @tree.nil?
|
92
|
+
|
93
|
+
classes = statements.select do |node|
|
94
|
+
node.is_a?(ClassStatement)
|
95
|
+
end
|
96
|
+
|
97
|
+
classes.map(&:to_hash)
|
98
|
+
end
|
99
|
+
|
100
|
+
# Returns an array of eneums parsed from the IO stream. The array
|
101
|
+
# contains hashes with enum information and variables.
|
102
|
+
#
|
103
|
+
# The hash is the hash form of EnumStatement
|
104
|
+
#
|
105
|
+
# @example Accessing the enums
|
106
|
+
# parser.enums # => [{ name: 'test', variables: [], ...]
|
107
|
+
#
|
108
|
+
# @return [Array<Hash>] an array of hashes representing the class
|
109
|
+
# @see EnumStatement
|
110
|
+
def enums
|
111
|
+
raise StreamNotParsed, 'you must parse first' if @tree.nil?
|
112
|
+
|
113
|
+
enums = statements.select do |node|
|
114
|
+
node.is_a?(EnumStatement)
|
115
|
+
end
|
116
|
+
|
117
|
+
enums.map(&:to_hash)
|
118
|
+
end
|
119
|
+
|
120
|
+
# Returns a hash representing the reason the parser failed.
|
121
|
+
#
|
122
|
+
# @example
|
123
|
+
# parser.last_error # => { reason: "Missing ';'", column: 1, line: 12 }
|
124
|
+
def last_error
|
125
|
+
{
|
126
|
+
reason: @parser.failure_reason,
|
127
|
+
column: @parser.failure_column,
|
128
|
+
line: @parser.failure_line
|
129
|
+
}
|
130
|
+
end
|
131
|
+
alias error last_error
|
132
|
+
|
133
|
+
private
|
134
|
+
|
135
|
+
# @api private
|
136
|
+
def loaded?
|
137
|
+
!@parser.nil?
|
138
|
+
end
|
139
|
+
|
140
|
+
# @api private
|
141
|
+
def statements
|
142
|
+
@tree.statements
|
143
|
+
end
|
144
|
+
|
145
|
+
# @api private
|
146
|
+
def raise_parser_error!
|
147
|
+
raise ParseError, "Parsing failed: #{error[:reason]} "\
|
148
|
+
"(col: #{error[:column]}, ln: #{error[:line]}"
|
149
|
+
end
|
150
|
+
|
151
|
+
# Fully reads the IO stream, and removes all comments
|
152
|
+
# and obsolete tags
|
153
|
+
def strip_comments_and_obsolete_tags!(io)
|
154
|
+
io.read.strip.gsub(%r{\/\/.*}, '').gsub(/\;\s?obsolete.*/, ';')
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Steamd
|
3
|
+
# Major version of Steamd
|
4
|
+
MAJOR = '0'
|
5
|
+
|
6
|
+
# Minor version of Steamd
|
7
|
+
MINOR = '1'
|
8
|
+
|
9
|
+
# Patch version of Steamd
|
10
|
+
PATCH = '0'
|
11
|
+
|
12
|
+
# Full version of Steamd
|
13
|
+
VERSION = [MAJOR, MINOR, PATCH].join('.')
|
14
|
+
end
|
data/steamd.gemspec
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'steamd/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'steamd'
|
8
|
+
spec.version = Steamd::VERSION
|
9
|
+
spec.authors = ['Taylor Finnell']
|
10
|
+
spec.email = ['tmfinnell@gmail.com']
|
11
|
+
spec.license = 'MIT'
|
12
|
+
|
13
|
+
spec.summary = 'Ruby access to the Steam Language.'
|
14
|
+
|
15
|
+
spec.description = 'Generate Ruby code for the full Steam Language.'\
|
16
|
+
' Useful for Steam clients'
|
17
|
+
|
18
|
+
spec.homepage = 'http://github.com/fastpeek/steamd'
|
19
|
+
|
20
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
21
|
+
f.match(%r{^(test|spec|features)/})
|
22
|
+
end
|
23
|
+
|
24
|
+
spec.bindir = 'bin'
|
25
|
+
spec.executables = ['steamd']
|
26
|
+
spec.require_paths = ['lib', 'ext']
|
27
|
+
|
28
|
+
spec.required_ruby_version = '>= 2.3.1'
|
29
|
+
|
30
|
+
spec.add_development_dependency 'bundler', '~> 1.13'
|
31
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
32
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
33
|
+
spec.add_development_dependency 'pry', '~> 0.10.4'
|
34
|
+
spec.add_development_dependency 'rubocop', '~> 0.44.1'
|
35
|
+
spec.add_development_dependency 'yard', '~> 0.9.5'
|
36
|
+
spec.add_development_dependency 'thor', '~> 0.19.1'
|
37
|
+
spec.add_development_dependency 'treetop', '~> 1.6'
|
38
|
+
end
|
data/tasks/language.rake
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
namespace :language do
|
3
|
+
desc 'Update the language files from the SteamKit repository.'
|
4
|
+
task :update do
|
5
|
+
Dir.mktmpdir do |path|
|
6
|
+
`git clone https://github.com/SteamRE/SteamKit.git #{path} --depth=1`
|
7
|
+
|
8
|
+
`cp -r #{path}/Resources/SteamLanguage/*.steamd #{Steamd.language_dir}/.`
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
metadata
ADDED
@@ -0,0 +1,220 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: steamd
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Taylor Finnell
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-11-18 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.13'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.13'
|
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: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.10.4
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.10.4
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.44.1
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.44.1
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: yard
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.9.5
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.9.5
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: thor
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.19.1
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.19.1
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: treetop
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.6'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.6'
|
125
|
+
description: Generate Ruby code for the full Steam Language. Useful for Steam clients
|
126
|
+
email:
|
127
|
+
- tmfinnell@gmail.com
|
128
|
+
executables:
|
129
|
+
- steamd
|
130
|
+
extensions: []
|
131
|
+
extra_rdoc_files: []
|
132
|
+
files:
|
133
|
+
- ".gitignore"
|
134
|
+
- ".rspec"
|
135
|
+
- ".rubocop.yml"
|
136
|
+
- ".ruby-version"
|
137
|
+
- ".travis.yml"
|
138
|
+
- Gemfile
|
139
|
+
- LICENSE
|
140
|
+
- README.md
|
141
|
+
- Rakefile
|
142
|
+
- bin/console
|
143
|
+
- bin/setup
|
144
|
+
- bin/steamd
|
145
|
+
- grammar/class.treetop
|
146
|
+
- grammar/enums.treetop
|
147
|
+
- grammar/import.treetop
|
148
|
+
- grammar/shared.treetop
|
149
|
+
- grammar/steamd.treetop
|
150
|
+
- language/emsg.steamd
|
151
|
+
- language/enums.steamd
|
152
|
+
- language/eresult.steamd
|
153
|
+
- language/gamecoordinator.steamd
|
154
|
+
- language/header.steamd
|
155
|
+
- language/netheader.steamd
|
156
|
+
- language/steammsg.steamd
|
157
|
+
- lib/ext/string.rb
|
158
|
+
- lib/steamd.rb
|
159
|
+
- lib/steamd/cli.rb
|
160
|
+
- lib/steamd/cli_options.rb
|
161
|
+
- lib/steamd/code_generator.rb
|
162
|
+
- lib/steamd/generated/emsg.rb
|
163
|
+
- lib/steamd/generated/enums.rb
|
164
|
+
- lib/steamd/generated/eresult.rb
|
165
|
+
- lib/steamd/generated/gamecoordinator.rb
|
166
|
+
- lib/steamd/generated/header.rb
|
167
|
+
- lib/steamd/generated/netheader.rb
|
168
|
+
- lib/steamd/generated/steammsg.rb
|
169
|
+
- lib/steamd/generator.rb
|
170
|
+
- lib/steamd/generator/generated_class.rb
|
171
|
+
- lib/steamd/generator/generated_enum.rb
|
172
|
+
- lib/steamd/generator/generated_import.rb
|
173
|
+
- lib/steamd/generator/implementation.rb
|
174
|
+
- lib/steamd/generator/ruby/class.erb
|
175
|
+
- lib/steamd/generator/ruby/enum.erb
|
176
|
+
- lib/steamd/generator/ruby/import.erb
|
177
|
+
- lib/steamd/generator/ruby/ruby.rb
|
178
|
+
- lib/steamd/generator/ruby/serializable_constant.rb
|
179
|
+
- lib/steamd/generator/ruby/serializable_type.rb
|
180
|
+
- lib/steamd/generator/ruby/serializable_variable.rb
|
181
|
+
- lib/steamd/generator/ruby/steam_serializable.rb
|
182
|
+
- lib/steamd/nodes/block_node.rb
|
183
|
+
- lib/steamd/nodes/class_statement_node.rb
|
184
|
+
- lib/steamd/nodes/class_type_node.rb
|
185
|
+
- lib/steamd/nodes/enum_statement_node.rb
|
186
|
+
- lib/steamd/nodes/enum_variable_node.rb
|
187
|
+
- lib/steamd/nodes/import_statement_node.rb
|
188
|
+
- lib/steamd/nodes/node.rb
|
189
|
+
- lib/steamd/nodes/nodes.rb
|
190
|
+
- lib/steamd/nodes/variable_node.rb
|
191
|
+
- lib/steamd/parser.rb
|
192
|
+
- lib/steamd/version.rb
|
193
|
+
- steamd.gemspec
|
194
|
+
- tasks/language.rake
|
195
|
+
homepage: http://github.com/fastpeek/steamd
|
196
|
+
licenses:
|
197
|
+
- MIT
|
198
|
+
metadata: {}
|
199
|
+
post_install_message:
|
200
|
+
rdoc_options: []
|
201
|
+
require_paths:
|
202
|
+
- lib
|
203
|
+
- ext
|
204
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - ">="
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: 2.3.1
|
209
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
210
|
+
requirements:
|
211
|
+
- - ">="
|
212
|
+
- !ruby/object:Gem::Version
|
213
|
+
version: '0'
|
214
|
+
requirements: []
|
215
|
+
rubyforge_project:
|
216
|
+
rubygems_version: 2.5.1
|
217
|
+
signing_key:
|
218
|
+
specification_version: 4
|
219
|
+
summary: Ruby access to the Steam Language.
|
220
|
+
test_files: []
|