card 1.93.6 → 1.93.7

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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/config/initializers/02_patches/active_record.rb +13 -0
  4. data/config/initializers/patches.rb +6 -0
  5. data/config/initializers/recaptcha.rb +16 -14
  6. data/lib/card.rb +4 -3
  7. data/lib/card/format/nest/fetch.rb +1 -3
  8. data/lib/card/migration/deck_structure.rb +18 -0
  9. data/lib/card/query/attributes.rb +1 -1
  10. data/lib/card/query/clause.rb +6 -7
  11. data/lib/card/query/interpretation.rb +5 -1
  12. data/lib/card/query/value.rb +29 -19
  13. data/lib/card/set/event.rb +52 -28
  14. data/lib/card/set/event/delayed_event.rb +3 -3
  15. data/lib/card/set/format/haml_views.rb +1 -1
  16. data/lib/card/tasks/card.rake +7 -0
  17. data/lib/card/tasks/card/migrate.rake +29 -0
  18. data/lib/card/view/options.rb +7 -189
  19. data/lib/card/view/options/key_lists.rb +41 -0
  20. data/lib/card/view/options/voo_api.rb +165 -0
  21. data/lib/cardio.rb +16 -7
  22. data/lib/cardio/schema.rb +6 -1
  23. data/mod/basic_formats/set/all/base.rb +7 -3
  24. data/mod/basic_formats/set/self/head.rb +5 -0
  25. data/mod/carrierwave/config/core_initializers/carrierwave.rb +7 -0
  26. data/mod/core/set/all/name_validations.rb +3 -4
  27. data/mod/machines/file/all_script_machine_output/file.js +75 -23
  28. data/mod/machines/file/all_style_machine_output/file.css +2 -2
  29. data/mod/machines/lib/javascript/decko.js.coffee +1 -1
  30. data/mod/machines/lib/javascript/decko_filter.js.coffee +18 -10
  31. data/mod/pointer/set/abstract/02_pointer.rb +1 -1
  32. data/mod/pointer/set/abstract/02_pointer/filtered.rb +3 -1
  33. data/mod/pointer/template/abstract/02_pointer/filtered/filter_items.haml +2 -1
  34. data/mod/pointer/template/abstract/02_pointer/filtered/filtered_list_input.haml +3 -2
  35. data/mod/search/set/abstract/01_filter_form_helper.rb +8 -0
  36. data/mod/search/set/abstract/{01_search_params.rb → 02_search_params.rb} +0 -0
  37. data/mod/search/set/abstract/03_filter.rb +1 -1
  38. data/mod/search/set/abstract/wql_search.rb +7 -0
  39. data/mod/search/template/abstract/03_filter/filter_form.haml +24 -22
  40. data/mod/search/template/abstract/search/checkbox_item.haml +1 -1
  41. metadata +9 -6
  42. data/mod/search/set/abstract/02_filter_formgroups.rb +0 -134
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b0adcfab0f64530119b1670a194d67fde9845ad6
4
- data.tar.gz: 3febe6d143c9de76acff582cbddd9ec8fded0104
3
+ metadata.gz: c81d66467e56b3af782e751bba26e6827dd6d9a0
4
+ data.tar.gz: b16da38bf76b952dfa8ee0886a83a32676feaf80
5
5
  SHA512:
6
- metadata.gz: a9f35f827cce3f73f984671c7a09f0d6adeff29523503f6b46b64bcfdee09c71449dcae5ab2356084f81788a9122a24821dc07a02b0036c9ee79f28ee2f699ae
7
- data.tar.gz: f843c07e3dd51ae50d2cae972cdfd307706b7e8ae1b0057cd83dd2d0256b9336de707b5b9e9e49353881aaf526331559d1dcf3f4bd05da2e1a1fb73c61d1ca8d
6
+ metadata.gz: 9c8a5450fb09bbfd53a6598eb0037ac5efebde683da6fd419ef069709c4e0848754896a5622c97c79baa41e0cfc4769b18e822f98af95f18f6a6e1fa21d2fac7
7
+ data.tar.gz: 5f635635cefc576134b1f806b2ca8b9b10d1310fa6d4317ce5f92d739dc78bf463d16f43893de4ef741029f092ad931cf1f5cbc043eb87c11967e8077af1692d
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.6
1
+ 0.3.7
@@ -104,5 +104,18 @@ module Patches
104
104
  end
105
105
  end
106
106
  end
107
+
108
+ module Migration
109
+ module ClassMethods
110
+ def check_pending! connection=::ActiveRecord::Base.connection
111
+ %i[structure core_cards deck deck_cards].each do |migration_type|
112
+ Cardio.schema_mode(migration_type) do |paths|
113
+ ::ActiveRecord::Migrator.migrations_paths = paths
114
+ super
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
107
120
  end
108
121
  end
@@ -19,6 +19,12 @@ module ActiveRecord #:nodoc: all
19
19
  include Patches::ActiveRecord::Relation
20
20
  end
21
21
 
22
+ class Migration
23
+ class << self
24
+ prepend Patches::ActiveRecord::Migration::ClassMethods
25
+ end
26
+ end
27
+
22
28
  module ConnectionAdapters
23
29
  class AbstractAdapter
24
30
  prepend Patches::ActiveRecord::ConnectionAdapters::AbstractAdapter
@@ -5,8 +5,8 @@ def load_recaptcha_config setting
5
5
  setting = "recaptcha_#{setting}".to_sym
6
6
  Cardio.config.send(
7
7
  "#{setting}=", load_recaptcha_card_config(setting) || # card content
8
- Cardio.config.send(setting) || # application.rb
9
- default_setting(setting)
8
+ Cardio.config.send(setting) || # application.rb
9
+ default_setting(setting)
10
10
  )
11
11
  end
12
12
 
@@ -26,18 +26,20 @@ def load_recaptcha_card_config setting
26
26
  card && card.db_content.present? && card.db_content
27
27
  end
28
28
 
29
- Recaptcha.configure do |config|
30
- # the seed task runs initializers so we have to check
31
- # if the cards table is ready before we use it here
32
- CONFIG_OPTIONS =
33
- {
34
- public_key: :site_key,
35
- private_key: :secret_key,
36
- proxy: :proxy
37
- }
38
- if card_table_ready?
39
- CONFIG_OPTIONS.each do |codename, setting|
40
- config.send "#{setting}=", load_recaptcha_config(codename)
29
+ ActiveSupport.on_load :after_card do
30
+ Recaptcha.configure do |config|
31
+ # the seed task runs initializers so we have to check
32
+ # if the cards table is ready before we use it here
33
+ CONFIG_OPTIONS =
34
+ {
35
+ public_key: :site_key,
36
+ private_key: :secret_key,
37
+ proxy: :proxy
38
+ }
39
+ if card_table_ready?
40
+ CONFIG_OPTIONS.each do |codename, setting|
41
+ config.send "#{setting}=", load_recaptcha_config(codename)
42
+ end
41
43
  end
42
44
  end
43
45
  end
@@ -1,7 +1,7 @@
1
1
  # -*- encoding : utf-8 -*-
2
- require "carrierwave"
3
2
 
4
3
  Object.const_remove_if_defined :Card
4
+ ActiveSupport.run_load_hooks(:before_card, self)
5
5
  # ActiveSupport::Dependencies.loaded.clear
6
6
 
7
7
  # Cards are wiki-inspired building blocks.
@@ -136,7 +136,7 @@ class Card < ApplicationRecord
136
136
  :update_referers, # wrong mechanism for this
137
137
  :update_all_users, # if the above is wrong then this one too
138
138
  :silent_change, # and this probably too
139
- :remove_rule_stash,
139
+ # :remove_rule_stash,
140
140
  :last_action_id_before_edit,
141
141
  :only_storage_phase, # used to save subcards
142
142
  :changed_attributes
@@ -174,6 +174,7 @@ class Card < ApplicationRecord
174
174
  after_commit :integration_phase, unless: -> { only_storage_phase? }
175
175
  # after_rollback :clean_up, unless: -> { only_storage_phase? }
176
176
 
177
- extend CarrierWave::Mount
178
177
  ActiveSupport.run_load_hooks(:card, self)
179
178
  end
179
+
180
+ ActiveSupport.run_load_hooks(:after_card, self)
@@ -49,9 +49,7 @@ class Card
49
49
  end
50
50
 
51
51
  def nest_content_from_subcard_params nest_name
52
- return unless (subcard_params = params["subcards"])
53
- return unless (nestcard_params = subcard_params[nest_name])
54
- nestcard_params["content"]
52
+ params.dig "subcards", nest_name, "content"
55
53
  end
56
54
  end
57
55
  end
@@ -0,0 +1,18 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require "card/migration"
3
+
4
+ class Card
5
+ class Migration
6
+ # Inherit from this migration class to make database table changes
7
+ # in your deck
8
+ class DeckStructure < Migration
9
+ @type = :deck
10
+
11
+ def contentedly
12
+ Cardio.schema_mode :deck do
13
+ yield
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -27,7 +27,7 @@ class Card
27
27
  # content.
28
28
  # Example: { match: "name or content" } vs. { name: ["match", "a name"] }
29
29
  def match val
30
- cxn, val = match_prep val
30
+ cxn = connection
31
31
  val.gsub!(/[^#{Card::Name::OK4KEY_RE}]+/, " ")
32
32
  return nil if val.strip.empty?
33
33
 
@@ -7,12 +7,11 @@ module Card::Query::Clause
7
7
  txt =~ /[^\w\*\(\)\s\.\,]/ ? raise("WQL contains disallowed characters: #{txt}") : txt
8
8
  end
9
9
 
10
- def quote v
11
- ActiveRecord::Base.connection.quote(v)
12
- end
10
+ def quote v
11
+ connection.quote(v)
12
+ end
13
13
 
14
- def match_prep v
15
- cxn ||= ActiveRecord::Base.connection
16
- [cxn, v]
17
- end
14
+ def connection
15
+ @connection ||= ActiveRecord::Base.connection
16
+ end
18
17
  end
@@ -61,11 +61,15 @@ class Card
61
61
  case val
62
62
  when Integer, Float, Symbol, Hash then val
63
63
  when String then normalize_string_value val
64
- when Array then val.map { |v| normalize_value v }
64
+ when Array then normalize_array_value val
65
65
  else raise Card::Error::BadQuery, "unknown WQL value type: #{val.class}"
66
66
  end
67
67
  end
68
68
 
69
+ def normalize_array_value val
70
+ val.map { |v| normalize_value v }
71
+ end
72
+
69
73
  def normalize_string_value val
70
74
  case val.to_s
71
75
  when /^\$(\w+)$/ # replace from @vars
@@ -2,6 +2,7 @@ class Card
2
2
  class Query
3
3
  class Value
4
4
  include Clause
5
+ SQL_FIELD = { name: "key", content: "db_content" }.freeze
5
6
 
6
7
  attr_reader :query, :operator, :value
7
8
 
@@ -14,11 +15,16 @@ class Card
14
15
  def parse_value rawvalue
15
16
  case rawvalue
16
17
  when String, Integer then ["=", rawvalue]
17
- when Array then [rawvalue[0], rawvalue[1..-1]]
18
+ when Array then parse_array_value rawvalue
18
19
  else raise("Invalid Condition Clause #{rawvalue}.inspect}")
19
20
  end
20
21
  end
21
22
 
23
+ def parse_array_value array
24
+ operator = operator?(array.first) ? array.shift : :in
25
+ [operator, array]
26
+ end
27
+
22
28
  def canonicalize_operator
23
29
  unless (target = OPERATORS[@operator.to_s])
24
30
  raise Card::Error::BadQuery, "Invalid Operator #{@operator}"
@@ -26,6 +32,10 @@ class Card
26
32
  @operator = target
27
33
  end
28
34
 
35
+ def operator? key
36
+ OPERATORS.key? key.to_s
37
+ end
38
+
29
39
  def sqlize v
30
40
  case v
31
41
  when Query then v.to_sql
@@ -35,27 +45,27 @@ class Card
35
45
  end
36
46
 
37
47
  def to_sql field
38
- op = @operator
39
- v = @value
40
- table = @query.table_alias
41
-
42
- field, v = case field.to_s
43
- when "name"
44
- ["#{table}.key", [v].flatten.map(&:to_name).map(&:key)]
45
- when "content"
46
- ["#{table}.db_content", v]
47
- else
48
- ["#{table}.#{safe_sql field}", v]
49
- end
50
-
51
- v = v[0] if Array === v && v.length == 1 && op != "in"
52
- if op == "~"
53
- cxn, v = match_prep(v)
54
- %(#{field} #{cxn.match(sqlize(v))})
48
+ value = value_sql field, @value
49
+ "#{field_sql field} #{operational_sql value}"
50
+ end
51
+
52
+ def operational_sql value
53
+ if @operator == "~"
54
+ connection.match value
55
55
  else
56
- "#{field} #{op} #{sqlize(v)}"
56
+ "#{@operator} #{value}"
57
57
  end
58
58
  end
59
+
60
+ def field_sql field
61
+ db_field = SQL_FIELD[field.to_sym] || safe_sql(field.to_s)
62
+ "#{@query.table_alias}.#{db_field}"
63
+ end
64
+
65
+ def value_sql field, value
66
+ value = [value].flatten.map(&:to_name).map(&:key) if field.to_sym == :name
67
+ sqlize value
68
+ end
59
69
  end
60
70
  end
61
71
  end
@@ -12,13 +12,7 @@ class Card
12
12
  include DelayedEvent
13
13
 
14
14
  def event event, stage_or_opts={}, opts={}, &final
15
- if stage_or_opts.is_a? Symbol
16
- opts[:in] = stage_or_opts
17
- else
18
- opts = stage_or_opts
19
- end
20
- process_stage_opts opts
21
-
15
+ opts = event_opts stage_or_opts, opts
22
16
  Card.define_callbacks event
23
17
  define_event event, opts, &final
24
18
  set_event_callbacks event, opts
@@ -26,27 +20,34 @@ class Card
26
20
 
27
21
  private
28
22
 
29
- def define_event event, opts, &final
30
- final_method_name = "#{event}_without_callbacks" # should be private?
31
- class_eval do
32
- define_method final_method_name, &final
33
- end
23
+ # EVENT OPTS
34
24
 
35
- if with_delay? opts
36
- define_delayed_event_method event, final_method_name
25
+ def event_opts stage_or_opts, opts
26
+ opts = normalize_opts stage_or_opts, opts
27
+ process_stage_opts opts
28
+ process_action_opts opts
29
+ opts
30
+ end
31
+
32
+ def normalize_opts stage_or_opts, opts
33
+ if stage_or_opts.is_a? Symbol
34
+ opts[:in] = stage_or_opts
37
35
  else
38
- define_event_method event, final_method_name
36
+ opts = stage_or_opts
39
37
  end
38
+ opts
39
+ end
40
+
41
+ def process_action_opts opts
42
+ opts[:on] = [:create, :update] if opts[:on] == :save
40
43
  end
41
44
 
42
45
  def process_stage_opts opts
43
46
  if opts[:after] || opts[:before]
44
47
  # ignore :in options
45
- elsif opts[:in]
46
- opts[:after] =
47
- callback_name opts.delete(:in), opts.delete(:after_subcards)
48
+ elsif (in_opt = opts.delete :in)
49
+ opts[:after] = callback_name in_opt, opts.delete(:after_subcards)
48
50
  end
49
- opts[:on] = [:create, :update] if opts[:on] == :save
50
51
  end
51
52
 
52
53
  def callback_name stage, after_subcards=false
@@ -54,27 +55,50 @@ class Card
54
55
  name.to_sym
55
56
  end
56
57
 
57
- def define_event_method event, call_method
58
+ # EVENT DEFINITION
59
+
60
+ def define_event event, opts, &final
61
+ simple_method_name = "#{event}_without_callbacks"
62
+ define_simple_method event, simple_method_name, &final
63
+ define_event_method event, simple_method_name, opts
64
+ end
65
+
66
+ def define_simple_method _event, method_name, &method
67
+ class_eval do
68
+ define_method method_name, &method
69
+ end
70
+ end
71
+
72
+ def define_event_method event, method_name, opts
73
+ event_type = with_delay?(opts) ? :delayed : :standard
74
+ send "define_#{event_type}_event_method", event, method_name
75
+ end
76
+
77
+ def define_standard_event_method event, method_name
58
78
  class_eval do
59
79
  define_method event do
60
80
  log_event_call event
61
81
  run_callbacks event do
62
- send call_method
82
+ send method_name
63
83
  end
64
84
  end
65
85
  end
66
86
  end
67
87
 
88
+ # EVENT CALLBACKS
89
+
68
90
  def set_event_callbacks event, opts
69
91
  opts[:set] ||= self
70
92
  [:before, :after, :around].each do |kind|
71
- next unless (object_method = opts.delete(kind))
72
- Card.class_eval do
73
- set_callback(
74
- object_method, kind, event,
75
- prepend: true, if: proc { |c| c.event_applies?(opts) }
76
- )
77
- end
93
+ next unless (object_method = opts.delete kind)
94
+ set_event_callback object_method, kind, event, opts
95
+ end
96
+ end
97
+
98
+ def set_event_callback object_method, kind, event, opts
99
+ Card.class_eval do
100
+ set_callback object_method, kind, event,
101
+ prepend: true, if: proc { |c| c.event_applies?(opts) }
78
102
  end
79
103
  end
80
104
  end
@@ -11,10 +11,10 @@ class Card
11
11
  DELAY_STAGES.include?(opts[:after]) || DELAY_STAGES.include?(opts[:before])
12
12
  end
13
13
 
14
- def define_delayed_event_method event, final_method_name
14
+ def define_delayed_event_method event, simple_method_name
15
15
  delaying_method = "#{event}_with_delay"
16
- define_event_delaying_method event, delaying_method, final_method_name
17
- define_event_method event, delaying_method
16
+ define_event_delaying_method event, delaying_method, simple_method_name
17
+ define_standard_event_method event, delaying_method
18
18
  end
19
19
 
20
20
  # creates an ActiveJob.
@@ -44,7 +44,7 @@ class Card
44
44
  end
45
45
  end
46
46
 
47
- def haml_template_path view=nil, source=nil
47
+ def haml_template_path view=nil, source=nil
48
48
  each_template_path(source) do |template_dir, source_dir|
49
49
  path = try_haml_template_path template_dir, view, source_dir
50
50
  return path if path
@@ -78,6 +78,13 @@ namespace :card do
78
78
  Rake::Task["card:migrate:stamp"].invoke :core_cards
79
79
  end
80
80
 
81
+ puts "migrating deck structure"
82
+ Rake::Task["card:migrate:deck_structure"].execute
83
+ if stamp
84
+ Rake::Task["card:migrate:stamp"].reenable
85
+ Rake::Task["card:migrate:stamp"].invoke :core_cards
86
+ end
87
+
81
88
  puts "migrating deck cards"
82
89
  # not invoke because we don't want to reload environment
83
90
  Rake::Task["card:migrate:deck_cards"].execute
@@ -19,6 +19,18 @@ def prepare_migration
19
19
  # structures are loaded before schema_mode is set
20
20
  end
21
21
 
22
+ # @param mod [Boolean] if true reset column information for models defined in
23
+ # in mods in the deck
24
+ def reset_column_information mod=false
25
+ Rails.application.eager_load!
26
+ load_mod_lib if mod
27
+ ApplicationRecord.descendants.each(&:reset_column_information)
28
+ end
29
+
30
+ def load_mod_lib
31
+ Dir.glob(Cardio.root.join("mod/*/lib/*.rb")).each { |x| require_dependency x }
32
+ end
33
+
22
34
  namespace :card do
23
35
  namespace :migrate do
24
36
  desc "migrate cards"
@@ -32,6 +44,7 @@ namespace :card do
32
44
  ActiveRecord::Migrator.migrate paths, version
33
45
  Rake::Task["db:_dump"].invoke # write schema.rb
34
46
  end
47
+ reset_column_information
35
48
  end
36
49
 
37
50
  desc "migrate core cards"
@@ -40,6 +53,22 @@ namespace :card do
40
53
  run_card_migration :core_cards
41
54
  end
42
55
 
56
+ desc "migrate deck structure"
57
+ task deck_structure: :environment do
58
+ migrate_deck_structure
59
+ end
60
+
61
+ def migrate_deck_structure
62
+ require "card/migration/deck_structure"
63
+ ENV["SCHEMA"] = "#{Cardio.root}/db/schema.rb"
64
+ Cardio.schema_mode(:deck) do |paths|
65
+ ActiveRecord::Migrator.migrations_paths = paths
66
+ ActiveRecord::Migrator.migrate paths, version
67
+ Rake::Task["db:_dump"].invoke # write schema.rb
68
+ end
69
+ reset_column_information true
70
+ end
71
+
43
72
  desc "migrate deck cards"
44
73
  task deck_cards: :environment do
45
74
  require "card/migration"