web-connect 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +1 -0
  3. data/Rakefile +3 -0
  4. data/lib/netfira/web_connect/components/checksum.rb +19 -0
  5. data/lib/netfira/web_connect/components/guid.rb +11 -0
  6. data/lib/netfira/web_connect/components/octa_word.rb +73 -0
  7. data/lib/netfira/web_connect/components.rb +1 -0
  8. data/lib/netfira/web_connect/configuration.rb +33 -0
  9. data/lib/netfira/web_connect/db_schema/20140514_support.rb +38 -0
  10. data/lib/netfira/web_connect/db_schema/20140515_alpha.rb +106 -0
  11. data/lib/netfira/web_connect/events.rb +14 -0
  12. data/lib/netfira/web_connect/migration/base_methods.rb +59 -0
  13. data/lib/netfira/web_connect/migration/refinements.rb +16 -0
  14. data/lib/netfira/web_connect/migration.rb +101 -0
  15. data/lib/netfira/web_connect/model/record/digests.rb +24 -0
  16. data/lib/netfira/web_connect/model/record/events.rb +35 -0
  17. data/lib/netfira/web_connect/model/record/file_record.rb +79 -0
  18. data/lib/netfira/web_connect/model/record/materialization.rb +59 -0
  19. data/lib/netfira/web_connect/model/record/relations.rb +51 -0
  20. data/lib/netfira/web_connect/model/record/sendable.rb +29 -0
  21. data/lib/netfira/web_connect/model/record/serializer.rb +56 -0
  22. data/lib/netfira/web_connect/model/record/translated_string.rb +42 -0
  23. data/lib/netfira/web_connect/model/record/translation.rb +58 -0
  24. data/lib/netfira/web_connect/model/record/translations.rb +63 -0
  25. data/lib/netfira/web_connect/model/record/tree.rb +13 -0
  26. data/lib/netfira/web_connect/model/record.rb +132 -0
  27. data/lib/netfira/web_connect/model/relation/events.rb +34 -0
  28. data/lib/netfira/web_connect/model/relation.rb +67 -0
  29. data/lib/netfira/web_connect/model/support.rb +13 -0
  30. data/lib/netfira/web_connect/model.rb +33 -0
  31. data/lib/netfira/web_connect/models/image.rb +48 -0
  32. data/lib/netfira/web_connect/models/order.rb +5 -0
  33. data/lib/netfira/web_connect/models/order_line.rb +13 -0
  34. data/lib/netfira/web_connect/models/support/setting.rb +31 -0
  35. data/lib/netfira/web_connect/models/support/shop/settings.rb +42 -0
  36. data/lib/netfira/web_connect/models/support/shop.rb +22 -0
  37. data/lib/netfira/web_connect/models/support/table.rb +5 -0
  38. data/lib/netfira/web_connect/models.rb +73 -0
  39. data/lib/netfira/web_connect/rack_app/action.rb +66 -0
  40. data/lib/netfira/web_connect/rack_app/action_helpers/data_types.rb +22 -0
  41. data/lib/netfira/web_connect/rack_app/action_helpers/env_importer.rb +59 -0
  42. data/lib/netfira/web_connect/rack_app/action_helpers/env_methods.rb +23 -0
  43. data/lib/netfira/web_connect/rack_app/actions/version_1/not_supported.rb +11 -0
  44. data/lib/netfira/web_connect/rack_app/actions/version_8/checksums.rb +14 -0
  45. data/lib/netfira/web_connect/rack_app/actions/version_8/commit/records.rb +45 -0
  46. data/lib/netfira/web_connect/rack_app/actions/version_8/commit/relations.rb +48 -0
  47. data/lib/netfira/web_connect/rack_app/actions/version_8/commit.rb +33 -0
  48. data/lib/netfira/web_connect/rack_app/actions/version_8/files.rb +21 -0
  49. data/lib/netfira/web_connect/rack_app/actions/version_8/info.rb +18 -0
  50. data/lib/netfira/web_connect/rack_app/actions/version_8/settings.rb +79 -0
  51. data/lib/netfira/web_connect/rack_app/exceptions/http_exception.rb +44 -0
  52. data/lib/netfira/web_connect/rack_app/exceptions.rb +6 -0
  53. data/lib/netfira/web_connect/rack_app.rb +56 -0
  54. data/lib/netfira/web_connect/request_filter.rb +66 -0
  55. data/lib/netfira/web_connect/schema/table.rb +58 -0
  56. data/lib/netfira/web_connect/schema.rb +22 -0
  57. data/lib/netfira/web_connect/version.rb +5 -0
  58. data/lib/netfira/web_connect.rb +82 -0
  59. data/lib/netfira.rb +10 -0
  60. data/lib/web_connect.rb +1 -0
  61. metadata +246 -0
@@ -0,0 +1,56 @@
1
+ require 'ostruct'
2
+
3
+ module Netfira::WebConnect
4
+ class RackApp
5
+ def call(env)
6
+ begin
7
+ body, headers = handle_request(env)
8
+ if headers['Content-Type']
9
+ [200, headers, body]
10
+ else
11
+ make_response 200, body, headers
12
+ end
13
+ rescue Exceptions::HttpException => e
14
+ make_response e.code, {errorMessage: e.message}, e.headers, e.code
15
+ end
16
+ end
17
+
18
+ def latest_api_version
19
+ Action.latest_version
20
+ end
21
+
22
+ private
23
+
24
+ def handle_request(env)
25
+ # Match [/]<api-version-number>/<anything other than a forward slash>
26
+ raise NotFound unless env['PATH_INFO'] =~ /\A\/?(\d+)\/([^\/]+)/
27
+ version = $1.to_i
28
+ action_name = $2.to_sym
29
+ action = Action.create(action_name, version)
30
+ raise NotFound unless action
31
+ action.import_env env
32
+ body = action.call
33
+ [body, action.headers]
34
+ end
35
+
36
+ def make_response(status, body = {}, headers = {}, error_code = 0)
37
+ body_string = {errorCode: error_code}.merge(body).to_json
38
+ [
39
+ status,
40
+ {
41
+ :'Content-Type' => 'application/json',
42
+ :'Content-Length' => body_string.length
43
+ }.merge(headers),
44
+ body_string
45
+ ]
46
+ end
47
+
48
+ end
49
+ end
50
+
51
+ require_relative 'rack_app/exceptions'
52
+ require_relative 'rack_app/action'
53
+
54
+ class Netfira::WebConnect::RackApp
55
+ include Exceptions::HttpExceptions
56
+ end
@@ -0,0 +1,66 @@
1
+ require 'zlib'
2
+ require 'stringio'
3
+
4
+ module Netfira::WebConnect
5
+ class RequestFilter
6
+
7
+ def initialize(app)
8
+ @app = app
9
+ end
10
+
11
+ def call(env)
12
+ if (env['CONTENT_TYPE'] || env['HTTP_CONTENT_TYPE']) == 'application/x-netfira-webconnect-packed'
13
+ begin
14
+ unpack env
15
+ rescue Zlib::GzipFile::Error => e
16
+ return [400, {}, {errorCode: 19, errorMessage: "Gzip decompression error: #{e.message}"}]
17
+ end
18
+ end
19
+ env['WC_ACCEPTABLE_REQUEST_TYPES'] = %w[packed unpacked]
20
+ @app.call env
21
+ end
22
+
23
+ def unpack(env)
24
+ env['original.rack.input'] = input = env['rack.input']
25
+
26
+ input = Zlib::GzipReader.new(input) if (env['CONTENT_ENCODING'] || env['HTTP_CONTENT_ENCODING']) == 'gzip'
27
+
28
+ method, path, query_string, headers, body = parse_request(input)
29
+
30
+ %w[REQUEST_METHOD PATH_INFO QUERY_STRING].each{ |field| env["OUTER_#{field}"] = env[field] }
31
+
32
+ env['REQUEST_METHOD'] = method
33
+ env['PATH_INFO'] = path
34
+ env['QUERY_STRING'] = query_string || ''
35
+
36
+ headers.each do |key, value|
37
+ field = key =~ /^CONTENT_/ ? '' : 'HTTP_'
38
+ field << key.upcase.gsub('-', '_')
39
+ env["OUTER_#{field}"] = env[field] if env[field]
40
+ env[field] = value
41
+ end
42
+
43
+ env['rack.input'] = StringIO.new(body || '')
44
+ end
45
+
46
+ private
47
+
48
+ def parse_request(input)
49
+ input.rewind
50
+
51
+ body = ''
52
+ headers = {}
53
+
54
+ method, path, query_string = /^([A-Z]+) ([^?\s]+)(?:\?(\S*))?/.match(input.readline)[1..3]
55
+
56
+ while !input.eof and (line = input.readline.chomp) != ''
57
+ headers.merge! [line.split(/:\s*/, 2)].to_h
58
+ end
59
+
60
+ body = input.read unless input.eof
61
+
62
+ [method, path, query_string, headers, body]
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,58 @@
1
+ module Netfira::WebConnect
2
+
3
+ class Schema::Table
4
+
5
+ attr_reader :klass
6
+
7
+ def initialize(klass)
8
+ @klass = klass
9
+ end
10
+
11
+ def singular
12
+ @singular ||= klass.name.demodulize
13
+ end
14
+
15
+ def plural
16
+ @plural ||= singular.pluralize
17
+ end
18
+
19
+ def primary_key
20
+ @primary_key ||= klass.origin_key
21
+ end
22
+
23
+ def localize
24
+ @localize ||= l10n_columns.keys.map(&:to_sym)
25
+ end
26
+
27
+ IGNORE_COLUMNS = %w[id shop_id created_at updated_at digest]
28
+
29
+ def columns
30
+ @columns ||= klass.columns_hash.reject{ |k| IGNORE_COLUMNS.include? k }.merge(l10n_columns).map{ |k, v| [k.to_sym, v.type.to_s] }.to_h
31
+ end
32
+
33
+ def as_json(options)
34
+ @json ||= {
35
+ columns: columns.map { |name, type| [name.to_s.camelize(:lower), type] }.to_h,
36
+ singular: singular,
37
+ primaryKey: [primary_key.to_s.camelize(:lower)],
38
+ localize: l10n_columns.keys.map{ |k| k.camelize :lower }
39
+ }
40
+ end
41
+
42
+ private
43
+
44
+ def l10n_columns
45
+ @l10n_columns ||= klass.has_languages? ? l10n_filtered_columns_hash : {}
46
+ end
47
+
48
+ IGNORE_L10N_COLUMNS = %w[id language]
49
+
50
+ def l10n_filtered_columns_hash
51
+ klass::Translation.columns_hash.reject do |k|
52
+ k == "#{klass.single_name}_id" or IGNORE_L10N_COLUMNS.include? k
53
+ end
54
+ end
55
+
56
+ end
57
+
58
+ end
@@ -0,0 +1,22 @@
1
+ module Netfira::WebConnect
2
+
3
+ # This class reflects the database's schema
4
+ class Schema < Hash
5
+
6
+ def initialize
7
+ classes = Models.constants.map{ |c| Models.const_get c }
8
+ classes.select!{ |klass| klass < Model::Record }
9
+ merge! classes.map{ |klass| [klass, Table.new(klass)] }.to_h
10
+ end
11
+
12
+ def as_json(options)
13
+ map do |klass, table|
14
+ [klass.name.demodulize.pluralize, table.as_json(options)]
15
+ end.to_h
16
+ end
17
+
18
+ end
19
+
20
+ end
21
+
22
+ require_relative 'schema/table'
@@ -0,0 +1,5 @@
1
+ module Netfira
2
+ module WebConnect
3
+ VERSION = '0.1.0'
4
+ end
5
+ end
@@ -0,0 +1,82 @@
1
+ require 'yaml'
2
+ require 'pathname'
3
+ require 'active_record'
4
+ require 'locale'
5
+
6
+ require_relative 'web_connect/model'
7
+
8
+ module Netfira
9
+ module WebConnect
10
+ ROOT = Pathname(__FILE__).parent
11
+
12
+ def self.configure(input = nil, **options)
13
+ if Hash === input
14
+ @config = Configuration.new(input)
15
+ elsif String === input
16
+ @config = Configuration.new(YAML.parse input)
17
+ elsif input.respond_to? :read
18
+ @config = Configuration.new(YAML.parse_stream input)
19
+ elsif input.nil?
20
+ @config ||= Configuration.new
21
+ else
22
+ raise "You cannot configure WebConnect with an instance of #{input.class}"
23
+ end
24
+ @config.materialize_when_db_changed = !options[:skip_materialization]
25
+ yield @config if block_given?
26
+ end
27
+
28
+ def self.db_table_prefix(string = '')
29
+ [@config.db_table_prefix, string].join.to_sym
30
+ end
31
+
32
+ def self.db_table_l10n_suffix(table_name = '')
33
+ :"#{table_name}_l10n"
34
+ end
35
+
36
+ def self.schema_migrations_table_name
37
+ db_table_prefix('schema_migrations').to_s
38
+ end
39
+
40
+ def self.logger
41
+ @config.logger || null_logger
42
+ end
43
+
44
+ def self.system_locale
45
+ @system_locale ||= Locale.current.to_simple.to_s
46
+ end
47
+
48
+ def self.file_store
49
+ @config.file_store || {}
50
+ end
51
+
52
+ def self.authenticator
53
+ @config.authenticator
54
+ end
55
+
56
+ def self.anonymous_shop
57
+ @anonymous_shop ||= Models::Shop.find(0)
58
+ end
59
+
60
+ def self.schema
61
+ @schema ||= Schema.new if @config
62
+ end
63
+
64
+ private
65
+
66
+ def self.null_logger
67
+ @null_logger ||= Logger.new nil
68
+ end
69
+
70
+ end
71
+ end
72
+
73
+ require_relative 'web_connect/events'
74
+
75
+ require_relative 'web_connect/rack_app'
76
+ require_relative 'web_connect/request_filter'
77
+ require_relative 'web_connect/migration'
78
+ require_relative 'web_connect/version'
79
+ require_relative 'web_connect/models'
80
+ require_relative 'web_connect/components'
81
+ require_relative 'web_connect/configuration'
82
+ require_relative 'web_connect/schema'
data/lib/netfira.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'i18n'
2
+
3
+ # Suppress a deprecation warning from (presumably) ActiveSupport
4
+ # TODO: get to the bottom of this maybe
5
+ I18n.config.enforce_available_locales = true
6
+
7
+ module Netfira
8
+ end
9
+
10
+ require_relative 'netfira/web_connect'
@@ -0,0 +1 @@
1
+ require_relative 'netfira'
metadata ADDED
@@ -0,0 +1,246 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: web-connect
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Neil E. Pearson
8
+ - Gerard (Gerry) Caulfield
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-06-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activerecord
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '4.1'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '4.1'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rack
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.5'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.5'
42
+ - !ruby/object:Gem::Dependency
43
+ name: locale
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '2.1'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '2.1'
56
+ - !ruby/object:Gem::Dependency
57
+ name: paperclip
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '4.1'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '4.1'
70
+ - !ruby/object:Gem::Dependency
71
+ name: fastimage
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '1.6'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '1.6'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rspec
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: 3.0.0.beta
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: 3.0.0.beta
98
+ - !ruby/object:Gem::Dependency
99
+ name: sqlite3
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '1.3'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '1.3'
112
+ - !ruby/object:Gem::Dependency
113
+ name: rspec-its
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '1.0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '1.0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: mime-types
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: '1.16'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: '1.16'
140
+ - !ruby/object:Gem::Dependency
141
+ name: database_cleaner
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: '1.3'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: '1.3'
154
+ description: |
155
+ This is a Ruby version of Netfira's WebConnect server-side library
156
+ email:
157
+ - neil@helium.net.au
158
+ - gerard@caulfield.me
159
+ executables: []
160
+ extensions: []
161
+ extra_rdoc_files: []
162
+ files:
163
+ - README.md
164
+ - Rakefile
165
+ - lib/netfira.rb
166
+ - lib/netfira/web_connect.rb
167
+ - lib/netfira/web_connect/components.rb
168
+ - lib/netfira/web_connect/components/checksum.rb
169
+ - lib/netfira/web_connect/components/guid.rb
170
+ - lib/netfira/web_connect/components/octa_word.rb
171
+ - lib/netfira/web_connect/configuration.rb
172
+ - lib/netfira/web_connect/db_schema/20140514_support.rb
173
+ - lib/netfira/web_connect/db_schema/20140515_alpha.rb
174
+ - lib/netfira/web_connect/events.rb
175
+ - lib/netfira/web_connect/migration.rb
176
+ - lib/netfira/web_connect/migration/base_methods.rb
177
+ - lib/netfira/web_connect/migration/refinements.rb
178
+ - lib/netfira/web_connect/model.rb
179
+ - lib/netfira/web_connect/model/record.rb
180
+ - lib/netfira/web_connect/model/record/digests.rb
181
+ - lib/netfira/web_connect/model/record/events.rb
182
+ - lib/netfira/web_connect/model/record/file_record.rb
183
+ - lib/netfira/web_connect/model/record/materialization.rb
184
+ - lib/netfira/web_connect/model/record/relations.rb
185
+ - lib/netfira/web_connect/model/record/sendable.rb
186
+ - lib/netfira/web_connect/model/record/serializer.rb
187
+ - lib/netfira/web_connect/model/record/translated_string.rb
188
+ - lib/netfira/web_connect/model/record/translation.rb
189
+ - lib/netfira/web_connect/model/record/translations.rb
190
+ - lib/netfira/web_connect/model/record/tree.rb
191
+ - lib/netfira/web_connect/model/relation.rb
192
+ - lib/netfira/web_connect/model/relation/events.rb
193
+ - lib/netfira/web_connect/model/support.rb
194
+ - lib/netfira/web_connect/models.rb
195
+ - lib/netfira/web_connect/models/image.rb
196
+ - lib/netfira/web_connect/models/order.rb
197
+ - lib/netfira/web_connect/models/order_line.rb
198
+ - lib/netfira/web_connect/models/support/setting.rb
199
+ - lib/netfira/web_connect/models/support/shop.rb
200
+ - lib/netfira/web_connect/models/support/shop/settings.rb
201
+ - lib/netfira/web_connect/models/support/table.rb
202
+ - lib/netfira/web_connect/rack_app.rb
203
+ - lib/netfira/web_connect/rack_app/action.rb
204
+ - lib/netfira/web_connect/rack_app/action_helpers/data_types.rb
205
+ - lib/netfira/web_connect/rack_app/action_helpers/env_importer.rb
206
+ - lib/netfira/web_connect/rack_app/action_helpers/env_methods.rb
207
+ - lib/netfira/web_connect/rack_app/actions/version_1/not_supported.rb
208
+ - lib/netfira/web_connect/rack_app/actions/version_8/checksums.rb
209
+ - lib/netfira/web_connect/rack_app/actions/version_8/commit.rb
210
+ - lib/netfira/web_connect/rack_app/actions/version_8/commit/records.rb
211
+ - lib/netfira/web_connect/rack_app/actions/version_8/commit/relations.rb
212
+ - lib/netfira/web_connect/rack_app/actions/version_8/files.rb
213
+ - lib/netfira/web_connect/rack_app/actions/version_8/info.rb
214
+ - lib/netfira/web_connect/rack_app/actions/version_8/settings.rb
215
+ - lib/netfira/web_connect/rack_app/exceptions.rb
216
+ - lib/netfira/web_connect/rack_app/exceptions/http_exception.rb
217
+ - lib/netfira/web_connect/request_filter.rb
218
+ - lib/netfira/web_connect/schema.rb
219
+ - lib/netfira/web_connect/schema/table.rb
220
+ - lib/netfira/web_connect/version.rb
221
+ - lib/web_connect.rb
222
+ homepage: http://www.netfira.com/
223
+ licenses:
224
+ - proprietary
225
+ metadata: {}
226
+ post_install_message:
227
+ rdoc_options: []
228
+ require_paths:
229
+ - lib
230
+ required_ruby_version: !ruby/object:Gem::Requirement
231
+ requirements:
232
+ - - ">="
233
+ - !ruby/object:Gem::Version
234
+ version: '2.1'
235
+ required_rubygems_version: !ruby/object:Gem::Requirement
236
+ requirements:
237
+ - - ">="
238
+ - !ruby/object:Gem::Version
239
+ version: '0'
240
+ requirements: []
241
+ rubyforge_project:
242
+ rubygems_version: 2.2.2
243
+ signing_key:
244
+ specification_version: 4
245
+ summary: Netfira's WebConnect Library
246
+ test_files: []