card 1.95.3 → 1.96.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/lib/card.rb +10 -2
  4. data/lib/card/migration/import.rb +1 -1
  5. data/lib/card/set.rb +1 -1
  6. data/lib/card/set/event.rb +63 -65
  7. data/lib/card/set/event/callbacks.rb +21 -0
  8. data/lib/card/set/event/delayed_event.rb +11 -16
  9. data/lib/card/set/event/options.rb +78 -0
  10. data/lib/card/set/format.rb +5 -93
  11. data/lib/card/set/format/abstract_format.rb +104 -0
  12. data/mod/Modfile +1 -0
  13. data/mod/basic_formats/set/all/all_csv.rb +1 -1
  14. data/mod/basic_formats/set/all/json.rb +61 -4
  15. data/mod/basic_formats/spec/set/all/json_spec.rb +51 -1
  16. data/mod/basic_formats/spec/shared_context/json_shared_context.rb +40 -0
  17. data/mod/bootstrap/lib/stylesheets/style_bootstrap_cards.scss +17 -1
  18. data/mod/bootstrap/set/abstract/bootswatch_theme.rb +2 -12
  19. data/mod/bootstrap/set/abstract/bootswatch_theme/html_views.rb +31 -0
  20. data/mod/bootstrap/set/type/customized_bootswatch_skin.rb +12 -0
  21. data/mod/bootstrap/set/type/customized_bootswatch_skin/core.haml +5 -0
  22. data/mod/bootstrap/set/type/customized_bootswatch_skin/html_views.rb +36 -0
  23. data/mod/bootstrap/set/type_plus_right/customized_bootswatch_skin/colors.rb +14 -10
  24. data/mod/bootstrap/set/type_plus_right/customized_bootswatch_skin/colors/_colorpicker.haml +1 -1
  25. data/mod/bootstrap/set/type_plus_right/customized_bootswatch_skin/colors/editor.haml +13 -9
  26. data/mod/core/chunk/link.rb +8 -0
  27. data/mod/core/set/abstract/code_file.rb +5 -0
  28. data/mod/core/set/all/chunk.rb +46 -24
  29. data/mod/core/set/all/event_conditions.rb +32 -11
  30. data/mod/core/set/all/export.rb +3 -5
  31. data/mod/core/set/all/item.rb +16 -0
  32. data/mod/core/set/all/name.rb +1 -0
  33. data/mod/core/set/all/references.rb +25 -16
  34. data/mod/core/set/all/rename.rb +20 -21
  35. data/mod/core/set/all/trash.rb +13 -4
  36. data/mod/core/spec/set/all/actify_spec.rb +4 -4
  37. data/mod/core/spec/set/all/event_conditions_spec.rb +68 -10
  38. data/mod/core/spec/set/all/export_spec.rb +7 -4
  39. data/mod/core/spec/set/all/references_spec.rb +38 -1
  40. data/mod/core/spec/set/all/rename_spec.rb +15 -9
  41. data/mod/follow/spec/set/right/followers_spec.rb +1 -1
  42. data/mod/follow/spec/set/right/following_spec.rb +4 -8
  43. data/mod/follow/spec/set/type/notification_template_spec.rb +1 -1
  44. data/mod/history/set/all/act_view.rb +2 -2
  45. data/mod/item/set/all/bar.haml +12 -0
  46. data/mod/item/set/all/bar.rb +77 -0
  47. data/mod/item/set/all/box.haml +10 -0
  48. data/mod/item/set/all/box.rb +8 -0
  49. data/mod/item/set/all/expanded_bar.haml +10 -0
  50. data/mod/machines/file/all_script_machine_output/file.js +30622 -66
  51. data/mod/machines/file/all_style_machine_output/file.css +3 -3
  52. data/mod/machines/file/script_html5shiv_printshiv_machine_output/file.js +1 -1
  53. data/mod/machines/lib/javascript/decko_slot.js.coffee +18 -13
  54. data/mod/machines/set/abstract/skin_box.rb +34 -0
  55. data/mod/machines/set/abstract/skin_box/box_bottom.haml +4 -0
  56. data/mod/machines/set/type/skin.rb +1 -1
  57. data/mod/pointer/set/abstract/01_paging.rb +49 -4
  58. data/mod/pointer/set/abstract/01_paging/paging_links.rb +6 -6
  59. data/mod/pointer/set/abstract/02_pointer/html_views.rb +10 -0
  60. data/mod/pointer/set/abstract/02_pointer/other_views.rb +9 -5
  61. data/mod/pointer/spec/set/abstract/pointer/html_views_spec.rb +4 -10
  62. data/mod/pointer/spec/set/abstract/pointer/other_views_spec.rb +20 -1
  63. data/mod/search/set/abstract/01_filter_form_helper.rb +4 -4
  64. data/mod/search/set/abstract/02_search_params.rb +1 -1
  65. data/mod/search/set/abstract/03_filter.rb +8 -0
  66. data/mod/search/set/abstract/search.rb +10 -0
  67. data/mod/settings/set/right/style.rb +13 -0
  68. data/mod/settings/set/right/style/editor.haml +4 -4
  69. data/mod/standard/set/all/path.rb +6 -0
  70. data/mod/standard/set/type/list.rb +3 -2
  71. data/mod/standard/set/type/listed_by.rb +5 -1
  72. data/mod/standard/spec/content/chunk/include_spec.rb +2 -2
  73. data/mod/standard/spec/set/all/rich_html/editing_spec.rb +4 -69
  74. data/mod/standard/spec/set/type/listed_by_spec.rb +2 -2
  75. data/mod/standard/spec/set/type/search_type_spec.rb +56 -0
  76. data/mod/standard/spec/set/type/set/html_views_spec.rb +5 -9
  77. data/mod/utility/set/abstract/bs_badge.rb +21 -0
  78. data/mod/utility/set/abstract/bs_badge/bs_badge.haml +5 -0
  79. data/mod/utility/set/abstract/bs_badge/labeled_badge.haml +5 -0
  80. data/mod/utility/set/abstract/bs_badge/tab_badge.haml +5 -0
  81. data/mod/utility/set/abstract/media.rb +27 -0
  82. data/mod/utility/set/abstract/media/media_snippet.haml +9 -0
  83. metadata +28 -10
  84. data/mod/machines/set/abstract/skin_thumbnail.rb +0 -28
  85. data/mod/machines/set/abstract/skin_thumbnail/thumbnail.haml +0 -10
@@ -1,6 +1,6 @@
1
- .album.py-5.bg-light
1
+ .album.bg-light
2
2
  .container
3
3
  .row
4
- - themes.each do |theme|
5
- .col-md-3
6
- = nest theme, view: :thumbnail
4
+ - selectable_themes.each do |theme|
5
+ .col-md-4
6
+ = nest theme, view: :box
@@ -117,6 +117,12 @@ end
117
117
 
118
118
  public
119
119
 
120
+ format :json do
121
+ def add_unknown_name_to_opts name, opts
122
+ # noop
123
+ end
124
+ end
125
+
120
126
  format :html do
121
127
  # in HTML, decko paths rendered as relative to the site's root.
122
128
  def contextualize_path relative_path
@@ -82,12 +82,13 @@ def update_all_items
82
82
  end
83
83
 
84
84
  def update_listed_by_cache_for item_keys, args={}
85
- type_key = args[:type_key] || left.type_card.key
85
+ type_key = args[:type_key] || left&.type_card&.key
86
+ return unless type_key
86
87
 
87
88
  item_keys.each do |item_key|
88
89
  key = "#{item_key}+#{type_key}"
89
90
  next unless Card::Cache[Card::Set::Type::ListedBy].exist? key
90
- if (card = Card.fetch(key))
91
+ if (card = Card.fetch(key)) && card.left
91
92
  card.update_cached_list
92
93
  card.update_references_out
93
94
  else
@@ -76,7 +76,11 @@ def listed_by
76
76
  end
77
77
 
78
78
  def update_cached_list
79
- Card::Cache[Card::Set::Type::ListedBy].write key, generate_content
79
+ if trunk
80
+ Card::Cache[Card::Set::Type::ListedBy].write key, generate_content
81
+ else
82
+ Card::Cache[Card::Set::Type::ListedBy].delete key
83
+ end
80
84
  end
81
85
 
82
86
  def list_card item
@@ -126,7 +126,7 @@ describe Card::Content::Chunk::Nest, "Inclusion" do
126
126
 
127
127
  r = bob_address.reload.format.render_core
128
128
  assert_view_select r, "div[class~=d0-card-content]", "Sparta"
129
- expect(Card.fetch("bob+address").includees.map(&:name))
129
+ expect(Card.fetch("bob+address").nestees.map(&:name))
130
130
  .to eq([bob_city.name])
131
131
  end
132
132
 
@@ -180,7 +180,7 @@ describe Card::Content::Chunk::Nest, "Inclusion" do
180
180
  wooga = Card.create! name: "Wooga", type: "SpecialType"
181
181
  wooga_age = create! "#{wooga.name}#{Card::Name.joint}age", "39"
182
182
  expect(wooga_age.format.render_core).to eq("39")
183
- expect(wooga_age.includers.map(&:name)).to eq(["Wooga"])
183
+ expect(wooga_age.nesters.map(&:name)).to eq(["Wooga"])
184
184
  end
185
185
  end
186
186
  end
@@ -1,81 +1,16 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  describe Card::Set::All::RichHtml::Editing do
4
- extend Card::SpecHelper::ViewHelper::ViewDescriber
5
-
6
- let(:mycard) { Card["A"] }
7
- let(:myformat) { mycard.format }
8
-
9
- def assert_active_toolbar_pill view, content, related_view=false
10
- view_selector = related_view ? "related" : view
11
- assert_view_select myformat.render!(view),
12
- "div[class~='card-slot #{view_selector}-view']" do
13
- assert_select 'nav[class="slotter toolbar navbar navbar-inverse"]' do
14
- assert_select 'ul[class="nav navbar-nav nav-pills"]' do
15
- assert_select 'li[class~="active"] > a', content
16
- end
17
- end
18
- end
19
- end
20
-
21
4
  describe "edit_nests view" do
22
5
  it "shows editors for both absolute and relative nests" do
23
- mycard.content = "{{absolute}} AND {{+relative}}"
24
- view = myformat.render :edit_nests
25
- expect(view).to have_tag "div.SELF-a" do
6
+ card_subject.content = "{{absolute}} AND {{+relative}}"
7
+ expect_view(:edit_nests).to have_tag "div.SELF-a" do
26
8
  with_tag "div.card-editor", with: { card_name: "absolute" }
27
9
  with_tag "div.card-editor", with: { card_name: "A+relative" }
28
10
  end
29
11
  end
30
12
  end
31
13
 
32
- describe_views :edit, :edit_buttons, :edit_name, :edit_type, :edit_rules,
33
- :edit_structure, :edit_nests do
34
- it "doesn't have errors" do
35
- expect(mycard.format.render(view)).to lack_errors
36
- end
37
- end
38
-
39
- # outdated
40
- # TODO: write tests for new toolbar
41
- # describe "edit view" do
42
- # it "has toolbar with active 'content' pill" do
43
- # assert_active_toolbar_pill :edit, 'content'
44
- # end
45
- # end
46
- #
47
- # describe 'edit_type view' do
48
- # it "has toolbar with active 'type' pill" do
49
- # assert_active_toolbar_pill :edit_type, 'type'
50
- # end
51
- # end
52
- #
53
- # describe 'edit_name view' do
54
- # it "has toolbar with active 'name' pill" do
55
- # assert_active_toolbar_pill :edit_name, 'name'
56
- # end
57
- # end
58
- #
59
- # describe 'edit_structure view' do
60
- # before do
61
- # @mycard = Card["Iliad"].format
62
- # end
63
- # it "has toolbar with active 'rules' pill" do
64
- # Card::Auth.as_bot do
65
- # assert_active_toolbar_pill :edit_structure, 'rules', true
66
- # end
67
- # end
68
- # end
69
- #
70
- # describe 'edit_nests view' do
71
- # before do
72
- # Card::Auth.as_bot do
73
- # Card.create! name: 'Iliad+author', content: 'Homer'
74
- # end
75
- # @mycard = Card["Iliad"].format
76
- # end
77
- # it "has toolbar with active 'nests' pill" do
78
- # assert_active_toolbar_pill :edit_nests, 'nests'
79
- # end
80
- # end
14
+ check_views_for_errors :edit, :edit_buttons, :edit_name, :edit_type, :edit_rules,
15
+ :edit_structure, :edit_nests
81
16
  end
@@ -26,8 +26,8 @@ RSpec.describe Card::Set::Type::ListedBy do
26
26
  /Name must have a cardtype name as right part/)
27
27
  end
28
28
 
29
- context 'when Darles Chickens is in the author list of \
30
- "Parry Hotter" and "50 grades of shy"' do
29
+ context "when Darles Chickens is in the author list of" \
30
+ '"Parry Hotter" and "50 grades of shy"' do
31
31
  describe "Darles Chickens+books" do
32
32
  subject { listed_by }
33
33
 
@@ -105,4 +105,60 @@ RSpec.describe Card::Set::Type::SearchType do
105
105
  end
106
106
  end
107
107
  end
108
+
109
+ describe "json" do
110
+ include_context "json context"
111
+
112
+ def card_subject
113
+ sample_search
114
+ end
115
+
116
+ let(:item_names) { ["50 grades of shy", "Iliad", "Parry Hotter"] }
117
+
118
+ specify "view: links" do
119
+ expect_view(:links, format: :json).to eq([])
120
+ end
121
+
122
+ describe "view: items" do
123
+ it "returns atom values for items" do
124
+ expect_view(:items, format: :json)
125
+ .to include(*item_names.map { |i| structured_atom_values Card[i] })
126
+ end
127
+
128
+ it "returns all items" do
129
+ expect(view(:items, card: card_subject, format: :json).size).to eq 3
130
+ end
131
+
132
+ context "with paging" do
133
+ def paging_url offset
134
+ json_url(card_subject.name.url_key, "limit=1&offset=#{offset}")
135
+ end
136
+
137
+ let(:paging_values) do
138
+ view(:molecule, card: card_subject, format: :json)[:paging]
139
+ end
140
+
141
+ before do
142
+ Card::Env.params[:limit] = 1
143
+ end
144
+
145
+ it "shows next link" do
146
+ expect(paging_values).to eq(next: paging_url(1))
147
+ end
148
+
149
+ it "shows next and previous link" do
150
+ Card::Env.params[:offset] = 1
151
+ expect(paging_values)
152
+ .to eq(next: paging_url(2),
153
+ previous: paging_url(0))
154
+ end
155
+
156
+ it "shows previous link" do
157
+ Card::Env.params[:offset] = 2
158
+ expect(paging_values)
159
+ .to eq(previous: paging_url(1))
160
+ end
161
+ end
162
+ end
163
+ end
108
164
  end
@@ -1,14 +1,10 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  describe Card::Set::Type::Set::HtmlViews do
4
- extend Card::SpecHelper::ViewHelper::ViewDescriber
5
-
6
- let(:sample_set) { Card.fetch("User+*type") }
7
-
8
- describe_views :all_rules, :grouped_rules, :recent_rules, :common_rules,
9
- :field_related_rules, :set_label, :set_navbar, :rule_navbar do
10
- it "doesn't have errors" do
11
- expect(sample_set.format.render(view)).to lack_errors
12
- end
4
+ def card_subject
5
+ Card.fetch("User+*type")
13
6
  end
7
+
8
+ check_views_for_errors :all_rules, :grouped_rules, :recent_rules, :common_rules,
9
+ :field_related_rules, :set_label, :set_navbar, :rule_navbar
14
10
  end
@@ -0,0 +1,21 @@
1
+ format :html do
2
+ def labeled_badge count, label, opts={}
3
+ haml :labeled_badge, badge_haml_opts(count, label, opts)
4
+ end
5
+
6
+ def tab_badge count, label, opts={}
7
+ haml :tab_badge, badge_haml_opts(count, label, opts)
8
+ end
9
+
10
+ def badge_haml_opts count, label, opts
11
+ process_badge_opts count, opts
12
+ { count: count, label: label, klass: opts[:klass], color: opts[:color] }
13
+ end
14
+
15
+ def process_badge_opts count, opts
16
+ if count.zero? && !opts[:zero_ok]
17
+ opts[:klass] = [opts[:klass], "disabled-o"].compact.join " "
18
+ end
19
+ opts[:color] ||= "secondary"
20
+ end
21
+ end
@@ -0,0 +1,5 @@
1
+ %span.labeled-badge{ class: klass }
2
+ %span.badge{ class: "badge-#{color}" }
3
+ = count
4
+ %label.mr-2.text-muted
5
+ = label
@@ -0,0 +1,5 @@
1
+ %span.labeled-badge{ class: klass }
2
+ %span.badge{ class: "badge-#{color}" }
3
+ = count
4
+ %label.mr-2.text-muted
5
+ = label
@@ -0,0 +1,5 @@
1
+ %div.tab-badge.count-number.clearfix{ class: klass }
2
+ %span.badge.badge-secondary{ class: "badge-#{color}" }
3
+ = count
4
+ %span.badge-label
5
+ = label
@@ -0,0 +1,27 @@
1
+ format :html do
2
+ def image_card
3
+ @image_card ||= card.fetch(trait: :image)
4
+ end
5
+
6
+ def image_src opts
7
+ return "" unless image_card
8
+ nest(image_card, view: :source, size: opts[:size])
9
+ end
10
+
11
+ def image_alt
12
+ image_card&.name
13
+ end
14
+
15
+ def text_with_image_args opts
16
+ opts.reverse_merge! title: _render_title, text: "", src: image_src(opts),
17
+ alt: image_alt, size: :original
18
+ end
19
+
20
+ def text_with_image opts={}
21
+ class_up "media-left", "m-2"
22
+ @image_card = Card.cardish(opts[:image]) if opts[:image]
23
+ opts[:media_opts] = {} unless opts[:media_opts]
24
+ text_with_image_args opts
25
+ haml :media_snippet, opts
26
+ end
27
+ end
@@ -0,0 +1,9 @@
1
+ .media{media_opts}
2
+ .image-box{class: [classy("media-left"), size]}
3
+ %a{href: "#"}
4
+ %img.media-object{class: size, src: src.html_safe, alt: alt}
5
+ .media-body
6
+ - if title != ""
7
+ %h5.media-heading
8
+ = title
9
+ = text
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.95.3
4
+ version: 1.96.0
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: 2018-06-21 00:00:00.000000000 Z
14
+ date: 2018-07-23 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: cardname
@@ -19,14 +19,14 @@ dependencies:
19
19
  requirements:
20
20
  - - '='
21
21
  - !ruby/object:Gem::Version
22
- version: 0.5.3
22
+ version: 0.6.0
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - '='
28
28
  - !ruby/object:Gem::Version
29
- version: 0.5.3
29
+ version: 0.6.0
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: haml
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -73,16 +73,16 @@ dependencies:
73
73
  name: carrierwave
74
74
  requirement: !ruby/object:Gem::Requirement
75
75
  requirements:
76
- - - "~>"
76
+ - - '='
77
77
  - !ruby/object:Gem::Version
78
- version: '1.1'
78
+ version: 1.2.2
79
79
  type: :runtime
80
80
  prerelease: false
81
81
  version_requirements: !ruby/object:Gem::Requirement
82
82
  requirements:
83
- - - "~>"
83
+ - - '='
84
84
  - !ruby/object:Gem::Version
85
- version: '1.1'
85
+ version: 1.2.2
86
86
  - !ruby/object:Gem::Dependency
87
87
  name: mini_magick
88
88
  requirement: !ruby/object:Gem::Requirement
@@ -583,8 +583,11 @@ files:
583
583
  - lib/card/set/advanced_api.rb
584
584
  - lib/card/set/basket.rb
585
585
  - lib/card/set/event.rb
586
+ - lib/card/set/event/callbacks.rb
586
587
  - lib/card/set/event/delayed_event.rb
588
+ - lib/card/set/event/options.rb
587
589
  - lib/card/set/format.rb
590
+ - lib/card/set/format/abstract_format.rb
588
591
  - lib/card/set/format/haml_views.rb
589
592
  - lib/card/set/helpers.rb
590
593
  - lib/card/set/i18n_scanner.rb
@@ -1071,6 +1074,7 @@ files:
1071
1074
  - mod/basic_formats/spec/set/all/json_spec.rb
1072
1075
  - mod/basic_formats/spec/set/all/rss_spec.rb
1073
1076
  - mod/basic_formats/spec/set/all/text_spec.rb
1077
+ - mod/basic_formats/spec/shared_context/json_shared_context.rb
1074
1078
  - mod/basic_formats/template/all/head/meta_tags.haml
1075
1079
  - mod/basic_types/set/type/html.rb
1076
1080
  - mod/basic_types/set/type/json.rb
@@ -1252,6 +1256,7 @@ files:
1252
1256
  - mod/bootstrap/script/update_skin_thumbnails.rb
1253
1257
  - mod/bootstrap/set/abstract/bootstrap_code_file.rb
1254
1258
  - mod/bootstrap/set/abstract/bootswatch_theme.rb
1259
+ - mod/bootstrap/set/abstract/bootswatch_theme/html_views.rb
1255
1260
  - mod/bootstrap/set/abstract/bootswatch_theme/thumbnail.haml
1256
1261
  - mod/bootstrap/set/all/bootstrap/accordion.rb
1257
1262
  - mod/bootstrap/set/all/bootstrap/form.rb
@@ -1276,6 +1281,8 @@ files:
1276
1281
  - mod/bootstrap/set/self/style_select2_bootstrap.rb
1277
1282
  - mod/bootstrap/set/type/bootswatch_skin.rb
1278
1283
  - mod/bootstrap/set/type/customized_bootswatch_skin.rb
1284
+ - mod/bootstrap/set/type/customized_bootswatch_skin/core.haml
1285
+ - mod/bootstrap/set/type/customized_bootswatch_skin/html_views.rb
1279
1286
  - mod/bootstrap/set/type_plus_right/customized_bootswatch_skin/colors.rb
1280
1287
  - mod/bootstrap/set/type_plus_right/customized_bootswatch_skin/colors/_colorpicker.haml
1281
1288
  - mod/bootstrap/set/type_plus_right/customized_bootswatch_skin/colors/editor.haml
@@ -4695,6 +4702,11 @@ files:
4695
4702
  - mod/history/set/all/acts.rb
4696
4703
  - mod/history/set/all/content_history.rb
4697
4704
  - mod/history/set/all/history.rb
4705
+ - mod/item/set/all/bar.haml
4706
+ - mod/item/set/all/bar.rb
4707
+ - mod/item/set/all/box.haml
4708
+ - mod/item/set/all/box.rb
4709
+ - mod/item/set/all/expanded_bar.haml
4698
4710
  - mod/machines/file/all_script_machine_output/file.js
4699
4711
  - mod/machines/file/all_style_machine_output/file.css
4700
4712
  - mod/machines/file/script_html5shiv_printshiv_machine_output/file.js
@@ -4734,8 +4746,8 @@ files:
4734
4746
  - mod/machines/set/abstract/machine/output_update.rb
4735
4747
  - mod/machines/set/abstract/machine_input.rb
4736
4748
  - mod/machines/set/abstract/script.rb
4737
- - mod/machines/set/abstract/skin_thumbnail.rb
4738
- - mod/machines/set/abstract/skin_thumbnail/thumbnail.haml
4749
+ - mod/machines/set/abstract/skin_box.rb
4750
+ - mod/machines/set/abstract/skin_box/box_bottom.haml
4739
4751
  - mod/machines/set/all/reset_machines.rb
4740
4752
  - mod/machines/set/right/machine_cache.rb
4741
4753
  - mod/machines/set/right/machine_input.rb
@@ -5176,6 +5188,12 @@ files:
5176
5188
  - mod/twitter/Gemfile
5177
5189
  - mod/twitter/db/migrate_core_cards/20170305112346_add_twitter_cards.rb
5178
5190
  - mod/twitter/set/type/twitter_template.rb
5191
+ - mod/utility/set/abstract/bs_badge.rb
5192
+ - mod/utility/set/abstract/bs_badge/bs_badge.haml
5193
+ - mod/utility/set/abstract/bs_badge/labeled_badge.haml
5194
+ - mod/utility/set/abstract/bs_badge/tab_badge.haml
5195
+ - mod/utility/set/abstract/media.rb
5196
+ - mod/utility/set/abstract/media/media_snippet.haml
5179
5197
  - mod/utility/set/abstract/utility.rb
5180
5198
  - mod/utility/spec/set/abstract/utility_spec.rb
5181
5199
  - mod/virtual/lib/card/virtual.rb