Class: Card::Migration

Inherits:
Object
  • Object
show all
Includes:
Card::Model::SaveHelper
Defined in:
lib/card/migration.rb,
lib/card/migration/core.rb,
lib/card/migration/import.rb,
lib/card/migration/import/merger.rb,
lib/card/migration/deck_structure.rb,
lib/card/migration/import/import_data.rb,
lib/card/migration/import/import_data/card_content.rb,
lib/card/migration/import/import_data/card_attributes.rb

Direct Known Subclasses

Core, DeckStructure

Defined Under Namespace

Classes: Core, DeckStructure, Import

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Card::Model::SaveHelper

#add_coderule_item, #add_script, #add_style, #codename_from_name, #create_card, #create_card!, #create_or_update_card, #create_or_update_card!, #delete_card, #delete_code_card, #ensure_card, #ensure_card!, #ensure_code_card, #ensure_trait, #ensure_trait_rule, #extract_cardtype_from_method_name, #method_missing, #respond_to_missing?, #update_card, #update_card!, #with_user

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Card::Model::SaveHelper

Class Method Details

.assume_migrated_upto_versionObject



49
50
51
52
53
54
# File 'lib/card/migration.rb', line 49

def assume_migrated_upto_version
  schema_mode do
    ActiveRecord::Schema.assume_migrated_upto_version schema,
                                                      migration_paths
  end
end

.data_path(filename = nil) ⇒ Object



56
57
58
59
# File 'lib/card/migration.rb', line 56

def data_path filename=nil
  path = migration_paths.first
  File.join([path, "data", filename].compact)
end

.find_unused_name(base_name) ⇒ Object



20
21
22
23
24
25
26
27
28
# File 'lib/card/migration.rb', line 20

def find_unused_name base_name
  test_name = base_name
  add = 1
  while Card.exists?(test_name)
    test_name = "#{base_name}#{add}"
    add += 1
  end
  test_name
end

.migration_paths(mig_type = type) ⇒ Object



30
31
32
# File 'lib/card/migration.rb', line 30

def migration_paths mig_type=type
  Cardio.migration_paths mig_type
end

.schema(mig_type = type) ⇒ Object



34
35
36
# File 'lib/card/migration.rb', line 34

def schema mig_type=type
  Cardio.schema mig_type
end

.schema_mode(mig_type = type) ⇒ Object



42
43
44
45
46
47
# File 'lib/card/migration.rb', line 42

def schema_mode mig_type=type
  Cardio.with_suffix mig_type do
    paths = Cardio.migration_paths(type)
    yield(paths)
  end
end

.schema_suffix(mig_type = type) ⇒ Object



38
39
40
# File 'lib/card/migration.rb', line 38

def schema_suffix mig_type=type
  Cardio.schema_suffix mig_type
end

.typeObject

Rake tasks use class methods, migrations use instance methods. To avoid repetition a lot of instance methods here just call class methods. The subclass Card::CoreMigration needs a different @type so we can't use a class variable @@type. It has to be a class instance variable. Migrations are subclasses of Card::Migration or Card::CoreMigration but they don't inherit the @type. The method below solves this problem.



16
17
18
# File 'lib/card/migration.rb', line 16

def type
  @type || (ancestors[1]&.type)
end

Instance Method Details

#contentedlyObject



62
63
64
65
66
67
68
69
70
71
# File 'lib/card/migration.rb', line 62

def contentedly
  Card::Cache.reset_all
  Cardio.schema_mode "" do
    Card::Auth.as_bot do
      yield
    ensure
      ::Card::Cache.reset_all
    end
  end
end

#data_path(filename = nil) ⇒ Object



120
121
122
# File 'lib/card/migration.rb', line 120

def data_path filename=nil
  self.class.data_path filename
end

#downObject

Raises:

  • (ActiveRecord::IrreversibleMigration)


149
150
151
# File 'lib/card/migration.rb', line 149

def down
  raise ActiveRecord::IrreversibleMigration
end

#exec_migration(conn, direction) ⇒ Object

Execute this migration in the named direction copied from ActiveRecord to wrap 'up' in 'contentendly'



134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/card/migration.rb', line 134

def exec_migration conn, direction
  @connection = conn
  if respond_to?(:change)
    if direction == :down
      revert { change }
    else
      change
    end
  else
    contentedly { send(direction) }
  end
ensure
  @connection = nil
end

#import_cards(filename, merge_opts = {}) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/card/migration.rb', line 84

def import_cards filename, merge_opts={}
  Card::Mailer.perform_deliveries = false
  output_file = File.join data_path, "unmerged_#{filename}"
  merge_opts[:output_file] ||= output_file
   = JSON.parse(File.read(data_path(filename)))
  full_data =
    .map do |hash|
      hash["content"] =
        File.read data_path(File.join("cards", hash["name"].to_name.key))
      hash
    end
  Card.merge_list full_data, merge_opts
end

#import_json(filename, merge_opts = {}) ⇒ Object

def disable_ddl_transaction #:nodoc: true end



77
78
79
80
81
82
# File 'lib/card/migration.rb', line 77

def import_json filename, merge_opts={}
  Card::Mailer.perform_deliveries = false
  output_file = File.join data_path, "unmerged_#{filename}"
  merge_opts[:output_file] ||= output_file
  Card.merge_list read_json(filename), merge_opts
end

#merge_cards(names_or_keys) ⇒ Object

uses the data in cards.yml and the card content in db/migrate_cards/data/cards to update or create the cards given by name or key in names_or_keys



100
101
102
103
104
105
# File 'lib/card/migration.rb', line 100

def merge_cards names_or_keys
  names_or_keys = Array(names_or_keys)
  Card::Mailer.perform_deliveries = false

  Card::Migration::Import.new(data_path).merge only: names_or_keys
end

#merge_pristine_cards(names_or_keys) ⇒ Object



107
108
109
110
111
112
# File 'lib/card/migration.rb', line 107

def merge_pristine_cards names_or_keys
  names_or_keys = Array(names_or_keys)

  pristine = names_or_keys.select { |n| !Card.exists?(n) || Card.fetch(n)&.pristine? }
  merge_cards pristine
end

#migration_pathsObject



128
129
130
# File 'lib/card/migration.rb', line 128

def migration_paths
  Cardio.paths self.class.type
end

#read_json(filename) ⇒ Object



114
115
116
117
118
# File 'lib/card/migration.rb', line 114

def read_json filename
  raw_json = File.read data_path(filename)
  json = JSON.parse raw_json
  json.is_a?(Hash) ? json["card"]["value"] : json
end

#schema_modeObject



124
125
126
# File 'lib/card/migration.rb', line 124

def schema_mode
  Cardio.schema_mode self.class.type
end

#update_machine_outputObject



153
154
155
# File 'lib/card/migration.rb', line 153

def update_machine_output
  Card.search(right: { codename: "machine_output" }).each(&:delete)
end