bridge_cache 0.2.8 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +5 -5
  2. data/Rakefile +1 -5
  3. data/app/lib/bridge_cache/data/bridge_model.rb +26 -12
  4. data/app/lib/bridge_cache/jobs/import_check.rb +5 -4
  5. data/app/lib/bridge_cache/jobs/import_data.rb +12 -20
  6. data/app/lib/bridge_cache/jobs/import_row.rb +1 -1
  7. data/app/lib/bridge_cache/jobs/import_start.rb +10 -19
  8. data/app/lib/bridge_cache/plugins/csv_dump.rb +57 -11
  9. data/app/lib/bridge_cache/plugins/data_transform.rb +0 -1
  10. data/app/lib/bridge_cache/utils/worker_helper.rb +1 -1
  11. data/app/lib/bridge_cache/webhooks/message.rb +0 -1
  12. data/app/models/bridge_cache/bridge_base_model.rb +2 -3
  13. data/app/models/bridge_cache/course_template.rb +2 -3
  14. data/app/models/bridge_cache/custom_field.rb +0 -1
  15. data/app/models/bridge_cache/domain.rb +0 -1
  16. data/app/models/bridge_cache/enrollment.rb +0 -1
  17. data/app/models/bridge_cache/enrollment_profile.rb +11 -1
  18. data/app/models/bridge_cache/grant.rb +0 -1
  19. data/app/models/bridge_cache/group.rb +0 -1
  20. data/app/models/bridge_cache/group_enrollment.rb +1 -2
  21. data/app/models/bridge_cache/learner_custom_field_value.rb +1 -2
  22. data/app/models/bridge_cache/live_course.rb +2 -3
  23. data/app/models/bridge_cache/live_course_enrollment.rb +0 -1
  24. data/app/models/bridge_cache/live_course_session.rb +0 -1
  25. data/app/models/bridge_cache/live_course_session_registration.rb +0 -1
  26. data/app/models/bridge_cache/membership.rb +1 -2
  27. data/app/models/bridge_cache/program.rb +2 -3
  28. data/app/models/bridge_cache/program_enrollment.rb +0 -1
  29. data/app/models/bridge_cache/program_group_enrollment.rb +0 -1
  30. data/app/models/bridge_cache/program_item.rb +0 -1
  31. data/app/models/bridge_cache/tag.rb +0 -1
  32. data/app/models/bridge_cache/user.rb +0 -1
  33. data/db/migrate/20171019195503_create_live_course_enrollments.rb +1 -1
  34. data/db/migrate/20171031165231_add_indexes.rb +0 -1
  35. data/db/migrate/20180406204906_add_uniq_constraints.rb +26 -0
  36. data/lib/bridge_cache.rb +46 -14
  37. data/lib/bridge_cache/engine.rb +12 -13
  38. data/lib/bridge_cache/version.rb +1 -1
  39. metadata +129 -31
  40. data/README.rdoc +0 -36
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: b65a0aeee23bdfaa1534a911ed6bffcebb63121fc21459950792bafdd7afacdb
4
- data.tar.gz: 699d173dbfbaec7ef7c99e6d940dce75a5f3259d8b4ff4e526461f42e3a7e00e
2
+ SHA1:
3
+ metadata.gz: f3c52f75722394bef7332035eb20cd3d7aeec83e
4
+ data.tar.gz: 85c863da50ae24857c04c7fbcbfb0b1a944eb13c
5
5
  SHA512:
6
- metadata.gz: d9dd46fe8b82bb9143cd2ad974537b96b0f0297db2efd9f00269cfddc7ab8ff98dd1fda9c8f8c6153397b7d9aab8d214a6f949bc516f3a8da13f9952eee787ad
7
- data.tar.gz: 627d7257a6630b936f946e3d12c36a2942d81047ed6f33c6992de0afa64356ce9d86edfd8ac496570e8fc1aa54471fd90b6bcd4c9dab453f72a80a0a2a9bd842
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("../test/dummy/Rakefile", __FILE__)
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
- self.to_s.demodulize.underscore.pluralize
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, -> (domain_id) {for_domain(domain_id)}
15
- scope :active, -> {is_active?}
16
- self.table_name = self.adjusted_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::dump_to_table(self, file_path)
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::dump_row(self, row)
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(message)
46
- raise "Method not implemented"
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 self.column_names.include? 'deleted_at'
55
- where(deleted_at: nil)
56
- end
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(bridge_base_url, bridge_api_key, bridge_api_secret, models, attempts, chain = [], global_options = {})
9
- remote_data = BridgeBlueprint::RemoteData.new(bridge_base_url, bridge_api_key, bridge_api_secret)
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: self.queue_name).perform_later(bridge_base_url, bridge_api_key, bridge_api_secret, models, chain, global_options)
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: self.queue_name, wait: 30.seconds).perform_later(bridge_base_url, bridge_api_key, bridge_api_secret, models, attempts + 1, chain, global_options)
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(bridge_base_url, bridge_api_key, bridge_api_secret, models, chain = [], global_options = {})
7
- begin
8
- remote_data = BridgeBlueprint::RemoteData.new(bridge_base_url, bridge_api_key, bridge_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
- models.each do |model|
14
- row_ids = []
15
-
16
- import.each_row(model.pluralize) do |row|
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,7 +2,7 @@ module BridgeCache::Jobs
2
2
  class ImportRow < ActiveJob::Base
3
3
  queue_as :default
4
4
 
5
- def perform(model, row, chain = [])
5
+ def perform(model, row)
6
6
  "BridgeCache::#{model.camelcase}".constantize.create_from_csv_row(row)
7
7
  end
8
8
  end
@@ -2,25 +2,16 @@ module BridgeCache::Jobs
2
2
  class ImportStart < ActiveJob::Base
3
3
  queue_as :default
4
4
 
5
- def perform(bridge_base_url, bridge_api_key, bridge_api_secret, models, chain = [], global_options = {})
6
- begin
7
- data = BridgeBlueprint::RemoteData.new(bridge_base_url, bridge_api_key, bridge_api_secret)
8
- models = (['domain', 'affiliated_sub_account'] + models).uniq unless global_options[:subaccount]
9
- data.start_data_report
10
- BridgeCache::Jobs::ImportCheck
11
- .set(queue: self.queue_name, wait: 30.seconds)
12
- .perform_later(
13
- bridge_base_url,
14
- bridge_api_key,
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 |row|
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(clazz, 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(clazz, [instance])
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::set_bridge_id(row).to_h))
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(clazz, 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, value| !clazz.column_names.include?(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
@@ -1,6 +1,5 @@
1
1
  module BridgeCache::Plugins
2
2
  class DataTransform
3
-
4
3
  def self.set_bridge_id(row)
5
4
  if row.key?('id')
6
5
  row['bridge_id'] = row['id'] if row.key?('id')
@@ -5,7 +5,7 @@ module BridgeCache::Utils
5
5
  job = job_chain.shift
6
6
  if job
7
7
  job_class = Object.const_get(job[:job].classify)
8
- job_class.perform_later(*(job[:params].concat(params)))
8
+ job_class.perform_later(*job[:params].concat(params))
9
9
  end
10
10
  end
11
11
  end
@@ -1,6 +1,5 @@
1
1
  module BridgeCache::Webhooks
2
2
  class Message
3
-
4
3
  attr_reader :payload
5
4
 
6
5
  def initialize(payload)
@@ -9,7 +9,7 @@ module BridgeCache
9
9
 
10
10
  def bridge_id
11
11
  if self.class.column_names.include? BRIDGE_ID
12
- self[:bridge_id]
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
- self.to_s.demodulize.underscore.pluralize
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
- .where('bridge_cache_affiliated_sub_accounts.domain_id = ? OR bridge_cache_course_templates.sub_account_id = ?', domain_id, domain_id)
18
- .references(:domains)
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
@@ -16,6 +16,5 @@ module BridgeCache
16
16
  belongs_to :owner, class_name: BridgeCache::User.name
17
17
 
18
18
  serialize :config
19
-
20
19
  end
21
20
  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
- json = BridgeCache::Plugins::DataTransform::valid_json?(self.config)
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
- .where('bridge_cache_affiliated_sub_accounts.domain_id = ? OR bridge_cache_live_courses.sub_account_id = ?', domain_id, domain_id)
15
- .references(:domains)
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
- .where('bridge_cache_affiliated_sub_accounts.domain_id = ? OR bridge_cache_programs.sub_account_id = ?', domain_id, domain_id)
16
- .references(:domains)
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
@@ -8,6 +8,5 @@ module BridgeCache
8
8
  def self.for_domain(domain_id)
9
9
  joins(:program).merge(BridgeCache::Program.for_domain(domain_id))
10
10
  end
11
-
12
11
  end
13
12
  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
@@ -7,6 +7,5 @@ module BridgeCache
7
7
  def self.for_domain(domain_id)
8
8
  joins(:program).merge(BridgeCache::Program.for_domain(domain_id))
9
9
  end
10
-
11
10
  end
12
11
  end
@@ -3,6 +3,5 @@ module BridgeCache
3
3
  extend BridgeCache::Data::BridgeModel
4
4
 
5
5
  has_many :taggings, foreign_key: :tag_id, primary_key: BridgeCache.primary_key, class_name: BridgeCache::Tagging.name
6
-
7
6
  end
8
7
  end
@@ -24,6 +24,5 @@ module BridgeCache
24
24
  def manager
25
25
  domain.owner
26
26
  end
27
-
28
27
  end
29
28
  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
@@ -92,6 +92,5 @@ class AddIndexes < ActiveRecord::Migration[5.1]
92
92
  add_index :bridge_cache_live_course_sessions, :domain_id
93
93
  add_index :bridge_cache_live_course_sessions, :sub_account_id
94
94
  add_index :bridge_cache_live_course_sessions, :parent_id
95
-
96
95
  end
97
96
  end
@@ -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 "bridge_cache/engine"
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
- class << self
33
+ def models=(models)
34
+ @models = merged_required_models(models)
35
+ end
7
36
 
8
- WRITER_METHODS = [:use_internal_database]
37
+ def models
38
+ return @models if defined?(@models)
9
39
 
10
- attr_writer(*WRITER_METHODS)
40
+ @models = merged_required_models([])
41
+ end
11
42
 
12
- def configure
13
- yield self if block_given?
14
- end
43
+ def primary_key
44
+ @use_internal_database ? :bridge_id : :id
45
+ end
15
46
 
16
- def use_internal_database
17
- return @use_internal_database if defined?(@use_internal_database)
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
- @use_internal_database = true
20
- end
52
+ private
21
53
 
22
- def primary_key
23
- @use_internal_database ? :bridge_id : :id
24
- end
54
+ def merged_required_models(models)
55
+ (%w[domain affiliated_sub_account] + models).uniq
25
56
  end
57
+ end
26
58
  end
@@ -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
- g.test_framework :rspec
9
- g.fixture_replacement :factory_girl, :dir => 'spec/factories'
10
- end
8
+ g.test_framework :rspec
9
+ g.fixture_replacement :factory_girl, dir: 'spec/factories'
10
+ end
11
11
 
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
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
@@ -1,3 +1,3 @@
1
1
  module BridgeCache
2
- VERSION = "0.2.8"
2
+ VERSION = '0.3.0'.freeze
3
3
  end
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.2.8
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-03-26 00:00:00.000000000 Z
11
+ date: 2018-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rails
14
+ name: activerecord-import
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '5.0'
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: '5.0'
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.04
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.04
40
+ version: 0.0.06
41
41
  - !ruby/object:Gem::Dependency
42
- name: actionmailer
42
+ name: rails
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 5.1.4
48
- type: :development
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.1.4
54
+ version: '5.0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: byebug
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: 9.1.0
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: 9.1.0
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: rspec-rails
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: 3.7.2
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: 3.7.2
134
+ version: 1.6.2
97
135
  - !ruby/object:Gem::Dependency
98
- name: factory_bot_rails
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: 4.8.2
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: 4.8.2
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: bundler
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.16.0
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.16.0
194
+ version: 1.6.2
139
195
  - !ruby/object:Gem::Dependency
140
- name: database_cleaner
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: 1.6.2
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: 1.6.2
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: A mountable engine for bridge data storage
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.7.3
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
- [])