arturo 1.7.0 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -8,7 +8,6 @@ if (typeof(jQuery) === 'function') {
8
8
  var output = jQuery(output);
9
9
  var input = jQuery('#' + output.attr('for'));
10
10
  input.change(function() {
11
- console.log('input value changed to ' + input.val());
12
11
  output.val(input.val());
13
12
  });
14
13
  output.removeClass('no_js');
@@ -16,7 +15,7 @@ if (typeof(jQuery) === 'function') {
16
15
  }
17
16
  }
18
17
  };
19
-
18
+
20
19
  jQuery(function() {
21
20
  jQuery.arturo.linkAndShowOutputs();
22
21
  });
@@ -19,12 +19,16 @@ module Arturo
19
19
  module FeatureCaching
20
20
 
21
21
  def self.extended(base)
22
- class <<base
22
+ class << base
23
23
  alias_method_chain :to_feature, :caching
24
- attr_accessor :cache_ttl, :feature_cache
24
+ attr_accessor :cache_ttl, :feature_cache, :feature_caching_strategy
25
+ end
26
+ base.send(:after_save) do |f|
27
+ f.class.feature_caching_strategy.expire(f.class.feature_cache, f.symbol.to_sym) if f.class.caches_features?
25
28
  end
26
29
  base.cache_ttl = 0
27
30
  base.feature_cache = Arturo::FeatureCaching::Cache.new
31
+ base.feature_caching_strategy = AllStrategy
28
32
  end
29
33
 
30
34
  def caches_features?
@@ -35,30 +39,64 @@ module Arturo
35
39
  def to_feature_with_caching(feature_or_symbol)
36
40
  if !caches_features?
37
41
  to_feature_without_caching(feature_or_symbol)
38
- elsif (feature_or_symbol.kind_of?(Arturo::Feature))
39
- feature_cache.write(feature_or_symbol.symbol.to_sym, feature_or_symbol, :expires_in => cache_ttl)
42
+ elsif feature_or_symbol.kind_of?(Arturo::Feature)
40
43
  feature_or_symbol
41
- elsif (cached_feature = feature_cache.read(feature_or_symbol.to_sym))
42
- cached_feature
43
44
  else
44
45
  symbol = feature_or_symbol.to_sym
45
- feature = to_feature_without_caching(symbol)
46
- feature_cache.write(symbol, feature, :expires_in => cache_ttl)
47
- feature
46
+ feature_caching_strategy.fetch(feature_cache, symbol) { to_feature_without_caching(symbol) }
48
47
  end
49
48
  end
50
49
 
51
- # Warms the cache by fetching all `Feature`s and caching them.
52
- # This is perfect for use in an initializer.
53
50
  def warm_cache!
54
- raise "Cannot warm Feature Cache; caching is disabled" unless caches_features?
51
+ warn "Deprecated, no longer necessary!"
52
+ end
53
+
54
+ class AllStrategy
55
+ class << self
56
+ def fetch(cache, symbol, &block)
57
+ features = cache.read("arturo.all")
58
+
59
+ unless cache_is_current?(cache, features)
60
+ features = Hash[Arturo::Feature.all.map { |f| [f.symbol.to_sym, f] }]
61
+ mark_as_current!(cache)
62
+ cache.write("arturo.all", features, :expires_in => Arturo::Feature.cache_ttl * 10)
63
+ end
64
+
65
+ features[symbol] || Arturo::NoSuchFeature.new(symbol)
66
+ end
67
+
68
+ def expire(cache, symbol)
69
+ cache.delete("arturo.all")
70
+ end
71
+
72
+ private
73
+
74
+ def cache_is_current?(cache, features)
75
+ return unless features
76
+ return true if cache.read("arturo.current")
77
+ return false if features.values.map(&:updated_at).compact.max != Arturo::Feature.maximum(:updated_at)
78
+ mark_as_current!(cache)
79
+ end
55
80
 
56
- all.each do |feature|
57
- feature_cache.write(feature.symbol.to_sym, feature, :expires_in => cache_ttl)
81
+ def mark_as_current!(cache)
82
+ cache.write("arturo.current", true, :expires_in => Arturo::Feature.cache_ttl)
83
+ end
58
84
  end
59
85
  end
60
86
 
61
- protected
87
+ class OneStrategy
88
+ def self.fetch(cache, symbol, &block)
89
+ if feature = cache.read("arturo.#{symbol}")
90
+ feature
91
+ else
92
+ cache.write("arturo.#{symbol}", yield || Arturo::NoSuchFeature.new(symbol), :expires_in => Arturo::Feature.cache_ttl)
93
+ end
94
+ end
95
+
96
+ def self.expire(cache, symbol)
97
+ cache.delete("arturo.#{symbol}")
98
+ end
99
+ end
62
100
 
63
101
  # Quack like a Rails cache.
64
102
  class Cache
@@ -75,6 +113,10 @@ module Arturo
75
113
  end
76
114
  end
77
115
 
116
+ def delete(name)
117
+ @data.delete(name)
118
+ end
119
+
78
120
  def write(name, value, options = nil)
79
121
  expires_at = if options && options.respond_to?(:[]) && options[:expires_in]
80
122
  Time.now + options.delete(:expires_in)
@@ -8,6 +8,7 @@ Arturo.instance_eval do
8
8
  # @param [Symbol, String] name the feature name
9
9
  def enable_feature!(name)
10
10
  if feature = Arturo::Feature.find_feature(name)
11
+ feature = feature.class.find(feature.id) if feature.frozen?
11
12
  feature.update_attributes(:deployment_percentage => 100)
12
13
  else
13
14
  Arturo::Feature.create!(:symbol => name, :deployment_percentage => 100)
@@ -22,6 +23,7 @@ Arturo.instance_eval do
22
23
  # @param [Symbol, String] name the feature name
23
24
  def disable_feature!(name)
24
25
  if feature = Arturo::Feature.find_feature(name)
26
+ feature = feature.class.find(feature.id) if feature.frozen?
25
27
  feature.update_attributes(:deployment_percentage => 0)
26
28
  end
27
29
  end
@@ -4,11 +4,11 @@ module Arturo
4
4
  class AssetsGenerator < Rails::Generators::Base
5
5
 
6
6
  def self.source_root
7
- Arturo::Engine.root_path
7
+ File.join(File.dirname(__FILE__), 'templates')
8
8
  end
9
9
 
10
10
  def copy_assets
11
- copy_file 'lib/generators/arturo/templates/arturo_customizations.css', 'public/stylesheets/arturo_customizations.css', :skip => true
11
+ copy_file 'arturo_customizations.css', 'public/stylesheets/arturo_customizations.css', :skip => true
12
12
 
13
13
  unless defined?(Sprockets)
14
14
  copy_file 'app/assets/stylesheets/arturo.css', 'public/stylesheets/arturo.css', :force => true
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arturo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0
4
+ version: 1.8.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,35 +9,8 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain:
12
- - !binary |-
13
- LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURQRENDQWlTZ0F3SUJB
14
- Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJFTVJZd0ZBWURWUVFEREExcVlX
15
- MWwKY3k1aExuSnZjMlZ1TVJVd0V3WUtDWkltaVpQeUxHUUJHUllGWjIxaGFX
16
- d3hFekFSQmdvSmtpYUprL0lzWkFFWgpGZ05qYjIwd0hoY05NVE13TlRBeE1q
17
- SXhNek14V2hjTk1UUXdOVEF4TWpJeE16TXhXakJFTVJZd0ZBWURWUVFECkRB
18
- MXFZVzFsY3k1aExuSnZjMlZ1TVJVd0V3WUtDWkltaVpQeUxHUUJHUllGWjIx
19
- aGFXd3hFekFSQmdvSmtpYUoKay9Jc1pBRVpGZ05qYjIwd2dnRWlNQTBHQ1Nx
20
- R1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURSUUxTTQppd05IaUY3
21
- WGNiRlR1TGp1Y0JHOUZSeFp4TTMvYnRKdXEzazNhbDJtUHhDMEh5MUdHS0Na
22
- aUNRQlF4SHpTMEJUCjdObVMvQldHNjU3eENzWDVQZGt4T01uMTVMS2trUkhP
23
- RkRvaFBpclViZnRrU04zSFFMcU5PUmpzY0ovZWxiQjcKWTIyUGhKbWtaR2JG
24
- QnJPTXcxNkNYV2I2azdkWVgvNUQyaTVDVTJTTnNzQk1BTEZRNGppS1p0d0p3
25
- YXVIb3pTbgozNjZyRVhVYzNiV3ZxL216VG5tMzRqVTBjYlo5R003UVowclFV
26
- V0hMZjhoT3k1VUdrdmtBVHorSk9GN0V5aGk1CjdObmlLdXc3STl1eFNHdEZ0
27
- Qkh5OENvSUVrSFJpamRJVWY4M3l4SmE3S3VLQWVpQlJ6N3JySUpHU2I3alNk
28
- b0wKdjczMjhlUTZIcjFacDhCdEFnTUJBQUdqT1RBM01Ba0dBMVVkRXdRQ01B
29
- QXdIUVlEVlIwT0JCWUVGTUFUcmZGUAo4anRnM3ZHVm9kTGVzUHRZV243Yk1B
30
- c0dBMVVkRHdRRUF3SUVzREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBCkUr
31
- TGVNeVRYcTB2QTB5WStoeUFuSjh0d1Jwc3ZLSU1DdW1TV3pCcGhqenpNc0Z5
32
- RmUxQnVvWXJJa2oxRGd5RDAKVkxwNlhDSmNzZGhpVlpQTCt3ejBpSVJQQWMy
33
- bUJiQTRRbUpSNlQ2dmNQRDZYak55ZS96K2RGR0lLc2NOSHR5SgpvY0RtMmR4
34
- eVNGNjFsaHZFVXl2RjlyWDZrN2FtREtoSjkzVjBFT1dmQUNHdUhJU2ZsZ0dp
35
- OUFpWSs5KzBrWFZrCmdrMHVLNkh5Rzc3UEEyTUc3K3M0d0xmalZiOXZQNjl5
36
- cGFiQWo1VEtKMDJhYXZWMzVFallWUmpNNlViVEEvUDcKL1dySHNYS2hZZk44
37
- eExwbFhYR2tTdDNOUzhSRmhRRkNPSWRnc1hFbGpFdlpwVnh1cmk1T2JIMHpx
38
- eFVOWE9scQo1bEVpNTZuM0tra0tSaHUxY0U2MWdBPT0KLS0tLS1FTkQgQ0VS
39
- VElGSUNBVEUtLS0tLQo=
40
- date: 2013-07-08 00:00:00.000000000 Z
12
+ - gem-public_cert.pem
13
+ date: 2013-10-12 00:00:00.000000000 Z
41
14
  dependencies:
42
15
  - !ruby/object:Gem::Dependency
43
16
  name: rails
@@ -93,6 +66,22 @@ dependencies:
93
66
  - - ! '>='
94
67
  - !ruby/object:Gem::Version
95
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - <
75
+ - !ruby/object:Gem::Version
76
+ version: '5'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - <
83
+ - !ruby/object:Gem::Version
84
+ version: '5'
96
85
  - !ruby/object:Gem::Dependency
97
86
  name: minitest-rg
98
87
  requirement: !ruby/object:Gem::Requirement
data.tar.gz.sig DELETED
@@ -1 +0,0 @@
1
- 9����.e44j drnKL�6;�<Ty�W�+�~�F��}Ȳ8r�)��]����ɒ�{ s��N\�b4�K�9�ˎ��Q�Y����ZN��cZ�*�v�$�K)!|*��,�v��� ��p�J�X3���c�[� ��~FG�M��$�0qꑪL��$�J0�tJ��c�͉�T���)�*�:Ĵ�e@" ��XWa�K�R�Y�f�eXBD�� �НuR%�̏g._�jU?�S���ƫ����pX��@�}�
metadata.gz.sig DELETED
Binary file