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.
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
- [])