rubypitaya 1.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.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/bin/rubypitaya +56 -0
  3. data/lib/rubypitaya/app-template/Gemfile +10 -0
  4. data/lib/rubypitaya/app-template/Gemfile.lock +83 -0
  5. data/lib/rubypitaya/app-template/Makefile +91 -0
  6. data/lib/rubypitaya/app-template/Rakefile +57 -0
  7. data/lib/rubypitaya/app-template/app/app_initializer.rb +23 -0
  8. data/lib/rubypitaya/app-template/app/bll/player_bll.rb +10 -0
  9. data/lib/rubypitaya/app-template/app/config/initial_player.json +3 -0
  10. data/lib/rubypitaya/app-template/app/constants/status_codes.rb +15 -0
  11. data/lib/rubypitaya/app-template/app/handlers/hello_world_handler.rb +11 -0
  12. data/lib/rubypitaya/app-template/app/handlers/player_handler.rb +79 -0
  13. data/lib/rubypitaya/app-template/app/models/player.rb +15 -0
  14. data/lib/rubypitaya/app-template/app/models/user.rb +4 -0
  15. data/lib/rubypitaya/app-template/bin/console +22 -0
  16. data/lib/rubypitaya/app-template/config/database.yml +22 -0
  17. data/lib/rubypitaya/app-template/db/migrate/001_create_user_migration.rb +12 -0
  18. data/lib/rubypitaya/app-template/db/migrate/002_create_player_migration.rb +14 -0
  19. data/lib/rubypitaya/app-template/docker/dev/Dockerfile +19 -0
  20. data/lib/rubypitaya/app-template/docker/entrypoint.sh +13 -0
  21. data/lib/rubypitaya/app-template/docker/prod/Dockerfile +32 -0
  22. data/lib/rubypitaya/app-template/docker/prod/Makefile +67 -0
  23. data/lib/rubypitaya/app-template/docker-compose.yml +75 -0
  24. data/lib/rubypitaya/core/application_files_importer.rb +13 -0
  25. data/lib/rubypitaya/core/config.rb +33 -0
  26. data/lib/rubypitaya/core/database_config.rb +50 -0
  27. data/lib/rubypitaya/core/database_connector.rb +22 -0
  28. data/lib/rubypitaya/core/etcd_connector.rb +75 -0
  29. data/lib/rubypitaya/core/handler_base.rb +26 -0
  30. data/lib/rubypitaya/core/handler_router.rb +71 -0
  31. data/lib/rubypitaya/core/initializer_base.rb +8 -0
  32. data/lib/rubypitaya/core/initializer_broadcast.rb +15 -0
  33. data/lib/rubypitaya/core/initializer_content.rb +12 -0
  34. data/lib/rubypitaya/core/instance_holder.rb +17 -0
  35. data/lib/rubypitaya/core/main.rb +121 -0
  36. data/lib/rubypitaya/core/nats_connector.rb +148 -0
  37. data/lib/rubypitaya/core/parameters.rb +245 -0
  38. data/lib/rubypitaya/core/path.rb +13 -0
  39. data/lib/rubypitaya/core/postman.rb +31 -0
  40. data/lib/rubypitaya/core/redis_connector.rb +26 -0
  41. data/lib/rubypitaya/core/session.rb +29 -0
  42. data/lib/rubypitaya/version.rb +4 -0
  43. data/lib/rubypitaya.rb +20 -0
  44. metadata +240 -0
@@ -0,0 +1,245 @@
1
+ require 'date'
2
+ require 'bigdecimal'
3
+ require 'stringio'
4
+
5
+ require 'active_support/concern'
6
+ require 'active_support/core_ext/hash/indifferent_access'
7
+ require 'active_support/core_ext/array/wrap'
8
+
9
+ module RubyPitaya
10
+
11
+ class ParameterMissing < IndexError
12
+ attr_reader :param
13
+
14
+ def initialize(param)
15
+ @param = param
16
+ super("param is missing or the value is empty: #{param}")
17
+ end
18
+ end
19
+
20
+ class UnpermittedParameters < IndexError
21
+ attr_reader :params
22
+
23
+ def initialize(params)
24
+ @params = params
25
+ super("found unpermitted parameters: #{params.join(", ")}")
26
+ end
27
+ end
28
+
29
+ class Parameters < ActiveSupport::HashWithIndifferentAccess
30
+ attr_accessor :permitted
31
+ alias :permitted? :permitted
32
+
33
+ cattr_accessor :action_on_unpermitted_parameters, :instance_accessor => false
34
+
35
+ # Never raise an UnpermittedParameters exception because of these params
36
+ # are present. They are added by Rails and it's of no concern.
37
+ NEVER_UNPERMITTED_PARAMS = %w( controller action )
38
+
39
+ def initialize(attributes = nil)
40
+ super(attributes)
41
+ @permitted = false
42
+ end
43
+
44
+ def permit!
45
+ each_pair do |key, value|
46
+ value = convert_hashes_to_parameters(key, value)
47
+ Array.wrap(value).each do |_|
48
+ _.permit! if _.respond_to? :permit!
49
+ end
50
+ end
51
+
52
+ @permitted = true
53
+ self
54
+ end
55
+
56
+ def require(key)
57
+ self[key].presence || raise(ParameterMissing.new(key))
58
+ end
59
+
60
+ alias :required :require
61
+
62
+ def permit(*filters)
63
+ params = self.class.new
64
+
65
+ filters.flatten.each do |filter|
66
+ case filter
67
+ when Symbol, String
68
+ permitted_scalar_filter(params, filter)
69
+ when Hash then
70
+ hash_filter(params, filter)
71
+ end
72
+ end
73
+
74
+ unpermitted_parameters!(params) if self.class.action_on_unpermitted_parameters
75
+
76
+ params.permit!
77
+ end
78
+
79
+ def [](key)
80
+ convert_hashes_to_parameters(key, super)
81
+ end
82
+
83
+ def fetch(key, *args)
84
+ convert_hashes_to_parameters(key, super, false)
85
+ rescue KeyError, IndexError
86
+ raise ParameterMissing.new(key)
87
+ end
88
+
89
+ def slice(*keys)
90
+ self.class.new(super).tap do |new_instance|
91
+ new_instance.instance_variable_set :@permitted, @permitted
92
+ end
93
+ end
94
+
95
+ def dup
96
+ self.class.new(self).tap do |duplicate|
97
+ duplicate.default = default
98
+ duplicate.instance_variable_set :@permitted, @permitted
99
+ end
100
+ end
101
+
102
+ protected
103
+ def convert_value(value, conversion = nil)
104
+ if value.class == Hash
105
+ Parameters.new(value)
106
+ elsif value.is_a?(Array)
107
+ value.dup.replace(value.map { |e| convert_value(e) })
108
+ else
109
+ value
110
+ end
111
+ end
112
+
113
+ private
114
+
115
+ def convert_hashes_to_parameters(key, value, assign_if_converted=true)
116
+ converted = convert_value_to_parameters(value)
117
+ self[key] = converted if assign_if_converted && !converted.equal?(value)
118
+ converted
119
+ end
120
+
121
+ def convert_value_to_parameters(value)
122
+ if value.is_a?(Array)
123
+ value.map { |_| convert_value_to_parameters(_) }
124
+ elsif value.is_a?(Parameters) || !value.is_a?(Hash)
125
+ value
126
+ else
127
+ self.class.new(value)
128
+ end
129
+ end
130
+
131
+ #
132
+ # --- Filtering ----------------------------------------------------------
133
+ #
134
+
135
+ # This is a white list of permitted scalar types that includes the ones
136
+ # supported in XML and JSON requests.
137
+ #
138
+ # This list is in particular used to filter ordinary requests, String goes
139
+ # as first element to quickly short-circuit the common case.
140
+ #
141
+ # If you modify this collection please update the README.
142
+ PERMITTED_SCALAR_TYPES = [
143
+ String,
144
+ Symbol,
145
+ NilClass,
146
+ Numeric,
147
+ TrueClass,
148
+ FalseClass,
149
+ Date,
150
+ Time,
151
+ # DateTimes are Dates, we document the type but avoid the redundant check.
152
+ StringIO,
153
+ IO,
154
+ ]
155
+
156
+ def permitted_scalar?(value)
157
+ PERMITTED_SCALAR_TYPES.any? {|type| value.is_a?(type)}
158
+ end
159
+
160
+ def array_of_permitted_scalars?(value)
161
+ if value.is_a?(Array)
162
+ value.all? {|element| permitted_scalar?(element)}
163
+ end
164
+ end
165
+
166
+ def permitted_scalar_filter(params, key)
167
+ if has_key?(key) && permitted_scalar?(self[key])
168
+ params[key] = self[key]
169
+ end
170
+
171
+ keys.grep(/\A#{Regexp.escape(key.to_s)}\(\d+[if]?\)\z/).each do |key|
172
+ if permitted_scalar?(self[key])
173
+ params[key] = self[key]
174
+ end
175
+ end
176
+ end
177
+
178
+ def array_of_permitted_scalars_filter(params, key, hash = self)
179
+ if hash.has_key?(key) && array_of_permitted_scalars?(hash[key])
180
+ params[key] = hash[key]
181
+ end
182
+ end
183
+
184
+ def hash_filter(params, filter)
185
+ filter = filter.with_indifferent_access
186
+
187
+ # Slicing filters out non-declared keys.
188
+ slice(*filter.keys).each do |key, value|
189
+ next unless value
190
+
191
+ if filter[key] == []
192
+ # Declaration {:comment_ids => []}.
193
+ array_of_permitted_scalars_filter(params, key)
194
+ else
195
+ # Declaration {:user => :name} or {:user => [:name, :age, {:adress => ...}]}.
196
+ params[key] = each_element(value) do |element, index|
197
+ if element.is_a?(Hash)
198
+ element = self.class.new(element) unless element.respond_to?(:permit)
199
+ element.permit(*Array.wrap(filter[key]))
200
+ elsif filter[key].is_a?(Hash) && filter[key][index] == []
201
+ array_of_permitted_scalars_filter(params, index, value)
202
+ end
203
+ end
204
+ end
205
+ end
206
+ end
207
+
208
+ def each_element(value)
209
+ if value.is_a?(Array)
210
+ value.map { |el| yield el }.compact
211
+ # fields_for on an array of records uses numeric hash keys.
212
+ elsif fields_for_style?(value)
213
+ hash = value.class.new
214
+ value.each { |k,v| hash[k] = yield(v, k) }
215
+ hash
216
+ else
217
+ yield value
218
+ end
219
+ end
220
+
221
+ def fields_for_style?(object)
222
+ object.is_a?(Hash) && object.all? { |k, v| k =~ /\A-?\d+\z/ && v.is_a?(Hash) }
223
+ end
224
+
225
+ def unpermitted_parameters!(params)
226
+ return unless self.class.action_on_unpermitted_parameters
227
+
228
+ unpermitted_keys = unpermitted_keys(params)
229
+
230
+ if unpermitted_keys.any?
231
+ case self.class.action_on_unpermitted_parameters
232
+ when :log
233
+ name = "unpermitted_parameters.action_controller"
234
+ ActiveSupport::Notifications.instrument(name, :keys => unpermitted_keys)
235
+ when :raise
236
+ raise UnpermittedParameters.new(unpermitted_keys)
237
+ end
238
+ end
239
+ end
240
+
241
+ def unpermitted_keys(params)
242
+ self.keys - params.keys - NEVER_UNPERMITTED_PARAMS
243
+ end
244
+ end
245
+ end
@@ -0,0 +1,13 @@
1
+ module RubyPitaya
2
+
3
+ class Path
4
+ APP_TEMPLATE_FOLDER_PATH = File.join(__dir__, '../app-template/')
5
+
6
+ DATABASE_CONFIG_PATH = File.join(Dir.pwd, 'config/database.yml')
7
+
8
+ APP_FOLDER_PATH = File.join(Dir.pwd, 'app/')
9
+ HANDLERS_FOLDER_PATH = File.join(Dir.pwd, 'app/handlers/')
10
+ APP_CONFIG_FOLDER_PATH = File.join(Dir.pwd, 'app/config/')
11
+ MIGRATIONS_FOLDER_PATH = File.join(Dir.pwd, 'db/migrate/')
12
+ end
13
+ end
@@ -0,0 +1,31 @@
1
+ require 'rubypitaya/core/nats_connector'
2
+
3
+ module RubyPitaya
4
+
5
+ class Postman
6
+
7
+ MESSAGE_ROUTE_BIND_SESSION = 'sys.bindsession'
8
+
9
+ def initialize(nats_connector)
10
+ @nats_connector = nats_connector
11
+ end
12
+
13
+ def bind_session(session)
14
+ route = MESSAGE_ROUTE_BIND_SESSION
15
+
16
+ nats_session = NatsSession.new(
17
+ id: session.id,
18
+ uid: session.uid,
19
+ data: session.data.to_json,
20
+ )
21
+
22
+ response = @nats_connector.push_to_frontend(session, route, nats_session)
23
+
24
+ response
25
+ end
26
+
27
+ def push_to_user(uid, message_route, payload)
28
+ @nats_connector.push_to_user(uid, message_route, payload)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,26 @@
1
+ require 'redis'
2
+
3
+ module RubyPitaya
4
+
5
+ class RedisConnector
6
+
7
+ attr_reader :redis
8
+
9
+ def initialize(redis_address)
10
+ @redis = nil
11
+ @redis_address = redis_address
12
+ end
13
+
14
+ def connect
15
+ @redis = Redis.new(url: @redis_address)
16
+
17
+ test_connection
18
+ end
19
+
20
+ def test_connection
21
+ @redis.set('tmp', 'value')
22
+ @redis.get('tmp')
23
+ @redis.del('tmp')
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,29 @@
1
+ module RubyPitaya
2
+
3
+ class Session
4
+
5
+ attr_reader :id, :uid, :data, :metadata, :frontend_id
6
+
7
+ attr_writer :uid, :data
8
+
9
+ def initialize
10
+ @id = ''
11
+ @uid = ''
12
+ @data = {}
13
+ @metadata = {}
14
+ @frontend_id = ''
15
+ end
16
+
17
+ def update(id, uid, data, metadata, frontend_id)
18
+ @id = id
19
+ @uid = uid
20
+ @data = data
21
+ @metadata = metadata
22
+ @frontend_id = frontend_id
23
+ end
24
+
25
+ def authenticated?
26
+ !@uid.strip.empty?
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,4 @@
1
+ module RubyPitaya
2
+ VERSION = "1.1.0"
3
+ end
4
+
data/lib/rubypitaya.rb ADDED
@@ -0,0 +1,20 @@
1
+ require 'fileutils'
2
+
3
+ require 'rubypitaya/core/main'
4
+
5
+ module RubyPitaya
6
+
7
+ class RubyPitaya
8
+
9
+ def self.run_server
10
+ Main.new
11
+ end
12
+
13
+ def self.create_project(project_name, folder_path)
14
+ project_path = File.join(folder_path, project_name)
15
+ app_template_path = Path::APP_TEMPLATE_FOLDER_PATH
16
+
17
+ FileUtils.cp_r app_template_path, project_path
18
+ end
19
+ end
20
+ end
metadata ADDED
@@ -0,0 +1,240 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubypitaya
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Luciano Prestes Cavalcanti
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-04-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pg
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.21.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.21.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: eventmachine
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 1.2.7
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 1.2.7
41
+ - !ruby/object:Gem::Dependency
42
+ name: nats
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 0.11.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.11.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: redis
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 4.1.3
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 4.1.3
69
+ - !ruby/object:Gem::Dependency
70
+ name: etcdv3
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 0.10.2
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 0.10.2
83
+ - !ruby/object:Gem::Dependency
84
+ name: protobuf
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: 3.10.0
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 3.10.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: activerecord
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 6.0.2
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 6.0.2
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '='
116
+ - !ruby/object:Gem::Version
117
+ version: 0.12.2
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '='
123
+ - !ruby/object:Gem::Version
124
+ version: 0.12.2
125
+ - !ruby/object:Gem::Dependency
126
+ name: bundler
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '='
130
+ - !ruby/object:Gem::Version
131
+ version: 1.17.2
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '='
137
+ - !ruby/object:Gem::Version
138
+ version: 1.17.2
139
+ - !ruby/object:Gem::Dependency
140
+ name: rake
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '='
144
+ - !ruby/object:Gem::Version
145
+ version: '10.0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '='
151
+ - !ruby/object:Gem::Version
152
+ version: '10.0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rspec
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - '='
158
+ - !ruby/object:Gem::Version
159
+ version: 3.8.0
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '='
165
+ - !ruby/object:Gem::Version
166
+ version: 3.8.0
167
+ description: RubyPitaya is an application to create servers using the pitaya protocol.
168
+ email:
169
+ - lucianopcbr@gmail.com
170
+ executables:
171
+ - rubypitaya
172
+ extensions: []
173
+ extra_rdoc_files: []
174
+ files:
175
+ - "./lib/rubypitaya.rb"
176
+ - "./lib/rubypitaya/app-template/Gemfile"
177
+ - "./lib/rubypitaya/app-template/Gemfile.lock"
178
+ - "./lib/rubypitaya/app-template/Makefile"
179
+ - "./lib/rubypitaya/app-template/Rakefile"
180
+ - "./lib/rubypitaya/app-template/app/app_initializer.rb"
181
+ - "./lib/rubypitaya/app-template/app/bll/player_bll.rb"
182
+ - "./lib/rubypitaya/app-template/app/config/initial_player.json"
183
+ - "./lib/rubypitaya/app-template/app/constants/status_codes.rb"
184
+ - "./lib/rubypitaya/app-template/app/handlers/hello_world_handler.rb"
185
+ - "./lib/rubypitaya/app-template/app/handlers/player_handler.rb"
186
+ - "./lib/rubypitaya/app-template/app/models/player.rb"
187
+ - "./lib/rubypitaya/app-template/app/models/user.rb"
188
+ - "./lib/rubypitaya/app-template/bin/console"
189
+ - "./lib/rubypitaya/app-template/config/database.yml"
190
+ - "./lib/rubypitaya/app-template/db/migrate/001_create_user_migration.rb"
191
+ - "./lib/rubypitaya/app-template/db/migrate/002_create_player_migration.rb"
192
+ - "./lib/rubypitaya/app-template/docker-compose.yml"
193
+ - "./lib/rubypitaya/app-template/docker/dev/Dockerfile"
194
+ - "./lib/rubypitaya/app-template/docker/entrypoint.sh"
195
+ - "./lib/rubypitaya/app-template/docker/prod/Dockerfile"
196
+ - "./lib/rubypitaya/app-template/docker/prod/Makefile"
197
+ - "./lib/rubypitaya/core/application_files_importer.rb"
198
+ - "./lib/rubypitaya/core/config.rb"
199
+ - "./lib/rubypitaya/core/database_config.rb"
200
+ - "./lib/rubypitaya/core/database_connector.rb"
201
+ - "./lib/rubypitaya/core/etcd_connector.rb"
202
+ - "./lib/rubypitaya/core/handler_base.rb"
203
+ - "./lib/rubypitaya/core/handler_router.rb"
204
+ - "./lib/rubypitaya/core/initializer_base.rb"
205
+ - "./lib/rubypitaya/core/initializer_broadcast.rb"
206
+ - "./lib/rubypitaya/core/initializer_content.rb"
207
+ - "./lib/rubypitaya/core/instance_holder.rb"
208
+ - "./lib/rubypitaya/core/main.rb"
209
+ - "./lib/rubypitaya/core/nats_connector.rb"
210
+ - "./lib/rubypitaya/core/parameters.rb"
211
+ - "./lib/rubypitaya/core/path.rb"
212
+ - "./lib/rubypitaya/core/postman.rb"
213
+ - "./lib/rubypitaya/core/redis_connector.rb"
214
+ - "./lib/rubypitaya/core/session.rb"
215
+ - "./lib/rubypitaya/version.rb"
216
+ - bin/rubypitaya
217
+ homepage: https://gitlab.com/LucianoPC/ruby-pitaya
218
+ licenses:
219
+ - MIT
220
+ metadata: {}
221
+ post_install_message:
222
+ rdoc_options: []
223
+ require_paths:
224
+ - lib
225
+ required_ruby_version: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ required_rubygems_version: !ruby/object:Gem::Requirement
231
+ requirements:
232
+ - - ">="
233
+ - !ruby/object:Gem::Version
234
+ version: '0'
235
+ requirements: []
236
+ rubygems_version: 3.0.3
237
+ signing_key:
238
+ specification_version: 4
239
+ summary: Create servers with pitaya
240
+ test_files: []