card 1.16.13 → 1.16.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/db/migrate_core_cards/20150501010515_responsive_sidebar.rb +11 -0
  4. data/db/schema.rb +1 -1
  5. data/lib/card/auth.rb +3 -2
  6. data/lib/card/env.rb +1 -1
  7. data/lib/card/loader.rb +79 -40
  8. data/lib/card/query.rb +5 -5
  9. data/lib/card/query/sql_statement.rb +10 -4
  10. data/lib/card/query/value.rb +5 -8
  11. data/lib/card/set.rb +0 -1
  12. data/lib/cardio.rb +18 -22
  13. data/mod/01_core/chunk/link.rb +37 -34
  14. data/mod/01_core/chunk/query_reference.rb +1 -1
  15. data/mod/01_core/set/all/fetch.rb +66 -58
  16. data/mod/01_core/set/all/permissions.rb +84 -83
  17. data/mod/01_core/set/all/templating.rb +6 -5
  18. data/mod/01_core/set/all/type.rb +16 -14
  19. data/mod/02_basic_types/set/all/base.rb +3 -3
  20. data/mod/02_basic_types/set/type/pointer.rb +4 -4
  21. data/mod/02_basic_types/spec/set/all/base_spec.rb +16 -1
  22. data/mod/03_machines/lib/javascript/wagn_mod.js.coffee +65 -0
  23. data/mod/05_email/set/all/follow.rb +6 -10
  24. data/mod/05_email/set/type/email_template.rb +1 -1
  25. data/mod/05_standard/lib/file_uploader.rb +39 -41
  26. data/mod/05_standard/set/all/account.rb +18 -20
  27. data/mod/05_standard/set/all/rich_html/toolbar.rb +1 -1
  28. data/mod/05_standard/set/right/account.rb +2 -2
  29. data/mod/05_standard/set/right/email.rb +14 -13
  30. data/mod/05_standard/set/right/password.rb +20 -12
  31. data/mod/05_standard/set/right/status.rb +2 -2
  32. data/mod/05_standard/set/self/head.rb +66 -53
  33. data/mod/05_standard/set/type/search_type.rb +3 -2
  34. data/mod/05_standard/set/type/set.rb +3 -3
  35. data/mod/06_bootstrap/lib/stylesheets/bootstrap_cards.scss +50 -0
  36. data/spec/lib/card/query_spec.rb +7 -0
  37. data/spec/spec_helper.rb +1 -1
  38. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9b4c4b233a9fa1a8b66a5483176b3be1d2dc9e69
4
- data.tar.gz: 0460c51269cf97f2e68f667277853c5fe0476311
3
+ metadata.gz: 5bff967a00719608171fe172a88f9e1d6771217a
4
+ data.tar.gz: 4d71791152c3662e0412e41986a395171bd457e3
5
5
  SHA512:
6
- metadata.gz: ecfd9c469003937a66110be1877a44cc05381b8f6cf18c3e3b886a289aec699639525edcf1d3996e5338def8cd84c62987a17e9dde98540fff2f95e32ee45d04
7
- data.tar.gz: 5eefe47c2c3c194cef8a1107935834b50f4973b9c8650f1ebd2f6310e61ef1e0a93da616f84ec5f88ad28a46aa33d89276e0f7bff9de1c326bb40a71bae92317
6
+ metadata.gz: 86f5d9f8cb45509e260ffc05f38c2fb6af60c5f855ef90d285df72ffe18b4ce94aeeb4a4e8bb89397bec239bc97aecfd1026a758c1fa16e388156866019c1e63
7
+ data.tar.gz: 4fc615ab61f11cbe7afba28a165430e8bc833651e1cf537181963fffaf74cafea1f90a89a01b87658d0f7579ea659102cb9980f7bb7860c50ec3a74573d6413a
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.16.13
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
@@ -126,4 +126,4 @@ ActiveRecord::Schema.define(version: 20151105225559) do
126
126
  t.integer "account_id", limit: 4, null: false
127
127
  end
128
128
 
129
- end
129
+ end
@@ -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: { codename: ['in'] + NON_CREATEABLE_TYPES }
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
@@ -9,7 +9,7 @@ class Card
9
9
  def reset args={}
10
10
  @@env = { main_name: nil }
11
11
 
12
- if c = args[:controller]
12
+ if (c = args[:controller])
13
13
  self[:controller] = c
14
14
  self[:session] = c.request.session
15
15
  self[:params] = c.params
@@ -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( dirname ) do |filename|
77
+ Dir.foreach(dirname) do |filename|
37
78
  next if filename =~ /^\./
38
- hash[ filename.gsub /\.html$/, '' ] = File.read( [dirname, filename] * '/' )
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( dirname ).sort.map do |filename|
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( dirname ).sort.each do |filename|
71
- if m = filename.match( /^(\d+_)?([^\.]*).rb/) and key = m[2]
72
- filename = [ dirname, filename ] * '/'
73
- SetPattern.write_tmp_file key, filename, seq
74
- seq = seq + 1
75
- end
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 core mod.
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
- if prepare_tmp_dir 'tmp/set'
98
- seq = 1
99
- mod_dirs.each do |mod_dir|
100
- mod_tmp_dir = make_set_module_tmp_dir mod_dir, seq
101
- Dir.glob("#{mod_dir}/set/**/*.rb").each do |abs_filename|
102
- rel_filename = abs_filename.gsub "#{mod_dir}/set/", ''
103
- tmp_filename = "#{mod_tmp_dir}/#{rel_filename}"
104
- Set.write_tmp_file abs_filename, tmp_filename, rel_filename
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).unshift 'abstract'
114
- Dir.glob( "#{Card.paths['tmp/set'].first}/*" ).sort.each do |tmp_mod|
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(/[^\/]+$/)[0]
126
- mod_tmp_dir = "#{Card.paths['tmp/set'].first}/mod#{"%03d" % seq}-#{modname}"
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
- if rewrite_tmp_files?
134
- p = Card.paths[ path ]
135
- if p.existent.first
136
- FileUtils.rm_rf p.first, secure: true
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?( @@rewrite )
183
+ if defined?(@@rewrite)
144
184
  @@rewrite
145
185
  else
146
- @@rewrite = !( Rails.env.production? and Card.paths['tmp/set'].existent.first )
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
- # puts Benchmark.measure("from #load_dir: rd: #{file}") {
193
+ # puts Benchmark.measure("from #load_dir: rd: #{file}") {
153
194
  require_dependency file
154
- # }.format("%n: %t %r")
195
+ # }.format('%n: %t %r')
155
196
  end
156
197
  end
157
198
  end
158
199
  end
159
-
160
200
  end
161
-
@@ -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
- query = new statement
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
- ["SELECT DISTINCT #{@fields}",
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.nil? ? 1 : read_rules.join(',')
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(txt)
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(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
@@ -13,14 +13,11 @@ class Card
13
13
  end
14
14
 
15
15
  def parse_value rawvalue
16
- operator =
17
- case rawvalue
18
- when Array; rawvalue.shift
19
- when String; '='
20
- when Integer; '='
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
@@ -216,7 +216,6 @@ class Card
216
216
  class_eval do
217
217
  define_method event do
218
218
  # Rails.logger.rspec event
219
- # puts "#{self.name}: #{event}"
220
219
  run_callbacks event do
221
220
  send call_method
222
221
  end
@@ -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 "empty database"
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, :file_store, 'tmp/cache'
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 "db"
71
+ add_path 'db'
74
72
  add_path 'db/migrate'
75
- add_path "db/migrate_core_cards"
76
- add_path "db/migrate_deck_cards", root: root, with: 'db/migrate_cards'
77
- add_path "db/seeds", with: "db/seeds.rb"
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( "#{mod_path}/*/initializers" ).each do |initializers_dir|
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
- ## used in test data
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 Cardio.schema(type), Cardio.migration_paths(type)
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 "failed to remove tmp files"
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( schema_stamp_path type ).strip
158
+ File.read(schema_stamp_path type).strip
161
159
  end
162
160
 
163
161
  def schema_stamp_path type
164
- root_dir = ( type == :deck_cards ? root : gem_root )
165
- stamp_dir = ENV['SCHEMA_STAMP_PATH'] || File.join( root_dir, 'db' )
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
-