card-mod-assets 0.13.0

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.
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: []