krpc 0.3.1 → 0.3.2

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.
@@ -1,31 +1,33 @@
1
1
  require 'krpc/gen'
2
2
  require 'krpc/attributes'
3
+ require 'krpc/encoder'
4
+ require 'krpc/types'
3
5
  require 'krpc/doc'
4
6
  require 'krpc/streaming'
5
7
 
6
8
  module KRPC
7
9
  module Services
8
10
  class << self
9
-
11
+
10
12
  # Generate classes and methods for the service - see documentation for Client#generate_services_api!
11
13
  def create_service(service_msg)
12
14
  service_name = service_msg.name
13
-
15
+
14
16
  # Create service class
15
17
  service_class = Class.new(ServiceBase)
16
18
  const_set(service_name, service_class)
17
-
19
+
18
20
  # Create service' classes
19
21
  service_msg.classes.map(&:name).each do |sc_name|
20
22
  TypeStore["Class(#{service_name}.#{sc_name})"]
21
23
  end
22
-
24
+
23
25
  # Create service' enums
24
26
  service_msg.enumerations.each do |enum|
25
27
  enum_type = TypeStore["Enum(#{service_name}.#{enum.name})"]
26
28
  enum_type.set_values(enum.values)
27
29
  end
28
-
30
+
29
31
  # Create service' procedures
30
32
  service_msg.procedures.each do |proc|
31
33
  if Attributes.is_a_class_method_or_property_accessor(proc.attributes)
@@ -54,41 +56,74 @@ module KRPC
54
56
  Gen.add_rpc_method(service_class, proc.name, service_name, proc, :static)
55
57
  end
56
58
  end
57
-
59
+
58
60
  # Return service class
59
61
  service_class
60
62
  end
61
-
63
+
62
64
  end
63
-
65
+
64
66
  ##
65
67
  # Base class for service objects, created at runtime using information received from the server.
66
68
  class ServiceBase
67
69
  include Doc::SuffixMethods
68
70
  include Streaming::StreamConstructors
69
-
71
+
70
72
  attr_reader :client
71
-
73
+
72
74
  def initialize(client)
73
75
  @client = client
74
76
  end
75
77
  end
76
-
78
+
77
79
  ##
78
- # Core kRPC service, e.g. for querying for the available services.
79
- class KRPC < ServiceBase
80
+ # Hardcoded version of `krpc` service - The core kRPC service, e.g. for querying for the available services.
81
+ class Core < ServiceBase
80
82
  include Gen::RPCMethodGenerator
81
83
 
82
84
  def initialize(client)
83
85
  super(client)
84
86
  unless respond_to? :get_status
85
- include_rpc_method("get_status", "KRPC", "GetStatus", return_type: "KRPC.Status", xmldoc: "<doc><summary>Gets a status message from the server containing information including the server’s version string and performance statistics.</summary></doc>", options: :no_stream)
86
- include_rpc_method("get_services", "KRPC", "GetServices", return_type: "KRPC.Services", xmldoc: "<doc><summary>Gets available services and procedures.</summary></doc>", options: :no_stream)
87
- include_rpc_method("add_stream", "KRPC", "AddStream", params: [PB::Parameter.new(name: "request", type: "KRPC.Request")], return_type: "uint32", xmldoc: "<doc><summary>Add a streaming request. Returns it's identifier.</summary></doc>", options: :no_stream)
88
- include_rpc_method("remove_stream", "KRPC", "RemoveStream", params: [PB::Parameter.new(name: "id", type: "uint32")], xmldoc: "<doc><summary>Remove a streaming request</summary></doc>", options: :no_stream)
87
+ # Generate enumerations
88
+ TypeStore['Enum(Core.GameScene)'].set_values(
89
+ Encoder.hash_to_enumeration_values(
90
+ space_center: 0, flight: 1, tracking_station: 2, editor_vab: 3, editor_sph: 4
91
+ )
92
+ )
93
+
94
+ # Generate procedures
95
+ opts = {doc_service_name: 'Core'}
96
+
97
+ include_rpc_method 'get_status', 'KRPC', 'GetStatus',
98
+ return_type: 'KRPC.Status',
99
+ xmldoc: "<doc><summary>Gets a status message from the server containing information including the server’s version string and performance statistics.</summary></doc>",
100
+ switches: [:static], options: opts
101
+ include_rpc_method 'get_services', 'KRPC', 'GetServices',
102
+ return_type: 'KRPC.Services',
103
+ xmldoc: "<doc><summary>Gets available services and procedures.</summary></doc>",
104
+ switches: [:static, :no_stream], options: opts
105
+ include_rpc_method 'add_stream', 'KRPC', 'AddStream',
106
+ params: [PB::Parameter.new(name: 'request', type: 'KRPC.Request')],
107
+ return_type: 'uint32',
108
+ xmldoc: "<doc><summary>Add a streaming request. Returns it's identifier.</summary></doc>",
109
+ switches: [:static, :no_stream], options: opts
110
+ include_rpc_method 'remove_stream', 'KRPC', 'RemoveStream',
111
+ params: [PB::Parameter.new(name: 'id', type: 'uint32')],
112
+ xmldoc: "<doc><summary>Remove a streaming request</summary></doc>",
113
+ switches: [:static, :no_stream], options: opts
114
+ include_rpc_method 'clients', 'KRPC', 'get_Clients',
115
+ return_type: 'KRPC.List',
116
+ attributes: ['Property.Get(Clients)', 'ReturnType.List(Tuple(bytes,string,string))'],
117
+ xmldoc: "<doc><summary>A list of RPC clients that are currently connected to the server.\nEach entry in the list is a clients identifier, name and address.</summary></doc>",
118
+ switches: [:static], options: opts
119
+ include_rpc_method 'current_game_scene', 'KRPC', 'get_CurrentGameScene',
120
+ return_type: 'int32',
121
+ attributes: ['Property.Get(CurrentGameScene)', 'ReturnType.Enum(Core.GameScene)'],
122
+ xmldoc: "<doc><summary>Get the current game scene.</summary></doc>",
123
+ switches: [:static], options: opts
89
124
  end
90
125
  end
91
126
  end
92
-
127
+
93
128
  end
94
129
  end
@@ -6,19 +6,19 @@ module KRPC
6
6
 
7
7
  class StreamsManager
8
8
  attr_reader :client
9
-
9
+
10
10
  def initialize(client)
11
11
  @client = client
12
12
  @streams = {}
13
13
  @streams_mutex = Mutex.new
14
14
  @streaming_thread = Thread.new {}
15
15
  end
16
-
16
+
17
17
  # Send a streaming request, create related Stream object and return it. If identical Stream
18
18
  # already exists, doesn't create new Stream and return the existing one.
19
19
  def create_stream(request, return_type, method, *args, **kwargs)
20
20
  raise RuntimeError("Cannot stream a property setter") if method.name.to_s.end_with? '='
21
- id = client.krpc.add_stream(request)
21
+ id = client.core.add_stream(request)
22
22
  @streams_mutex.synchronize do
23
23
  if @streams.include? id
24
24
  @streams[id]
@@ -28,14 +28,14 @@ module KRPC
28
28
  end
29
29
  end
30
30
  end
31
-
31
+
32
32
  # Remove a streaming request and deactivate the Stream object. Returns `true` if
33
33
  # streaming request is removed or `false` if passed Stream object is already inactive.
34
34
  def remove_stream(stream)
35
35
  return false unless stream.active?
36
36
  @streams_mutex.synchronize do
37
37
  return false unless @streams.include? stream.id
38
- client.krpc.remove_stream stream.id
38
+ client.core.remove_stream stream.id
39
39
  @streams.delete stream.id
40
40
  end
41
41
  stream.value = RuntimeError.new("Stream has been removed")
@@ -47,7 +47,7 @@ module KRPC
47
47
  def remove_all_streams
48
48
  @streams.each {|_,stream| remove_stream(stream)}
49
49
  end
50
-
50
+
51
51
  # Start streaming thread. It receives stream data, and updates Stream object's `value` attribute.
52
52
  def start_streaming_thread
53
53
  stop_streaming_thread
@@ -72,17 +72,17 @@ module KRPC
72
72
  end
73
73
  end
74
74
  end
75
-
75
+
76
76
  # Stop streaming thread.
77
77
  def stop_streaming_thread
78
78
  @streaming_thread.terminate
79
79
  end
80
80
  end
81
-
81
+
82
82
  class Stream
83
83
  attr_reader :id, :method, :args, :kwargs, :return_type, :manager
84
84
  attr_writer :value
85
-
85
+
86
86
  def initialize(manager, id, return_type, value, method, *args, **kwargs)
87
87
  @manager = manager
88
88
  @id = id
@@ -90,7 +90,7 @@ module KRPC
90
90
  @method, @args, @kwargs = method, args, kwargs
91
91
  @active = true
92
92
  end
93
-
93
+
94
94
  # Get the current stream value. Has alias method `value`.
95
95
  def get
96
96
  raise @value if @value.is_a?(Exception)
@@ -103,18 +103,18 @@ module KRPC
103
103
  manager.remove_stream self
104
104
  end
105
105
  alias_method :close, :remove
106
-
106
+
107
107
  # Check if stream is active (i.e. not removed).
108
108
  def active?; @active end
109
109
 
110
110
  # Mark stream as inactive.
111
111
  # WARNING: This method does not remove the stream. To remove the stream call Stream#remove instead.
112
112
  def mark_as_inactive; @active = false end
113
-
113
+
114
114
  def to_s
115
115
  inspect.gsub(/\n|\t/," ").squeeze(" ").uncolorize
116
116
  end
117
-
117
+
118
118
  def inspect
119
119
  def coderay(x)
120
120
  require 'coderay'
@@ -134,11 +134,11 @@ module KRPC
134
134
  ">".green
135
135
  end
136
136
  end
137
-
137
+
138
138
  module StreamConstructors
139
139
  STREAM_METHOD_SUFFIX = "_stream"
140
140
  STREAM_METHOD_REGEX = /^(.+)(?:#{STREAM_METHOD_SUFFIX})$/
141
-
141
+
142
142
  module ClassMethods
143
143
  def stream_constructors
144
144
  @stream_constructors ||= {}
@@ -149,7 +149,7 @@ module KRPC
149
149
  base.extend ClassMethods
150
150
  base.extend self
151
151
  end
152
-
152
+
153
153
  def method_missing(method, *args, **kwargs, &block)
154
154
  if STREAM_METHOD_REGEX =~ method.to_s
155
155
  if respond_to? $1.to_sym
@@ -159,7 +159,7 @@ module KRPC
159
159
  end
160
160
  super
161
161
  end
162
-
162
+
163
163
  def respond_to_missing?(method, *)
164
164
  if STREAM_METHOD_REGEX =~ method.to_s
165
165
  if respond_to? $1.to_sym
@@ -169,8 +169,8 @@ module KRPC
169
169
  end
170
170
  super
171
171
  end
172
-
172
+
173
173
  end
174
-
174
+
175
175
  end
176
176
  end
@@ -21,14 +21,14 @@ module KRPC
21
21
  "bytes" => Array
22
22
  }
23
23
  PROTOBUF_TO_MESSAGE_TYPE = ProtobufUtils.create_PB_to_PB_message_class_hash("KRPC")
24
-
24
+
25
25
  class TypeStore
26
26
  @cache = {}
27
27
  class << self
28
-
28
+
29
29
  def [](type_string)
30
30
  return @cache[type_string] if @cache.include? type_string
31
-
31
+
32
32
  type =
33
33
  if PROTOBUF_VALUE_TYPES.include? type_string then ValueType.new(type_string)
34
34
  elsif type_string.start_with? "Class(" || type_string == "Class" then ClassType.new(type_string)
@@ -47,9 +47,9 @@ module KRPC
47
47
  end
48
48
 
49
49
  @cache[type_string] = type
50
- type
50
+ type
51
51
  end
52
-
52
+
53
53
  def get_parameter_type(pos, type, attrs)
54
54
  type_attrs = Attributes.get_parameter_type_attrs(pos, attrs)
55
55
  type_attrs.each do |ta|
@@ -71,14 +71,14 @@ module KRPC
71
71
  end
72
72
  self[type]
73
73
  end
74
-
74
+
75
75
  def coerce_to(value, type)
76
76
  return value if type.is_a?(EnumType) && value.class == Symbol # Enum handling
77
77
  return value if value.is_a?(type.ruby_type)
78
78
  # A NilClass can be coerced to a ClassType
79
79
  return nil if type.is_a?(ClassType) && value.nil?
80
80
  # Handle service' class instance
81
- if type.is_a?(ClassType) && value.is_a?(Gen::ClassBase) &&
81
+ if type.is_a?(ClassType) && value.is_a?(Gen::ClassBase) &&
82
82
  type.ruby_type == value.class
83
83
  return value
84
84
  end
@@ -108,20 +108,20 @@ module KRPC
108
108
  end
109
109
  raise(ValueError, "Failed to coerce value #{value.to_s} of type #{value.class} to type #{type}")
110
110
  end
111
-
111
+
112
112
  end
113
113
  end
114
-
115
-
114
+
115
+
116
116
  class TypeBase
117
117
  attr_reader :protobuf_type, :ruby_type
118
118
  def initialize(protobuf_type, ruby_type)
119
119
  @protobuf_type = protobuf_type
120
120
  @ruby_type = ruby_type
121
121
  end
122
-
122
+
123
123
  protected
124
-
124
+
125
125
  def parse_type_string(type)
126
126
  raise ValueError.new if type.nil?
127
127
  result = ""
@@ -138,14 +138,14 @@ module KRPC
138
138
  [result, type[(result.length+1)..-1]]
139
139
  end
140
140
  end
141
-
141
+
142
142
  class ValueType < TypeBase
143
143
  def initialize(type_string)
144
144
  raise(ValueError, "\"#{type_string}\" is not a valid type string for a value type") unless PROTOBUF_TO_RUBY_VALUE_TYPE.has_key? type_string
145
145
  super(type_string, PROTOBUF_TO_RUBY_VALUE_TYPE[type_string])
146
146
  end
147
147
  end
148
-
148
+
149
149
  class MessageType < TypeBase
150
150
  def initialize(type_string)
151
151
  if PROTOBUF_TO_MESSAGE_TYPE.has_key? type_string
@@ -155,7 +155,7 @@ module KRPC
155
155
  end
156
156
  end
157
157
  end
158
-
158
+
159
159
  class ClassType < TypeBase
160
160
  attr_reader :service_name, :class_name
161
161
  def initialize(type_string)
@@ -165,7 +165,7 @@ module KRPC
165
165
  super(type_string, Gen.generate_class(service_name, class_name))
166
166
  end
167
167
  end
168
-
168
+
169
169
  class EnumType < TypeBase
170
170
  attr_reader :service_name, :enum_name
171
171
  def initialize(type_string)
@@ -175,12 +175,12 @@ module KRPC
175
175
  # Sets ruby_type to nil, set_values must be called to set the ruby_type
176
176
  super(type_string, nil)
177
177
  end
178
-
178
+
179
179
  def set_values(values)
180
180
  @ruby_type = Gen.generate_enum(service_name, enum_name, values)
181
181
  end
182
182
  end
183
-
183
+
184
184
  class ListType < TypeBase
185
185
  attr_reader :value_type
186
186
  def initialize(type_string)
@@ -190,7 +190,7 @@ module KRPC
190
190
  super(type_string, Array)
191
191
  end
192
192
  end
193
-
193
+
194
194
  class DictionaryType < TypeBase
195
195
  attr_reader :key_type, :value_type
196
196
  def initialize(type_string)
@@ -206,7 +206,7 @@ module KRPC
206
206
  super(type_string, Hash)
207
207
  end
208
208
  end
209
-
209
+
210
210
  class SetType < TypeBase
211
211
  attr_reader :value_type
212
212
  def initialize(type_string)
@@ -216,25 +216,25 @@ module KRPC
216
216
  super(type_string, Set)
217
217
  end
218
218
  end
219
-
219
+
220
220
  class TupleType < TypeBase
221
221
  attr_reader :value_types
222
222
  def initialize(type_string)
223
223
  m = /^Tuple\((.+)\)$/.match type_string
224
224
  raise(ValueError, "\"#{type_string}\" is not a valid type string for a tuple type") unless m
225
-
225
+
226
226
  @value_types = []
227
227
  type = m[1]
228
228
  until type.nil?
229
229
  value_type, type = parse_type_string(type)
230
230
  @value_types << TypeStore[value_type]
231
231
  end
232
-
232
+
233
233
  super(type_string, Array)
234
234
  end
235
235
  end
236
-
236
+
237
237
  end
238
-
238
+
239
239
  TypeStore = Types::TypeStore
240
240
  end
@@ -1,3 +1,3 @@
1
1
  module KRPC
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: krpc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomasz Więch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-18 00:00:00.000000000 Z
11
+ date: 2017-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: google-protobuf
@@ -16,112 +16,112 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 3.0.0.alpha.5
19
+ version: '3.3'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 3.0.0.alpha.5
26
+ version: '3.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: colorize
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.7'
33
+ version: '0.8'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.7'
40
+ version: '0.8'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: nokogiri
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.6'
47
+ version: '1.8'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.6'
54
+ version: '1.8'
55
55
  - !ruby/object:Gem::Dependency
56
- name: hanna-nouveau
56
+ name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0.4'
62
- type: :runtime
61
+ version: '1.15'
62
+ type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0.4'
68
+ version: '1.15'
69
69
  - !ruby/object:Gem::Dependency
70
- name: bundler
70
+ name: pry
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '1.11'
75
+ version: '0.10'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '1.11'
82
+ version: '0.10'
83
83
  - !ruby/object:Gem::Dependency
84
- name: pry
84
+ name: rspec
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0.10'
89
+ version: '3.6'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0.10'
96
+ version: '3.6'
97
97
  - !ruby/object:Gem::Dependency
98
- name: rspec
98
+ name: rake
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '3.4'
103
+ version: '12.0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '3.4'
110
+ version: '12.0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: rake
112
+ name: hanna-nouveau
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '11.1'
117
+ version: '1.0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '11.1'
124
+ version: '1.0'
125
125
  description: kRPC-rb is a Ruby client library for kRPC, a Kerbal Space Program mod
126
126
  that allows you to control KSP from external scripts running outside of the game.
127
127
  email:
@@ -131,11 +131,9 @@ extensions: []
131
131
  extra_rdoc_files:
132
132
  - README.md
133
133
  files:
134
- - CHANGELOG.md
135
134
  - Gemfile
136
135
  - LICENSE.txt
137
136
  - README.md
138
- - Rakefile
139
137
  - krpc.gemspec
140
138
  - lib/krpc.rb
141
139
  - lib/krpc/attributes.rb
@@ -163,8 +161,6 @@ post_install_message:
163
161
  rdoc_options:
164
162
  - "--markup"
165
163
  - markdown
166
- - "--format"
167
- - hanna
168
164
  - "--title"
169
165
  - kRPC-rb API Docs
170
166
  - "--main"
@@ -183,9 +179,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
183
179
  version: '0'
184
180
  requirements: []
185
181
  rubyforge_project:
186
- rubygems_version: 2.4.8
182
+ rubygems_version: 2.6.8
187
183
  signing_key:
188
184
  specification_version: 4
189
185
  summary: Client library for kRPC
190
186
  test_files: []
191
- has_rdoc: