card 1.103.4 → 1.104.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/config/environments/development.rb +4 -2
  4. data/config/environments/test.rb +1 -1
  5. data/config/initializers/01_core_extensions/array.rb +4 -1
  6. data/config/initializers/01_core_extensions/object.rb +1 -1
  7. data/config/initializers/02_patches/active_record.rb +16 -17
  8. data/config/locales/de.yml +8 -564
  9. data/config/locales/es.yml +2 -3
  10. data/db/migrate/20110511221913_require_earlier_migrations.rb +1 -1
  11. data/db/migrate/20120105203350_require_1_8_migrations.rb +1 -1
  12. data/db/migrate/20121111025347_require_1_10_migrations.rb +1 -1
  13. data/db/migrate/20211128040849_virtuals_updated_at.rb +11 -0
  14. data/db/migrate_core_cards/20190502130029_add_shark_and_help_desk_role.rb +0 -1
  15. data/db/schema.rb +19 -16
  16. data/db/seed/new/card_actions.yml +1323 -2091
  17. data/db/seed/new/card_acts.yml +2 -2
  18. data/db/seed/new/card_references.yml +629 -741
  19. data/db/seed/new/cards.yml +2593 -5557
  20. data/db/seed/new/schema_migrations.yml +2 -0
  21. data/db/seed/new/schema_migrations_core_cards.yml +8 -0
  22. data/db/seed/test/fixtures/card_actions.yml +2555 -3395
  23. data/db/seed/test/fixtures/card_acts.yml +606 -666
  24. data/db/seed/test/fixtures/card_changes.yml +101 -101
  25. data/db/seed/test/fixtures/card_references.yml +1609 -1686
  26. data/db/seed/test/fixtures/cards.yml +4363 -7541
  27. data/db/seed/test/fixtures/schema_migrations.yml +2 -0
  28. data/db/seed/test/fixtures/schema_migrations_core_cards.yml +8 -0
  29. data/db/test_seed.rb +1 -4
  30. data/db/version.txt +1 -1
  31. data/db/version_core_cards.txt +1 -1
  32. data/lib/card/auth/current.rb +1 -1
  33. data/lib/card/auth/permissions.rb +37 -35
  34. data/lib/card/content/all.rb +3 -3
  35. data/lib/card/content/chunk.rb +1 -0
  36. data/lib/card/director/act_direction.rb +1 -3
  37. data/lib/card/director/card_methods.rb +0 -1
  38. data/lib/card/director/phases.rb +1 -0
  39. data/lib/card/director.rb +1 -0
  40. data/lib/card/fetch/all.rb +3 -3
  41. data/lib/card/fetch/card_class.rb +5 -11
  42. data/lib/card/fetch/results.rb +2 -2
  43. data/lib/card/model/save_helper.rb +2 -2
  44. data/lib/card/name/all/descendants.rb +9 -7
  45. data/lib/card/name/all/parts.rb +1 -1
  46. data/lib/card/name/all.rb +4 -3
  47. data/lib/card/name/card_class.rb +1 -0
  48. data/lib/card/name/fields_and_traits.rb +6 -30
  49. data/lib/card/name/name_variants.rb +5 -1
  50. data/lib/card/name.rb +0 -8
  51. data/lib/card/query/abstract_query/tie.rb +2 -3
  52. data/lib/card/query/card_query/normalization.rb +1 -1
  53. data/lib/card/query/sql_statement/order.rb +5 -6
  54. data/lib/card/query/value.rb +10 -7
  55. data/lib/card/reference/all.rb +9 -7
  56. data/lib/card/reference.rb +36 -41
  57. data/lib/card/rule/all.rb +3 -3
  58. data/lib/card/set/advanced_api.rb +5 -0
  59. data/lib/card/set/event/delayed_event.rb +8 -1
  60. data/lib/card/set/event.rb +1 -0
  61. data/lib/card/set/helpers.rb +30 -17
  62. data/lib/card/set/pattern/all.rb +13 -4
  63. data/lib/card/set/pattern/base.rb +12 -18
  64. data/lib/card/set/pattern/class_methods.rb +13 -13
  65. data/lib/card/set/pattern.rb +30 -19
  66. data/lib/card/set/trait.rb +16 -1
  67. data/lib/card/set/type.rb +3 -0
  68. data/lib/card/subcards/add.rb +1 -3
  69. data/lib/card/subcards/all.rb +30 -56
  70. data/lib/card/view/options.rb +7 -5
  71. data/lib/cardio/cli.rb +1 -0
  72. data/lib/cardio/commands/custom.rb +60 -0
  73. data/lib/cardio/commands/rake_command/parser.rb +49 -48
  74. data/lib/cardio/commands/rake_command.rb +17 -15
  75. data/lib/cardio/commands/rspec_command.rb +2 -0
  76. data/lib/cardio/commands.rb +69 -69
  77. data/lib/cardio/generators.rb +56 -3
  78. data/lib/cardio/migration/deck.rb +0 -0
  79. data/lib/cardio/migration/deck_structure.rb +2 -0
  80. data/lib/cardio/migration/import/import_data/card_content.rb +1 -1
  81. data/lib/cardio/migration/import.rb +2 -2
  82. data/lib/cardio/migration.rb +26 -2
  83. data/lib/cardio/mod/class_methods.rb +112 -0
  84. data/lib/cardio/mod/dirs.rb +15 -11
  85. data/lib/cardio/mod/eat/edibles.rb +92 -0
  86. data/lib/cardio/mod/eat.rb +81 -0
  87. data/lib/cardio/mod/load_strategy/tmp_files.rb +1 -1
  88. data/lib/cardio/mod/modfile_api.rb +5 -0
  89. data/lib/cardio/mod/poop.rb +135 -0
  90. data/lib/cardio/mod.rb +20 -80
  91. data/lib/cardio/railtie.rb +15 -3
  92. data/lib/cardio/schema.rb +11 -10
  93. data/lib/cardio/version.rb +35 -0
  94. data/lib/cardio.rb +4 -0
  95. data/lib/generators/deck/templates/Gemfile.erb +0 -4
  96. data/lib/generators/deck/templates/rspec.erb +1 -1
  97. data/lib/generators/deck/templates/spec/javascripts/support/decko_jasmine.yml.erb +0 -1
  98. data/lib/generators/mod/USAGE +1 -0
  99. data/lib/tasks/card/migrate.rake +41 -1
  100. data/lib/tasks/card/mod.rake +15 -8
  101. data/lib/tasks/card.rake +47 -87
  102. data/mod/admin/locales/de.yml +4 -0
  103. data/mod/admin/set/self/admin.rb +10 -8
  104. data/mod/core/data/production.yml +7 -0
  105. data/mod/core/data/test.yml +30 -0
  106. data/mod/core/locales/de.yml +28 -0
  107. data/mod/core/set/all/assign_attributes.rb +1 -33
  108. data/mod/core/set/all/content.rb +3 -1
  109. data/mod/core/set/all/initialize.rb +1 -4
  110. data/mod/core/set/all/name_events.rb +3 -18
  111. data/mod/core/set/all/reference_events.rb +29 -28
  112. data/mod/core/set/all/subcards.rb +6 -2
  113. data/mod/core/set/all/trash.rb +2 -3
  114. data/mod/core/set/all/type.rb +67 -18
  115. data/mod/core/set/self/version.rb +1 -1
  116. data/mod/core/spec/set/self/trash_spec.rb +1 -1
  117. data/mod/standard/{file → data/files}/favicon/image-icon.png +0 -0
  118. data/mod/standard/{file → data/files}/favicon/image-large.png +0 -0
  119. data/mod/standard/{file → data/files}/favicon/image-medium.png +0 -0
  120. data/mod/standard/{file → data/files}/favicon/image-original.png +0 -0
  121. data/mod/standard/{file → data/files}/favicon/image-small.png +0 -0
  122. data/mod/standard/{file → data/files}/logo/image-original.svg +0 -0
  123. metadata +37 -28
  124. data/db/migrate_core_cards/20150605115802_add_performance_log_card.rb +0 -7
  125. data/lib/card/set/code_nest.rb +0 -15
  126. data/lib/card/version.rb +0 -11
  127. data/lib/cardio/commands/USAGE +0 -28
  128. data/lib/cardio/generators/class_methods.rb +0 -35
  129. data/lib/tasks/card/asset.rake +0 -22
  130. data/mod/core/spec/set/all/clean_me_spec.rb +0 -258
  131. data/mod/core/spec/set/all/export_spec.rb +0 -71
  132. data/tmpsets/set_pattern/100-all.rb +0 -22
  133. data/tmpsets/set_pattern/101-all_plus.rb +0 -24
  134. data/tmpsets/set_pattern/102-type.rb +0 -40
  135. data/tmpsets/set_pattern/103-star.rb +0 -26
  136. data/tmpsets/set_pattern/104-rstar.rb +0 -28
  137. data/tmpsets/set_pattern/105-rule.rb +0 -28
  138. data/tmpsets/set_pattern/106-right.rb +0 -35
  139. data/tmpsets/set_pattern/107-type_plus_right.rb +0 -43
  140. data/tmpsets/set_pattern/108-self.rb +0 -34
@@ -63,3 +63,5 @@ schema_migrations_031:
63
63
  version: '20200718051236'
64
64
  schema_migrations_032:
65
65
  version: '20200805200729'
66
+ schema_migrations_033:
67
+ version: '20211128040849'
@@ -337,3 +337,11 @@ schema_migrations_core_cards_168:
337
337
  version: '20201129140917'
338
338
  schema_migrations_core_cards_169:
339
339
  version: '20210509141814'
340
+ schema_migrations_core_cards_170:
341
+ version: '202108028112350'
342
+ schema_migrations_core_cards_171:
343
+ version: '202108028112351'
344
+ schema_migrations_core_cards_172:
345
+ version: '202108028112352'
346
+ schema_migrations_core_cards_173:
347
+ version: '20211107155032'
data/db/test_seed.rb CHANGED
@@ -13,7 +13,7 @@ class SharedData
13
13
  "Big Brother", "Optic fan", "Sunglasses fan", "Narcissist"
14
14
  ].freeze
15
15
 
16
- CARDTYPE_COUNT = 54
16
+ CARDTYPE_COUNT = 44
17
17
 
18
18
  class << self
19
19
  def create_user name, args
@@ -153,9 +153,6 @@ class SharedData
153
153
  create_pointer "items",
154
154
  content: ["Parry Hotter", "42", "Stam Broker", "First",
155
155
  "yeti skin+image", "*all+*script+*machine output"]
156
- # Card['*all+*style' ].ensure_machine_output
157
- # Card['*all+*script'].ensure_machine_output
158
- # (ie9 = Card[:script_html5shiv_printshiv]) && ie9.ensure_machine_output
159
156
  end
160
157
 
161
158
  def user_and_role_cards
data/db/version.txt CHANGED
@@ -1 +1 @@
1
- 20200805200729
1
+ 20211128040849
@@ -1 +1 @@
1
- 201905021300268
1
+ 202108028112352
@@ -43,7 +43,7 @@ class Card
43
43
  end
44
44
 
45
45
  # set current from token, api_key, or session
46
- def signin_with _opts={}
46
+ def signin_with opts={}
47
47
  if opts[:token]
48
48
  signin_with_token opts[:token]
49
49
  else
@@ -5,39 +5,14 @@ class Card
5
5
  # user has "root" permissions
6
6
  # @return [true/false]
7
7
  def always_ok?
8
- usr_id = as_id
9
- case usr_id
10
- when Card::WagnBotID then true # cannot disable
11
- when nil then false
8
+ case as_id
9
+ when WagnBotID then true # cannot disable
10
+ when nil then false
12
11
  else
13
- always_ok_usr_id? usr_id
12
+ always_ok_cached?
14
13
  end
15
14
  end
16
15
 
17
- # specified user has root permission
18
- # @param usr_id [Integer]
19
- # @return [true/false]
20
- def always_ok_usr_id? usr_id, force_cache_update=false
21
- always = always_cache
22
- if always[usr_id].nil? || force_cache_update
23
- update_always_cache usr_id, admin?(usr_id)
24
- else
25
- always[usr_id]
26
- end
27
- end
28
-
29
- def update_always_cache usr_id, value
30
- always = always_cache
31
- always = always.dup if always.frozen?
32
- always[usr_id] = value
33
- Card.cache.write "ALWAYS", always
34
- value
35
- end
36
-
37
- def always_cache
38
- Card.cache.read("ALWAYS") || {}
39
- end
40
-
41
16
  # list of names of cardtype cards that current user has perms to create
42
17
  # @return [Array of strings]
43
18
  def createable_types
@@ -56,16 +31,43 @@ class Card
56
31
  end
57
32
 
58
33
  # test whether user is an administrator
59
- # @param user_id [Integer]
34
+ # @param user_mark [Cardish]
60
35
  # @return [true/false]
61
- def admin? user_id
62
- has_role? user_id, Card::AdministratorID
36
+ def admin? user_mark=nil
37
+ user_mark ||= as_id
38
+ has_role? Card::AdministratorID, user_mark
63
39
  end
64
40
 
65
- def has_role? user_id, role_id
66
- return false unless user_id && role_id
41
+ def has_role? role_mark, user_mark=nil
42
+ user_mark ||= as_id
43
+ return false unless (role_id = role_mark&.card_id)
67
44
 
68
- Card[user_id].all_enabled_roles.include? role_id
45
+ Card[user_mark].all_enabled_roles.include? role_id
46
+ end
47
+
48
+ def update_always_cache value
49
+ always = always_cache
50
+ always = always.dup if always.frozen?
51
+ always[as_id] = value
52
+ Card.cache.write "ALWAYS", always
53
+ value
54
+ end
55
+
56
+ private
57
+
58
+ # specified user has root permission
59
+ # @return [true/false]
60
+ def always_ok_cached?
61
+ always = always_cache
62
+ if always[as_id].nil?
63
+ update_always_cache admin?
64
+ else
65
+ always[as_id]
66
+ end
67
+ end
68
+
69
+ def always_cache
70
+ Card.cache.read("ALWAYS") || {}
69
71
  end
70
72
  end
71
73
  end
@@ -5,10 +5,10 @@ class Card
5
5
  def content
6
6
  structured_content || standard_content
7
7
  end
8
- alias_method :raw_content, :content # DEPRECATED!
8
+ # alias_method :raw_content, :content # DEPRECATED!
9
9
 
10
10
  def content= value
11
- self.db_content = standardize_content(value)
11
+ self.db_content = standardize_content value
12
12
  end
13
13
 
14
14
  def content?
@@ -20,7 +20,7 @@ class Card
20
20
  end
21
21
 
22
22
  def standardize_content value
23
- value.is_a?(Array) ? value.join("\n") : value
23
+ value.is_a?(Array) ? items_content(value) : value
24
24
  end
25
25
 
26
26
  def structured_content
@@ -89,6 +89,7 @@ class Card
89
89
  register_list :nest_only, [:Nest]
90
90
  register_list :query, [:QueryReference]
91
91
  register_list :stub, [:ViewStub]
92
+ register_list :none, []
92
93
  end
93
94
  end
94
95
  end
@@ -4,9 +4,7 @@ class Card
4
4
  attr_accessor :act, :act_card
5
5
 
6
6
  def act_director
7
- return unless act_card
8
-
9
- act_card.director
7
+ act_card&.director
10
8
  end
11
9
 
12
10
  def directors
@@ -12,7 +12,6 @@ class Card
12
12
 
13
13
  def prepare_for_phases
14
14
  reset_patterns
15
- identify_action
16
15
  include_set_modules
17
16
  end
18
17
 
@@ -16,6 +16,7 @@ class Card
16
16
 
17
17
  def prepare_for_phases
18
18
  @card.prepare_for_phases unless running?
19
+ @card.identify_action
19
20
  @running = true
20
21
  @subdirectors.each(&:prepare_for_phases)
21
22
  end
data/lib/card/director.rb CHANGED
@@ -180,6 +180,7 @@ class Card
180
180
  @subdirectors.clear
181
181
  @stage = nil
182
182
  @action = nil
183
+ @running = false
183
184
  end
184
185
 
185
186
  def appoint card
@@ -3,10 +3,10 @@ class Card
3
3
  # fetch-related Card instance methods
4
4
  module All
5
5
  # fetching from the context of a card
6
- def fetch traits, opts={}
6
+ def fetch field_marks, opts={}
7
7
  opts[:new][:supercard] = self if opts[:new]
8
- Array.wrap(traits).inject(self) do |card, trait|
9
- Card.fetch card.name.trait(trait), opts
8
+ Array.wrap(field_marks).inject(self) do |card, mark|
9
+ Card.fetch card.name.field(mark.cardname), opts
10
10
  end
11
11
  end
12
12
 
@@ -26,7 +26,7 @@ class Card
26
26
  # new: { opts for Card#new } Return a new card when not found
27
27
  # @return [Card]
28
28
  def fetch *args
29
- f = Card::Fetch.new(*args)
29
+ f = Fetch.new(*args)
30
30
  f.retrieve_or_new
31
31
  rescue ActiveModel::RangeError => _e
32
32
  Card.new name: "card id out of range: #{f.mark}"
@@ -65,19 +65,13 @@ class Card
65
65
  def id cardish
66
66
  case cardish
67
67
  when Integer then cardish
68
- when Card then cardish.id
69
- when Symbol then Card::Codename.id cardish
70
- else fetch_id cardish
68
+ when Card then cardish.id
69
+ when Symbol then Codename.id cardish
70
+ when String then Lexicon.id cardish
71
+ else quick_fetch(cardish)&.id
71
72
  end
72
73
  end
73
74
 
74
- # @param mark_parts - see #fetch
75
- # @return [Integer]
76
- def fetch_id *mark_parts
77
- mark = Card::Fetch.new(*mark_parts)&.mark
78
- mark.is_a?(Integer) ? mark : quick_fetch(mark.to_s)&.id
79
- end
80
-
81
75
  # @param mark - see #fetch
82
76
  # @return [Card::Name]
83
77
  def fetch_name *mark, &block
@@ -63,7 +63,7 @@ class Card
63
63
  return unless (sc = new_opts[:supercard])
64
64
 
65
65
  @card.supercard = sc
66
- @card.update_superleft @card.name
66
+ @card.update_superleft
67
67
  end
68
68
 
69
69
  def quick_renew?
@@ -116,7 +116,7 @@ class Card
116
116
  def supercard_might_change_type?
117
117
  # ...via type_plus_right rule
118
118
  sc = new_opts[:supercard]
119
- @force_type_lookup = sc&.new? && (sc.type_id != sc.default_type_id)
119
+ @force_type_lookup = sc&.new? && (sc.type_id != Card.default_type_id)
120
120
  end
121
121
 
122
122
  def new_opts
@@ -13,7 +13,7 @@ class Card
13
13
  include SaveArguments
14
14
 
15
15
  def with_user user_name, &block
16
- Card::Auth.with(current_id: Card.fetch_id(user_name), &block)
16
+ Card::Auth.with(current_id: user_name.card_id, &block)
17
17
  end
18
18
 
19
19
  def create_card name_or_args, content_or_args=nil
@@ -59,7 +59,7 @@ class Card
59
59
  return unless delete_code_card? name
60
60
 
61
61
  card = Card[name]
62
- card.update! codename: nil
62
+ card.update! codename: ""
63
63
  card.delete!
64
64
  end
65
65
 
@@ -6,24 +6,26 @@ class Card
6
6
  # NOTE: for all these helpers, method returns *all* fields/children/descendants.
7
7
  # (Not just those current user has permission to read.)
8
8
 
9
- def fields
10
- field_ids.map { |id| Card[id] }
9
+ def field_cards
10
+ field_ids.map(&:card)
11
11
  end
12
12
 
13
13
  def field_names
14
- field_ids.map { |id| Card::Name[id] }
14
+ field_ids.map(&:cardname)
15
15
  end
16
16
 
17
17
  def field_ids
18
18
  child_ids :left
19
19
  end
20
20
 
21
- def each_child &block
21
+ def each_child
22
22
  return unless id
23
23
 
24
- Card.where(
25
- "(left_id = #{id} or right_id = #{id}) and trash is false"
26
- ).each(&block)
24
+ sql = "(left_id = #{id} or right_id = #{id}) and trash is false"
25
+ Card.where(sql).find_each do |card|
26
+ card.include_set_modules
27
+ yield card
28
+ end
27
29
  end
28
30
 
29
31
  # eg, A+B is a child of A and B
@@ -58,7 +58,7 @@ class Card
58
58
  # after_store forces it to save the subcard first
59
59
  # and callback afterwards
60
60
  def with_id_after_store subcard
61
- add_subcard subcard
61
+ subcard subcard
62
62
  subcard.director.after_store { |card| yield card.id }
63
63
  end
64
64
  end
data/lib/card/name/all.rb CHANGED
@@ -7,7 +7,7 @@ class Card
7
7
 
8
8
  # TODO: use delegations and include more name functions
9
9
  delegate :simple?, :compound?, :junction?, to: :name
10
-
10
+ attr_reader :supercard
11
11
  def name
12
12
  @name ||= left_id ? Lexicon.lex_to_name([left_id, right_id]) : super.to_name
13
13
  end
@@ -47,8 +47,9 @@ class Card
47
47
  end
48
48
  end
49
49
 
50
- def update_superleft cardname
51
- @superleft = @supercard if cardname.field_of? @supercard.name
50
+ def update_superleft newname=nil
51
+ newname ||= name
52
+ @superleft = @supercard if newname.field_of? @supercard.name
52
53
  end
53
54
 
54
55
  def update_subcard_names new_name, name_to_replace=nil
@@ -7,6 +7,7 @@ class Card
7
7
  end
8
8
 
9
9
  def uniquify_name name, rename=:new
10
+ name = name.to_name
10
11
  return name unless Card.exists? name
11
12
 
12
13
  uniq_name = generate_alternative_name name
@@ -12,14 +12,9 @@ class Card
12
12
  end
13
13
 
14
14
  # @return [Card::Name]
15
- def field_name tag_name
16
- case tag_name
17
- when Symbol
18
- trait_name tag_name
19
- else
20
- tag_name = tag_name.to_s[1..-1] if tag_name.to_s[0] == "+"
21
- [self, tag_name].to_name
22
- end
15
+ def field_name tag
16
+ tag = tag.to_s[1..-1] if !tag.is_a?(Symbol) && tag.to_s[0] == "+"
17
+ [self, tag].to_name
23
18
  end
24
19
 
25
20
  # @return [True/False]
@@ -29,10 +24,12 @@ class Card
29
24
  if context.present?
30
25
  absolute_name(context).left_name.key == context.to_name.key
31
26
  else
32
- s.match(/^\s*\+[^+]+$/).present?
27
+ s.match?(/^\s*\+[^+]+$/)
33
28
  end
34
29
  end
35
30
 
31
+ # name is relative name containing only the rightmost part
32
+ # @return [True/False]
36
33
  def field_only?
37
34
  relative? && stripped.to_name.parts.reject(&:blank?).first == parts.last
38
35
  end
@@ -40,27 +37,6 @@ class Card
40
37
  def relative_field_name tag_name
41
38
  field_name(tag_name).name_from self
42
39
  end
43
-
44
- # @return [String]
45
- def trait tag_code
46
- name = trait_name tag_code
47
- name.s
48
- end
49
-
50
- # @return [Card::Name]
51
- def trait_name tag_code
52
- Card::Name[self, tag_code.to_sym]
53
- end
54
-
55
- # @return [True/False]
56
- def trait_name? *traitlist
57
- return false unless compound?
58
-
59
- right_key = right_name.key
60
- traitlist.any? do |codename|
61
- Card::Codename.name(codename)&.key == right_key
62
- end
63
- end
64
40
  end
65
41
  end
66
42
  end
@@ -23,13 +23,17 @@ class Card
23
23
  end
24
24
 
25
25
  def card_id
26
- Card.fetch_id self
26
+ Lexicon.id self
27
27
  end
28
28
 
29
29
  # @return [Symbol] codename of card with name
30
30
  def codename
31
31
  Codename[card_id]
32
32
  end
33
+
34
+ def codename_or_string
35
+ codename || s
36
+ end
33
37
  end
34
38
  end
35
39
  end
data/lib/card/name.rb CHANGED
@@ -76,13 +76,5 @@ class Card
76
76
  def code
77
77
  Card::Codename[card_id]
78
78
  end
79
-
80
- def setting?
81
- Set::Type::Setting.member_names[key]
82
- end
83
-
84
- def set?
85
- Set::Pattern.card_keys[tag_name.key]
86
- end
87
79
  end
88
80
  end
@@ -93,9 +93,8 @@ class Card
93
93
 
94
94
  def id_from_val val
95
95
  case val
96
- when Integer then val
97
- when String then Card.fetch_id(val) || -999
98
- when Symbol then Card::Codename.id(val) || -999
96
+ when Integer then val
97
+ when String, Symbol then val.card_id || -999
99
98
  end
100
99
  end
101
100
  end
@@ -28,7 +28,7 @@ class Card
28
28
 
29
29
  def normalize_value val
30
30
  case val
31
- when Integer, Float, Hash, Symbol, NilClass then val
31
+ when Integer, Float, Hash, Symbol, NilClass, ActiveRecord::Relation then val
32
32
  when String then normalize_string_value val
33
33
  when Array then normalize_array_value val
34
34
  else raise Error::BadQuery, "Invalid value type: #{val.class} (#{val.inspect})"
@@ -18,12 +18,15 @@ class Card
18
18
  module Order
19
19
  def order
20
20
  full_syntax do
21
- "ORDER BY #{order_directives.join ', '}"
21
+ dirs = order_directives
22
+ "ORDER BY #{dirs.join ', '}" if dirs.present?
22
23
  end
23
24
  end
24
25
 
25
26
  def order_directives
26
- Array.wrap(order_config).map do |order_key|
27
+ return if @mods[:sort].blank?
28
+
29
+ Array.wrap(@mods[:sort]).map do |order_key|
27
30
  order_directive order_key
28
31
  end
29
32
  end
@@ -58,10 +61,6 @@ class Card
58
61
  safe_sql @mods[:dir]
59
62
  end
60
63
  end
61
-
62
- def order_config
63
- @mods[:sort].blank? ? "update" : @mods[:sort]
64
- end
65
64
  end
66
65
  end
67
66
  end
@@ -32,9 +32,10 @@ class Card
32
32
 
33
33
  def parse_value value
34
34
  case value
35
- when Array then parse_array_value value.clone
36
- when nil then ["is", nil]
37
- else ["=", parse_simple_value(value)]
35
+ when Array then parse_array_value value.clone
36
+ when ActiveRecord::Relation then ["in", value]
37
+ when nil then ["is", nil]
38
+ else ["=", parse_simple_value(value)]
38
39
  end
39
40
  end
40
41
 
@@ -48,7 +49,8 @@ class Card
48
49
  when String, Integer then value
49
50
  when Symbol then value.to_s
50
51
  when nil then nil
51
- else raise Error::BadQuery, "Invalid property value: #{value.inspect}"
52
+ else
53
+ raise Error::BadQuery, "Invalid property value: #{value.inspect}"
52
54
  end
53
55
  end
54
56
 
@@ -66,9 +68,10 @@ class Card
66
68
 
67
69
  def sqlize v
68
70
  case v
69
- when Query then v.to_sql
70
- when Array then sqlize_array v
71
- when nil then "NULL"
71
+ when Query then v.to_sql
72
+ when ActiveRecord::Relation then "(#{v.to_sql})"
73
+ when Array then sqlize_array v
74
+ when nil then "NULL"
72
75
  else quote(v.to_s)
73
76
  end
74
77
  end
@@ -21,7 +21,7 @@ class Card
21
21
  end
22
22
 
23
23
  def referer_cards_from_references references
24
- references.map(&:referer_id).uniq.map(&Card.method(:fetch)).compact
24
+ references.map(&:referer_id).uniq.map(&:card).compact
25
25
  end
26
26
 
27
27
  # cards that self refers to
@@ -62,11 +62,13 @@ class Card
62
62
  Reference.mass_insert reference_values_array(ref_hash)
63
63
  end
64
64
 
65
- # delete references from this card
66
- def delete_references_out
67
- return unless id.present?
68
-
69
- Reference.where(referer_id: id).delete_all
65
+ # replace references in card content
66
+ def swap_names old_name, new_name
67
+ cont = content_object
68
+ cont.find_chunks(:Reference).each do |chunk|
69
+ chunk.swap_name old_name, new_name
70
+ end
71
+ cont.to_s
70
72
  end
71
73
 
72
74
  private
@@ -122,7 +124,7 @@ class Card
122
124
  end
123
125
 
124
126
  # Partial references are needed to track references to virtual cards.
125
- # For example a link to virual card [[A+*self]] won't have a referee_id,
127
+ # For example a link to virtual card [[A+*self]] won't have a referee_id,
126
128
  # but when A's name is changed we have to find and update that link.
127
129
  def interpret_partial_references ref_hash, referee_name
128
130
  return if referee_name.simple?