web-connect 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.
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: []