card 1.101.3 → 1.101.4

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 (84) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/config/initializers/02_patches/active_record.rb +1 -1
  4. data/config/locales/en.yml +155 -378
  5. data/db/migrate_core_cards/20150202143810_import_bootstrap_layout.rb +1 -1
  6. data/lib/card.rb +15 -2
  7. data/lib/card/auth.rb +5 -2
  8. data/lib/card/auth/current.rb +39 -100
  9. data/lib/card/auth/proxy.rb +36 -16
  10. data/lib/card/auth/token.rb +6 -0
  11. data/lib/card/cache/all.rb +83 -0
  12. data/lib/card/cache/card_class.rb +41 -0
  13. data/lib/card/cache/persistent.rb +3 -34
  14. data/lib/card/cache/persistent_class.rb +28 -0
  15. data/lib/card/codename.rb +1 -1
  16. data/lib/card/content.rb +16 -2
  17. data/lib/card/content/all.rb +59 -0
  18. data/lib/card/director/act_direction.rb +4 -0
  19. data/lib/card/director/all.rb +61 -0
  20. data/lib/card/director/card_class.rb +18 -0
  21. data/lib/card/director/phases.rb +0 -1
  22. data/lib/card/dirty.rb +13 -3
  23. data/lib/card/env/success.rb +14 -14
  24. data/lib/card/env/success/target.rb +9 -11
  25. data/lib/card/error.rb +1 -1
  26. data/lib/card/fetch/all.rb +32 -0
  27. data/lib/card/fetch/card_class.rb +147 -0
  28. data/lib/card/format.rb +1 -1
  29. data/lib/card/format/error.rb +3 -3
  30. data/lib/card/format/nest.rb +1 -1
  31. data/lib/card/format/nest/fetch.rb +1 -1
  32. data/lib/card/lexicon.rb +2 -2
  33. data/lib/card/name/all.rb +8 -0
  34. data/lib/card/name/all/descendants.rb +6 -3
  35. data/lib/card/name/card_class.rb +26 -0
  36. data/lib/card/reference/all.rb +131 -0
  37. data/lib/card/rule/all.rb +75 -0
  38. data/lib/card/set/event/all.rb +95 -0
  39. data/lib/card/set/event/skip_and_trigger.rb +89 -0
  40. data/lib/card/set/pattern/all.rb +63 -0
  41. data/lib/card/subcards/all.rb +103 -0
  42. data/lib/cardio/migration/import.rb +1 -1
  43. data/lib/cardio/utils.rb +5 -3
  44. data/mod/admin/set/self/admin_info.rb +3 -5
  45. data/mod/admin/set/self/trash.rb +2 -2
  46. data/mod/core/set/all/autoname.rb +17 -0
  47. data/mod/core/set/all/codename.rb +2 -2
  48. data/mod/core/set/all/content.rb +52 -97
  49. data/mod/core/set/all/name_events.rb +69 -58
  50. data/mod/core/set/all/reference_events.rb +67 -0
  51. data/mod/core/set/all/states.rb +2 -2
  52. data/mod/core/set/all/subcards.rb +0 -100
  53. data/mod/core/set/all/trash.rb +11 -13
  54. data/mod/core/set/all/type.rb +7 -9
  55. data/mod/core/set/all/utils.rb +3 -0
  56. data/mod/core/set/type/cardtype.rb +3 -3
  57. data/mod/core/set_pattern/06_rule.rb +1 -1
  58. data/mod/core/spec/set/all/{rules2_spec.rb → clean_me_spec.rb} +0 -0
  59. data/mod/core/spec/set/all/name_events_spec.rb +204 -0
  60. metadata +30 -37
  61. data/lib/card/mod_inflector.rb +0 -16
  62. data/lib/card/name/all/class_methods.rb +0 -28
  63. data/mod/core/set/all/actify.rb +0 -68
  64. data/mod/core/set/all/cache.rb +0 -109
  65. data/mod/core/set/all/event_conditions.rb +0 -172
  66. data/mod/core/set/all/fetch.rb +0 -122
  67. data/mod/core/set/all/fetch_helper.rb +0 -35
  68. data/mod/core/set/all/i18n.rb +0 -9
  69. data/mod/core/set/all/pattern.rb +0 -54
  70. data/mod/core/set/all/references.rb +0 -191
  71. data/mod/core/set/all/rename.rb +0 -33
  72. data/mod/core/set/all/rules.rb +0 -81
  73. data/mod/core/spec/set/all/actify_spec.rb +0 -58
  74. data/mod/core/spec/set/all/content_spec.rb +0 -15
  75. data/mod/core/spec/set/all/event_conditions_spec.rb +0 -217
  76. data/mod/core/spec/set/all/fetch_helper_spec.rb +0 -65
  77. data/mod/core/spec/set/all/fetch_spec.rb +0 -338
  78. data/mod/core/spec/set/all/i18n_spec.rb +0 -17
  79. data/mod/core/spec/set/all/pattern_spec.rb +0 -101
  80. data/mod/core/spec/set/all/permissions/reader_rules_spec.rb +0 -166
  81. data/mod/core/spec/set/all/references_spec.rb +0 -62
  82. data/mod/core/spec/set/all/rename_spec.rb +0 -189
  83. data/mod/core/spec/set/all/rules_spec.rb +0 -100
  84. data/mod/core/spec/set/all/subcards_spec.rb +0 -102
@@ -15,40 +15,9 @@ class Card
15
15
  # re-included after retrieval from the persistent cache.
16
16
  #
17
17
  class Persistent
18
- attr_accessor :prefix
19
-
20
- class << self
21
- # name of current database; used here to insure that different databases
22
- # are cached separately
23
- # TODO: find better home for this method
24
- def database_name
25
- @database_name ||= (cfg = Cardio.config) &&
26
- (dbcfg = cfg.database_configuration) &&
27
- dbcfg[Rails.env]["database"]
28
- end
29
-
30
- def stamp
31
- @stamp ||= Cardio.cache.fetch(stamp_key) { new_stamp }
32
- end
33
-
34
- # stamp generator
35
- def new_stamp
36
- Time.now.to_i.to_s(36) + rand(999).to_s(36)
37
- end
18
+ extend PersistentClass
38
19
 
39
- def stamp_key
40
- "#{database_name}-stamp"
41
- end
42
-
43
- def renew
44
- @stamp = nil
45
- end
46
-
47
- def reset
48
- @stamp = new_stamp
49
- Cardio.cache.write stamp_key, @stamp
50
- end
51
- end
20
+ attr_accessor :prefix
52
21
 
53
22
  # @param opts [Hash]
54
23
  # @option opts [Rails::Cache] :store
@@ -58,7 +27,7 @@ class Card
58
27
  @store = opts[:store]
59
28
  @klass = opts[:class]
60
29
  @class_key = @klass.to_s.to_name.key
61
- @database = opts[:database] || self.class.database_name
30
+ @database = opts[:database] || Cardio.database_name
62
31
  end
63
32
 
64
33
  # renew insures you're using the most current cache version by
@@ -0,0 +1,28 @@
1
+ class Card
2
+ class Cache
3
+ # class methods for Card::Cache::Persistent
4
+ module PersistentClass
5
+ def stamp
6
+ @stamp ||= Cardio.cache.fetch(stamp_key) { new_stamp }
7
+ end
8
+
9
+ # stamp generator
10
+ def new_stamp
11
+ Time.now.to_i.to_s(36) + rand(999).to_s(36)
12
+ end
13
+
14
+ def stamp_key
15
+ "#{Cardio.database_name}-stamp"
16
+ end
17
+
18
+ def renew
19
+ @stamp = nil
20
+ end
21
+
22
+ def reset
23
+ @stamp = new_stamp
24
+ Cardio.cache.write stamp_key, @stamp
25
+ end
26
+ end
27
+ end
28
+ end
data/lib/card/codename.rb CHANGED
@@ -138,7 +138,7 @@ class Card
138
138
 
139
139
  def unknown_codename! mark
140
140
  raise Card::Error::CodenameNotFound,
141
- Cardio.tr(:exception_unknown_codename, codename: mark)
141
+ Cardio.t(:lib_exception_unknown_codename, codename: mark)
142
142
  end
143
143
 
144
144
  def id_constant codename, id=nil
data/lib/card/content.rb CHANGED
@@ -36,9 +36,10 @@ class Card
36
36
  end
37
37
 
38
38
  # Find all chunks of a given type
39
- # @param chunk_type [Chunk Class]
39
+ # @param chunk_type [Chunk Class or Symbol]
40
40
  # @return [Array of Chunk instances]
41
- def find_chunks chunk_type
41
+ def find_chunks chunk_type=nil
42
+ chunk_type = interpret_chunk_type chunk_type
42
43
  each_chunk.select { |chunk| chunk.is_a?(chunk_type) }
43
44
  end
44
45
 
@@ -119,6 +120,19 @@ class Card
119
120
 
120
121
  private
121
122
 
123
+ def interpret_chunk_type chunk_type
124
+ case chunk_type
125
+ when nil
126
+ Chunk
127
+ when Symbol, String
128
+ Chunk.const_get chunk_type
129
+ when Class
130
+ chunk_type
131
+ else
132
+ raise ArgumentError, "unknown chunk type: #{chunk_type}"
133
+ end
134
+ end
135
+
122
136
  def stash_chunks chunk_classes
123
137
  chunks = []
124
138
  each_chunk do |chunk|
@@ -0,0 +1,59 @@
1
+ class Card
2
+ class Content
3
+ # content-related methods for cards
4
+ module All
5
+ def content
6
+ structured_content || standard_content
7
+ end
8
+ alias_method :raw_content, :content # DEPRECATED!
9
+
10
+ def content= value
11
+ self.db_content = standardize_content(value)
12
+ end
13
+
14
+ def content?
15
+ content.present?
16
+ end
17
+
18
+ def standard_content
19
+ db_content || (new_card? && template.db_content)
20
+ end
21
+
22
+ def standardize_content value
23
+ value.is_a?(Array) ? value.join("\n") : value
24
+ end
25
+
26
+ def structured_content
27
+ structure && template.db_content
28
+ end
29
+
30
+ def refresh_content
31
+ self.content = Card.find(id)&.db_content
32
+ end
33
+
34
+ def save_content_draft _content
35
+ clear_drafts
36
+ end
37
+
38
+ def clear_drafts
39
+ drafts.created_by(Card::Auth.current_id).each(&:delete)
40
+ end
41
+
42
+ def last_draft_content
43
+ drafts.last.card_changes.last.value
44
+ end
45
+
46
+ def blank_content?
47
+ content.blank? || content.strip.blank?
48
+ end
49
+
50
+ def nests?
51
+ content_object.has_chunk? Content::Chunk::Nest
52
+ end
53
+
54
+ def content_object
55
+ Card::Content.new content, self
56
+ end
57
+ end
58
+ end
59
+ end
@@ -60,6 +60,10 @@ class Card
60
60
  directors.keys.any? { |card| card.key == name.to_name.key }
61
61
  end
62
62
 
63
+ def include_id? id
64
+ directors.keys.any? { |card| card.id == id }
65
+ end
66
+
63
67
  def new_director card, parent
64
68
  if !parent && act_card && act_card != card && running_act?
65
69
  act_card.director.subdirectors.add card
@@ -0,0 +1,61 @@
1
+ class Card
2
+ class Director
3
+ # director-related Card instance methods
4
+ module All
5
+ def act options={}, &block
6
+ if act_card
7
+ add_to_act options, &block
8
+ else
9
+ start_new_act(&block)
10
+ end
11
+ end
12
+
13
+ def act_card
14
+ Card::Director.act_card
15
+ end
16
+
17
+ def act_card?
18
+ self == act_card
19
+ end
20
+
21
+ def save! *args
22
+ as_subcard = args.first&.delete :as_subcard
23
+ act(as_subcard: as_subcard) { super }
24
+ end
25
+
26
+ def save *args
27
+ act { super }
28
+ end
29
+
30
+ def valid? *args
31
+ act(validating: true) { super }
32
+ end
33
+
34
+ def update *args
35
+ act { super }
36
+ end
37
+
38
+ def update! *args
39
+ act { super }
40
+ end
41
+
42
+ alias_method :update_attributes, :update
43
+ alias_method :update_attributes!, :update!
44
+
45
+ private
46
+
47
+ def start_new_act
48
+ self.director = nil
49
+ Director.run_act(self) do
50
+ run_callbacks(:act) { yield }
51
+ end
52
+ end
53
+
54
+ def add_to_act options={}
55
+ director.appoint self unless @director
56
+ director.head = true unless options[:validating] || options[:as_subcard]
57
+ yield
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,18 @@
1
+ class Card
2
+ class Director
3
+ # director-related Card class methods
4
+ module CardClass
5
+ def create! opts
6
+ card = Card.new opts
7
+ card.save!
8
+ card
9
+ end
10
+
11
+ def create opts
12
+ card = Card.new opts
13
+ card.save
14
+ card
15
+ end
16
+ end
17
+ end
18
+ end
@@ -25,7 +25,6 @@ class Card
25
25
  run_stage :prepare_to_validate
26
26
  run_stage :validate
27
27
  ensure
28
- # @card.expire_pieces if @card.errors.any?
29
28
  @card.errors.empty?
30
29
  end
31
30
 
data/lib/card/dirty.rb CHANGED
@@ -61,10 +61,20 @@ class Card
61
61
  super || dirty_name(left_id_before_act, right_id_before_act)
62
62
  end
63
63
 
64
- def dirty_name left, right
65
- return unless left.present? && right.present?
64
+ def dirty_name left_id, right_id
65
+ return unless left_id.present? && right_id.present?
66
66
 
67
- Card::Name[left, right]
67
+ parts = [left_id, right_id].map { |id| Card.quick_fetch(id)&.name_before_act }
68
+
69
+ Card::Name[*parts]
70
+ end
71
+
72
+ def lex_before_act
73
+ if (old_left_id = left_id_before_act)
74
+ [old_left_id, right_id_before_act]
75
+ else
76
+ name_before_act
77
+ end
68
78
  end
69
79
  end
70
80
  end
@@ -5,8 +5,8 @@ class Card
5
5
  include Location
6
6
  include Target
7
7
 
8
- attr_accessor :redirect, :name, :name_context, :reload
9
- attr_writer :params, :card
8
+ attr_accessor :name, :name_context, :reload
9
+ attr_writer :params, :redirect, :card
10
10
  attr_reader :id
11
11
 
12
12
  def initialize name_context=nil, success_args=nil
@@ -17,12 +17,8 @@ class Card
17
17
  end
18
18
 
19
19
  def to_url name_context=@name_context
20
- case (target = target(name_context))
21
- when Card
22
- target.format.path params
23
- else
24
- target
25
- end
20
+ target = target name_context
21
+ target.is_a?(Card) ? target.format.path(params) : target
26
22
  end
27
23
 
28
24
  def in_context name_context
@@ -34,10 +30,14 @@ class Card
34
30
  if value.is_a? Hash
35
31
  apply value
36
32
  else
37
- self.target = value
33
+ self.mark = value
38
34
  end
39
35
  end
40
36
 
37
+ def redirect
38
+ @redirect.present? ? @redirect : false
39
+ end
40
+
41
41
  def reload?
42
42
  @reload.to_s == "true"
43
43
  end
@@ -79,11 +79,9 @@ class Card
79
79
  end
80
80
 
81
81
  def method_missing method, *args
82
- if (m = method.match(/^(\w+(=)?)/))
83
- infer_bracket m[1].to_sym, m[2], args[0]
84
- else
85
- super
86
- end
82
+ return super unless (m = method.match(/^(\w+(=)?)/))
83
+
84
+ infer_bracket m[1].to_sym, m[2], args[0]
87
85
  end
88
86
 
89
87
  def infer_bracket method, assign, val
@@ -94,6 +92,8 @@ class Card
94
92
 
95
93
  def apply hash
96
94
  hash.each_pair do |key, value|
95
+ next unless value.present?
96
+
97
97
  self[key] = value
98
98
  end
99
99
  end
@@ -11,16 +11,13 @@ class Card
11
11
  end
12
12
 
13
13
  def target name_context=@name_context
14
- card(name_context) ||
15
- (@target == :previous ? Card::Env.previous_location : @target) ||
16
- Card.fetch(name_context)
14
+ card(name_context) || @target || Card.fetch(name_context)
17
15
  end
18
16
 
19
17
  # TODO: refactor to use cardish
20
18
  def mark= value
21
19
  case value
22
20
  when Integer then @id = value
23
- when String then @name = value
24
21
  when Card then @card = value
25
22
  else
26
23
  self.target = value
@@ -60,13 +57,14 @@ class Card
60
57
 
61
58
  def process_target value
62
59
  case value
63
- when "" then ""
64
- when "*previous", :previous then :previous
65
- when %r{^(http|/)} then value
66
- when /^REDIRECT:\s*(.+)/
67
- @redirect = true
68
- process_target Regexp.last_match(1)
69
- else self.mark = value
60
+ when ""
61
+ ""
62
+ when "*previous", ":previous", :previous
63
+ Card::Env.previous_location
64
+ when %r{^(http|/)}
65
+ value
66
+ else
67
+ @name = Name[value]
70
68
  end
71
69
  end
72
70
  end
data/lib/card/error.rb CHANGED
@@ -22,7 +22,7 @@ class Card
22
22
  end
23
23
 
24
24
  def message_from_card
25
- Cardio.tr :exception_for_card, cardname: card.name, message: card_message_text
25
+ Cardio.t :lib_exception_for_card, cardname: card.name, message: card_message_text
26
26
  end
27
27
 
28
28
  def backtrace
@@ -0,0 +1,32 @@
1
+ class Card
2
+ class Fetch
3
+ # fetch-related Card instance methods
4
+ module All
5
+ # fetching from the context of a card
6
+ def fetch traits, opts={}
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
10
+ end
11
+ end
12
+
13
+ def newish opts
14
+ reset_patterns
15
+ Card.with_normalized_new_args opts do |norm_opts|
16
+ handle_type norm_opts do
17
+ assign_attributes norm_opts
18
+ self.name = name # trigger superize_name
19
+ end
20
+ end
21
+ end
22
+
23
+ def refresh force=false
24
+ return self unless force || frozen? || readonly?
25
+ return unless id
26
+ fresh_card = self.class.find id
27
+ fresh_card.include_set_modules
28
+ fresh_card
29
+ end
30
+ end
31
+ end
32
+ end