card 1.19.5 → 1.19.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4de6e0031d77758dbc7c4ca11a084e2e24cd13ae
4
- data.tar.gz: e33dd67fb7b2c868d12d4db50e574c0bc6cfb69b
3
+ metadata.gz: 3c91002b7b0036a9412a5b3f4d24c785d6cc7cd3
4
+ data.tar.gz: 91b617c019d6a60441ac0b9e08d9557099094f1c
5
5
  SHA512:
6
- metadata.gz: eeaafba60cf7defa62e9d63756bcfb184cc84705191fef1503e44d4e60bd4229a1f727f6b7eaa618720781fb62e6899f6676e6bfae6452da7d0a5d00800a026f
7
- data.tar.gz: 023ddaf342ae2eed8174132b2a438b7b663809195806e85fd24c3535cd26f0d36352b01e8bfe7c4598f0c0659034c4f2cab77b238048142be3dd724b29193d9a
6
+ metadata.gz: 93ab7930c6911b7bb811c106ad2167178d9bbd79a3b7b9e0027d5204c381ceeed0d9e6ff122748b4f966c3c37ebf8eb155483526b435660bd69cd72b18f11dd5
7
+ data.tar.gz: 9d2e34c1d4778d25fe534384bac6fd26a5bb54bcf8bccfbde7a721b5477be596cc212f005d61691aac4e014365ab3e66b1e40a01aac6b36a13966856957de552
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.19.5
1
+ 1.19.6
@@ -11,11 +11,17 @@ class Card
11
11
  self.session = proc { Card::Auth.current.name }
12
12
  self.banned_array = ["/"]
13
13
 
14
- def self.cardish mark
15
- case mark
16
- when Card then mark.cardname
17
- when Symbol, Integer then Card.quick_fetch(mark).cardname
18
- else mark.to_name
14
+ class << self
15
+ def cardish mark
16
+ case mark
17
+ when Card then mark.cardname
18
+ when Symbol, Integer then Card.quick_fetch(mark).cardname
19
+ else mark.to_name
20
+ end
21
+ end
22
+
23
+ def url_key_to_standard key
24
+ key.to_s.tr "_", " "
19
25
  end
20
26
  end
21
27
 
@@ -37,7 +37,7 @@ format :html do
37
37
 
38
38
  def default_sign_up_args args
39
39
  account_link_text :sign_up, args
40
- account_link_opts "signup-link", args, action: :new, type: :signup
40
+ account_link_opts "signup-link", args, action: :new, mark: :signup
41
41
  end
42
42
 
43
43
  def default_sign_in_args args
@@ -47,7 +47,7 @@ format :html do
47
47
 
48
48
  def default_invite_args args
49
49
  account_link_text :invite, args
50
- account_link_opts "invite-a-friend-link", args, action: :new, type: :signup
50
+ account_link_opts "invite-a-friend-link", args, action: :new, mark: :signup
51
51
  end
52
52
 
53
53
  def default_sign_out_args args
@@ -43,10 +43,11 @@ format do
43
43
 
44
44
  view :link, closed: true, perms: :none do |args|
45
45
  title = showname args[:title]
46
- known = card.known?
47
- path_opts = {}
48
- path_opts[:type] = args[:type] if !known && Card.known?(args[:type])
49
- link_to_card card.name, title, known: known, path: path_opts
46
+ opts = { known: card.known? }
47
+ if args[:type] && !opts[:known]
48
+ opts[:path] = { card: { type: args[:type] } }
49
+ end
50
+ link_to_card card.name, title, opts
50
51
  end
51
52
 
52
53
  view(:codename, closed: true) { card.codename.to_s }
@@ -69,6 +69,7 @@ describe Card::Set::All::Base do
69
69
  expect(render_card(:array, content: "yoing")).to eq(%(["yoing"]))
70
70
  end
71
71
  end
72
+
72
73
  it "renders template rule of embed cards based on set" do
73
74
  Card::Auth.as_bot
74
75
  content = "{{_left+test_another_card|content|content;"\
@@ -187,9 +187,8 @@ module ClassMethods
187
187
  opts = (args[:card] || {}).clone
188
188
  # clone so that original params remain unaltered. need deeper clone?
189
189
  opts[:type] ||= args[:type] if args[:type]
190
- # for /new/:type shortcut. we should fix and deprecate this.
191
- opts[:name] ||= args[:id].to_s.tr("_", " ")
192
- # move handling to Card::Name?
190
+ # for /new/:type shortcut. we should handle in routing and deprecate this
191
+ opts[:name] ||= Card::Name.url_key_to_standard(args[:id])
193
192
  opts
194
193
  end
195
194
 
@@ -36,7 +36,7 @@ module ClassMethods
36
36
  end
37
37
 
38
38
  def merge name, attribs={}, opts={}
39
- puts "merging #{name}"
39
+ # puts "merging #{name}"
40
40
  card = fetch name, new: {}
41
41
  [:image, :file].each do |attach|
42
42
  next unless attribs[attach] && attribs[attach].is_a?(String)
@@ -37,7 +37,7 @@ format do
37
37
  end
38
38
  set_card = card.default_follow_set_card
39
39
  hash[:path] = path(
40
- name: set_card.follow_rule_name(Auth.current.name),
40
+ mark: set_card.follow_rule_name(Auth.current.name),
41
41
  action: :update,
42
42
  success: { layout: :modal, view: :follow_status },
43
43
  card: { content: "[[#{hash[:content]}]]" }
@@ -62,7 +62,7 @@ format :html do
62
62
  # card.default_follow_set_card.follow_rule_name(Auth.current.name),
63
63
  # new: {}
64
64
  # )
65
- opts = (args[:html_args] || {}).clone
65
+ opts = (args[:link_opts] || {}).clone
66
66
  opts.merge!(
67
67
  title: hash[:title],
68
68
  "data-path" => hash[:path],
@@ -384,8 +384,8 @@ format :html do
384
384
  end
385
385
 
386
386
  def rollback_link actions
387
- # @fixme -- doesn't this need to specify which action it wants?
388
- prior = # @fixme - should be a Card::Action method
387
+ # FIXME -- doesn't this need to specify which action it wants?
388
+ prior = # FIXME - should be a Card::Action method
389
389
  actions.select { |action| action.card.last_action_id != action.id }
390
390
  return unless card.ok?(:update) && prior.present?
391
391
  link = link_to(
@@ -100,12 +100,10 @@ format :html do
100
100
 
101
101
  view :missing do |args|
102
102
  return "" unless card.ok? :create # should this be moved into ok_view?
103
- missing_view = args[:denied_view] || args[:home_view]
104
- wrap args do
105
- link_to_view :new, "Add #{fancy_title args[:title]}",
106
- path: (args[:type] ? { type: args[:type] } : {}),
107
- class: "slotter missing-#{missing_view}"
108
- end
103
+ path_opts = args[:type] ? { card: { type: args[:type] } } : {}
104
+ link_text = "Add #{fancy_title args[:title]}"
105
+ klass = "slotter missing-#{args[:denied_view] || args[:home_view]}"
106
+ wrap(args) { link_to_view :new, link_text, path: path_opts, class: klass }
109
107
  end
110
108
 
111
109
  view :closed_missing, perms: :none do
@@ -153,7 +151,7 @@ format :html do
153
151
  sign_in_or_up_links =
154
152
  unless Auth.signed_in?
155
153
  signin_link = link_to_card :signin, "Sign in"
156
- signup_link = link_to "Sign up", path: { account: :new, type: :signup }
154
+ signup_link = link_to "Sign up", path: { action: :new, mark: :signup }
157
155
  %(<div>#{signin_link} or #{signup_link} to create it.</div>)
158
156
  end
159
157
  frame args.merge(title: "Not Found", optional_menu: :never) do
@@ -184,7 +182,7 @@ format :html do
184
182
  or_signup_link =
185
183
  if Card.new(type_id: Card::SignupID).ok? :create
186
184
  "or " +
187
- link_to("sign up", path: { account: "new", type: :signup })
185
+ link_to("sign up", path: { action: "new", mark: :signup })
188
186
  end
189
187
  Env.save_interrupted_action(request.env["REQUEST_URI"])
190
188
  "Please #{signin_link} #{or_signup_link} #{to_task}"
@@ -2,7 +2,7 @@ RESOURCE_TYPE_REGEXP = /^([a-zA-Z][\-+\.a-zA-Z\d]*):/
2
2
 
3
3
  format :html do
4
4
  def link_to text=nil, opts={}
5
- opts[:href] = interpret_pathish opts.delete(:path)
5
+ opts[:href] = path opts.delete(:path)
6
6
  text = raw(text || opts[:href])
7
7
  interpret_data_opts_to_link_to opts
8
8
  content_tag :a, text, opts
@@ -18,31 +18,23 @@ end
18
18
 
19
19
  format :css do
20
20
  def link_to _text=nil, opts={}
21
- card_url interpret_pathish(opts.delete(:path))
21
+ card_url path(opts.delete(:path))
22
22
  end
23
23
  end
24
24
 
25
25
  format do
26
26
  def link_to text=nil, opts={}
27
- href = interpret_pathish opts.delete(:path)
28
- if text && href != text
29
- "#{text}[#{href}]"
27
+ path = path opts.delete(:path)
28
+ if text && path != text
29
+ "#{text}[#{path}]"
30
30
  else
31
- href
32
- end
33
- end
34
-
35
- def smart_link_to text, opts={}
36
- if (linktype = [:view, :related, :card, :resource].find { |key| opts[key] })
37
- send "link_to_#{linktype}", opts.delete(linktype), text, opts
38
- else
39
- send :link_to, text, opts
31
+ path
40
32
  end
41
33
  end
42
34
 
43
35
  def link_to_resource resource, text=nil, opts={}
44
36
  case (resource_type = resource_type resource)
45
- when "external-link" then opts[:target] = "_blank"
37
+ when "external-link" then opts[:target] ||= "_blank"
46
38
  when "internal-link" then resource = internal_url resource[1..-1]
47
39
  end
48
40
  add_class opts, resource_type
@@ -60,9 +52,7 @@ format do
60
52
 
61
53
  def link_to_card cardish, text=nil, opts={}
62
54
  opts[:path] ||= {}
63
- name = opts[:path][:name] = Card::Name.cardish cardish
64
- # @fixme - need smarter mark handling
65
-
55
+ name = opts[:path][:mark] = Card::Name.cardish cardish
66
56
  text ||= name.to_name.to_show @context_names
67
57
  add_known_or_wanted_class opts, name
68
58
  link_to text, opts
@@ -74,8 +64,8 @@ format do
74
64
  add_class opts, (known ? "known-card" : "wanted-card")
75
65
  end
76
66
 
77
- # link to a specific view (defaults to current card)
78
- # this is generally used for ajax calls
67
+ # dynamic (ajax) link to a specific view
68
+ #
79
69
  def link_to_view view, text, opts={}
80
70
  opts.reverse_merge! path: {}, remote: true, rel: "nofollow"
81
71
  opts[:path][:view] = view unless view == :home
@@ -90,38 +80,55 @@ format do
90
80
  link_to_view :related, (text || name), opts
91
81
  end
92
82
 
93
- # @param opts [Hash]
83
+ # smart_link_to is wrapper method for #link_to, #link_to_card, #link_to_view,
84
+ # #link_to_resource, and #link_to_related. If the opts argument contains
85
+ # :view, :related, :card, or :resource, it will use the respective method to
86
+ # render a link.
87
+ def smart_link_to text, opts={}
88
+ if (linktype = [:view, :related, :card, :resource].find { |key| opts[key] })
89
+ send "link_to_#{linktype}", opts.delete(linktype), text, opts
90
+ else
91
+ send :link_to, text, opts
92
+ end
93
+ end
94
+
95
+ # path is for generating standard card routes, eg
96
+ # [cardname]
97
+ # [cardname]?[param]=[value]
98
+ # [action]/[cardname]?[param]=[value]
99
+
100
+ # @param opts [Hash, String] a String is treated as a complete path and
101
+ # bypasses all processing
102
+ # @option opts [String, Card::Name, Integer, Symbol, Card] :mark
94
103
  # @option opts [Symbol] :action card action (:create, :update, :delete)
95
- # @option opts [Integer, String] :id
96
- # @option opts [String, Card::Name] :name
97
- # @option opts [String] :type
98
104
  # @option opts [Hash] :card
99
- # @param mark_type [Symbol] defaults to :id
100
- def path opts={}, mark_type=:id
101
- path = new_cardtype_path(opts) || standard_path(opts, mark_type)
105
+ # @option opts []
106
+ def path opts={}
107
+ return opts unless opts.is_a? Hash
108
+ path = new_cardtype_path(opts) || standard_path(opts)
102
109
  internal_url path
103
110
  end
104
111
 
105
112
  def new_cardtype_path opts
106
113
  return unless opts[:action] == :new
107
114
  opts.delete :action
108
- return unless (type_mark = opts.delete(:type))
109
- "new/#{Card.quick_fetch(type_mark).cardname.url_key}"
115
+ return unless opts[:mark]
116
+ "new/#{path_mark opts}"
110
117
  end
111
118
 
112
- def standard_path opts, mark_type
119
+ def standard_path opts
113
120
  standardize_action! opts
114
- base = path_action(opts[:action]) + path_mark(opts, mark_type)
121
+ mark = path_mark opts
122
+ base = path_base opts[:action], mark
115
123
  base + path_query(opts)
116
124
  end
117
125
 
118
- def path_action action
119
- case action
120
- when :create then "card/#{action}/"
121
- # sometimes create action has no mark,
122
- # but /create alone would refer to a card named "create"
123
- when nil then ""
124
- else "#{action}/"
126
+ def path_base action, mark
127
+ if action
128
+ mark.present? ? "#{action}/#{mark}" : "card/#{action}"
129
+ # the card/ prefix prevents interpreting action as cardname
130
+ else
131
+ mark
125
132
  end
126
133
  end
127
134
 
@@ -130,58 +137,27 @@ format do
130
137
  opts.delete :action
131
138
  end
132
139
 
133
- def path_mark opts, mark_type
134
- case mark_type
135
- when :id && (id = path_id opts) then "~#{id}"
136
- when :codename && (codename = card.codename) then ":#{codename}"
137
- else (opts[:name] || card.name).to_name.url_key
138
- end
139
- end
140
-
141
- def path_id opts
142
- id = opts.delete :id
143
- id if id.present?
140
+ def path_mark opts
141
+ return "" if opts[:action] == :create || opts.delete(:no_mark)
142
+ name = opts[:mark] ? Card::Name.cardish(opts.delete(:mark)) : card.name
143
+ add_unknown_name_to_opts name.to_name, opts
144
+ name.to_name.url_key
144
145
  end
145
146
 
146
147
  def path_query opts
147
- finalize_card_opts opts.delete(:card), opts
148
148
  opts.delete :action
149
149
  opts.empty? ? "" : "?#{opts.to_param}"
150
150
  end
151
151
 
152
- def finalize_card_opts card_opts, opts
153
- card_opts ||= {}
154
- [:name, :type].each do |field|
155
- assign_path_card_opt card_opts, field, opts
156
- end
157
- opts[:card] = card_opts unless card_opts.empty?
158
- end
159
-
160
- def assign_path_card_opt card_opts, field, opts
161
- optvalue = opts.delete field
162
- return if card_opts[field] || !optvalue.present?
163
- new_value = send "new_#{field}_in_path_opts", optvalue.to_s, opts
164
- return unless new_value
165
- card_opts[field] = new_value
166
- end
167
-
168
- def new_name_in_path_opts name, opts
169
- if opts[:action] == :update
170
- name if name != card.name
171
- elsif !Card.known?(name) && name != name.to_name.url_key
172
- name
173
- end
174
- end
175
-
176
- def new_type_in_path_opts opttype, _opts
177
- opttype if Card.known?(opttype)
152
+ def add_unknown_name_to_opts name, opts
153
+ return if opts[:card] && opts[:card][:name]
154
+ return if name.s == Card::Name.url_key_to_standard(name.url_key)
155
+ return if Card.known? name
156
+ opts[:card] ||= {}
157
+ opts[:card][:name] = name
178
158
  end
179
159
 
180
160
  def internal_url relative_path
181
161
  card_path relative_path
182
162
  end
183
-
184
- def interpret_pathish pathish
185
- pathish.is_a?(Hash) ? path(pathish) : pathish
186
- end
187
163
  end
@@ -43,9 +43,9 @@ format :html do
43
43
 
44
44
  def generic_new_card_title
45
45
  if card.type_id == Card.default_type_id
46
- "New #{card.type_name}"
47
- else
48
46
  "New"
47
+ else
48
+ "New #{card.type_name}"
49
49
  end
50
50
  end
51
51
 
@@ -139,7 +139,7 @@ format :html do
139
139
  view :edit_rule, tags: :unknown_ok do |args|
140
140
  return "not a rule" unless card.is_rule?
141
141
  form_args = {
142
- url: path(action: :update, mark_type: :name),
142
+ url: path(action: :update, no_mark: true),
143
143
  html: { class: "card-form card-rule-form" }
144
144
  }
145
145
  if args[:remote]
@@ -9,7 +9,8 @@ describe Card::Content::Chunk::Link do
9
9
  assert_args[0] << "[#{key}=\"#{val}\"]"
10
10
  end
11
11
  assert_args << { text: text } if text
12
- assert_view_select render_content(target, (format_args || {})), *assert_args
12
+ link = render_content target, (format_args || {})
13
+ assert_view_select link, *assert_args
13
14
  end
14
15
 
15
16
  it "handles unknown cards" do
@@ -25,7 +25,7 @@ describe Card::Content do
25
25
  "{{Included|open}}",
26
26
  rendered: ["Some Links and includes: ",
27
27
  '<a class="wanted-card" ' \
28
- 'href="/the_card?card%5Bname%5D=the+card">' \
28
+ 'href="/the_card">' \
29
29
  "the text</a>",
30
30
  ", and ",
31
31
  { options: { view: "Is Included",
@@ -208,18 +208,26 @@ describe Card::Content do
208
208
 
209
209
  describe "parse" do
210
210
  def check_chunk_classes
211
- expect(cobj.inject(classes, &@check_proc)).to eq(true)
212
- clist = classes.select { |c| String != c }
211
+ all_classes_pass_check_proc
212
+ clist = nonstring_classes
213
213
  cobj.each_chunk do |chk|
214
214
  expect(chk).to be_instance_of clist.shift
215
215
  end
216
216
  expect(clist).to be_empty
217
217
  end
218
218
 
219
+ def nonstring_classes
220
+ classes.select { |c| String != c }
221
+ end
222
+
223
+ def all_classes_pass_check_proc
224
+ expect(cobj.inject(classes, &@check_proc)).to eq(true)
225
+ end
226
+
219
227
  it "finds all the chunks and strings" do
220
228
  # note the mixed [} that are considered matching, needs some cleanup ...
221
229
  @example = :nests
222
- expect(cobj.inject(classes, &@check_proc)).to eq(true)
230
+ all_classes_pass_check_proc
223
231
  end
224
232
 
225
233
  it "gives just the chunks" do
@@ -229,7 +237,7 @@ describe Card::Content do
229
237
 
230
238
  it "finds all the chunks links and trasclusions" do
231
239
  @example = :links_and_nests
232
- expect(cobj.inject(classes, &@check_proc)).to eq(true)
240
+ all_classes_pass_check_proc
233
241
  end
234
242
 
235
243
  it "finds uri chunks " do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: card
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.19.5
4
+ version: 1.19.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ethan McCutchen
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2016-09-23 00:00:00.000000000 Z
14
+ date: 2016-10-02 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: smartname