card-mod-assets 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b59f6f6f70adc14e63bc31249f6800971fcff3558d05fe332f29ea5ddbdfdbe7
4
+ data.tar.gz: b0c4afd0e8497fd44ed495812893dcbb4386f25d2c0898ce1c8f53fc3c4bcc4d
5
+ SHA512:
6
+ metadata.gz: b9a5fc6b02f596d3fc34616d6c9cceca46b6b04077c6687630b27b11a823ff33c1dc15d22bf777a98aa54b0e80426df615e0802eae51567a0f404bbfb864e576
7
+ data.tar.gz: 4091054b08b2ddcb3c9c07d4ab973d57fc11c41547b77911ce608636f057370ccda3f62104a74f21d27245a1f204dc73dc0171a52bb5c7cb6d8d4be6d9fc1050
@@ -0,0 +1,13 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ class AddModType < Cardio::Migration::Core
4
+ def up
5
+ add_cardtypes
6
+ Card::Cache.reset_all
7
+ end
8
+
9
+ def add_cardtypes
10
+ ensure_code_card name: "Remote manifest group", type_id: Card::CardtypeID
11
+ ensure_code_card name: "Mod", type_id: Card::CardtypeID
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ def group_name
2
+ codename.to_s.sub(/^.+__/, "")
3
+ end
4
+
5
+ def relative_paths
6
+ paths
7
+ end
8
+
9
+ format :html do
10
+ view :core do
11
+ list_group card.item_names
12
+ end
13
+ end
@@ -0,0 +1,71 @@
1
+ include_set Abstract::CodeFile
2
+
3
+ attr_accessor :base_path
4
+
5
+ def source_paths
6
+ source_files.map do |file|
7
+ ::File.join base_path, file
8
+ end
9
+ end
10
+
11
+ def source_files
12
+ [db_content]
13
+ end
14
+
15
+ def find_file path
16
+ path.tap do |file_path|
17
+ return nil if unknown_file? file_path
18
+ end
19
+ end
20
+
21
+ def unknown_file? file_path
22
+ return false if ::File.exist? file_path
23
+
24
+ Rails.logger.info "couldn't locate #{file_path}"
25
+ true
26
+ end
27
+
28
+ def virtual?
29
+ true
30
+ end
31
+
32
+ def new?
33
+ false
34
+ end
35
+
36
+ def compress?
37
+ @minimize
38
+ end
39
+
40
+ def minimize
41
+ @minimze = true
42
+ end
43
+
44
+ def local
45
+ @local = true
46
+ end
47
+
48
+ format do
49
+ def link_view opts={}
50
+ opts[:path] = { card: { type: card.type, content: card.db_content } }
51
+ link_to_card card.name, _render_title, opts
52
+ end
53
+
54
+ def link_to_view view, text=nil, opts={}
55
+ opts[:path] = { card: { type: card.type, content: card.db_content } }
56
+ super view, (text || view), opts
57
+ end
58
+ end
59
+
60
+ format :html do
61
+ view :javascript_include_tag do
62
+ card.existing_source_paths.map do |path|
63
+ javascript_include_tag(path)
64
+ end.join "\n"
65
+ end
66
+
67
+ def short_content
68
+ fa_icon("exclamation-circle", class: "text-muted pr-2") +
69
+ wrap_with(:span, "asset file", class: "text-muted")
70
+ end
71
+ end
@@ -0,0 +1,66 @@
1
+ include_set Abstract::ReadOnly
2
+ include_set Abstract::Sources
3
+ include_set Abstract::Items
4
+
5
+ def refresh_output force: false
6
+ update_items! if refresh_output? || force
7
+ end
8
+
9
+ def refresh_output?
10
+ !output_updated_at || source_changed?(since: output_updated_at)
11
+ end
12
+
13
+ event :update_asset_list, :prepare_to_store, on: :save do
14
+ self.db_content = relative_paths.join("\n")
15
+ end
16
+
17
+ def render_items_and_compress format
18
+ item_cards.map do |mcard|
19
+ js = mcard.format(format)._render_core
20
+ js = mcard.compress js if minimize?
21
+ "// #{mcard.name}\n#{js}"
22
+ end.join "\n"
23
+ end
24
+
25
+ def update_items!
26
+ Card::Auth.as_bot do
27
+ save!
28
+ end
29
+ regenerate_machine_output
30
+ end
31
+
32
+ def item_name_to_path name
33
+ name
34
+ end
35
+
36
+ def fetch_item_card name, _args={}
37
+ new_asset_file_card item_name_to_path(name)
38
+ end
39
+
40
+ def new_asset_file_card path, name=::File.basename(path)
41
+ return unless (constants = new_asset_constants path)
42
+ asset_card = Card.new(name: name, type_id: constants[:type_id], content: path)
43
+ asset_card.include_set_module constants[:set_module]
44
+ asset_card.minimize if @minimize
45
+ asset_card.local if @local
46
+ asset_card.base_path = base_path
47
+ asset_card
48
+ end
49
+
50
+ def source_paths
51
+ paths
52
+ end
53
+
54
+ def self_machine_input?
55
+ true
56
+ end
57
+
58
+ def local
59
+ @local = true
60
+ end
61
+
62
+ def source_changed? since:
63
+ difference = (relative_paths + item_names) - (relative_paths & item_names)
64
+ difference.present? ||
65
+ existing_source_paths.any? { |path| ::File.mtime(path) > since }
66
+ end
@@ -0,0 +1,23 @@
1
+ def paths
2
+ return [] unless (path = left&.assets_path)
3
+
4
+ relative_paths.map { |child| ::File.join path, child }
5
+ end
6
+
7
+ def relative_paths
8
+ return [] unless (path = left&.assets_path)
9
+
10
+ Dir.children path
11
+ end
12
+
13
+ def item_name_to_path name
14
+ ::File.join base_path, name
15
+ end
16
+
17
+ def base_path
18
+ left&.assets_path
19
+ end
20
+
21
+ def minimize?
22
+ @minimize = true
23
+ end
@@ -0,0 +1,25 @@
1
+ include_set Abstract::ManifestGroup
2
+
3
+ def paths
4
+ return [] unless left
5
+
6
+ relative_paths.map { |path| ::File.join(base_path, path) } || []
7
+ end
8
+
9
+ def relative_paths
10
+ return [] unless left
11
+
12
+ left.manifest_group_items group_name
13
+ end
14
+
15
+ def item_name_to_path name
16
+ ::File.join base_path, name
17
+ end
18
+
19
+ def minimize?
20
+ left.manifest_group_minimize? group_name
21
+ end
22
+
23
+ def base_path
24
+ left&.assets_path
25
+ end
@@ -0,0 +1,170 @@
1
+ include_set Abstract::Pointer
2
+
3
+ def mod_name
4
+ left&.codename.to_s.sub(/^mod_/, "")
5
+ end
6
+
7
+ def mod
8
+ @mod ||= Cardio::Mod.dirs.fetch_mod(mod_name)
9
+ end
10
+
11
+ def assets_path
12
+ return unless mod&.assets_path.present?
13
+
14
+ File.join mod&.assets_path, subpath
15
+ end
16
+
17
+ def manifest_path
18
+ return unless assets_path
19
+
20
+ File.join(assets_path, "manifest.yml")
21
+ end
22
+
23
+ def expected_item_keys
24
+ return [] unless assets_dir_exists?
25
+
26
+ if manifest_exists?
27
+ manifest.keys.map { |group_key| "#{name}+#{group_key}".to_name.key }
28
+ else
29
+ ["#{name}+#{local_group_name}".to_name.key]
30
+ end
31
+ end
32
+
33
+ def local_group_name
34
+ "local"
35
+ end
36
+
37
+ def update_items
38
+ # return unless groups_changed?
39
+
40
+ delete_unused_items do
41
+ self.content = ""
42
+ return unless assets_dir_exists?
43
+
44
+ ensure_update_items
45
+ save!
46
+ end
47
+ end
48
+
49
+ def ensure_update_items
50
+ if manifest_exists?
51
+ ensure_manifest_groups_cards
52
+ else
53
+ ensure_item local_group_name, local_folder_group_type_id
54
+ end
55
+ end
56
+
57
+ def delete_unused_items
58
+ @old_items = ::Set.new item_keys
59
+ yield
60
+ remove_deprecated_items @old_items
61
+ end
62
+
63
+ def assets_dir_exists?
64
+ path = assets_path
65
+ path && Dir.exist?(path)
66
+ end
67
+
68
+ def manifest_exists?
69
+ manifest_path && File.exist?(manifest_path)
70
+ end
71
+
72
+ def manifest_group_items group_name
73
+ manifest.dig(group_name, "items") || []
74
+ end
75
+
76
+ def manifest_group_minimize? group_name
77
+ manifest.dig group_name, "minimize"
78
+ end
79
+
80
+ def manifest
81
+ @manifest ||= YAML.load_file manifest_path
82
+ end
83
+
84
+ def with_manifest_groups
85
+ manifest.each_pair do |key, config|
86
+ yield key, config
87
+ end
88
+ end
89
+
90
+ def ensure_manifest_groups_cards
91
+ with_manifest_groups { |group_name, config| new_manifest_group group_name, config }
92
+ end
93
+
94
+ def new_manifest_group group_name, config
95
+ type_id =
96
+ config["remote"] ? ::Card::RemoteManifestGroupID : local_manifest_group_type_id
97
+ ensure_item group_name, type_id
98
+ end
99
+
100
+ def ensure_item field, type_id
101
+ item_name = "#{name}+#{field}"
102
+ ensure_item_content item_name
103
+
104
+ card = Card[item_name]
105
+ args = ensure_item_args field, type_id, item_name
106
+ return if item_already_coded? card, args
107
+
108
+ ensure_item_save card, args
109
+ card.try :update_machine_output
110
+ end
111
+
112
+ def item_already_coded? card, args
113
+ card&.type_id == args[:type_id] && card.codename == args[:codename]
114
+ end
115
+
116
+ def ensure_item_content item_name
117
+ @old_items.delete item_name.to_name.key
118
+ add_item item_name
119
+ end
120
+
121
+ def ensure_item_save card, args
122
+ if card
123
+ card.update args
124
+ else
125
+ Card.create! args
126
+ end
127
+ end
128
+
129
+ def ensure_item_args field, type_id, name
130
+ {
131
+ type_id: type_id,
132
+ codename: "#{mod_name}_group__#{field}",
133
+ name: name
134
+ }
135
+ end
136
+
137
+ def refresh_output force: false
138
+ update_items
139
+ item_cards.each do |item_card|
140
+ item_card.try :refresh_output, force: force
141
+ end
142
+ end
143
+
144
+ def make_machine_output_coded verbose=false
145
+ item_cards.each do |item_card|
146
+ puts "coding machine output for #{item_card.name}" if verbose
147
+ item_card.try(:make_machine_output_coded, mod_name)
148
+ end
149
+ end
150
+
151
+ def no_action?
152
+ new? && !assets_dir_exists?
153
+ end
154
+
155
+ private
156
+
157
+ # def groups_changed?
158
+ # expected_items = expected_item_keys
159
+ # actual_items = item_keys
160
+ # difference = (expected_items + actual_items) - (expected_items & actual_items)
161
+ # difference.present?
162
+ # end
163
+
164
+ def remove_deprecated_items items
165
+ items.each do |deprecated_item|
166
+ next unless (item_card = Card.fetch(deprecated_item))
167
+ item_card.update codename: nil
168
+ item_card.delete
169
+ end
170
+ end
data/set/type/mod.rb ADDED
@@ -0,0 +1,52 @@
1
+ def ensure_mod_script_card
2
+ ensure_mod_asset_card :script, Card::ModScriptAssetsID
3
+ end
4
+
5
+ def ensure_mod_style_card
6
+ ensure_mod_asset_card :style, Card::ModStyleAssetsID
7
+ end
8
+
9
+ private
10
+
11
+ def ensure_mod_asset_card asset_type, type_id
12
+ asset_card = fetch_mod_assets_card asset_type, type_id
13
+ return if asset_card.no_action?
14
+ asset_card.save! if asset_card.new?
15
+
16
+ asset_card.update_items
17
+ if asset_card.item_cards.present?
18
+ add_asset asset_type
19
+ else
20
+ drop_asset asset_type, asset_card
21
+ end
22
+ end
23
+
24
+ def add_asset asset_type
25
+ all_rule(asset_type).add_item! codename_for(asset_type).to_sym
26
+ end
27
+
28
+ def drop_asset asset_type, asset_card
29
+ asset_card.update codename: nil
30
+ asset_card.delete update_referers: true
31
+ all_rule(asset_type).drop_item! asset_card
32
+ end
33
+
34
+ def codename_for asset_type
35
+ "#{codename}_#{asset_type}"
36
+ end
37
+
38
+ def all_rule asset_type
39
+ Card[:all, asset_type]
40
+ end
41
+
42
+ def fetch_mod_assets_card asset_type, type_id
43
+ codename = codename_for asset_type
44
+ if Card::Codename.exists? codename
45
+ Card[codename.to_sym]
46
+ else
47
+ Card.fetch [name, asset_type], new: {
48
+ type_id: type_id,
49
+ codename: codename
50
+ }
51
+ end
52
+ end
@@ -0,0 +1,38 @@
1
+ include_set Abstract::ReadOnly
2
+ include_set Abstract::ManifestGroup
3
+
4
+ def local?
5
+ @local = false
6
+ end
7
+
8
+ def minimize?
9
+ @minimize = false
10
+ end
11
+
12
+ def paths
13
+ return [] unless left
14
+
15
+ left.manifest_group_items group_name
16
+ end
17
+
18
+ def item_names _content=nil
19
+ paths
20
+ end
21
+
22
+ def content
23
+ paths.join "\n"
24
+ end
25
+
26
+ format :html do
27
+ view :javascript_include_tag do
28
+ paths.map do |path|
29
+ javascript_include_tag path
30
+ end.join("\n")
31
+ end
32
+
33
+ view :stylesheet_include_tag do
34
+ paths.map do |path|
35
+ tag "link", href: path, media: "all", rel: "stylesheet", type: "text/css"
36
+ end.join("\n")
37
+ end
38
+ end
metadata ADDED
@@ -0,0 +1,102 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: card-mod-assets
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.13.0
5
+ platform: ruby
6
+ authors:
7
+ - Ethan McCutchen
8
+ - Philipp Kühl
9
+ - Gerry Gleason
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2021-08-06 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: card
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - '='
20
+ - !ruby/object:Gem::Version
21
+ version: 1.103.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - '='
27
+ - !ruby/object:Gem::Version
28
+ version: 1.103.0
29
+ - !ruby/object:Gem::Dependency
30
+ name: card-mod-machines
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - '='
34
+ - !ruby/object:Gem::Version
35
+ version: 0.13.0
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - '='
41
+ - !ruby/object:Gem::Version
42
+ version: 0.13.0
43
+ - !ruby/object:Gem::Dependency
44
+ name: card-mod-content
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - '='
48
+ - !ruby/object:Gem::Version
49
+ version: 0.13.0
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - '='
55
+ - !ruby/object:Gem::Version
56
+ version: 0.13.0
57
+ description: ''
58
+ email:
59
+ - info@decko.org
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - db/migrate_core_cards/20200806112346_add_mod_type.rb
65
+ - set/abstract/01_manifest_group.rb
66
+ - set/abstract/asset_file.rb
67
+ - set/abstract/asset_list.rb
68
+ - set/abstract/local_folder_group.rb
69
+ - set/abstract/local_manifest_group.rb
70
+ - set/abstract/mod_assets.rb
71
+ - set/type/mod.rb
72
+ - set/type/remote_manifest_group.rb
73
+ homepage: https://decko.org
74
+ licenses:
75
+ - GPL-3.0
76
+ metadata:
77
+ source_code_uri: https://github.com/decko-commons/decko
78
+ homepage_uri: https://decko.org
79
+ bug_tracker_uri: https://github.com/decko-commons/decko/issues
80
+ wiki_uri: https://decko.org
81
+ documentation_url: http://docs.decko.org/
82
+ card-mod: assets
83
+ post_install_message:
84
+ rdoc_options: []
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '2.5'
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ requirements: []
98
+ rubygems_version: 3.1.6
99
+ signing_key:
100
+ specification_version: 4
101
+ summary: decko asset pipeline
102
+ test_files: []