bridge_cache 0.2.8 → 0.3.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.
- checksums.yaml +5 -5
- data/Rakefile +1 -5
- data/app/lib/bridge_cache/data/bridge_model.rb +26 -12
- data/app/lib/bridge_cache/jobs/import_check.rb +5 -4
- data/app/lib/bridge_cache/jobs/import_data.rb +12 -20
- data/app/lib/bridge_cache/jobs/import_row.rb +1 -1
- data/app/lib/bridge_cache/jobs/import_start.rb +10 -19
- data/app/lib/bridge_cache/plugins/csv_dump.rb +57 -11
- data/app/lib/bridge_cache/plugins/data_transform.rb +0 -1
- data/app/lib/bridge_cache/utils/worker_helper.rb +1 -1
- data/app/lib/bridge_cache/webhooks/message.rb +0 -1
- data/app/models/bridge_cache/bridge_base_model.rb +2 -3
- data/app/models/bridge_cache/course_template.rb +2 -3
- data/app/models/bridge_cache/custom_field.rb +0 -1
- data/app/models/bridge_cache/domain.rb +0 -1
- data/app/models/bridge_cache/enrollment.rb +0 -1
- data/app/models/bridge_cache/enrollment_profile.rb +11 -1
- data/app/models/bridge_cache/grant.rb +0 -1
- data/app/models/bridge_cache/group.rb +0 -1
- data/app/models/bridge_cache/group_enrollment.rb +1 -2
- data/app/models/bridge_cache/learner_custom_field_value.rb +1 -2
- data/app/models/bridge_cache/live_course.rb +2 -3
- data/app/models/bridge_cache/live_course_enrollment.rb +0 -1
- data/app/models/bridge_cache/live_course_session.rb +0 -1
- data/app/models/bridge_cache/live_course_session_registration.rb +0 -1
- data/app/models/bridge_cache/membership.rb +1 -2
- data/app/models/bridge_cache/program.rb +2 -3
- data/app/models/bridge_cache/program_enrollment.rb +0 -1
- data/app/models/bridge_cache/program_group_enrollment.rb +0 -1
- data/app/models/bridge_cache/program_item.rb +0 -1
- data/app/models/bridge_cache/tag.rb +0 -1
- data/app/models/bridge_cache/user.rb +0 -1
- data/db/migrate/20171019195503_create_live_course_enrollments.rb +1 -1
- data/db/migrate/20171031165231_add_indexes.rb +0 -1
- data/db/migrate/20180406204906_add_uniq_constraints.rb +26 -0
- data/lib/bridge_cache.rb +46 -14
- data/lib/bridge_cache/engine.rb +12 -13
- data/lib/bridge_cache/version.rb +1 -1
- metadata +129 -31
- data/README.rdoc +0 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f3c52f75722394bef7332035eb20cd3d7aeec83e
|
4
|
+
data.tar.gz: 85c863da50ae24857c04c7fbcbfb0b1a944eb13c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af984e81a83c4237feedd11712b4e6020768a8c0a12668b6cda2288ef6bdb62ed1deea31457f3c13671b7e043d290a578b33e449cdbc13a1aa9ff4bc8c131197
|
7
|
+
data.tar.gz: a35ff760b4d414b480d7d8ebf8078a84865481f66735680219c569022ba1cfcbbdb8c864362ed77b481dd7dcfe91709364ef0e6990e756fe559aade72d2e2aab
|
data/Rakefile
CHANGED
@@ -14,14 +14,11 @@ RDoc::Task.new(:rdoc) do |rdoc|
|
|
14
14
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
15
|
end
|
16
16
|
|
17
|
-
APP_RAKEFILE = File.expand_path(
|
17
|
+
APP_RAKEFILE = File.expand_path('../test/dummy/Rakefile', __FILE__)
|
18
18
|
load 'rails/tasks/engine.rake'
|
19
19
|
|
20
|
-
|
21
20
|
load 'rails/tasks/statistics.rake'
|
22
21
|
|
23
|
-
|
24
|
-
|
25
22
|
Bundler::GemHelper.install_tasks
|
26
23
|
|
27
24
|
require 'rake/testtask'
|
@@ -33,5 +30,4 @@ Rake::TestTask.new(:test) do |t|
|
|
33
30
|
t.verbose = false
|
34
31
|
end
|
35
32
|
|
36
|
-
|
37
33
|
task default: :test
|
@@ -1,28 +1,32 @@
|
|
1
1
|
module BridgeCache::Data
|
2
2
|
module BridgeModel
|
3
|
-
|
3
|
+
EXCLUDED_COLUMNS = %w[created_at updated_at].freeze
|
4
4
|
def adjusted_table_name
|
5
5
|
if BridgeCache.use_internal_database
|
6
6
|
table_name
|
7
7
|
else
|
8
|
-
|
8
|
+
to_s.demodulize.underscore.pluralize
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.extended(base)
|
13
13
|
base.class_eval do
|
14
|
-
scope :in_domain, ->
|
15
|
-
scope :active, -> {is_active?}
|
16
|
-
self.table_name =
|
14
|
+
scope :in_domain, ->(domain_id) { for_domain(domain_id) }
|
15
|
+
scope :active, -> { is_active? }
|
16
|
+
self.table_name = adjusted_table_name
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
def format_import_row(row)
|
21
|
+
row
|
22
|
+
end
|
23
|
+
|
20
24
|
def import_from_csv(file_path)
|
21
|
-
BridgeCache::Plugins::CSVDump
|
25
|
+
BridgeCache::Plugins::CSVDump.dump_to_table(self, file_path)
|
22
26
|
end
|
23
27
|
|
24
28
|
def create_from_csv_row(row)
|
25
|
-
BridgeCache::Plugins::CSVDump
|
29
|
+
BridgeCache::Plugins::CSVDump.dump_row(self, row)
|
26
30
|
end
|
27
31
|
|
28
32
|
def cleanup(row_ids)
|
@@ -42,18 +46,28 @@ module BridgeCache::Data
|
|
42
46
|
message.payload_class.where(bridge_id: message.resource_object['id']).destroy_all
|
43
47
|
end
|
44
48
|
|
45
|
-
def webhook_completed(
|
46
|
-
raise
|
49
|
+
def webhook_completed(_message)
|
50
|
+
raise 'Method not implemented'
|
47
51
|
end
|
48
52
|
|
49
53
|
def for_domain(domain_id)
|
50
54
|
where(domain_id: domain_id)
|
51
55
|
end
|
52
56
|
|
57
|
+
def uniq_constraint_name
|
58
|
+
"#{table_name.downcase}_bridge_uniq"
|
59
|
+
end
|
60
|
+
|
53
61
|
def is_active?
|
54
|
-
if
|
55
|
-
|
56
|
-
|
62
|
+
where(deleted_at: nil) if column_names.include? 'deleted_at'
|
63
|
+
end
|
64
|
+
|
65
|
+
def csv_mapping
|
66
|
+
columns = column_names.as_json
|
67
|
+
mapping = {}
|
68
|
+
columns.each { |column| mapping[column] = column unless EXCLUDED_COLUMNS.include?(column) }
|
69
|
+
mapping['bridge_id'] = 'bridge_id'
|
70
|
+
mapping
|
57
71
|
end
|
58
72
|
|
59
73
|
private
|
@@ -5,14 +5,15 @@ module BridgeCache::Jobs
|
|
5
5
|
|
6
6
|
ATTEMPTS_THRESHOLD = 30
|
7
7
|
|
8
|
-
def perform(
|
9
|
-
|
8
|
+
def perform(account_settings, attempts, chain = [])
|
9
|
+
account_settings = account_settings.with_indifferent_access
|
10
|
+
remote_data = BridgeBlueprint::RemoteData.new(account_settings[:url], account_settings[:api_key], account_settings[:api_secret])
|
10
11
|
if attempts > ATTEMPTS_THRESHOLD
|
11
12
|
Rails.logger.fatal("Bridge data dump failed to download after #{(ATTEMPTS_THRESHOLD * 30) / 60} minutes")
|
12
13
|
elsif remote_data.status == BridgeBlueprint::Constants::STATUS_COMPLETE
|
13
|
-
BridgeCache::Jobs::ImportData.set(queue:
|
14
|
+
BridgeCache::Jobs::ImportData.set(queue: queue_name).perform_later(account_settings, chain)
|
14
15
|
elsif remote_data.status == BridgeBlueprint::Constants::STATUS_PENDING
|
15
|
-
BridgeCache::Jobs::ImportCheck.set(queue:
|
16
|
+
BridgeCache::Jobs::ImportCheck.set(queue: queue_name, wait: 30.seconds).perform_later(account_settings, attempts + 1, chain)
|
16
17
|
elsif remote_data.status == BridgeBlueprint::Constants::STATUS_FAILED || remote_data.status == BridgeBlueprint::Constants::STATUS_NOT_FOUND
|
17
18
|
raise 'Bridge data dump download failed'
|
18
19
|
end
|
@@ -3,28 +3,20 @@ module BridgeCache::Jobs
|
|
3
3
|
include BridgeCache::Utils::WorkerHelper
|
4
4
|
queue_as :default
|
5
5
|
|
6
|
-
def perform(
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
BridgeCache::Jobs::ImportRow.set(queue: self.queue_name).perform_later(model, row.to_h)
|
18
|
-
row_ids << row['id'].to_i
|
19
|
-
end
|
20
|
-
|
21
|
-
BridgeCache::Jobs::CleanupJob.set(queue: self.queue_name).perform_later(model, row_ids)
|
22
|
-
end
|
6
|
+
def perform(account_settings, chain = [])
|
7
|
+
account_settings = account_settings.with_indifferent_access
|
8
|
+
remote_data = BridgeBlueprint::RemoteData.new(account_settings[:url], account_settings[:api_key], account_settings[:api_secret])
|
9
|
+
Dir.mktmpdir do |dir|
|
10
|
+
path = "#{dir}/data_dump"
|
11
|
+
remote_data.store_file(path)
|
12
|
+
import = BridgeBlueprint::DataDump.new(path)
|
13
|
+
BridgeCache.resolved_models(account_settings[:is_subaccount]).each do |model|
|
14
|
+
ids = []
|
15
|
+
ids << BridgeCache::Plugins::CSVDump.bulk_import(import, model)
|
16
|
+
BridgeCache::Jobs::CleanupJob.set(queue: queue_name).perform_later(model, ids)
|
23
17
|
end
|
24
|
-
BridgeCache::Utils::WorkerHelper.invoke_next(chain)
|
25
|
-
rescue => e
|
26
|
-
Rails.logger.debug(e)
|
27
18
|
end
|
19
|
+
BridgeCache::Utils::WorkerHelper.invoke_next(chain)
|
28
20
|
end
|
29
21
|
end
|
30
22
|
end
|
@@ -2,25 +2,16 @@ module BridgeCache::Jobs
|
|
2
2
|
class ImportStart < ActiveJob::Base
|
3
3
|
queue_as :default
|
4
4
|
|
5
|
-
def perform(
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
bridge_api_secret,
|
16
|
-
models,
|
17
|
-
0,
|
18
|
-
chain,
|
19
|
-
global_options
|
20
|
-
)
|
21
|
-
rescue => e
|
22
|
-
Rails.logger.debug(e)
|
23
|
-
end
|
5
|
+
def perform(account_settings, chain = [])
|
6
|
+
data = BridgeBlueprint::RemoteData.new(account_settings[:url], account_settings[:api_key], account_settings[:api_secret])
|
7
|
+
data.start_data_report
|
8
|
+
BridgeCache::Jobs::ImportCheck
|
9
|
+
.set(queue: queue_name, wait: 30.seconds)
|
10
|
+
.perform_later(
|
11
|
+
account_settings,
|
12
|
+
0,
|
13
|
+
chain
|
14
|
+
)
|
24
15
|
end
|
25
16
|
end
|
26
17
|
end
|
@@ -2,22 +2,43 @@ require 'csv'
|
|
2
2
|
|
3
3
|
module BridgeCache::Plugins
|
4
4
|
class CSVDump
|
5
|
-
|
6
5
|
MAX_ROW_INTERVAL = 5000
|
7
6
|
|
7
|
+
def self.bulk_import(iterator, model)
|
8
|
+
ids = []
|
9
|
+
rows = []
|
10
|
+
klass = "BridgeCache::#{model.camelcase}".constantize
|
11
|
+
|
12
|
+
csv_column_names = klass.csv_mapping.keys
|
13
|
+
database_column_names = klass.csv_mapping.values
|
14
|
+
|
15
|
+
iterator.each_row(model.pluralize) do |row|
|
16
|
+
row = remove_bad_columns(klass, BridgeCache::Plugins::DataTransform.set_bridge_id(row).to_h)
|
17
|
+
row = klass.format_import_row(row)
|
18
|
+
rows << csv_column_names.map { |column| row[column] }
|
19
|
+
ids << row['bridge_id']
|
20
|
+
|
21
|
+
if rows.length >= BridgeCache.batch_size
|
22
|
+
perform_bulk_import(klass, database_column_names, rows)
|
23
|
+
rows = []
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
perform_bulk_import(klass, database_column_names, rows)
|
28
|
+
ids
|
29
|
+
end
|
30
|
+
|
8
31
|
def self.dump_to_table(clazz, file_path)
|
9
32
|
count = 1
|
10
33
|
total = 0
|
11
34
|
rows = []
|
12
|
-
CSV.foreach(file_path, headers: true) do |
|
35
|
+
CSV.foreach(file_path, headers: true) do |_row|
|
13
36
|
total += 1
|
14
37
|
end
|
15
38
|
CSV.foreach(file_path, headers: true) do |row|
|
16
|
-
if count < MAX_ROW_INTERVAL
|
17
|
-
rows << initialze_row(clazz, row)
|
18
|
-
end
|
39
|
+
rows << initialze_row(clazz, row) if count < MAX_ROW_INTERVAL
|
19
40
|
if count % MAX_ROW_INTERVAL == 0 || count == total
|
20
|
-
dump_rows(
|
41
|
+
dump_rows(rows)
|
21
42
|
count = 0
|
22
43
|
rows = []
|
23
44
|
end
|
@@ -27,27 +48,52 @@ module BridgeCache::Plugins
|
|
27
48
|
|
28
49
|
def self.dump_row(clazz, row)
|
29
50
|
instance = initialze_row(clazz, row)
|
30
|
-
dump_rows(
|
51
|
+
dump_rows([instance])
|
31
52
|
end
|
32
53
|
|
33
54
|
private
|
34
55
|
|
56
|
+
def self.perform_bulk_import(klass, columns, rows)
|
57
|
+
return if rows.empty?
|
58
|
+
columns = columns.dup
|
59
|
+
klass.import(columns, rows, validate: false, on_duplicate_key_update: {
|
60
|
+
constraint_name: klass.uniq_constraint_name,
|
61
|
+
condition: condition_sql(klass, columns),
|
62
|
+
columns: columns
|
63
|
+
})
|
64
|
+
end
|
65
|
+
|
66
|
+
# This method generates SQL that looks like:
|
67
|
+
# (users.sis_id, users.email) IS DISTINCT FROM (EXCLUDED.sis_id, EXCLUDED.email)
|
68
|
+
#
|
69
|
+
# This prevents activerecord-import from setting the `updated_at` column for
|
70
|
+
# rows that haven't actually changed. This allows you to query for rows that have changed
|
71
|
+
# by doing something like:
|
72
|
+
#
|
73
|
+
# started_at = Time.now
|
74
|
+
# run_the_users_sync!
|
75
|
+
# changed = User.where("updated_at >= ?", started_at)
|
76
|
+
def self.condition_sql(klass, columns)
|
77
|
+
columns_str = columns.map { |c| "#{klass.quoted_table_name}.#{c}" }.join(', ')
|
78
|
+
excluded_str = columns.map { |c| "EXCLUDED.#{c}" }.join(', ')
|
79
|
+
"(#{columns_str}) IS DISTINCT FROM (#{excluded_str})"
|
80
|
+
end
|
81
|
+
|
35
82
|
def self.initialze_row(clazz, row)
|
36
83
|
instance = clazz.find_or_create_by(bridge_id: row['id'])
|
37
|
-
instance.assign_attributes(remove_bad_columns(clazz, BridgeCache::Plugins::DataTransform
|
84
|
+
instance.assign_attributes(remove_bad_columns(clazz, BridgeCache::Plugins::DataTransform.set_bridge_id(row).to_h))
|
38
85
|
instance
|
39
86
|
end
|
40
87
|
|
41
|
-
def self.dump_rows(
|
88
|
+
def self.dump_rows(rows)
|
42
89
|
rows.each do |row|
|
43
90
|
row.save! if row.changed?
|
44
91
|
end
|
45
92
|
end
|
46
93
|
|
47
94
|
def self.remove_bad_columns(clazz, row)
|
48
|
-
row = row.delete_if {|key,
|
95
|
+
row = row.delete_if { |key, _value| !clazz.column_names.include?(key) }
|
49
96
|
row
|
50
97
|
end
|
51
|
-
|
52
98
|
end
|
53
99
|
end
|
@@ -9,7 +9,7 @@ module BridgeCache
|
|
9
9
|
|
10
10
|
def bridge_id
|
11
11
|
if self.class.column_names.include? BRIDGE_ID
|
12
|
-
|
12
|
+
self[:bridge_id]
|
13
13
|
else
|
14
14
|
id
|
15
15
|
end
|
@@ -19,9 +19,8 @@ module BridgeCache
|
|
19
19
|
if BridgeCache.use_internal_database
|
20
20
|
table_name
|
21
21
|
else
|
22
|
-
|
22
|
+
to_s.demodulize.underscore.pluralize
|
23
23
|
end
|
24
24
|
end
|
25
|
-
|
26
25
|
end
|
27
26
|
end
|
@@ -14,9 +14,8 @@ module BridgeCache
|
|
14
14
|
|
15
15
|
def self.for_domain(domain_id)
|
16
16
|
includes(:domains)
|
17
|
-
|
18
|
-
|
17
|
+
.where('bridge_cache_affiliated_sub_accounts.domain_id = ? OR bridge_cache_course_templates.sub_account_id = ?', domain_id, domain_id)
|
18
|
+
.references(:domains)
|
19
19
|
end
|
20
|
-
|
21
20
|
end
|
22
21
|
end
|
@@ -4,6 +4,5 @@ module BridgeCache
|
|
4
4
|
|
5
5
|
belongs_to :domain, foreign_key: :domain_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::Domain.name, optional: true
|
6
6
|
has_many :learner_custom_field_values, primary_key: BridgeCache.primary_key, foreign_key: :custom_field_id, class_name: BridgeCache::LearnerCustomFieldValue.name
|
7
|
-
|
8
7
|
end
|
9
8
|
end
|
@@ -8,6 +8,5 @@ module BridgeCache
|
|
8
8
|
|
9
9
|
belongs_to :user, foreign_key: :user_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::User.name, optional: true
|
10
10
|
belongs_to :course_template, foreign_key: :course_template_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::CourseTemplate.name, optional: true
|
11
|
-
|
12
11
|
end
|
13
12
|
end
|
@@ -11,9 +11,19 @@ module BridgeCache
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def parse_json
|
14
|
-
|
14
|
+
self.parse_config(self.config)
|
15
15
|
self.config = json if json.present?
|
16
16
|
end
|
17
17
|
|
18
|
+
def self.parse_config(config)
|
19
|
+
json = BridgeCache::Plugins::DataTransform::valid_json?(config)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.format_import_row(row)
|
23
|
+
json = parse_config(row['config'])
|
24
|
+
row['config'] = json if json.present?
|
25
|
+
row
|
26
|
+
end
|
27
|
+
|
18
28
|
end
|
19
29
|
end
|
@@ -4,6 +4,5 @@ module BridgeCache
|
|
4
4
|
|
5
5
|
belongs_to :user, foreign_key: :user_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::User.name, optional: true
|
6
6
|
belongs_to :domain, foreign_key: :domain_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::Domain.name, optional: true
|
7
|
-
|
8
7
|
end
|
9
8
|
end
|
@@ -9,6 +9,5 @@ module BridgeCache
|
|
9
9
|
has_many :group_enrollments, foreign_key: :group_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::GroupEnrollment.name
|
10
10
|
has_many :memberships, foreign_key: :group_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::Membership.name
|
11
11
|
belongs_to :domain, foreign_key: :domain_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::Domain.name, optional: true
|
12
|
-
|
13
12
|
end
|
14
13
|
end
|
@@ -3,11 +3,10 @@ module BridgeCache
|
|
3
3
|
extend BridgeCache::Data::BridgeModel
|
4
4
|
|
5
5
|
def self.for_domain(domain_id)
|
6
|
-
joins(:course_template).where(bridge_cache_course_templates: {domain_id: domain_id})
|
6
|
+
joins(:course_template).where(bridge_cache_course_templates: { domain_id: domain_id })
|
7
7
|
end
|
8
8
|
|
9
9
|
belongs_to :group, foreign_key: :group_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::Group.name, optional: true
|
10
10
|
belongs_to :course_template, foreign_key: :course_template_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::CourseTemplate.name, optional: true
|
11
|
-
|
12
11
|
end
|
13
12
|
end
|
@@ -3,11 +3,10 @@ module BridgeCache
|
|
3
3
|
extend BridgeCache::Data::BridgeModel
|
4
4
|
|
5
5
|
def self.for_domain(domain_id)
|
6
|
-
joins(:user).where(bridge_cache_users: {domain_id: domain_id})
|
6
|
+
joins(:user).where(bridge_cache_users: { domain_id: domain_id })
|
7
7
|
end
|
8
8
|
|
9
9
|
belongs_to :user, foreign_key: :user_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::User.name, optional: true
|
10
10
|
belongs_to :custom_field, foreign_key: :custom_field_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::CustomField.name, optional: true
|
11
|
-
|
12
11
|
end
|
13
12
|
end
|
@@ -11,9 +11,8 @@ module BridgeCache
|
|
11
11
|
|
12
12
|
def self.for_domain(domain_id)
|
13
13
|
includes(:domains)
|
14
|
-
|
15
|
-
|
14
|
+
.where('bridge_cache_affiliated_sub_accounts.domain_id = ? OR bridge_cache_live_courses.sub_account_id = ?', domain_id, domain_id)
|
15
|
+
.references(:domains)
|
16
16
|
end
|
17
|
-
|
18
17
|
end
|
19
18
|
end
|
@@ -9,6 +9,5 @@ module BridgeCache
|
|
9
9
|
belongs_to :user, foreign_key: :user_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::User.name, optional: true
|
10
10
|
belongs_to :live_course, foreign_key: :live_course_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::LiveCourse.name, optional: true
|
11
11
|
has_many :live_course_session_registrations, foreign_key: :live_course_enrollment_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::LiveCourseSessionRegistration.name
|
12
|
-
|
13
12
|
end
|
14
13
|
end
|
@@ -10,6 +10,5 @@ module BridgeCache
|
|
10
10
|
belongs_to :sub_account, foreign_key: :sub_account_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::Domain.name, optional: true
|
11
11
|
belongs_to :live_course, foreign_key: :live_course_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::LiveCourse.name, optional: true
|
12
12
|
has_many :live_course_session_registrations, foreign_key: :live_course_session_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::LiveCourseSessionRegistration.name
|
13
|
-
|
14
13
|
end
|
15
14
|
end
|
@@ -10,6 +10,5 @@ module BridgeCache
|
|
10
10
|
belongs_to :domain, foreign_key: :domain_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::Domain.name, optional: true
|
11
11
|
belongs_to :live_course_enrollment, primary_key: BridgeCache.primary_key, class_name: BridgeCache::LiveCourseEnrollment.name, optional: true
|
12
12
|
belongs_to :live_course_session, primary_key: BridgeCache.primary_key, class_name: BridgeCache::LiveCourseSession.name, optional: true
|
13
|
-
|
14
13
|
end
|
15
14
|
end
|
@@ -6,8 +6,7 @@ module BridgeCache
|
|
6
6
|
belongs_to :user, foreign_key: :group_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::User.name, optional: true
|
7
7
|
|
8
8
|
def self.for_domain(domain_id)
|
9
|
-
joins(:group).where(bridge_cache_groups: {domain_id: domain_id})
|
9
|
+
joins(:group).where(bridge_cache_groups: { domain_id: domain_id })
|
10
10
|
end
|
11
|
-
|
12
11
|
end
|
13
12
|
end
|
@@ -12,9 +12,8 @@ module BridgeCache
|
|
12
12
|
|
13
13
|
def self.for_domain(domain_id)
|
14
14
|
includes(:domains)
|
15
|
-
|
16
|
-
|
15
|
+
.where('bridge_cache_affiliated_sub_accounts.domain_id = ? OR bridge_cache_programs.sub_account_id = ?', domain_id, domain_id)
|
16
|
+
.references(:domains)
|
17
17
|
end
|
18
|
-
|
19
18
|
end
|
20
19
|
end
|
@@ -4,6 +4,5 @@ module BridgeCache
|
|
4
4
|
|
5
5
|
belongs_to :group, foreign_key: :group_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::Group.name, optional: true
|
6
6
|
belongs_to :program, foreign_key: :program_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::Program.name, optional: true
|
7
|
-
|
8
7
|
end
|
9
8
|
end
|
@@ -3,7 +3,7 @@ class CreateLiveCourseEnrollments < ActiveRecord::Migration[5.1]
|
|
3
3
|
return unless BridgeCache.use_internal_database
|
4
4
|
create_table :bridge_cache_live_course_enrollments do |t|
|
5
5
|
t.integer :bridge_id, limit: 8
|
6
|
-
t.integer :live_course_id,limit: 8
|
6
|
+
t.integer :live_course_id, limit: 8
|
7
7
|
t.integer :user_id, limit: 8
|
8
8
|
t.datetime :created_at
|
9
9
|
t.datetime :updated_at
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class AddUniqConstraints < ActiveRecord::Migration[5.1]
|
2
|
+
def change
|
3
|
+
add_unique_constraint :bridge_cache_affiliated_sub_accounts, %i[bridge_id domain_id], deferrable: false, name: 'bridge_cache_affiliated_sub_accounts_bridge_uniq'
|
4
|
+
add_unique_constraint :bridge_cache_course_templates, %i[bridge_id sub_account_id], deferrable: false, name: 'bridge_cache_course_templates_bridge_uniq'
|
5
|
+
add_unique_constraint :bridge_cache_custom_fields, %i[bridge_id domain_id], deferrable: false, name: 'bridge_cache_custom_fields_bridge_uniq'
|
6
|
+
add_unique_constraint :bridge_cache_domains, [:bridge_id], deferrable: false, name: 'bridge_cache_domains_bridge_uniq'
|
7
|
+
add_unique_constraint :bridge_cache_enrollment_profiles, %i[bridge_id domain_id], deferrable: false, name: 'bridge_cache_enrollment_profiles_bridge_uniq'
|
8
|
+
add_unique_constraint :bridge_cache_enrollments, [:bridge_id], deferrable: false, name: 'bridge_cache_enrollments_bridge_uniq'
|
9
|
+
add_unique_constraint :bridge_cache_grants, %i[bridge_id domain_id], deferrable: false, name: 'bridge_cache_grants_bridge_uniq'
|
10
|
+
add_unique_constraint :bridge_cache_groups, %i[bridge_id domain_id], deferrable: false, name: 'bridge_cache_groups_bridge_uniq'
|
11
|
+
add_unique_constraint :bridge_cache_group_enrollments, [:bridge_id], deferrable: false, name: 'bridge_cache_group_enrollments_bridge_uniq'
|
12
|
+
add_unique_constraint :bridge_cache_learner_custom_field_values, [:bridge_id], deferrable: false, name: 'bridge_cache_learner_custom_field_values_bridge_uniq'
|
13
|
+
add_unique_constraint :bridge_cache_live_course_enrollments, [:bridge_id], deferrable: false, name: 'bridge_cache_live_course_enrollments_bridge_uniq'
|
14
|
+
add_unique_constraint :bridge_cache_live_course_session_registrations, [:bridge_id], deferrable: false, name: 'bridge_cache_live_course_session_registrations_bridge_uniq'
|
15
|
+
add_unique_constraint :bridge_cache_live_course_sessions, %i[bridge_id domain_id], deferrable: false, name: 'bridge_cache_live_course_sessions_bridge_uniq'
|
16
|
+
add_unique_constraint :bridge_cache_live_courses, %i[bridge_id domain_id], deferrable: false, name: 'bridge_cache_live_courses_bridge_uniq'
|
17
|
+
add_unique_constraint :bridge_cache_memberships, [:bridge_id], deferrable: false, name: 'bridge_cache_memberships_bridge_uniq'
|
18
|
+
add_unique_constraint :bridge_cache_program_enrollments, [:bridge_id], deferrable: false, name: 'bridge_cache_program_enrollments_bridge_uniq'
|
19
|
+
add_unique_constraint :bridge_cache_program_group_enrollments, [:bridge_id], deferrable: false, name: 'bridge_cache_program_group_enrollments_bridge_uniq'
|
20
|
+
add_unique_constraint :bridge_cache_program_items, [:bridge_id], deferrable: false, name: 'bridge_cache_program_items_bridge_uniq'
|
21
|
+
add_unique_constraint :bridge_cache_programs, [:bridge_id], deferrable: false, name: 'bridge_cache_programs_bridge_uniq'
|
22
|
+
add_unique_constraint :bridge_cache_tags, [:bridge_id], deferrable: false, name: 'bridge_cache_tags_bridge_uniq'
|
23
|
+
add_unique_constraint :bridge_cache_taggings, [:bridge_id], deferrable: false, name: 'bridge_cache_taggings_bridge_uniq'
|
24
|
+
add_unique_constraint :bridge_cache_users, %i[bridge_id sub_account_id], deferrable: false, name: 'bridge_cache_users_bridge_uniq'
|
25
|
+
end
|
26
|
+
end
|
data/lib/bridge_cache.rb
CHANGED
@@ -1,26 +1,58 @@
|
|
1
|
-
require
|
1
|
+
require 'bridge_cache/engine'
|
2
2
|
require 'bridge_blueprint'
|
3
|
+
require 'active_record'
|
4
|
+
require 'activerecord-import'
|
5
|
+
require 'rein'
|
3
6
|
|
4
7
|
module BridgeCache
|
8
|
+
class << self
|
9
|
+
WRITER_METHODS = %w[use_internal_database batch_size is_subaccount].freeze
|
10
|
+
READ_METHODS = %w[models].freeze
|
11
|
+
READ_WRITE_METHODS = %w[].freeze
|
12
|
+
DEFAULT_BATCH_SIZE = 10_000
|
13
|
+
DEFAULT_MODELS = %(domain affiliated_sub_account).freeze
|
14
|
+
|
15
|
+
attr_writer(*WRITER_METHODS)
|
16
|
+
attr_accessor(*READ_WRITE_METHODS)
|
17
|
+
attr_reader(*READ_METHODS)
|
18
|
+
|
19
|
+
def configure
|
20
|
+
yield self if block_given?
|
21
|
+
end
|
22
|
+
|
23
|
+
def use_internal_database
|
24
|
+
return @use_internal_database if defined?(@use_internal_database)
|
25
|
+
|
26
|
+
@use_internal_database = true
|
27
|
+
end
|
28
|
+
|
29
|
+
def batch_size
|
30
|
+
@batch_size || DEFAULT_BATCH_SIZE
|
31
|
+
end
|
5
32
|
|
6
|
-
|
33
|
+
def models=(models)
|
34
|
+
@models = merged_required_models(models)
|
35
|
+
end
|
7
36
|
|
8
|
-
|
37
|
+
def models
|
38
|
+
return @models if defined?(@models)
|
9
39
|
|
10
|
-
|
40
|
+
@models = merged_required_models([])
|
41
|
+
end
|
11
42
|
|
12
|
-
|
13
|
-
|
14
|
-
|
43
|
+
def primary_key
|
44
|
+
@use_internal_database ? :bridge_id : :id
|
45
|
+
end
|
15
46
|
|
16
|
-
|
17
|
-
|
47
|
+
def resolved_models(remove_root_models)
|
48
|
+
return @models unless remove_root_models
|
49
|
+
@models.reject { |model| DEFAULT_MODELS.include?(model) }
|
50
|
+
end
|
18
51
|
|
19
|
-
|
20
|
-
end
|
52
|
+
private
|
21
53
|
|
22
|
-
|
23
|
-
|
24
|
-
end
|
54
|
+
def merged_required_models(models)
|
55
|
+
(%w[domain affiliated_sub_account] + models).uniq
|
25
56
|
end
|
57
|
+
end
|
26
58
|
end
|
data/lib/bridge_cache/engine.rb
CHANGED
@@ -5,19 +5,18 @@ module BridgeCache
|
|
5
5
|
config.autoload_once_paths += Dir["#{config.root}/lib/**/"]
|
6
6
|
|
7
7
|
config.generators do |g|
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
g.test_framework :rspec
|
9
|
+
g.fixture_replacement :factory_girl, dir: 'spec/factories'
|
10
|
+
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
12
|
+
initializer :append_migrations do |app|
|
13
|
+
unless app.root.to_s.match root.to_s
|
14
|
+
config.paths['db/migrate'].expanded.each do |expanded_path|
|
15
|
+
app.config.paths['db/migrate'] << expanded_path
|
16
|
+
end
|
17
|
+
# Apartment will modify this, but it doesn't fully support engine migrations, so we'll reset it here
|
18
|
+
ActiveRecord::Migrator.migrations_paths = Rails.application.paths['db/migrate'].to_a
|
19
|
+
end
|
20
|
+
end
|
22
21
|
end
|
23
22
|
end
|
data/lib/bridge_cache/version.rb
CHANGED
metadata
CHANGED
@@ -1,75 +1,104 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bridge_cache
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jshaffer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-04-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: activerecord-import
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 0.20.2
|
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:
|
26
|
+
version: 0.20.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bridge_blueprint
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.0.
|
33
|
+
version: 0.0.06
|
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.0.
|
40
|
+
version: 0.0.06
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rails
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 5.
|
48
|
-
type: :
|
47
|
+
version: '5.0'
|
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: 5.
|
54
|
+
version: '5.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rein
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.4'
|
62
|
+
- - "~>"
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 3.4.0
|
65
|
+
type: :runtime
|
66
|
+
prerelease: false
|
67
|
+
version_requirements: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - "~>"
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '3.4'
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 3.4.0
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: actionmailer
|
57
77
|
requirement: !ruby/object:Gem::Requirement
|
58
78
|
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '5.1'
|
59
82
|
- - ">="
|
60
83
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
84
|
+
version: 5.1.4
|
62
85
|
type: :development
|
63
86
|
prerelease: false
|
64
87
|
version_requirements: !ruby/object:Gem::Requirement
|
65
88
|
requirements:
|
89
|
+
- - "~>"
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '5.1'
|
66
92
|
- - ">="
|
67
93
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
94
|
+
version: 5.1.4
|
69
95
|
- !ruby/object:Gem::Dependency
|
70
96
|
name: actionpack
|
71
97
|
requirement: !ruby/object:Gem::Requirement
|
72
98
|
requirements:
|
99
|
+
- - "~>"
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '5.1'
|
73
102
|
- - ">="
|
74
103
|
- !ruby/object:Gem::Version
|
75
104
|
version: 5.1.4
|
@@ -77,41 +106,59 @@ dependencies:
|
|
77
106
|
prerelease: false
|
78
107
|
version_requirements: !ruby/object:Gem::Requirement
|
79
108
|
requirements:
|
109
|
+
- - "~>"
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '5.1'
|
80
112
|
- - ">="
|
81
113
|
- !ruby/object:Gem::Version
|
82
114
|
version: 5.1.4
|
83
115
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
116
|
+
name: bundler
|
85
117
|
requirement: !ruby/object:Gem::Requirement
|
86
118
|
requirements:
|
119
|
+
- - "~>"
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '1.6'
|
87
122
|
- - ">="
|
88
123
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
124
|
+
version: 1.6.2
|
90
125
|
type: :development
|
91
126
|
prerelease: false
|
92
127
|
version_requirements: !ruby/object:Gem::Requirement
|
93
128
|
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '1.6'
|
94
132
|
- - ">="
|
95
133
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
134
|
+
version: 1.6.2
|
97
135
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
136
|
+
name: byebug
|
99
137
|
requirement: !ruby/object:Gem::Requirement
|
100
138
|
requirements:
|
139
|
+
- - "~>"
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '9.1'
|
101
142
|
- - ">="
|
102
143
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
144
|
+
version: 9.1.0
|
104
145
|
type: :development
|
105
146
|
prerelease: false
|
106
147
|
version_requirements: !ruby/object:Gem::Requirement
|
107
148
|
requirements:
|
149
|
+
- - "~>"
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '9.1'
|
108
152
|
- - ">="
|
109
153
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
154
|
+
version: 9.1.0
|
111
155
|
- !ruby/object:Gem::Dependency
|
112
156
|
name: combustion
|
113
157
|
requirement: !ruby/object:Gem::Requirement
|
114
158
|
requirements:
|
159
|
+
- - "~>"
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
version: '0.7'
|
115
162
|
- - ">="
|
116
163
|
- !ruby/object:Gem::Version
|
117
164
|
version: 0.7.0
|
@@ -119,41 +166,59 @@ dependencies:
|
|
119
166
|
prerelease: false
|
120
167
|
version_requirements: !ruby/object:Gem::Requirement
|
121
168
|
requirements:
|
169
|
+
- - "~>"
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: '0.7'
|
122
172
|
- - ">="
|
123
173
|
- !ruby/object:Gem::Version
|
124
174
|
version: 0.7.0
|
125
175
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
176
|
+
name: database_cleaner
|
127
177
|
requirement: !ruby/object:Gem::Requirement
|
128
178
|
requirements:
|
179
|
+
- - "~>"
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: '1.6'
|
129
182
|
- - ">="
|
130
183
|
- !ruby/object:Gem::Version
|
131
|
-
version: 1.
|
184
|
+
version: 1.6.2
|
132
185
|
type: :development
|
133
186
|
prerelease: false
|
134
187
|
version_requirements: !ruby/object:Gem::Requirement
|
135
188
|
requirements:
|
189
|
+
- - "~>"
|
190
|
+
- !ruby/object:Gem::Version
|
191
|
+
version: '1.6'
|
136
192
|
- - ">="
|
137
193
|
- !ruby/object:Gem::Version
|
138
|
-
version: 1.
|
194
|
+
version: 1.6.2
|
139
195
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
196
|
+
name: factory_bot_rails
|
141
197
|
requirement: !ruby/object:Gem::Requirement
|
142
198
|
requirements:
|
199
|
+
- - "~>"
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '4.8'
|
143
202
|
- - ">="
|
144
203
|
- !ruby/object:Gem::Version
|
145
|
-
version:
|
204
|
+
version: 4.8.2
|
146
205
|
type: :development
|
147
206
|
prerelease: false
|
148
207
|
version_requirements: !ruby/object:Gem::Requirement
|
149
208
|
requirements:
|
209
|
+
- - "~>"
|
210
|
+
- !ruby/object:Gem::Version
|
211
|
+
version: '4.8'
|
150
212
|
- - ">="
|
151
213
|
- !ruby/object:Gem::Version
|
152
|
-
version:
|
214
|
+
version: 4.8.2
|
153
215
|
- !ruby/object:Gem::Dependency
|
154
216
|
name: pg
|
155
217
|
requirement: !ruby/object:Gem::Requirement
|
156
218
|
requirements:
|
219
|
+
- - "~>"
|
220
|
+
- !ruby/object:Gem::Version
|
221
|
+
version: '0.21'
|
157
222
|
- - ">="
|
158
223
|
- !ruby/object:Gem::Version
|
159
224
|
version: 0.21.0
|
@@ -161,13 +226,39 @@ dependencies:
|
|
161
226
|
prerelease: false
|
162
227
|
version_requirements: !ruby/object:Gem::Requirement
|
163
228
|
requirements:
|
229
|
+
- - "~>"
|
230
|
+
- !ruby/object:Gem::Version
|
231
|
+
version: '0.21'
|
164
232
|
- - ">="
|
165
233
|
- !ruby/object:Gem::Version
|
166
234
|
version: 0.21.0
|
235
|
+
- !ruby/object:Gem::Dependency
|
236
|
+
name: rspec-rails
|
237
|
+
requirement: !ruby/object:Gem::Requirement
|
238
|
+
requirements:
|
239
|
+
- - "~>"
|
240
|
+
- !ruby/object:Gem::Version
|
241
|
+
version: '3.7'
|
242
|
+
- - ">="
|
243
|
+
- !ruby/object:Gem::Version
|
244
|
+
version: 3.7.2
|
245
|
+
type: :development
|
246
|
+
prerelease: false
|
247
|
+
version_requirements: !ruby/object:Gem::Requirement
|
248
|
+
requirements:
|
249
|
+
- - "~>"
|
250
|
+
- !ruby/object:Gem::Version
|
251
|
+
version: '3.7'
|
252
|
+
- - ">="
|
253
|
+
- !ruby/object:Gem::Version
|
254
|
+
version: 3.7.2
|
167
255
|
- !ruby/object:Gem::Dependency
|
168
256
|
name: shoulda-matchers
|
169
257
|
requirement: !ruby/object:Gem::Requirement
|
170
258
|
requirements:
|
259
|
+
- - "~>"
|
260
|
+
- !ruby/object:Gem::Version
|
261
|
+
version: '3.1'
|
171
262
|
- - ">="
|
172
263
|
- !ruby/object:Gem::Version
|
173
264
|
version: 3.1.2
|
@@ -175,10 +266,16 @@ dependencies:
|
|
175
266
|
prerelease: false
|
176
267
|
version_requirements: !ruby/object:Gem::Requirement
|
177
268
|
requirements:
|
269
|
+
- - "~>"
|
270
|
+
- !ruby/object:Gem::Version
|
271
|
+
version: '3.1'
|
178
272
|
- - ">="
|
179
273
|
- !ruby/object:Gem::Version
|
180
274
|
version: 3.1.2
|
181
|
-
description:
|
275
|
+
description: |-
|
276
|
+
A mountable engine for bridge data storage,
|
277
|
+
can either be used for direct database connection
|
278
|
+
or as a localized data storage mechanism
|
182
279
|
email:
|
183
280
|
- jshaffer@instructure.com
|
184
281
|
executables: []
|
@@ -186,7 +283,6 @@ extensions: []
|
|
186
283
|
extra_rdoc_files: []
|
187
284
|
files:
|
188
285
|
- MIT-LICENSE
|
189
|
-
- README.rdoc
|
190
286
|
- Rakefile
|
191
287
|
- app/assets/javascripts/bridge_cache/application.js
|
192
288
|
- app/assets/stylesheets/bridge_cache/application.css
|
@@ -253,6 +349,7 @@ files:
|
|
253
349
|
- db/migrate/20171031165231_add_indexes.rb
|
254
350
|
- db/migrate/20180316205458_create_bridge_cache_enrollment_profiles.rb
|
255
351
|
- db/migrate/20180320190443_add_index_to_enrollment_profile.rb
|
352
|
+
- db/migrate/20180406204906_add_uniq_constraints.rb
|
256
353
|
- lib/bridge_cache.rb
|
257
354
|
- lib/bridge_cache/engine.rb
|
258
355
|
- lib/bridge_cache/version.rb
|
@@ -277,8 +374,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
277
374
|
version: '0'
|
278
375
|
requirements: []
|
279
376
|
rubyforge_project:
|
280
|
-
rubygems_version: 2.
|
377
|
+
rubygems_version: 2.6.14
|
281
378
|
signing_key:
|
282
379
|
specification_version: 4
|
283
380
|
summary: A mountable engine for bridge data storage
|
284
381
|
test_files: []
|
382
|
+
has_rdoc:
|
data/README.rdoc
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
# BridgeCache
|
2
|
-
|
3
|
-
https://www.getbridge.com/
|
4
|
-
|
5
|
-
Bridge Cache is a data dump engine used to cache remote bridge data into a local database.
|
6
|
-
|
7
|
-
The application mimics the bridge data model and will copy csv rows directly into the local
|
8
|
-
data store without any extra configuration
|
9
|
-
|
10
|
-
## Setup
|
11
|
-
gem install 'bridge_cache'
|
12
|
-
|
13
|
-
rake db:migrate
|
14
|
-
|
15
|
-
Enable Bridge data dumps through the administrative interface in bridge, or have your bridge
|
16
|
-
admin enable it for you.
|
17
|
-
|
18
|
-
## Usage
|
19
|
-
|
20
|
-
To Import an entire csv
|
21
|
-
BridgeCache::User.import_from_csv(path_to_csv)
|
22
|
-
|
23
|
-
Import a list of models from a data dump automatically. This feature requires a queue manager
|
24
|
-
like sidekiq or delayed jobs
|
25
|
-
|
26
|
-
BridgeCache::Jobs::ImportStart.perform_later(
|
27
|
-
bridge_base_url, (https://yourbridgeurl.bridgeapp.com)
|
28
|
-
bridge_api_key, (API key generated through bridge admin interface)
|
29
|
-
bridge_api_secret, (API secret generated through bridge admin interface)
|
30
|
-
[
|
31
|
-
'user',
|
32
|
-
'group',
|
33
|
-
'domain',
|
34
|
-
'course_template'
|
35
|
-
],
|
36
|
-
[])
|