card 1.16.13 → 1.16.14
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 +4 -4
- data/VERSION +1 -1
- data/db/migrate_core_cards/20150501010515_responsive_sidebar.rb +11 -0
- data/db/schema.rb +1 -1
- data/lib/card/auth.rb +3 -2
- data/lib/card/env.rb +1 -1
- data/lib/card/loader.rb +79 -40
- data/lib/card/query.rb +5 -5
- data/lib/card/query/sql_statement.rb +10 -4
- data/lib/card/query/value.rb +5 -8
- data/lib/card/set.rb +0 -1
- data/lib/cardio.rb +18 -22
- data/mod/01_core/chunk/link.rb +37 -34
- data/mod/01_core/chunk/query_reference.rb +1 -1
- data/mod/01_core/set/all/fetch.rb +66 -58
- data/mod/01_core/set/all/permissions.rb +84 -83
- data/mod/01_core/set/all/templating.rb +6 -5
- data/mod/01_core/set/all/type.rb +16 -14
- data/mod/02_basic_types/set/all/base.rb +3 -3
- data/mod/02_basic_types/set/type/pointer.rb +4 -4
- data/mod/02_basic_types/spec/set/all/base_spec.rb +16 -1
- data/mod/03_machines/lib/javascript/wagn_mod.js.coffee +65 -0
- data/mod/05_email/set/all/follow.rb +6 -10
- data/mod/05_email/set/type/email_template.rb +1 -1
- data/mod/05_standard/lib/file_uploader.rb +39 -41
- data/mod/05_standard/set/all/account.rb +18 -20
- data/mod/05_standard/set/all/rich_html/toolbar.rb +1 -1
- data/mod/05_standard/set/right/account.rb +2 -2
- data/mod/05_standard/set/right/email.rb +14 -13
- data/mod/05_standard/set/right/password.rb +20 -12
- data/mod/05_standard/set/right/status.rb +2 -2
- data/mod/05_standard/set/self/head.rb +66 -53
- data/mod/05_standard/set/type/search_type.rb +3 -2
- data/mod/05_standard/set/type/set.rb +3 -3
- data/mod/06_bootstrap/lib/stylesheets/bootstrap_cards.scss +50 -0
- data/spec/lib/card/query_spec.rb +7 -0
- data/spec/spec_helper.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5bff967a00719608171fe172a88f9e1d6771217a
|
4
|
+
data.tar.gz: 4d71791152c3662e0412e41986a395171bd457e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 86f5d9f8cb45509e260ffc05f38c2fb6af60c5f855ef90d285df72ffe18b4ce94aeeb4a4e8bb89397bec239bc97aecfd1026a758c1fa16e388156866019c1e63
|
7
|
+
data.tar.gz: 4fc615ab61f11cbe7afba28a165430e8bc833651e1cf537181963fffaf74cafea1f90a89a01b87658d0f7579ea659102cb9980f7bb7860c50ec3a74573d6413a
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.16.
|
1
|
+
1.16.14
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
class ResponsiveSidebar < Card::CoreMigration
|
4
|
+
def up
|
5
|
+
if (layout = Card.fetch 'Default Layout') &&
|
6
|
+
layout.updater.id == Card::WagnBotID
|
7
|
+
new_content = layout.content.gsub '<body>', '<body class="right-sidebar">'
|
8
|
+
layout.update_attributes! content: new_content
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/db/schema.rb
CHANGED
data/lib/card/auth.rb
CHANGED
@@ -5,7 +5,6 @@ class Card
|
|
5
5
|
@@as_card = @@as_id = @@current_id = @@current = nil
|
6
6
|
@@simulating_setup_need = nil
|
7
7
|
|
8
|
-
NON_CREATEABLE_TYPES = %w{ signup setting set } # NEED API
|
9
8
|
SETUP_COMPLETED_KEY = 'SETUP_COMPLETED'
|
10
9
|
|
11
10
|
# after_save :reset_instance_cache
|
@@ -214,7 +213,9 @@ class Card
|
|
214
213
|
def createable_types
|
215
214
|
type_names = Auth.as_bot do
|
216
215
|
Card.search type: Card::CardtypeID, return: :name,
|
217
|
-
not: {
|
216
|
+
not: {
|
217
|
+
codename: ['in'] + Card.config.non_createable_types
|
218
|
+
}
|
218
219
|
end
|
219
220
|
type_names.select do |name|
|
220
221
|
Card.new(type: name).ok? :create
|
data/lib/card/env.rb
CHANGED
data/lib/card/loader.rb
CHANGED
@@ -15,12 +15,53 @@ class Card
|
|
15
15
|
end
|
16
16
|
|
17
17
|
module Loader
|
18
|
-
|
19
18
|
class << self
|
20
19
|
def load_mods
|
21
20
|
load_set_patterns
|
22
21
|
load_formats
|
23
22
|
load_sets
|
23
|
+
|
24
|
+
if ENV['RAILS_ENV'] == 'development'
|
25
|
+
update_machine_output_hack
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def update_machine_output_hack
|
30
|
+
update_script_output
|
31
|
+
update_style_output
|
32
|
+
end
|
33
|
+
|
34
|
+
def update_script_output
|
35
|
+
script = Card['*all+*script']
|
36
|
+
return unless (mtime_output = script.machine_output_card.updated_at)
|
37
|
+
['wagn_mod.js.coffee', 'wagn.js.coffee',
|
38
|
+
'script_card_menu.js.coffee'].each do |name|
|
39
|
+
mtime_file = File.mtime(
|
40
|
+
"#{Cardio.gem_root}/mod/03_machines/lib/javascript/#{name}"
|
41
|
+
)
|
42
|
+
if mtime_file > mtime_output
|
43
|
+
script.update_machine_output
|
44
|
+
break
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def update_style_output
|
50
|
+
style = Card['*all+*style']
|
51
|
+
return unless (mtime_output = style.machine_output_card.updated_at)
|
52
|
+
style.machine_input_card.item_cards.each do |i_card|
|
53
|
+
next unless i_card.codename
|
54
|
+
['03_machines', '06_bootstrap'].each do |mod|
|
55
|
+
style_dir = "#{Cardio.gem_root}/mod/#{mod}/lib/stylesheets"
|
56
|
+
file_path = "#{style_dir}/#{i_card.codename}.scss"
|
57
|
+
next unless File.exist? file_path
|
58
|
+
mtime_file = File.mtime file_path
|
59
|
+
if mtime_file > mtime_output
|
60
|
+
style.update_machine_output
|
61
|
+
break
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
24
65
|
end
|
25
66
|
|
26
67
|
def load_chunks
|
@@ -33,9 +74,10 @@ class Card
|
|
33
74
|
mod_dirs.inject({}) do |hash, mod|
|
34
75
|
dirname = "#{mod}/layout"
|
35
76
|
if File.exists? dirname
|
36
|
-
Dir.foreach(
|
77
|
+
Dir.foreach(dirname) do |filename|
|
37
78
|
next if filename =~ /^\./
|
38
|
-
hash[
|
79
|
+
hash[filename.gsub /\.html$/, ''] =
|
80
|
+
File.read([dirname, filename] * '/')
|
39
81
|
end
|
40
82
|
end
|
41
83
|
hash
|
@@ -45,7 +87,7 @@ class Card
|
|
45
87
|
def mod_dirs
|
46
88
|
@@mod_dirs ||= begin
|
47
89
|
Card.paths['mod'].existent.map do |dirname|
|
48
|
-
Dir.entries(
|
90
|
+
Dir.entries(dirname).sort.map do |filename|
|
49
91
|
"#{dirname}/#{filename}" if filename !~ /^\./
|
50
92
|
end.compact
|
51
93
|
end.flatten.compact
|
@@ -67,19 +109,21 @@ class Card
|
|
67
109
|
mod_dirs.each do |mod|
|
68
110
|
dirname = "#{mod}/set_pattern"
|
69
111
|
if Dir.exists? dirname
|
70
|
-
Dir.entries(
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
112
|
+
Dir.entries(dirname).sort.each do |filename|
|
113
|
+
m = filename.match(/^(\d+_)?([^\.]*).rb/)
|
114
|
+
key = m && m[2]
|
115
|
+
next unless key
|
116
|
+
filename = [dirname, filename] * '/'
|
117
|
+
SetPattern.write_tmp_file key, filename, seq
|
118
|
+
seq = seq + 1
|
76
119
|
end
|
77
120
|
end
|
78
121
|
end
|
79
122
|
end
|
80
123
|
|
81
124
|
def load_formats
|
82
|
-
#cheating on load issues now by putting all inherited-from formats in
|
125
|
+
# cheating on load issues now by putting all inherited-from formats in
|
126
|
+
# core mod.
|
83
127
|
mod_dirs.each do |mod|
|
84
128
|
load_dir "#{mod}/format/*.rb"
|
85
129
|
end
|
@@ -92,26 +136,24 @@ class Card
|
|
92
136
|
Set.clean_empty_modules
|
93
137
|
end
|
94
138
|
|
95
|
-
|
96
139
|
def generate_tmp_set_modules
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
end
|
106
|
-
seq = seq + 1
|
140
|
+
return unless prepare_tmp_dir 'tmp/set'
|
141
|
+
seq = 1
|
142
|
+
mod_dirs.each do |mod_dir|
|
143
|
+
mod_tmp_dir = make_set_module_tmp_dir mod_dir, seq
|
144
|
+
Dir.glob("#{mod_dir}/set/**/*.rb").each do |abs_filename|
|
145
|
+
rel_filename = abs_filename.gsub "#{mod_dir}/set/", ''
|
146
|
+
tmp_filename = "#{mod_tmp_dir}/#{rel_filename}"
|
147
|
+
Set.write_tmp_file abs_filename, tmp_filename, rel_filename
|
107
148
|
end
|
149
|
+
seq = seq + 1
|
108
150
|
end
|
109
151
|
end
|
110
152
|
|
111
|
-
|
112
153
|
def load_tmp_set_modules
|
113
|
-
patterns = Card.set_patterns.reverse.map(&:pattern_code)
|
114
|
-
|
154
|
+
patterns = Card.set_patterns.reverse.map(&:pattern_code)
|
155
|
+
.unshift 'abstract'
|
156
|
+
Dir.glob("#{Card.paths['tmp/set'].first}/*").sort.each do |tmp_mod|
|
115
157
|
patterns.each do |pattern|
|
116
158
|
pattern_dir = "#{tmp_mod}/#{pattern}"
|
117
159
|
if Dir.exists? pattern_dir
|
@@ -122,40 +164,37 @@ class Card
|
|
122
164
|
end
|
123
165
|
|
124
166
|
def make_set_module_tmp_dir mod_dir, seq
|
125
|
-
modname = mod_dir.match(
|
126
|
-
mod_tmp_dir = "#{Card.paths['tmp/set'].first}/mod#{
|
167
|
+
modname = mod_dir.match(%r{[^/]+$})[0]
|
168
|
+
mod_tmp_dir = "#{Card.paths['tmp/set'].first}/mod#{'%03d' % seq}-#{modname}"
|
127
169
|
Dir.mkdir mod_tmp_dir
|
128
170
|
mod_tmp_dir
|
129
171
|
end
|
130
172
|
|
131
|
-
|
132
173
|
def prepare_tmp_dir path
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
end
|
138
|
-
Dir.mkdir p.first
|
174
|
+
return unless rewrite_tmp_files?
|
175
|
+
p = Card.paths[path]
|
176
|
+
if p.existent.first
|
177
|
+
FileUtils.rm_rf p.first, secure: true
|
139
178
|
end
|
179
|
+
Dir.mkdir p.first
|
140
180
|
end
|
141
181
|
|
142
182
|
def rewrite_tmp_files?
|
143
|
-
if defined?(
|
183
|
+
if defined?(@@rewrite)
|
144
184
|
@@rewrite
|
145
185
|
else
|
146
|
-
@@rewrite = !(
|
186
|
+
@@rewrite = !(Rails.env.production? &&
|
187
|
+
Card.paths['tmp/set'].existent.first)
|
147
188
|
end
|
148
189
|
end
|
149
190
|
|
150
191
|
def load_dir dir
|
151
192
|
Dir[dir].sort.each do |file|
|
152
|
-
#
|
193
|
+
# puts Benchmark.measure("from #load_dir: rd: #{file}") {
|
153
194
|
require_dependency file
|
154
|
-
#
|
195
|
+
# }.format('%n: %t %r')
|
155
196
|
end
|
156
197
|
end
|
157
198
|
end
|
158
199
|
end
|
159
|
-
|
160
200
|
end
|
161
|
-
|
data/lib/card/query.rb
CHANGED
@@ -70,11 +70,12 @@ class Card
|
|
70
70
|
|
71
71
|
DEFAULT_ORDER_DIRS = { :update => "desc", :relevance => "desc" }
|
72
72
|
|
73
|
-
attr_reader :statement, :mods, :conditions,
|
73
|
+
attr_reader :statement, :mods, :conditions, :comment,
|
74
74
|
:subqueries, :superquery
|
75
75
|
attr_accessor :joins, :table_seq, :unjoined, :conditions_on_join
|
76
76
|
|
77
|
-
def initialize statement
|
77
|
+
def initialize statement, comment=nil
|
78
|
+
@comment = comment
|
78
79
|
@subqueries = []
|
79
80
|
@conditions = []
|
80
81
|
@joins = []
|
@@ -96,9 +97,8 @@ class Card
|
|
96
97
|
# a card identifier from SQL and then hooking into our caching system (see
|
97
98
|
# Card::Fetch)
|
98
99
|
|
99
|
-
def self.run statement
|
100
|
-
|
101
|
-
query.run
|
100
|
+
def self.run statement, comment=nil
|
101
|
+
new(statement, comment).run
|
102
102
|
end
|
103
103
|
|
104
104
|
# run the current query
|
@@ -18,7 +18,8 @@ class Card
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def to_s
|
21
|
-
[
|
21
|
+
[comment,
|
22
|
+
"SELECT DISTINCT #{@fields}",
|
22
23
|
"FROM #{@tables}",
|
23
24
|
@joins,
|
24
25
|
@where,
|
@@ -28,6 +29,11 @@ class Card
|
|
28
29
|
].compact * "\n"
|
29
30
|
end
|
30
31
|
|
32
|
+
def comment
|
33
|
+
return nil unless Card.config.sql_comments && @query.comment
|
34
|
+
"/* #{@query.comment} */"
|
35
|
+
end
|
36
|
+
|
31
37
|
def tables
|
32
38
|
"cards #{@query.table_alias}"
|
33
39
|
end
|
@@ -150,7 +156,7 @@ class Card
|
|
150
156
|
def permission_conditions query
|
151
157
|
return if Auth.always_ok?
|
152
158
|
read_rules = Auth.as_card.read_rules
|
153
|
-
read_rule_list = read_rules.
|
159
|
+
read_rule_list = read_rules.present? ? read_rules.join(',') : 1
|
154
160
|
"#{query.table_alias}.read_rule_id IN (#{read_rule_list})"
|
155
161
|
end
|
156
162
|
|
@@ -210,7 +216,7 @@ class Card
|
|
210
216
|
"#{order_field} #{dir}"
|
211
217
|
end
|
212
218
|
|
213
|
-
def safe_sql
|
219
|
+
def safe_sql txt
|
214
220
|
txt = txt.to_s
|
215
221
|
if txt.match(/[^\w\*\(\)\s\.\,]/)
|
216
222
|
fail "WQL contains disallowed characters: #{txt}"
|
@@ -219,7 +225,7 @@ class Card
|
|
219
225
|
end
|
220
226
|
end
|
221
227
|
|
222
|
-
def cast_type
|
228
|
+
def cast_type type
|
223
229
|
cxn ||= ActiveRecord::Base.connection
|
224
230
|
(val = cxn.cast_types[type.to_sym]) ? val[:name] : safe_sql(type)
|
225
231
|
end
|
data/lib/card/query/value.rb
CHANGED
@@ -13,14 +13,11 @@ class Card
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def parse_value rawvalue
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
else raise("Invalid Condition Clause #{rawvalue}.inspect}")
|
22
|
-
end
|
23
|
-
[operator, rawvalue]
|
16
|
+
case rawvalue
|
17
|
+
when String, Integer then ['=', rawvalue]
|
18
|
+
when Array then [rawvalue[0], rawvalue[1..-1]]
|
19
|
+
else raise("Invalid Condition Clause #{rawvalue}.inspect}")
|
20
|
+
end
|
24
21
|
end
|
25
22
|
|
26
23
|
def canonicalize_operator
|
data/lib/card/set.rb
CHANGED
data/lib/cardio.rb
CHANGED
@@ -2,16 +2,14 @@
|
|
2
2
|
|
3
3
|
require 'active_support/core_ext/numeric/time'
|
4
4
|
|
5
|
-
|
6
5
|
module Cardio
|
7
|
-
|
8
6
|
CARD_GEM_ROOT = File.expand_path('../..', __FILE__)
|
9
7
|
|
10
8
|
ActiveSupport.on_load :card do
|
11
9
|
if Card.take
|
12
10
|
Card::Loader.load_mods
|
13
11
|
else
|
14
|
-
Rails.logger.warn
|
12
|
+
Rails.logger.warn 'empty database'
|
15
13
|
end
|
16
14
|
end
|
17
15
|
|
@@ -36,7 +34,7 @@ module Cardio
|
|
36
34
|
set_default_value config, :recaptcha_private_key, nil
|
37
35
|
set_default_value config, :recaptcha_proxy, nil
|
38
36
|
|
39
|
-
set_default_value config, :cache_store,
|
37
|
+
set_default_value config, :cache_store, :file_store, 'tmp/cache'
|
40
38
|
set_default_value config, :override_host, nil
|
41
39
|
set_default_value config, :override_protocol, nil
|
42
40
|
|
@@ -52,6 +50,7 @@ module Cardio
|
|
52
50
|
set_default_value config, :space_last_in_multispace, true
|
53
51
|
set_default_value config, :closed_search_limit, 50
|
54
52
|
|
53
|
+
set_default_value config, :non_createable_types, %w{ signup setting set }
|
55
54
|
set_default_value config, :view_cache, false
|
56
55
|
end
|
57
56
|
|
@@ -62,7 +61,6 @@ module Cardio
|
|
62
61
|
config.send("#{setting}=", *value) unless config.respond_to? setting
|
63
62
|
end
|
64
63
|
|
65
|
-
|
66
64
|
def set_paths paths
|
67
65
|
@@paths = paths
|
68
66
|
add_path 'tmp/set', root: root
|
@@ -70,20 +68,18 @@ module Cardio
|
|
70
68
|
|
71
69
|
add_path 'mod'
|
72
70
|
|
73
|
-
add_path
|
71
|
+
add_path 'db'
|
74
72
|
add_path 'db/migrate'
|
75
|
-
add_path
|
76
|
-
add_path
|
77
|
-
add_path
|
73
|
+
add_path 'db/migrate_core_cards'
|
74
|
+
add_path 'db/migrate_deck_cards', root: root, with: 'db/migrate_cards'
|
75
|
+
add_path 'db/seeds', with: 'db/seeds.rb'
|
78
76
|
|
79
77
|
add_path 'config/initializers', glob: '**/*.rb'
|
80
|
-
|
81
78
|
end
|
82
79
|
|
83
|
-
|
84
80
|
def set_mod_paths
|
85
81
|
each_mod_path do |mod_path|
|
86
|
-
Dir.glob(
|
82
|
+
Dir.glob("#{mod_path}/*/initializers").each do |initializers_dir|
|
87
83
|
paths['config/initializers'] << initializers_dir
|
88
84
|
end
|
89
85
|
end
|
@@ -105,13 +101,13 @@ module Cardio
|
|
105
101
|
|
106
102
|
def add_path path, options={}
|
107
103
|
root = options.delete(:root) || gem_root
|
108
|
-
options[:with] = File.join(root, (options[:with] || path)
|
104
|
+
options[:with] = File.join(root, (options[:with] || path))
|
109
105
|
paths.add path, options
|
110
106
|
end
|
111
107
|
|
112
108
|
def future_stamp
|
113
|
-
|
114
|
-
@@future_stamp ||= Time.local 2020,1,1,0,0,0
|
109
|
+
# # used in test data
|
110
|
+
@@future_stamp ||= Time.zone.local 2020, 1, 1, 0, 0, 0
|
115
111
|
end
|
116
112
|
|
117
113
|
def migration_paths type
|
@@ -126,7 +122,9 @@ module Cardio
|
|
126
122
|
|
127
123
|
def assume_migrated_upto_version type
|
128
124
|
Cardio.schema_mode(type) do
|
129
|
-
ActiveRecord::Schema.assume_migrated_upto_version
|
125
|
+
ActiveRecord::Schema.assume_migrated_upto_version(
|
126
|
+
Cardio.schema(type), Cardio.migration_paths(type)
|
127
|
+
)
|
130
128
|
end
|
131
129
|
end
|
132
130
|
|
@@ -143,7 +141,7 @@ module Cardio
|
|
143
141
|
dir += "/#{id}" if id
|
144
142
|
FileUtils.rm_rf dir, secure: true
|
145
143
|
rescue
|
146
|
-
Rails.logger.info
|
144
|
+
Rails.logger.info 'failed to remove tmp files'
|
147
145
|
end
|
148
146
|
|
149
147
|
def schema_mode type
|
@@ -157,16 +155,14 @@ module Cardio
|
|
157
155
|
end
|
158
156
|
|
159
157
|
def schema type=nil
|
160
|
-
File.read(
|
158
|
+
File.read(schema_stamp_path type).strip
|
161
159
|
end
|
162
160
|
|
163
161
|
def schema_stamp_path type
|
164
|
-
root_dir = (
|
165
|
-
stamp_dir = ENV['SCHEMA_STAMP_PATH'] || File.join(
|
162
|
+
root_dir = (type == :deck_cards ? root : gem_root)
|
163
|
+
stamp_dir = ENV['SCHEMA_STAMP_PATH'] || File.join(root_dir, 'db')
|
166
164
|
|
167
165
|
File.join stamp_dir, "version#{ schema_suffix(type) }.txt"
|
168
166
|
end
|
169
|
-
|
170
167
|
end
|
171
168
|
end
|
172
|
-
|