envoku 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2f39cc37ce741e045daf7913c44c7dd96c36fabb
4
- data.tar.gz: 3461cd1dc93448897c09bcb9c0cf204186beaac1
3
+ metadata.gz: 12cb3de23b25c163a12dc7320786b5e8aef7e6c0
4
+ data.tar.gz: ec871654478e09acec6316f18249e274fff24848
5
5
  SHA512:
6
- metadata.gz: f9f54a52452e96f561ec0528d12e96c95c455181b459685529ae04876dc3a5affa267c76f6090599ecdf098ac8c05d4816c12183b624b2ccfaeb4b96cc7e296b
7
- data.tar.gz: aa46e0265014179c0d2a2d63b0ba8f52f2941e242810ebee5fb71b9c9deef1adacb56f6a917b3fa7816762b11c16ad3175b907f68e3e688315ddb5fddb51c0c0
6
+ metadata.gz: 8cbf3e539206de10ccedb8f7b264320435ab131d0241adc5dc6eb6c36c17c0b89b6b29a0b1918920badf0add8c631777f510b1530f49b048603933a876be93c2
7
+ data.tar.gz: 7f501e221cfc0bd53b87aa77a0b1ba87cc792e1daef744f423fc65626e2b447bae169ee193cc468beb25c8b2801720c1de032d430a44b94a32a4739ac77bcff2
data/.gitignore CHANGED
@@ -8,3 +8,5 @@
8
8
  /spec/reports/
9
9
  /tmp/
10
10
  *.gem
11
+ .env
12
+ .env.*
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.3.1
data/.simplecov CHANGED
@@ -1,8 +1,12 @@
1
+ require "codeclimate-test-reporter"
1
2
  require 'codecov'
2
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
3
- SimpleCov::Formatter::HTMLFormatter,
3
+
4
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
5
+ CodeClimate::TestReporter::Formatter,
4
6
  SimpleCov::Formatter::Codecov,
5
- ]
7
+ SimpleCov::Formatter::HTMLFormatter,
8
+ ])
6
9
  SimpleCov.start do
7
- add_filter 'spec'
10
+ add_filter "spec"
11
+ add_group "Adapters", "lib/envoku/adapters/"
8
12
  end
data/README.md CHANGED
@@ -1,7 +1,10 @@
1
1
  # Envoku
2
2
 
3
- [![Circle CI](https://circleci.com/gh/marcqualie/envoku-ruby/tree/master.svg?style=svg)](https://circleci.com/gh/marcqualie/envoku-ruby/tree/master)
4
- [![codecov.io](https://codecov.io/github/marcqualie/envoku-ruby/coverage.svg?branch=master)](https://codecov.io/github/marcqualie/envoku-ruby?branch=master)
3
+ [![Gem Version](https://badge.fury.io/rb/envoku.svg)](https://badge.fury.io/rb/envoku)
4
+ [![Circle CI](https://circleci.com/gh/marcqualie/envoku-ruby/tree/master.svg?style=shield)](https://circleci.com/gh/marcqualie/envoku-ruby/tree/master)
5
+ [![Test Coverage](https://codeclimate.com/github/marcqualie/envoku-ruby/badges/coverage.svg)](https://codeclimate.com/github/marcqualie/envoku-ruby/coverage)
6
+ [![Code Climate](https://codeclimate.com/github/marcqualie/envoku-ruby/badges/gpa.svg)](https://codeclimate.com/github/marcqualie/envoku-ruby)
7
+ [![Issue Count](https://codeclimate.com/github/marcqualie/envoku-ruby/badges/issue_count.svg)](https://codeclimate.com/github/marcqualie/envoku-ruby)
5
8
 
6
9
  Configuration storage that can be loaded into your application transparently at boot-time.
7
10
 
@@ -10,7 +13,7 @@ Configuration storage that can be loaded into your application transparently at
10
13
 
11
14
  Add this line to your application's Gemfile:
12
15
 
13
- ```ruby
16
+ ``` ruby
14
17
  gem 'envoku'
15
18
  ```
16
19
 
@@ -35,11 +38,33 @@ Envoku automatically pre-loads itself during `before_configuration` phase so no
35
38
 
36
39
  Run the following code before you need access to the environment variables
37
40
 
38
- ```
41
+ ``` ruby
39
42
  Envoku.load
40
43
  ```
41
44
 
42
45
 
46
+ ## Features
47
+
48
+ ``` ruby
49
+ all_features = Envoku::Feature.all
50
+ feature = Envoku::Feature.new('FEATURE1')
51
+ feature.enabled? # global for all resources
52
+ feature.enabled_for?(current_user) # does current_user have this feature enabled
53
+ feature.enable_for!(current_user) # enable feature for current_user
54
+ feature.disable_for!(current_user) # disable feature for current_user
55
+ resource.feature_enabled?('FEATURE1')
56
+ resource.toggle_feature!('FEATURE1')
57
+ resource.features_enabled
58
+ ```
59
+
60
+ Per-resource features are stored in Redis via the following keys:
61
+
62
+ ```
63
+ (SET) envoku:features:[feature]:[class] 123 456 789 # IDs for resource grouped by feature and class
64
+ (SET) envoku:features:[class]:[id] FEATURE1 FEATURE2 # Features grouped by resource and ID
65
+ ```
66
+
67
+
43
68
  ## Development
44
69
 
45
70
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
3
 
4
+ load "#{__dir__}/lib/tasks/envoku.rake"
5
+
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
8
  task :default => :spec
data/circle.yml CHANGED
@@ -1,9 +1,9 @@
1
1
  machine:
2
2
  ruby:
3
- version: 2.2.3
3
+ version: 2.3.1
4
4
 
5
5
  dependencies:
6
6
  cache_directories:
7
7
  - vendor/bundle
8
8
  pre:
9
- - gem install bundler:1.10.6
9
+ - gem install bundler:1.13.3
data/codecov.yml ADDED
@@ -0,0 +1,13 @@
1
+ codecov:
2
+ notify:
3
+ require_ci_to_pass: true
4
+
5
+ comment: off
6
+
7
+ coverage:
8
+ precision: 2
9
+ range: "80...100"
10
+ round: down
11
+ status:
12
+ patch: auto
13
+ project: auto
data/envoku.gemspec CHANGED
@@ -19,9 +19,11 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency "dotenv", "~> 2.1"
22
+ spec.add_dependency "redis", "~> 3.3"
22
23
 
23
- spec.add_development_dependency "bundler", "~> 1.11"
24
- spec.add_development_dependency "codecov", "~> 0.1.4"
25
- spec.add_development_dependency "rake", "~> 10.5"
26
- spec.add_development_dependency "rspec", "~> 3.4"
24
+ spec.add_development_dependency "bundler", "~> 1.13"
25
+ spec.add_development_dependency "codecov", "~> 0.1.5"
26
+ spec.add_development_dependency "codeclimate-test-reporter", "~> 0.6"
27
+ spec.add_development_dependency "rake", "~> 11.3"
28
+ spec.add_development_dependency "rspec", "~> 3.5"
27
29
  end
@@ -0,0 +1,70 @@
1
+ require 'yaml'
2
+
3
+ module Envoku
4
+ class Feature
5
+ ENV_NAMESPACE = "ENVOKU_FEATURE_"
6
+ REDIS_NAMESPACE = "envoku:features:"
7
+
8
+ attr_reader :name
9
+ attr_reader :description
10
+
11
+ def self.all
12
+ keys = ENV.select { |key, value| key.index(ENV_NAMESPACE) == 0 }
13
+ keys.keys.map do |key|
14
+ Feature.new(key[(ENV_NAMESPACE.length)..-1])
15
+ end
16
+ end
17
+
18
+ def initialize(name)
19
+ @name = name
20
+ @enabled = false
21
+ var_string = ENV["#{ENV_NAMESPACE}#{name}"]
22
+ return nil unless var_string
23
+ attributes = ::YAML.safe_load(var_string) rescue {}
24
+ attributes.each do |key, value|
25
+ instance_variable_set(:"@#{key}", value)
26
+ end
27
+ @enabled = !!@enabled
28
+ end
29
+
30
+ def enabled?
31
+ @enabled
32
+ end
33
+
34
+ def enabled_for?(resource)
35
+ return true if enabled?
36
+ Envoku.redis.sismember("#{REDIS_NAMESPACE}#{@name}:#{resource.class.name}", "#{resource.id}")
37
+ end
38
+
39
+ def enable_for!(resource)
40
+ Envoku.redis.multi do
41
+ Envoku.redis.sadd("#{REDIS_NAMESPACE}#{@name}:#{resource.class.name}", resource.id.to_s)
42
+ Envoku.redis.sadd("#{REDIS_NAMESPACE}#{resource.class.name}:#{resource.id}", @name)
43
+ end
44
+ end
45
+
46
+ def disable_for!(resource)
47
+ Envoku.redis.multi do
48
+ Envoku.redis.del("#{REDIS_NAMESPACE}#{@name}:#{resource.class.name}")
49
+ Envoku.redis.del("#{REDIS_NAMESPACE}#{resource.class.name}:#{resource.id}")
50
+ end
51
+ end
52
+
53
+ def toggle_for!(resource)
54
+ enabled_for?(resource) ? disable_for!(resource) : enable_for!(resource)
55
+ end
56
+
57
+ def resources
58
+ list = []
59
+ feature_prefix = "#{REDIS_NAMESPACE}#{@name}"
60
+ klasses = Envoku.redis.keys("#{feature_prefix}:*").map { |klass| klass[(feature_prefix.length + 1)..-1] }
61
+ klasses.each do |klass|
62
+ ids = Envoku.redis.smembers("#{feature_prefix}:#{klass}")
63
+ ids.each do |id|
64
+ list.push("#{klass}:#{id}")
65
+ end
66
+ end
67
+ list
68
+ end
69
+ end
70
+ end
data/lib/envoku/rails.rb CHANGED
@@ -18,5 +18,10 @@ module Envoku
18
18
  def self.load
19
19
  instance.load
20
20
  end
21
+
22
+ # Rake tasks
23
+ rake_tasks do
24
+ Rails::Railtie.instance_method(:load).bind(self).call("tasks/envoku.rake")
25
+ end
21
26
  end
22
27
  end
@@ -0,0 +1,23 @@
1
+ module Envoku
2
+ module Resource
3
+ def disable_feature!(feature)
4
+ ::Envoku::Feature.new(feature).disable_for!(self)
5
+ end
6
+
7
+ def enable_feature!(feature)
8
+ ::Envoku::Feature.new(feature).enable_for!(self)
9
+ end
10
+
11
+ def feature_enabled?(feature)
12
+ ::Envoku::Feature.new(feature).enabled_for?(self)
13
+ end
14
+
15
+ def features_enabled
16
+ ::Envoku.features_enabled_for(self)
17
+ end
18
+
19
+ def toggle_feature!(feature)
20
+ ::Envoku::Feature.new(feature).toggle_for!(self)
21
+ end
22
+ end
23
+ end
@@ -1,3 +1,3 @@
1
1
  module Envoku
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/envoku.rb CHANGED
@@ -1,13 +1,32 @@
1
+ require "redis"
2
+
1
3
  require "envoku/version"
2
4
  require "envoku/adapters/s3"
3
- require "envoku/rails" if defined? Rails
5
+ require "envoku/feature"
6
+ require "envoku/resource"
7
+
8
+ require "envoku/rails" if defined?(Rails)
4
9
 
5
10
  module Envoku
6
11
 
7
12
  module_function
8
13
 
9
- def load options = {}
14
+ def load(options = {})
10
15
  instance = Envoku::Adapters::S3.new options
11
16
  instance.load
12
17
  end
18
+
19
+ def redis
20
+ @redis ||= ::Redis.new(
21
+ url: (ENV['ENVOKU_REDIS_URL'] || ENV['REDIS_URL']),
22
+ )
23
+ end
24
+
25
+ def feature_enabled_for?(feature_name, resource)
26
+ Feature.new(feature_name).enabled_for?(resource)
27
+ end
28
+
29
+ def features_enabled_for(resource)
30
+ redis.smembers("#{Feature::REDIS_NAMESPACE}#{resource.class.name}:#{resource.id}")
31
+ end
13
32
  end
@@ -0,0 +1,20 @@
1
+ require 'envoku'
2
+ require 'yaml'
3
+
4
+ namespace :envoku do
5
+
6
+ task :load do
7
+ Envoku.load
8
+ end
9
+
10
+ desc "Show Envoku Info"
11
+ task :info => :load do
12
+ puts "URL: #{ENV['ENVOKU_URL'] ? ENV['ENVOKU_URL'] : "[not set]"}"
13
+ end
14
+
15
+ desc "List Envoku Features"
16
+ task :features => :load do
17
+ features = Envoku::Feature.all
18
+ puts features.to_yaml
19
+ end
20
+ end
File without changes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: envoku
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marc Qualie
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-02-18 00:00:00.000000000 Z
11
+ date: 2016-10-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dotenv
@@ -24,62 +24,90 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: redis
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.3'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.3'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '1.11'
47
+ version: '1.13'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '1.11'
54
+ version: '1.13'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: codecov
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: 0.1.4
61
+ version: 0.1.5
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.1.5
69
+ - !ruby/object:Gem::Dependency
70
+ name: codeclimate-test-reporter
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.6'
48
76
  type: :development
49
77
  prerelease: false
50
78
  version_requirements: !ruby/object:Gem::Requirement
51
79
  requirements:
52
80
  - - "~>"
53
81
  - !ruby/object:Gem::Version
54
- version: 0.1.4
82
+ version: '0.6'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: rake
57
85
  requirement: !ruby/object:Gem::Requirement
58
86
  requirements:
59
87
  - - "~>"
60
88
  - !ruby/object:Gem::Version
61
- version: '10.5'
89
+ version: '11.3'
62
90
  type: :development
63
91
  prerelease: false
64
92
  version_requirements: !ruby/object:Gem::Requirement
65
93
  requirements:
66
94
  - - "~>"
67
95
  - !ruby/object:Gem::Version
68
- version: '10.5'
96
+ version: '11.3'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: rspec
71
99
  requirement: !ruby/object:Gem::Requirement
72
100
  requirements:
73
101
  - - "~>"
74
102
  - !ruby/object:Gem::Version
75
- version: '3.4'
103
+ version: '3.5'
76
104
  type: :development
77
105
  prerelease: false
78
106
  version_requirements: !ruby/object:Gem::Requirement
79
107
  requirements:
80
108
  - - "~>"
81
109
  - !ruby/object:Gem::Version
82
- version: '3.4'
110
+ version: '3.5'
83
111
  description:
84
112
  email:
85
113
  - marc@marcqualie.com
@@ -89,21 +117,26 @@ extra_rdoc_files: []
89
117
  files:
90
118
  - ".gitignore"
91
119
  - ".rspec"
120
+ - ".ruby-version"
92
121
  - ".simplecov"
93
122
  - ".travis.yml"
94
123
  - Gemfile
95
124
  - LICENSE
96
125
  - README.md
97
126
  - Rakefile
98
- - bin/console
99
127
  - bin/setup
100
128
  - circle.yml
129
+ - codecov.yml
101
130
  - envoku.gemspec
102
131
  - lib/envoku.rb
103
132
  - lib/envoku/adapters.rb
104
133
  - lib/envoku/adapters/s3.rb
134
+ - lib/envoku/feature.rb
105
135
  - lib/envoku/rails.rb
136
+ - lib/envoku/resource.rb
106
137
  - lib/envoku/version.rb
138
+ - lib/tasks/envoku.rake
139
+ - script/console
107
140
  homepage: https://envoku.com
108
141
  licenses:
109
142
  - MIT
@@ -124,7 +157,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
157
  version: '0'
125
158
  requirements: []
126
159
  rubyforge_project:
127
- rubygems_version: 2.5.1
160
+ rubygems_version: 2.6.7
128
161
  signing_key:
129
162
  specification_version: 4
130
163
  summary: Store environment variables securely on S3 away from your application