steamd 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +4 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +6 -0
  7. data/Gemfile +3 -0
  8. data/LICENSE +21 -0
  9. data/README.md +51 -0
  10. data/Rakefile +22 -0
  11. data/bin/console +6 -0
  12. data/bin/setup +6 -0
  13. data/bin/steamd +6 -0
  14. data/grammar/class.treetop +63 -0
  15. data/grammar/enums.treetop +44 -0
  16. data/grammar/import.treetop +11 -0
  17. data/grammar/shared.treetop +62 -0
  18. data/grammar/steamd.treetop +15 -0
  19. data/language/emsg.steamd +1802 -0
  20. data/language/enums.steamd +989 -0
  21. data/language/eresult.steamd +119 -0
  22. data/language/gamecoordinator.steamd +17 -0
  23. data/language/header.steamd +37 -0
  24. data/language/netheader.steamd +62 -0
  25. data/language/steammsg.steamd +357 -0
  26. data/lib/ext/string.rb +33 -0
  27. data/lib/steamd.rb +40 -0
  28. data/lib/steamd/cli.rb +24 -0
  29. data/lib/steamd/cli_options.rb +58 -0
  30. data/lib/steamd/code_generator.rb +41 -0
  31. data/lib/steamd/generated/emsg.rb +3464 -0
  32. data/lib/steamd/generated/enums.rb +1750 -0
  33. data/lib/steamd/generated/eresult.rb +236 -0
  34. data/lib/steamd/generated/gamecoordinator.rb +119 -0
  35. data/lib/steamd/generated/header.rb +261 -0
  36. data/lib/steamd/generated/netheader.rb +315 -0
  37. data/lib/steamd/generated/steammsg.rb +2527 -0
  38. data/lib/steamd/generator.rb +6 -0
  39. data/lib/steamd/generator/generated_class.rb +128 -0
  40. data/lib/steamd/generator/generated_enum.rb +60 -0
  41. data/lib/steamd/generator/generated_import.rb +21 -0
  42. data/lib/steamd/generator/implementation.rb +83 -0
  43. data/lib/steamd/generator/ruby/class.erb +39 -0
  44. data/lib/steamd/generator/ruby/enum.erb +14 -0
  45. data/lib/steamd/generator/ruby/import.erb +1 -0
  46. data/lib/steamd/generator/ruby/ruby.rb +54 -0
  47. data/lib/steamd/generator/ruby/serializable_constant.rb +20 -0
  48. data/lib/steamd/generator/ruby/serializable_type.rb +93 -0
  49. data/lib/steamd/generator/ruby/serializable_variable.rb +85 -0
  50. data/lib/steamd/generator/ruby/steam_serializable.rb +89 -0
  51. data/lib/steamd/nodes/block_node.rb +14 -0
  52. data/lib/steamd/nodes/class_statement_node.rb +46 -0
  53. data/lib/steamd/nodes/class_type_node.rb +12 -0
  54. data/lib/steamd/nodes/enum_statement_node.rb +50 -0
  55. data/lib/steamd/nodes/enum_variable_node.rb +24 -0
  56. data/lib/steamd/nodes/import_statement_node.rb +26 -0
  57. data/lib/steamd/nodes/node.rb +3 -0
  58. data/lib/steamd/nodes/nodes.rb +10 -0
  59. data/lib/steamd/nodes/variable_node.rb +106 -0
  60. data/lib/steamd/parser.rb +157 -0
  61. data/lib/steamd/version.rb +14 -0
  62. data/steamd.gemspec +38 -0
  63. data/tasks/language.rake +11 -0
  64. 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
@@ -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
@@ -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: []