bookingsync_portal 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +123 -2
- data/app/assets/javascripts/bookingsync_portal/admin/handle_remote_errors.js.coffee +1 -1
- data/app/models/bookingsync_portal/account.rb +5 -0
- data/app/models/bookingsync_portal/photo.rb +8 -0
- data/app/models/bookingsync_portal/rate.rb +6 -0
- data/app/models/bookingsync_portal/rental.rb +8 -2
- data/app/resources/bookingsync_portal/admin_api/connection_resource.rb +1 -1
- data/app/resources/bookingsync_portal/admin_api/remote_account_resource.rb +1 -1
- data/app/resources/bookingsync_portal/admin_api/remote_rental_resource.rb +0 -2
- data/app/resources/bookingsync_portal/admin_api/rental_resource.rb +0 -2
- data/app/views/bookingsync_portal/admin/rentals/_remote_rental.html.erb +1 -1
- data/app/views/bookingsync_portal/admin/rentals/index.html.erb +1 -1
- data/config/locales/en.yml +1 -0
- data/db/migrate/20150222172825_create_accounts.rb +6 -2
- data/db/migrate/20150222173413_create_rentals.rb +1 -1
- data/db/migrate/20150222173711_create_remote_accounts.rb +1 -1
- data/db/migrate/20150222174023_create_remote_rentals.rb +1 -1
- data/db/migrate/20150222174234_create_connections.rb +2 -1
- data/db/migrate/20150520134912_create_photos.rb +13 -0
- data/db/migrate/20150521091056_create_rates.rb +12 -0
- data/lib/bookingsync_portal.rb +9 -1
- data/lib/bookingsync_portal/version.rb +1 -1
- data/lib/generators/bookingsync_portal/install_generator.rb +10 -3
- data/lib/generators/templates/{bookingsync_portal.rb → initializers/bookingsync_portal.rb} +11 -6
- data/lib/generators/templates/models/account.rb +14 -0
- data/lib/generators/templates/models/connection.rb +2 -0
- data/lib/generators/templates/models/photo.rb +4 -0
- data/lib/generators/templates/models/rate.rb +3 -0
- data/lib/generators/templates/models/remote_account.rb +6 -0
- data/lib/generators/templates/models/remote_rental.rb +6 -0
- data/lib/generators/templates/models/rental.rb +6 -0
- metadata +23 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7bce44a09e365af14bee6025bdbaf505b5cbaa3e
|
4
|
+
data.tar.gz: 672dc73f92f93d0d3e0d9aa18199b73b201d7ded
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb08b602aef04800fd3608c2db757bb2b8d5b8aa0ae62611d4bfe66c4926638511476a4401ebe22684ed15b5c0b434ccab5d8f45f94990038b4d0acfbf44b749
|
7
|
+
data.tar.gz: d0026be5f43c6fe11bd6b240f36f719ef0eecc243468a116433e3b23e179dbe16401dc70cb33d61edb3678913b3bb957be8b1c0049f3b73767d847fccb8d54b9
|
data/README.md
CHANGED
@@ -1,8 +1,85 @@
|
|
1
|
+
[![Code Climate](https://codeclimate.com/github/BookingSync/bookingsync_portal/badges/gpa.svg)](https://codeclimate.com/github/BookingSync/bookingsync_portal)
|
2
|
+
[![Build Status](https://travis-ci.org/BookingSync/bookingsync_portal.svg?branch=master)](https://travis-ci.org/BookingSync/bookingsync_portal)
|
3
|
+
|
1
4
|
# BookingsyncPortal
|
2
5
|
|
3
|
-
|
6
|
+
A Rails engine to simplify building BookingSync Portal Applications.
|
7
|
+
|
8
|
+
## Requirements
|
9
|
+
|
10
|
+
This engine requires Rails `>= 4.0.0` and Ruby `>= 2.0.0`.
|
11
|
+
|
12
|
+
## Documentation
|
13
|
+
|
14
|
+
[API documentation is available at rdoc.info](http://rdoc.info/github/BookingSync/bookingsync_portal/master/frames).
|
15
|
+
|
16
|
+
## Installation
|
17
|
+
|
18
|
+
BookingSync Portal works with Rails 4.0 onwards and Ruby 2.0 onwards. To get started, add it to your Gemfile with:
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
gem 'bookingsync_portal'
|
22
|
+
```
|
23
|
+
|
24
|
+
Then bundle install:
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
bundle install
|
28
|
+
```
|
29
|
+
|
30
|
+
### Add routes
|
31
|
+
|
32
|
+
BookingSync Authorization routes need to be mounted inside you apps `routes.rb`:
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
mount BookingSync::Engine => '/'
|
36
|
+
```
|
37
|
+
|
38
|
+
This will add the following routes:
|
39
|
+
|
40
|
+
* `/auth/bookingsync/callback`
|
41
|
+
* `/auth/failure`
|
42
|
+
* `/signout`
|
43
|
+
|
44
|
+
as well as BookingSync Portal controllers routes:
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
mount BookingsyncPortal::Engine => '/'
|
48
|
+
```
|
49
|
+
|
50
|
+
### Migrations
|
51
|
+
|
52
|
+
BookingSync Portal provide migrations for the most common models:
|
53
|
+
* `Account`: BookingSync accounts,
|
54
|
+
* `Connection`: connection between `rentals` and `remote_rentals`,
|
55
|
+
* `Photo`: BookingSync rentals' photos,
|
56
|
+
* `Rate`: BookingSync rentals' rates,
|
57
|
+
* `RemoteAccount`: Portal accounts,
|
58
|
+
* `RemoteRental`: Portal rentals,
|
59
|
+
* `Rental`: BookingSync rentals,
|
60
|
+
|
61
|
+
You can copy the migrations file to your application by running:
|
62
|
+
|
63
|
+
```console
|
64
|
+
rake bookingsync_portal:install:migrations
|
65
|
+
```
|
66
|
+
|
67
|
+
then run the migration:
|
68
|
+
|
69
|
+
```console
|
70
|
+
rake db:migrate
|
71
|
+
```
|
4
72
|
|
5
|
-
|
73
|
+
### Add initializer and default models
|
74
|
+
|
75
|
+
This will install a configuration file in `config/initializers/bookingsync_portal.rb` as well as creating default models:
|
76
|
+
|
77
|
+
```console
|
78
|
+
rails g bookingsync_portal:install
|
79
|
+
```
|
80
|
+
|
81
|
+
|
82
|
+
### Assets
|
6
83
|
|
7
84
|
You will need to install the assets for each namespace:
|
8
85
|
|
@@ -45,3 +122,47 @@ in `/app/assets/javascripts/admin/application.css.scss`:
|
|
45
122
|
*/
|
46
123
|
|
47
124
|
```
|
125
|
+
|
126
|
+
|
127
|
+
_Note: When saving new token, this gem uses a separate thread with new db connection to ensure token save (in case of a rollback in the main transaction). To make room for the new connections, it is recommended to increase db `pool` size by 2-3._
|
128
|
+
|
129
|
+
## Configuration
|
130
|
+
|
131
|
+
The engine is configured by the following ENV variables:
|
132
|
+
|
133
|
+
* `BOOKINGSYNC_URL` - the url of the website, should be `https://www.bookingsync.com`
|
134
|
+
* `BOOKINGSYNC_APP_ID` - BookingSync Application's Client ID
|
135
|
+
* `BOOKINGSYNC_APP_SECRET` - BookingSync Application's Client Secret
|
136
|
+
* `BOOKINGSYNC_VERIFY_SSL` - Verify SSL (available only in development or test). Default to false
|
137
|
+
* `BOOKINGSYNC_SCOPE` - Space separated list of required scopes. Defaults to nil, which means the public scope.
|
138
|
+
|
139
|
+
You might want to use [dotenv-rails](https://github.com/bkeepers/dotenv)
|
140
|
+
to make ENV variables management easy.
|
141
|
+
|
142
|
+
## Testing
|
143
|
+
|
144
|
+
### RSpec
|
145
|
+
|
146
|
+
We do provide some helper for RSpec users, you can include them in your `spec/rails_helper.rb` (before `spec/support` inclusion):
|
147
|
+
```
|
148
|
+
require 'bookingsync_application/spec_helper'
|
149
|
+
```
|
150
|
+
|
151
|
+
### VCR
|
152
|
+
|
153
|
+
We recommend a VCR setup inspired from the following configuration. It will mask authorization tokens from your fixtures:
|
154
|
+
|
155
|
+
```ruby
|
156
|
+
require 'vcr'
|
157
|
+
|
158
|
+
VCR.configure do |config|
|
159
|
+
config.cassette_library_dir = 'spec/fixtures/cassettes'
|
160
|
+
config.hook_into :webmock
|
161
|
+
config.configure_rspec_metadata!
|
162
|
+
config.filter_sensitive_data('BOOKINGSYNC_OAUTH_ACCESS_TOKEN') do
|
163
|
+
ENV['BOOKINGSYNC_OAUTH_ACCESS_TOKEN']
|
164
|
+
end
|
165
|
+
# Uncomment if using codeclimate
|
166
|
+
# config.ignore_hosts 'codeclimate.com'
|
167
|
+
end
|
168
|
+
```
|
@@ -7,4 +7,9 @@ class BookingsyncPortal::Account < ActiveRecord::Base
|
|
7
7
|
has_many :remote_rentals, class_name: BookingsyncPortal.remote_rental_model, through: :remote_accounts
|
8
8
|
has_many :rentals, class_name: BookingsyncPortal.rental_model, dependent: :destroy
|
9
9
|
has_many :connections, class_name: BookingsyncPortal.connection_model, through: :rentals
|
10
|
+
|
11
|
+
# Used to synchronize accounts using `Account.synchronize(remove: true)`
|
12
|
+
def self.api
|
13
|
+
BookingSync::API::Client.new(BookingSync::Engine.application_token.token)
|
14
|
+
end
|
10
15
|
end
|
@@ -2,8 +2,10 @@ class BookingsyncPortal::Rental < ActiveRecord::Base
|
|
2
2
|
self.table_name = 'rentals'
|
3
3
|
|
4
4
|
belongs_to :account, class_name: BookingsyncPortal.account_model
|
5
|
-
has_one
|
6
|
-
has_one
|
5
|
+
has_one :connection, class_name: BookingsyncPortal.connection_model, dependent: :destroy
|
6
|
+
has_one :remote_rental, class_name: BookingsyncPortal.remote_rental_model, through: :connection
|
7
|
+
has_many :photos, class_name: BookingsyncPortal.photo_model, dependent: :destroy
|
8
|
+
has_many :rates, class_name: BookingsyncPortal.rate_model, dependent: :destroy
|
7
9
|
|
8
10
|
validates :synced_id, uniqueness: true, presence: true
|
9
11
|
|
@@ -15,4 +17,8 @@ class BookingsyncPortal::Rental < ActiveRecord::Base
|
|
15
17
|
def connected?
|
16
18
|
remote_rental.present?
|
17
19
|
end
|
20
|
+
|
21
|
+
def ordered_photos
|
22
|
+
photos.ordered
|
23
|
+
end
|
18
24
|
end
|
@@ -3,7 +3,7 @@ module BookingsyncPortal
|
|
3
3
|
class ConnectionResource < JSONAPI::Resource
|
4
4
|
model_name BookingsyncPortal.connection_model
|
5
5
|
|
6
|
-
attributes :
|
6
|
+
attributes :rental_id, :remote_rental_id
|
7
7
|
|
8
8
|
def self.records(options = {})
|
9
9
|
context = options[:context]
|
@@ -2,7 +2,7 @@
|
|
2
2
|
data-uid="<%= remote_rental.uid %>">
|
3
3
|
<div class="panel-heading" title="<%= RemoteRental.human_attribute_name(:uid) %>
|
4
4
|
<%= remote_rental.uid %>">
|
5
|
-
<%= remote_rental.remote_account.uid%>:
|
5
|
+
<%= remote_rental.remote_account.uid %>:
|
6
6
|
<%= remote_rental.name %>
|
7
7
|
</div>
|
8
8
|
<div class="panel-body">
|
@@ -6,7 +6,7 @@
|
|
6
6
|
<div class="rentals-list-scroll">
|
7
7
|
<%- if @visible_rentals_count == 0 -%>
|
8
8
|
<div class="lead text-center well">
|
9
|
-
<p><%= t('.no_published_rentals_html', id: current_account.
|
9
|
+
<p><%= t('.no_published_rentals_html', id: current_account.synced_id) %></p>
|
10
10
|
</div>
|
11
11
|
<%- elsif @not_connected_rentals.count > 0 -%>
|
12
12
|
<% @not_connected_rentals.each do |rental| %>
|
data/config/locales/en.yml
CHANGED
@@ -2,12 +2,16 @@ class CreateAccounts < ActiveRecord::Migration
|
|
2
2
|
def change
|
3
3
|
create_table :accounts do |t|
|
4
4
|
t.string :provider
|
5
|
-
t.integer :
|
5
|
+
t.integer :synced_id, index: true
|
6
6
|
t.string :name
|
7
7
|
t.string :oauth_access_token
|
8
8
|
t.string :oauth_refresh_token
|
9
9
|
t.datetime :oauth_expires_at
|
10
|
-
t.
|
10
|
+
t.text :synced_data
|
11
|
+
t.datetime :synced_all_at
|
12
|
+
t.string :email
|
13
|
+
|
14
|
+
t.timestamps null: false
|
11
15
|
end
|
12
16
|
end
|
13
17
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreatePhotos < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :photos do |t|
|
4
|
+
t.belongs_to :rental, index: true
|
5
|
+
t.integer :synced_id, index: true
|
6
|
+
t.text :synced_data
|
7
|
+
t.datetime :synced_all_at
|
8
|
+
t.integer :position
|
9
|
+
|
10
|
+
t.timestamps null: false
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class CreateRates < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :rates do |t|
|
4
|
+
t.belongs_to :rental, index: true
|
5
|
+
t.integer :synced_id, index: true
|
6
|
+
t.text :synced_data
|
7
|
+
t.datetime :synced_all_at
|
8
|
+
|
9
|
+
t.timestamps null: false
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/bookingsync_portal.rb
CHANGED
@@ -34,10 +34,18 @@ module BookingsyncPortal
|
|
34
34
|
mattr_accessor :remote_rental_model
|
35
35
|
@@remote_rental_model = 'BookingsyncPortal::RemoteRental'
|
36
36
|
|
37
|
-
#
|
37
|
+
# connection model class
|
38
38
|
mattr_accessor :connection_model
|
39
39
|
@@connection_model = 'BookingsyncPortal::Connection'
|
40
40
|
|
41
|
+
# photo model class
|
42
|
+
mattr_accessor :photo_model
|
43
|
+
@@photo_model = 'BookingsyncPortal::Photo'
|
44
|
+
|
45
|
+
# rate model class
|
46
|
+
mattr_accessor :rate_model
|
47
|
+
@@rate_model = 'BookingsyncPortal::Rate'
|
48
|
+
|
41
49
|
# account resource class
|
42
50
|
mattr_accessor :account_resource
|
43
51
|
@@account_resource = 'BookingsyncPortal::AdminApi::AccountResource'
|
@@ -5,11 +5,18 @@ module BookingsyncPortal
|
|
5
5
|
class InstallGenerator < ::Rails::Generators::Base
|
6
6
|
source_root File.expand_path("../../templates", __FILE__)
|
7
7
|
|
8
|
-
desc "Creates a BookingsyncPortal initializer."
|
8
|
+
desc "Creates a BookingsyncPortal initializer and default models."
|
9
9
|
|
10
10
|
def copy_initializer
|
11
|
-
template "bookingsync_portal.rb", "config/initializers/bookingsync_portal.rb"
|
11
|
+
template "initializers/bookingsync_portal.rb", "config/initializers/bookingsync_portal.rb"
|
12
|
+
template "models/account.rb", "app/models/account.rb"
|
13
|
+
template "models/connection.rb", "app/models/connection.rb"
|
14
|
+
template "models/photo.rb", "app/models/photo.rb"
|
15
|
+
template "models/rate.rb", "app/models/rate.rb"
|
16
|
+
template "models/remote_account.rb", "app/models/remote_account.rb"
|
17
|
+
template "models/remote_rental.rb", "app/models/remote_rental.rb"
|
18
|
+
template "models/rental.rb", "app/models/rental.rb"
|
12
19
|
end
|
13
20
|
end
|
14
21
|
end
|
15
|
-
end
|
22
|
+
end
|
@@ -1,19 +1,25 @@
|
|
1
1
|
# Use this to customize the behaviour of BookingsyncPortal engine and hook up custom synchronization
|
2
2
|
BookingsyncPortal.setup do |config|
|
3
3
|
# customize account model class, can extend BookingsyncPortal::Account
|
4
|
-
|
4
|
+
config.account_model = '::Account'
|
5
5
|
|
6
6
|
# customize remote account model class, can extend BookingsyncPortal::RemoteAccount
|
7
|
-
|
7
|
+
config.remote_account_model = '::RemoteAccount'
|
8
8
|
|
9
9
|
# customize rental model class, can extend BookingsyncPortal::Rental
|
10
|
-
|
10
|
+
config.rental_model = '::Rental'
|
11
11
|
|
12
12
|
# customize remote_rental model class, can extend BookingsyncPortal::RemoteRental
|
13
|
-
|
13
|
+
config.remote_rental_model = '::RemoteRental'
|
14
14
|
|
15
15
|
# customize connection model class, can extend BookingsyncPortal::Connection
|
16
|
-
|
16
|
+
config.connection_model = '::Connection'
|
17
|
+
|
18
|
+
# customize photo model class, can extend BookingsyncPortal::Photo
|
19
|
+
config.photo_model = '::Photo'
|
20
|
+
|
21
|
+
# customize rate model class, can extend BookingsyncPortal::Rate
|
22
|
+
config.rate_model = '::Rate'
|
17
23
|
|
18
24
|
# customize account resource class, can extend BookingsyncPortal::AdminApi::AccountResource
|
19
25
|
# config.account_resource = '::AdminApi::AccountResource'
|
@@ -43,4 +49,3 @@ BookingsyncPortal.setup do |config|
|
|
43
49
|
# return false if remote account is not present or not valid
|
44
50
|
end
|
45
51
|
end
|
46
|
-
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class Account < BookingsyncPortal::Account
|
2
|
+
synced local_attributes: [:email]
|
3
|
+
|
4
|
+
# Uncomment to add Rails logger
|
5
|
+
# def api
|
6
|
+
# @api ||= BookingSync::Engine::APIClient.new(token.token, logger: Rails.logger, account: self)
|
7
|
+
# end
|
8
|
+
|
9
|
+
# Uncomment to add Rails logger
|
10
|
+
# # Used to synchronize accounts using `Account.synchronize(remove: true)`
|
11
|
+
# def self.api
|
12
|
+
# BookingSync::API::Client.new(BookingSync::Engine.application_token.token, logger: Rails.logger)
|
13
|
+
# end
|
14
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bookingsync_portal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Marciniak
|
8
|
+
- Sebastien Grosjean
|
9
|
+
- Artur Krzeminski Freda
|
8
10
|
autorequire:
|
9
11
|
bindir: bin
|
10
12
|
cert_chain: []
|
11
|
-
date: 2015-
|
13
|
+
date: 2015-07-31 00:00:00.000000000 Z
|
12
14
|
dependencies:
|
13
15
|
- !ruby/object:Gem::Dependency
|
14
16
|
name: rails
|
@@ -44,14 +46,14 @@ dependencies:
|
|
44
46
|
requirements:
|
45
47
|
- - "~>"
|
46
48
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
49
|
+
version: 0.3.1
|
48
50
|
type: :runtime
|
49
51
|
prerelease: false
|
50
52
|
version_requirements: !ruby/object:Gem::Requirement
|
51
53
|
requirements:
|
52
54
|
- - "~>"
|
53
55
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
56
|
+
version: 0.3.1
|
55
57
|
- !ruby/object:Gem::Dependency
|
56
58
|
name: jquery-rails
|
57
59
|
requirement: !ruby/object:Gem::Requirement
|
@@ -304,9 +306,11 @@ dependencies:
|
|
304
306
|
- - ">="
|
305
307
|
- !ruby/object:Gem::Version
|
306
308
|
version: '0'
|
307
|
-
description:
|
309
|
+
description: A common base for creating BookingSync portal applications.
|
308
310
|
email:
|
309
311
|
- mandaryyyn@gmail.com
|
312
|
+
- dev@bookingsync.com
|
313
|
+
- artur@bookingsync.com
|
310
314
|
executables: []
|
311
315
|
extensions: []
|
312
316
|
extra_rdoc_files: []
|
@@ -333,6 +337,8 @@ files:
|
|
333
337
|
- app/helpers/bookingsync_portal/admin/rentals_helper.rb
|
334
338
|
- app/models/bookingsync_portal/account.rb
|
335
339
|
- app/models/bookingsync_portal/connection.rb
|
340
|
+
- app/models/bookingsync_portal/photo.rb
|
341
|
+
- app/models/bookingsync_portal/rate.rb
|
336
342
|
- app/models/bookingsync_portal/remote_account.rb
|
337
343
|
- app/models/bookingsync_portal/remote_rental.rb
|
338
344
|
- app/models/bookingsync_portal/rental.rb
|
@@ -358,12 +364,21 @@ files:
|
|
358
364
|
- db/migrate/20150222173711_create_remote_accounts.rb
|
359
365
|
- db/migrate/20150222174023_create_remote_rentals.rb
|
360
366
|
- db/migrate/20150222174234_create_connections.rb
|
367
|
+
- db/migrate/20150520134912_create_photos.rb
|
368
|
+
- db/migrate/20150521091056_create_rates.rb
|
361
369
|
- lib/bookingsync_portal.rb
|
362
370
|
- lib/bookingsync_portal/engine.rb
|
363
371
|
- lib/bookingsync_portal/mash_serializer.rb
|
364
372
|
- lib/bookingsync_portal/version.rb
|
365
373
|
- lib/generators/bookingsync_portal/install_generator.rb
|
366
|
-
- lib/generators/templates/bookingsync_portal.rb
|
374
|
+
- lib/generators/templates/initializers/bookingsync_portal.rb
|
375
|
+
- lib/generators/templates/models/account.rb
|
376
|
+
- lib/generators/templates/models/connection.rb
|
377
|
+
- lib/generators/templates/models/photo.rb
|
378
|
+
- lib/generators/templates/models/rate.rb
|
379
|
+
- lib/generators/templates/models/remote_account.rb
|
380
|
+
- lib/generators/templates/models/remote_rental.rb
|
381
|
+
- lib/generators/templates/models/rental.rb
|
367
382
|
- lib/tasks/bookingsync_portal_tasks.rake
|
368
383
|
homepage: https://github.com/BookingSync/bookingsync_portal
|
369
384
|
licenses:
|
@@ -385,8 +400,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
385
400
|
version: '0'
|
386
401
|
requirements: []
|
387
402
|
rubyforge_project:
|
388
|
-
rubygems_version: 2.4.
|
403
|
+
rubygems_version: 2.4.8
|
389
404
|
signing_key:
|
390
405
|
specification_version: 4
|
391
406
|
summary: A common base for creating BookingSync portal applications.
|
392
407
|
test_files: []
|
408
|
+
has_rdoc:
|