card 1.105.6 → 1.106.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 +4 -4
- data/VERSION +1 -1
- data/config/initializers/02_patches/active_record.rb +2 -2
- data/db/schema.rb +5 -13
- data/lib/card/codename.rb +8 -0
- data/lib/card/director/store.rb +1 -1
- data/lib/card/model/save_helper/save_helper_helper.rb +6 -2
- data/lib/card/query/abstract_query/tie.rb +14 -0
- data/lib/card/query/card_query/interpretation.rb +26 -3
- data/lib/card/query/reference_query.rb +4 -4
- data/lib/card/set.rb +27 -0
- data/lib/cardio/generators/base.rb +1 -1
- data/lib/cardio/migration/assumption.rb +29 -0
- data/lib/cardio/migration/schema.rb +12 -0
- data/lib/cardio/migration/stamp.rb +31 -0
- data/lib/cardio/migration/transform.rb +44 -0
- data/lib/cardio/migration.rb +60 -74
- data/lib/cardio/mod/eat/edibles.rb +8 -2
- data/lib/cardio/mod/eat.rb +2 -1
- data/lib/cardio/mod/sow.rb +3 -1
- data/lib/cardio/mod.rb +5 -2
- data/lib/cardio/railtie.rb +6 -5
- data/lib/cardio/seed.rb +3 -6
- data/lib/generators/migration/USAGE +10 -11
- data/lib/generators/migration/migration_generator.rb +26 -24
- data/lib/generators/migration/templates/card_migration.erb +1 -3
- data/mod/core/data/fixtures/real/transform_migrations.yml +351 -0
- data/mod/core/data/recode.yml +7 -0
- data/{db/migrate → mod/core/data/schema}/20110511221913_require_earlier_migrations.rb +3 -3
- data/{db/migrate → mod/core/data/schema}/20120105203350_require_1_8_migrations.rb +1 -1
- data/{db/migrate → mod/core/data/schema}/20121111025347_require_1_10_migrations.rb +1 -1
- data/{db/migrate → mod/core/data/schema}/20121118114000_split_link_type.rb +1 -1
- data/{db/migrate → mod/core/data/schema}/20121118115000_update_link_type.rb +1 -1
- data/{db/migrate → mod/core/data/schema}/20130106052640_table_cleanup.rb +1 -1
- data/{db/migrate → mod/core/data/schema}/20130109015336_trunk_left.rb +1 -1
- data/{db/migrate → mod/core/data/schema}/20140822073704_create_new_revision_tables.rb +1 -1
- data/mod/core/data/schema/20141001105348_move_revisions_to_actions.rb +87 -0
- data/{db/migrate → mod/core/data/schema}/20141216053032_better_index_names.rb +10 -4
- data/{db/migrate → mod/core/data/schema}/20150724210803_add_comment_to_actions.rb +1 -1
- data/{db/migrate → mod/core/data/schema}/20151105225559_more_space_for_db_content.rb +1 -1
- data/{db/migrate → mod/core/data/schema}/20160122153608_new_indices.rb +1 -1
- data/{db/migrate → mod/core/data/schema}/20170908114442_create_delayed_jobs.rb +1 -1
- data/{db/migrate → mod/core/data/schema}/20170908114452_increase_text_size_for_delayed_jobs.rb +1 -1
- data/{db/migrate → mod/core/data/schema}/20180514152037_add_card_virtuals_table.rb +1 -1
- data/{db/migrate → mod/core/data/schema}/20190116170824_add_left_key_to_card_virtuals.rb +1 -1
- data/{db/migrate → mod/core/data/schema}/20190131223248_add_codename_index.rb +1 -1
- data/{db/migrate → mod/core/data/schema}/20190929202325_rename_present_in_reference_table.rb +1 -1
- data/{db/migrate → mod/core/data/schema}/20200718051236_compound_names_do_not_store_name_and_key.rb +1 -1
- data/{db/migrate → mod/core/data/schema}/20200805200729_add_unique_pair_indices.rb +1 -3
- data/{db/migrate → mod/core/data/schema}/20211128040849_virtuals_updated_at.rb +1 -1
- data/{db/migrate → mod/core/data/schema}/20221031182227_remove_referee_key_requirement.rb +1 -1
- data/mod/core/data/test.yml +4 -4
- data/{db/migrate_core_cards → mod/core/data/transform}/20120611203506_rails_inflection_updates.rb +10 -6
- data/mod/core/data/transform/20130411191151_renaming_for_menu.rb +17 -0
- data/mod/core/data/transform/20130920214038_jsonize_tinymce.rb +28 -0
- data/{db/migrate_core_cards → mod/core/data/transform}/20130920291703_update_stylesheets.rb +1 -1
- data/mod/core/data/transform/20140307231621_user_data_to_cards.rb +40 -0
- data/{db/migrate_core_cards → mod/core/data/transform}/20140317035504_account_requests_to_signups.rb +1 -1
- data/{db/migrate_core_cards → mod/core/data/transform}/20141204061304_watchers_to_following.rb +1 -1
- data/{db/migrate_core_cards → mod/core/data/transform}/20141208132416_partial_reference_type.rb +1 -1
- data/{db/migrate_core_cards → mod/core/data/transform}/20150220134731_following_to_follow_rule.rb +1 -1
- data/{db/migrate_core_cards → mod/core/data/transform}/20150429090551_search_card_context.rb +1 -1
- data/{db/migrate_core_cards → mod/core/data/transform}/20150510031118_fix_skin_codenames.rb +2 -2
- data/{db/migrate_core_cards → mod/core/data/transform}/20150724123438_update_file_and_image_cards.rb +2 -2
- data/{db/migrate_core_cards → mod/core/data/transform}/20150807205221_create_references_for_search_cards.rb +1 -1
- data/mod/core/data/transform/20150824135418_update_file_history.rb +33 -0
- data/{db/migrate_core_cards → mod/core/data/transform}/20160811115836_rename_stats_to_admin.rb +1 -1
- data/{db/migrate_core_cards → mod/core/data/transform}/20160914132636_fix_mod_files.rb +1 -1
- data/{db/migrate_core_cards → mod/core/data/transform}/20161103154836_update_keys.rb +3 -3
- data/{db/migrate_core_cards → mod/core/data/transform}/20170830210517_correct_signup_success_message.rb +1 -1
- data/{db/migrate_core_cards → mod/core/data/transform}/20180905061537_migrate_layouts.rb +1 -1
- data/{db/migrate_core_cards → mod/core/data/transform}/20190125125150_add_script_rules_card.rb +1 -1
- data/{db/migrate_core_cards → mod/core/data/transform}/20190320091257_upgrade_recaptcha_to_v3.rb +1 -1
- data/{db/migrate_core_cards → mod/core/data/transform}/20190322095534_remove_toolbar_cards.rb +1 -1
- data/{db/migrate_core_cards → mod/core/data/transform}/20190502130029_add_shark_and_help_desk_role.rb +2 -1
- data/{db/migrate_core_cards → mod/core/data/transform}/20190528131330_enabled_roles.rb +1 -1
- data/{db/migrate_core_cards → mod/core/data/transform}/20190625153616_pointer_overhaul.rb +1 -1
- data/{db/migrate_core_cards → mod/core/data/transform}/20190718140126_add_guides.rb +1 -1
- data/{db/migrate_core_cards → mod/core/data/transform}/20190822093633_move_help_text_to_code.rb +3 -1
- data/{db/migrate_core_cards → mod/core/data/transform}/20190829205148_remove_add_help.rb +1 -1
- data/mod/core/data/transform/20190902193208_input_type.rb +10 -0
- data/{db/migrate_core_cards → mod/core/data/transform}/20190904174403_token_upgrade.rb +2 -2
- data/{db/migrate_core_cards → mod/core/data/transform}/20190909104250_add_cardtype_input_types.rb +2 -2
- data/{db/migrate_core_cards → mod/core/data/transform}/20191115160748_history_cleanup.rb +1 -1
- data/mod/core/data/transform/20230502094848_repair_all_references.rb +7 -0
- data/mod/core/lib/tasks/card/migrate.rake +79 -114
- data/mod/core/lib/tasks/card.rake +2 -4
- metadata +67 -71
- data/db/migrate/20130411210957_update_codenames.rb +0 -15
- data/db/migrate/20141001105348_move_revisions_to_actions.rb +0 -70
- data/db/migrate/20141121172918_rename_card_migration_table.rb +0 -15
- data/db/migrate/20141208132159_remove_present_from_reference_table.rb +0 -9
- data/db/migrate_core_cards/20130411191151_renaming_for_menu.rb +0 -47
- data/db/migrate_core_cards/20130920214038_jsonize_tinymce.rb +0 -15
- data/db/migrate_core_cards/20140307231621_user_data_to_cards.rb +0 -28
- data/db/migrate_core_cards/20150824135418_update_file_history.rb +0 -24
- data/db/migrate_core_cards/20190902193208_input_type.rb +0 -15
- data/db/migrate_core_cards/20230502094848_repair_all_references.rb +0 -7
- data/lib/cardio/migration/core.rb +0 -11
- data/lib/cardio/migration/deck.rb +0 -0
- data/lib/cardio/migration/deck_structure.rb +0 -19
- data/lib/cardio/schema.rb +0 -96
- data/mod/core/data/fixtures/real/schema_migrations_core_cards.yml +0 -347
- data/mod/core/data/fixtures/real/schema_migrations_deck.yml +0 -1
- data/mod/core/data/fixtures/real/schema_migrations_deck_cards.yml +0 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5a8e1bc39a0131940fbec71fd5a92601c334c895d67d4781e8b03c109d7e0f59
|
|
4
|
+
data.tar.gz: 14bbcc9ac8d90d9a4f3a361710510d43f516ebe7a147f028c31b6cf903b3fd67
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d215a5fa5a0557d60a9a17ee7a6a4ee134206281ea96c7d3c3665be0f81756fc251055ea27a52c7f0ec2652cc2b91b559006f17816d43594c0fbebcee1c7baf9
|
|
7
|
+
data.tar.gz: e2af61cd07919b7759d9af5f66507f06d5320d8b430974ffa296512466e7d61fd4b5bb56fe2af3120ac0928c19420daa53156cce7fee2b1b3244bfcd434da582
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.16.0
|
|
@@ -121,8 +121,8 @@ module Patches
|
|
|
121
121
|
module Migration
|
|
122
122
|
module ClassMethods
|
|
123
123
|
def check_pending! connection=::ActiveRecord::Base.connection
|
|
124
|
-
%i[
|
|
125
|
-
Cardio::
|
|
124
|
+
%i[schema transform].each do |migration_type|
|
|
125
|
+
Cardio::Migration.new_for(migration_type).mode do |paths|
|
|
126
126
|
::ActiveRecord::Migrator.migrations_paths = paths
|
|
127
127
|
super
|
|
128
128
|
end
|
data/db/schema.rb
CHANGED
|
@@ -114,19 +114,6 @@ ActiveRecord::Schema.define(version: 2022_10_31_182227) do
|
|
|
114
114
|
t.index ["priority", "run_at"], name: "delayed_jobs_priority"
|
|
115
115
|
end
|
|
116
116
|
|
|
117
|
-
create_table "schema_migrations_core_cards", id: false, charset: "utf8mb3", force: :cascade do |t|
|
|
118
|
-
t.string "version", null: false
|
|
119
|
-
t.index ["version"], name: "unique_schema_migrations_cards", unique: true
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
create_table "schema_migrations_deck", primary_key: "version", id: :string, charset: "utf8mb3", force: :cascade do |t|
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
create_table "schema_migrations_deck_cards", id: false, charset: "utf8mb3", force: :cascade do |t|
|
|
126
|
-
t.string "version", null: false
|
|
127
|
-
t.index ["version"], name: "unique_schema_migrations_deck_cards", unique: true
|
|
128
|
-
end
|
|
129
|
-
|
|
130
117
|
create_table "sessions", id: :integer, charset: "utf8mb3", force: :cascade do |t|
|
|
131
118
|
t.string "session_id"
|
|
132
119
|
t.text "data"
|
|
@@ -134,6 +121,11 @@ ActiveRecord::Schema.define(version: 2022_10_31_182227) do
|
|
|
134
121
|
t.index ["session_id"], name: "sessions_session_id_index"
|
|
135
122
|
end
|
|
136
123
|
|
|
124
|
+
create_table "transform_migrations", id: false, charset: "utf8mb3", force: :cascade do |t|
|
|
125
|
+
t.string "version", null: false
|
|
126
|
+
t.index ["version"], name: "unique_schema_migrations_cards", unique: true
|
|
127
|
+
end
|
|
128
|
+
|
|
137
129
|
create_table "users", id: :integer, charset: "utf8mb3", force: :cascade do |t|
|
|
138
130
|
t.string "login", limit: 40
|
|
139
131
|
t.string "email", limit: 100
|
data/lib/card/codename.rb
CHANGED
|
@@ -95,6 +95,14 @@ class Card
|
|
|
95
95
|
end
|
|
96
96
|
end
|
|
97
97
|
|
|
98
|
+
def recode oldcode, newcode
|
|
99
|
+
return unless id(oldcode) && !id(newcode)
|
|
100
|
+
|
|
101
|
+
puts "recode #{oldcode}, #{newcode}"
|
|
102
|
+
Card.where(codename: oldcode).take.update_column :codename, newcode
|
|
103
|
+
reset_cache
|
|
104
|
+
end
|
|
105
|
+
|
|
98
106
|
private
|
|
99
107
|
|
|
100
108
|
# iterate through every card with a codename
|
data/lib/card/director/store.rb
CHANGED
|
@@ -21,8 +21,12 @@ class Card
|
|
|
21
21
|
method_name, cardtype_card = extract_cardtype_from_method_name method
|
|
22
22
|
return super unless method_name
|
|
23
23
|
|
|
24
|
-
sargs = standardize_args(*args)
|
|
25
|
-
|
|
24
|
+
sargs = standardize_args(*args).merge(type_id: cardtype_card.id)
|
|
25
|
+
if method_name == "ensure"
|
|
26
|
+
Card.ensure sargs
|
|
27
|
+
else
|
|
28
|
+
send "#{method_name}_card", sargs
|
|
29
|
+
end
|
|
26
30
|
end
|
|
27
31
|
|
|
28
32
|
def respond_to_missing? method, _include_private=false
|
|
@@ -97,6 +97,20 @@ class Card
|
|
|
97
97
|
when String, Symbol then val.card_id || -999
|
|
98
98
|
end
|
|
99
99
|
end
|
|
100
|
+
|
|
101
|
+
def op_and_id_or_ids_from_val val
|
|
102
|
+
if (single_id = id_from_val val)
|
|
103
|
+
"= #{single_id}"
|
|
104
|
+
elsif list_of_ids? val
|
|
105
|
+
"in (#{val.map { |v| id_from_val v }.join ', '})"
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def list_of_ids? val
|
|
110
|
+
return unless val.is_a? Array
|
|
111
|
+
|
|
112
|
+
!val.find { |v| !id_from_val v }
|
|
113
|
+
end
|
|
100
114
|
end
|
|
101
115
|
end
|
|
102
116
|
end
|
|
@@ -80,6 +80,7 @@ class Card
|
|
|
80
80
|
def relate key, val, opts={}
|
|
81
81
|
multiple = opts[:multiple].nil? ? val.is_a?(Array) : opts[:multiple]
|
|
82
82
|
method = opts[:method] || :send
|
|
83
|
+
|
|
83
84
|
if multiple
|
|
84
85
|
relate_multi_value method, key, val
|
|
85
86
|
else
|
|
@@ -87,15 +88,37 @@ class Card
|
|
|
87
88
|
end
|
|
88
89
|
end
|
|
89
90
|
|
|
91
|
+
private
|
|
92
|
+
|
|
90
93
|
def relate_multi_value method, key, val
|
|
91
94
|
conj = conjunction(val.first) ? conjunction(val.shift) : :and
|
|
92
|
-
if conj
|
|
95
|
+
if as_list_of_ids?(conj, key, val)
|
|
96
|
+
relate key, val, multiple: false
|
|
97
|
+
elsif conj == current_conjunction
|
|
93
98
|
# same conjunction as container, no need for subcondition
|
|
94
|
-
|
|
99
|
+
relate_multi_value_without_subcondition method, key, val
|
|
95
100
|
else
|
|
96
|
-
|
|
101
|
+
relate_multi_value_with_subcondition key, conj, val
|
|
97
102
|
end
|
|
98
103
|
end
|
|
104
|
+
|
|
105
|
+
def relate_multi_value_with_subcondition key, conj, val
|
|
106
|
+
send conj, (val.map { |v| { key => v } })
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def relate_multi_value_without_subcondition method, key, val
|
|
110
|
+
val.each { |v| send method, key, v }
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# the #list_of_ids optimization is intended to avoid unnecessary joins and
|
|
114
|
+
# can probably be applied more broadly, but in the name of caution, we went
|
|
115
|
+
# with an initial implementation that would only apply to reference attributes
|
|
116
|
+
# (because reference_query can handle lists of values)
|
|
117
|
+
def as_list_of_ids? conj, key, val
|
|
118
|
+
(conj == :or) &&
|
|
119
|
+
key.to_s.start_with?(/refer|nest|include|link|member/) &&
|
|
120
|
+
list_of_ids?(val)
|
|
121
|
+
end
|
|
99
122
|
end
|
|
100
123
|
end
|
|
101
124
|
end
|
|
@@ -26,8 +26,8 @@ class Card
|
|
|
26
26
|
def add_outfield_condition outfield, outcard
|
|
27
27
|
if outcard == "_none"
|
|
28
28
|
non_outfield
|
|
29
|
-
elsif (
|
|
30
|
-
outfield_id outfield,
|
|
29
|
+
elsif (op_and_id = op_and_id_or_ids_from_val(outcard))
|
|
30
|
+
outfield_id outfield, op_and_id
|
|
31
31
|
else
|
|
32
32
|
tie :card, outcard, from: outfield
|
|
33
33
|
end
|
|
@@ -37,8 +37,8 @@ class Card
|
|
|
37
37
|
add_condition "#{fld :is_present} = 0"
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
-
def outfield_id outfield,
|
|
41
|
-
add_condition "#{fld(outfield)}
|
|
40
|
+
def outfield_id outfield, op_and_id
|
|
41
|
+
add_condition "#{fld(outfield)} #{op_and_id}"
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
def add_reftype_condition reftype
|
data/lib/card/set.rb
CHANGED
|
@@ -90,7 +90,34 @@ class Card
|
|
|
90
90
|
# ...then mycard will include the set modules associated with each of those sets in the
|
|
91
91
|
# above order.
|
|
92
92
|
#
|
|
93
|
+
# ### Abstract set modules
|
|
93
94
|
#
|
|
95
|
+
# Suppose you have code that you'd like to reuse in more than one set.
|
|
96
|
+
#
|
|
97
|
+
# Well, set modules are just ruby, so it's possible to just define a standard ruby
|
|
98
|
+
# module (eg `module MySimpleModule...`) in a lib directory and then include that
|
|
99
|
+
# set (`include MySimpleModule`). That will work just fine so long as you only want
|
|
100
|
+
# to add simple ruby code and include it in the base ruby module. But what if you
|
|
101
|
+
# want the reusable code to use the DSL? What if you want to define reusable events,
|
|
102
|
+
# for example? Or if you want to define reusable views on formats?
|
|
103
|
+
#
|
|
104
|
+
# For this purpose, you can use _abstract set modules_. These are modules that use
|
|
105
|
+
# the set DSL but are not defined directly onto a specific set. Instead, they can
|
|
106
|
+
# be included in a set using the `include_set` command.
|
|
107
|
+
#
|
|
108
|
+
# For example, suppose you create a file at `mod/biz/set/abstract/special_views.rb`.
|
|
109
|
+
# And within that file you define a view such as the following:
|
|
110
|
+
#
|
|
111
|
+
# format :html do
|
|
112
|
+
# view :bizzy do
|
|
113
|
+
# "I'm so busy"
|
|
114
|
+
# end
|
|
115
|
+
# end
|
|
116
|
+
#
|
|
117
|
+
# This will create an abstract set that can be included in any other set by invoking
|
|
118
|
+
# `include_set Card::Set::Abstract::SpecialViews`. Or just `include_set
|
|
119
|
+
# Abstract::SpecialViews` for short. And then the including set will have access to the
|
|
120
|
+
# "bizzy" view.
|
|
94
121
|
module Set
|
|
95
122
|
include Event::Api
|
|
96
123
|
include Trait
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Cardio
|
|
2
|
+
class Migration
|
|
3
|
+
# methods for assuming migration states
|
|
4
|
+
module Assumption
|
|
5
|
+
def assume_current
|
|
6
|
+
context do |mc|
|
|
7
|
+
versions = mc.migrations.map(&:version)
|
|
8
|
+
migrated = mc.get_all_versions
|
|
9
|
+
to_mark = versions - migrated
|
|
10
|
+
mark_as_migrated to_mark if to_mark.present?
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def assume_migrated_upto_version version=nil
|
|
15
|
+
mode do |_paths|
|
|
16
|
+
version ||= self.version
|
|
17
|
+
ActiveRecord::Schema.assume_migrated_upto_version version
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def mark_as_migrated versions
|
|
24
|
+
sql = connection.send :insert_versions_sql, versions
|
|
25
|
+
connection.execute sql
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require "cardio/migration"
|
|
2
|
+
|
|
3
|
+
module Cardio
|
|
4
|
+
class Migration
|
|
5
|
+
# for migrations involving database schema definitions
|
|
6
|
+
class Schema < Migration
|
|
7
|
+
@migration_type = :schema
|
|
8
|
+
@old_tables = []
|
|
9
|
+
@old_deck_table = "schema_migrations_deck"
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Cardio
|
|
2
|
+
class Migration
|
|
3
|
+
# methods for stamping migration versions to files
|
|
4
|
+
module Stamp
|
|
5
|
+
def stamp
|
|
6
|
+
mode do
|
|
7
|
+
return unless (version = stampable_version) && (file = stamp_file)
|
|
8
|
+
puts ">> writing version: #{version} to #{file.path}"
|
|
9
|
+
file.puts version
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
def stamp_file
|
|
16
|
+
::File.open stamp_path, "w"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def stampable_version
|
|
20
|
+
version = ActiveRecord::Migrator.current_version
|
|
21
|
+
version.to_i.positive? && version
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def stamp_path
|
|
25
|
+
stamp_dir = ENV["SCHEMA_STAMP_PATH"] || File.join(Cardio.root, "db")
|
|
26
|
+
|
|
27
|
+
File.join stamp_dir, "version_#{migration_type}.txt"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require "cardio/migration"
|
|
2
|
+
|
|
3
|
+
module Cardio
|
|
4
|
+
class Migration
|
|
5
|
+
# for migrations involving data transformations (but not schema changes)
|
|
6
|
+
class Transform < Migration
|
|
7
|
+
include Card::Model::SaveHelper unless ENV["NO_CARD_LOAD"]
|
|
8
|
+
|
|
9
|
+
@migration_type = :transform
|
|
10
|
+
@old_tables = %w[schema_migrations_core_cards schema_migrations_cards]
|
|
11
|
+
@old_deck_table = "schema_migrations_deck_cards"
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
def with_migration_table
|
|
16
|
+
self.table_name = "transform_migrations"
|
|
17
|
+
yield
|
|
18
|
+
ensure
|
|
19
|
+
self.table_name = "schema_migrations"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Execute this migration in the named direction
|
|
23
|
+
# override ActiveRecord to wrap 'up' in 'contentedly'
|
|
24
|
+
def exec_migration conn, direction
|
|
25
|
+
return super if respond_to? :change
|
|
26
|
+
|
|
27
|
+
@connection = conn
|
|
28
|
+
contentedly { send direction }
|
|
29
|
+
ensure
|
|
30
|
+
@connection = nil
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def contentedly
|
|
34
|
+
return yield if ENV["NO_CARD_LOAD"]
|
|
35
|
+
Card::Cache.reset_all
|
|
36
|
+
Card::Auth.as_bot do
|
|
37
|
+
yield
|
|
38
|
+
ensure
|
|
39
|
+
::Card::Cache.reset_all
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
data/lib/cardio/migration.rb
CHANGED
|
@@ -2,113 +2,99 @@
|
|
|
2
2
|
|
|
3
3
|
module Cardio
|
|
4
4
|
class Migration < ActiveRecord::Migration[6.1]
|
|
5
|
-
include
|
|
6
|
-
|
|
5
|
+
include Assumption
|
|
6
|
+
include Stamp
|
|
7
7
|
|
|
8
8
|
class << self
|
|
9
|
-
|
|
10
|
-
# To avoid repetition a lot of instance methods here just call class
|
|
11
|
-
# methods.
|
|
12
|
-
# The subclass Card::CoreMigration needs a different @type so we can't use a
|
|
13
|
-
# class variable @@type. It has to be a class instance variable.
|
|
14
|
-
# Migrations are subclasses of Cardio::Migration or Card::CoreMigration
|
|
15
|
-
# but they don't inherit the @type. The method below solves this problem.
|
|
16
|
-
def type
|
|
17
|
-
@type || ancestors[1]&.type
|
|
18
|
-
end
|
|
9
|
+
attr_reader :migration_type, :old_tables, :old_deck_table
|
|
19
10
|
|
|
20
|
-
def
|
|
21
|
-
|
|
22
|
-
add = 1
|
|
23
|
-
while Card.exists?(test_name)
|
|
24
|
-
test_name = "#{base_name}#{add}"
|
|
25
|
-
add += 1
|
|
26
|
-
end
|
|
27
|
-
test_name
|
|
11
|
+
def migration_class type
|
|
12
|
+
type == :schema ? Migration::Schema : Migration::Transform
|
|
28
13
|
end
|
|
29
14
|
|
|
30
|
-
def
|
|
31
|
-
|
|
15
|
+
def new_for type
|
|
16
|
+
migration_class(type).new
|
|
32
17
|
end
|
|
33
18
|
|
|
34
|
-
def
|
|
35
|
-
|
|
19
|
+
def port_all
|
|
20
|
+
%i[schema transform].each do |type|
|
|
21
|
+
migration_class(type).port
|
|
22
|
+
end
|
|
36
23
|
end
|
|
37
24
|
|
|
38
|
-
def
|
|
39
|
-
|
|
25
|
+
def port
|
|
26
|
+
return unless connection.table_exists? old_deck_table
|
|
27
|
+
rename_old_tables
|
|
28
|
+
connection.execute "INSERT INTO #{table} (SELECT * from #{old_deck_table})"
|
|
29
|
+
connection.drop_table old_deck_table
|
|
40
30
|
end
|
|
41
31
|
|
|
42
|
-
|
|
43
|
-
Schema.assume_migrated_upto_version type
|
|
44
|
-
end
|
|
32
|
+
private
|
|
45
33
|
|
|
46
|
-
def
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
to_mark = versions - migrated
|
|
51
|
-
mark_as_migrated to_mark if to_mark.present?
|
|
34
|
+
def rename_old_tables
|
|
35
|
+
old_tables.each do |old_table_name|
|
|
36
|
+
next unless connection.table_exists? old_table_name
|
|
37
|
+
connection.rename_table old_table_name, table
|
|
52
38
|
end
|
|
53
39
|
end
|
|
54
40
|
|
|
55
|
-
def
|
|
56
|
-
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
private
|
|
60
|
-
|
|
61
|
-
def mark_as_migrated versions
|
|
62
|
-
sql = connection.send :insert_versions_sql, versions
|
|
63
|
-
connection.execute sql
|
|
41
|
+
def table
|
|
42
|
+
"#{migration_type}_migrations"
|
|
64
43
|
end
|
|
65
44
|
|
|
66
45
|
def connection
|
|
67
46
|
ActiveRecord::Base.connection
|
|
68
47
|
end
|
|
48
|
+
end
|
|
69
49
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
end
|
|
50
|
+
def migration_type
|
|
51
|
+
self.class.migration_type || :schema
|
|
73
52
|
end
|
|
74
53
|
|
|
75
|
-
def
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
Card::Auth.as_bot do
|
|
80
|
-
yield
|
|
81
|
-
ensure
|
|
82
|
-
::Card::Cache.reset_all
|
|
83
|
-
end
|
|
54
|
+
def run version=nil, verbose=true
|
|
55
|
+
context do |mc|
|
|
56
|
+
ActiveRecord::Migration.verbose = verbose
|
|
57
|
+
mc.migrate version
|
|
84
58
|
end
|
|
85
59
|
end
|
|
86
60
|
|
|
87
|
-
def
|
|
88
|
-
|
|
61
|
+
def version
|
|
62
|
+
path = stamp_path
|
|
63
|
+
File.exist?(path) ? File.read(path).strip : nil
|
|
89
64
|
end
|
|
90
65
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
else
|
|
99
|
-
change
|
|
100
|
-
end
|
|
101
|
-
else
|
|
102
|
-
contentedly { send(direction) }
|
|
66
|
+
def migration_paths
|
|
67
|
+
Cardio.paths["data/#{migration_type}"].existent.to_a
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def context
|
|
71
|
+
mode do |paths|
|
|
72
|
+
yield ActiveRecord::MigrationContext.new(paths, ActiveRecord::SchemaMigration)
|
|
103
73
|
end
|
|
104
|
-
|
|
105
|
-
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def mode
|
|
77
|
+
with_migration_table { yield migration_paths }
|
|
106
78
|
end
|
|
107
79
|
|
|
108
80
|
def down
|
|
109
81
|
raise ActiveRecord::IrreversibleMigration
|
|
110
82
|
end
|
|
83
|
+
|
|
84
|
+
private
|
|
85
|
+
|
|
86
|
+
def connection
|
|
87
|
+
Cardio::Migration.connection
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def with_migration_table
|
|
91
|
+
yield
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def table_name= table_name
|
|
95
|
+
ActiveRecord::Base.schema_migrations_table_name = table_name
|
|
96
|
+
ActiveRecord::SchemaMigration.table_name = table_name
|
|
97
|
+
ActiveRecord::SchemaMigration.reset_column_information
|
|
98
|
+
end
|
|
111
99
|
end
|
|
112
100
|
end
|
|
113
|
-
|
|
114
|
-
require "cardio/migration/core"
|
|
@@ -71,14 +71,20 @@ module Cardio
|
|
|
71
71
|
end
|
|
72
72
|
|
|
73
73
|
# for processing that needs to happen on all cards, including fields
|
|
74
|
-
def each_card_hash items
|
|
74
|
+
def each_card_hash items, &block
|
|
75
75
|
items.each do |item|
|
|
76
|
+
raise Card::Error, "inedible pod data: #{item}" unless item.is_a? Hash
|
|
77
|
+
|
|
76
78
|
yield item
|
|
77
|
-
item
|
|
79
|
+
process_fields item, &block
|
|
78
80
|
end
|
|
79
81
|
items
|
|
80
82
|
end
|
|
81
83
|
|
|
84
|
+
def process_fields item
|
|
85
|
+
item[:fields]&.values&.each { |val| yield val if val.is_a? Hash }
|
|
86
|
+
end
|
|
87
|
+
|
|
82
88
|
def handle_attachments mod, hash
|
|
83
89
|
each_attachment hash do |key, filename|
|
|
84
90
|
hash[key] = mod_file mod, filename
|
data/lib/cardio/mod/eat.rb
CHANGED
|
@@ -25,7 +25,6 @@ module Cardio
|
|
|
25
25
|
track edible do
|
|
26
26
|
current_user edible.delete(:user)
|
|
27
27
|
time_machine edible.delete(:time) do
|
|
28
|
-
# binding.pry if edible[:type] == :link_list
|
|
29
28
|
Card.ensure edible
|
|
30
29
|
end
|
|
31
30
|
end
|
|
@@ -47,6 +46,8 @@ module Cardio
|
|
|
47
46
|
|
|
48
47
|
def track edible
|
|
49
48
|
rescuing edible do
|
|
49
|
+
# n = edible[:name]
|
|
50
|
+
# binding.pry if (n.is_a? Array) && n.first.to_s == "main_menu"
|
|
50
51
|
# puts "eating: #{edible}" if @verbose
|
|
51
52
|
card = yield
|
|
52
53
|
puts "eaten: #{card.name}".cyan if @verbose
|
data/lib/cardio/mod/sow.rb
CHANGED
|
@@ -114,7 +114,9 @@ module Cardio
|
|
|
114
114
|
end
|
|
115
115
|
|
|
116
116
|
def old_data
|
|
117
|
-
|
|
117
|
+
return unless File.exist? filename
|
|
118
|
+
# YAML.safe_load File.read(filename), [Symbol] if File.exist? filename
|
|
119
|
+
YAML.safe_load File.read(filename), permitted_classes: [Symbol]
|
|
118
120
|
end
|
|
119
121
|
|
|
120
122
|
# @return Path
|
data/lib/cardio/mod.rb
CHANGED
|
@@ -59,9 +59,12 @@ module Cardio
|
|
|
59
59
|
"mod_#{name}"
|
|
60
60
|
end
|
|
61
61
|
|
|
62
|
-
def subpath *parts
|
|
62
|
+
def subpath *parts, force: false
|
|
63
63
|
path = File.join [@path] + parts
|
|
64
|
-
path if File.exist? path
|
|
64
|
+
return path if File.exist? path
|
|
65
|
+
return unless force
|
|
66
|
+
|
|
67
|
+
FileUtils.mkdir_p path
|
|
65
68
|
end
|
|
66
69
|
|
|
67
70
|
def tmp_dir type
|
data/lib/cardio/railtie.rb
CHANGED
|
@@ -65,14 +65,11 @@ module Cardio
|
|
|
65
65
|
|
|
66
66
|
p.add "lib/graph_q_l/types/query.rb"
|
|
67
67
|
p.add "mod-data"
|
|
68
|
+
p.add "data/schema"
|
|
69
|
+
p.add "data/transform"
|
|
68
70
|
|
|
69
71
|
p.add "db", with: "#{card_root}/db"
|
|
70
72
|
p.add "db/seeds.rb", with: "#{card_root}/db/seeds.rb"
|
|
71
|
-
p.add "db/migrate", with: "#{card_root}/db/migrate"
|
|
72
|
-
p.add "db/migrate_core_cards", with: "#{card_root}/db/migrate_core_cards"
|
|
73
|
-
|
|
74
|
-
p.add "db/migrate_deck", with: "db/migrate"
|
|
75
|
-
p.add "db/migrate_deck_cards", with: "db/migrate_cards"
|
|
76
73
|
|
|
77
74
|
Cardio::Mod.dirs.each do |mod_path|
|
|
78
75
|
c.autoload_paths += Dir["#{mod_path}/lib"]
|
|
@@ -83,7 +80,11 @@ module Cardio
|
|
|
83
80
|
p["config/initializers"] << "#{mod_path}/config/early"
|
|
84
81
|
p["late/initializers"] << "#{mod_path}/config/late"
|
|
85
82
|
p["lib/tasks"] << "#{mod_path}/lib/tasks"
|
|
83
|
+
|
|
86
84
|
p["mod-data"] << "#{mod_path}/data"
|
|
85
|
+
p["data/schema"] << "#{mod_path}/data/schema"
|
|
86
|
+
p["data/transform"] << "#{mod_path}/data/transform"
|
|
87
|
+
|
|
87
88
|
p["config/locales"] << "#{mod_path}/config/locales"
|
|
88
89
|
end
|
|
89
90
|
|
data/lib/cardio/seed.rb
CHANGED
|
@@ -2,8 +2,7 @@ module Cardio
|
|
|
2
2
|
# methods in support of seeding
|
|
3
3
|
module Seed
|
|
4
4
|
TABLES = %w[cards card_actions card_acts card_changes card_references
|
|
5
|
-
schema_migrations
|
|
6
|
-
schema_migrations_deck schema_migrations_deck_cards].freeze
|
|
5
|
+
schema_migrations transform_migrations].freeze
|
|
7
6
|
|
|
8
7
|
class << self
|
|
9
8
|
def default_path
|
|
@@ -23,10 +22,8 @@ module Cardio
|
|
|
23
22
|
|
|
24
23
|
return unless update_seed?
|
|
25
24
|
|
|
26
|
-
Cardio::Migration.assume_current
|
|
27
|
-
Cardio::Migration::
|
|
28
|
-
Cardio::Migration::DeckStructure.assume_current
|
|
29
|
-
# Cardio::Migration::Core.assume_current
|
|
25
|
+
Cardio::Migration::Schema.new.assume_current
|
|
26
|
+
Cardio::Migration::Transform.new.assume_current
|
|
30
27
|
end
|
|
31
28
|
|
|
32
29
|
def dump
|