time_pilot 1.0.0 → 1.0.1

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
  SHA256:
3
- metadata.gz: 1035c965584954a3de7fbee71027d0d081c2c8a99521f1590fd9f6ad00f84438
4
- data.tar.gz: 01bc1de61e0911ca0e60f464d2869028a9b22556ea0f6c5ec71163d5d3b4b979
3
+ metadata.gz: c6553820e8f6b3c0a0432cbc93853d738c185d241d4600054c6004bf6bb72c8b
4
+ data.tar.gz: 6a15e38e9b53dd74c3d46b2117f6c357136b1119ea1c1d29b20950e79d27ce52
5
5
  SHA512:
6
- metadata.gz: 5d477c3f65330966a93de7ba0088b24771f38d6cbc9a280a1dfa6382d30ce01fe025df2f31d9aa734a366587e545f2bc2e7e7d85aeb9220c77513603ab9ecc36
7
- data.tar.gz: 2f790748fcdcd320ee06fdfafacef5facd3400dce9a807f1f6998647622b3155519b865e8f9a6f139491d3b9a291f1947b49c866568774362fa9b990d3416dec
6
+ metadata.gz: 3e3ae4b4ff917dd411dc82fd56e32be43c297e7b3b0116f34dbd902d171a73c5e2a5965e1770f52933652868bd1f405a73044c128ece0d101bb5561bd6ca1e00
7
+ data.tar.gz: 1e0e68b17d22063b01aaea0ad9580e654590635e2e909d7b9c7de68b9c66350fbf51ba0afd0582ac8a7c990e89e59ef9443e2a878795e636029d3df1b802af51
@@ -0,0 +1,33 @@
1
+ name: Testing
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ branches: [ master ]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ ruby-version: ['2.6', '2.7', '3.0']
15
+ services:
16
+ redis:
17
+ image: redis
18
+ options: >-
19
+ --health-cmd "redis-cli ping"
20
+ --health-interval 10s
21
+ --health-timeout 5s
22
+ --health-retries 5
23
+ ports:
24
+ - 6379:6379
25
+ steps:
26
+ - uses: actions/checkout@v2
27
+ - name: Set up Ruby
28
+ uses: ruby/setup-ruby@v1
29
+ with:
30
+ ruby-version: ${{ matrix.ruby-version }}
31
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
32
+ - name: Run tests
33
+ run: bundle exec rake
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  *.gem
2
2
  Gemfile.lock
3
+ .idea
data/.tool-versions ADDED
@@ -0,0 +1 @@
1
+ ruby 3.0.2
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2014 Matthijs Langenberg and Mark Oude Veldhuis
3
+ Copyright (c) 2014-2021 Matthijs Langenberg and Mark Oude Veldhuis
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # TimePilot [![Build Status](https://travis-ci.org/nedap/time_pilot.svg)](https://travis-ci.org/nedap/time_pilot) ![Code Climate](https://codeclimate.com/repos/538c225ae30ba00d55006394/badges/1741b217ec9818699a37/gpa.png)
1
+ # TimePilot [![Testing](https://github.com/nedap/time_pilot/actions/workflows/ruby.yml/badge.svg)](https://github.com/nedap/time_pilot/actions/workflows/ruby.yml) ![Code Climate](https://codeclimate.com/repos/538c225ae30ba00d55006394/badges/1741b217ec9818699a37/gpa.png)
2
2
 
3
3
  TimePilot is a RubyGem that makes it possible to define features that can be enabled for a certain group of users. It requires very little configuration, and is designed to work stand-alone on any object. TimePilot uses Redis for storage.
4
4
 
@@ -0,0 +1,6 @@
1
+ version: '3'
2
+ services:
3
+ redis:
4
+ image: "redis:latest"
5
+ ports:
6
+ - 6379:6379
@@ -90,9 +90,9 @@ module TimePilot
90
90
  end
91
91
 
92
92
  def pilot_member_in_any_group?(feature_name)
93
- TimePilot.redis.pipelined do
93
+ TimePilot.redis.pipelined do |pipeline|
94
94
  self.class.time_pilot_groups.each do |group|
95
- TimePilot.redis.sismember(
95
+ pipeline.sismember(
96
96
  TimePilot.key("#{feature_name}:#{group}_ids"),
97
97
  send(pilot_method_for_group(group))
98
98
  )
@@ -1,3 +1,3 @@
1
1
  module TimePilot
2
- VERSION = '1.0.0'.freeze
2
+ VERSION = '1.0.1'.freeze
3
3
  end
@@ -1,10 +1,13 @@
1
- require_relative '../lib/time_pilot'
2
- require 'minitest/autorun'
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../lib/time_pilot"
4
+ require "minitest/autorun"
3
5
 
4
6
  class Company
5
7
  include TimePilot::Features
6
8
  is_pilot_group
7
9
  attr_reader :id
10
+
8
11
  def initialize(id)
9
12
  @id = id
10
13
  end
@@ -14,6 +17,7 @@ class Team
14
17
  include TimePilot::Features
15
18
  is_pilot_group overridden_by: :company
16
19
  attr_reader :company_id, :id
20
+
17
21
  def initialize(company_id, id)
18
22
  @company_id = company_id
19
23
  @id = id
@@ -22,8 +26,9 @@ end
22
26
 
23
27
  class Employee
24
28
  include TimePilot::Features
25
- is_pilot_group overridden_by: [:company, :team]
29
+ is_pilot_group overridden_by: %i[company team]
26
30
  attr_reader :company_id, :team_id, :id
31
+
27
32
  def initialize(company_id, team_id, id)
28
33
  @company_id = company_id
29
34
  @team_id = team_id
@@ -32,11 +37,11 @@ class Employee
32
37
  end
33
38
 
34
39
  TimePilot.configure do |c|
35
- c.feature 'planning'
40
+ c.feature "planning"
36
41
  end
37
42
 
38
43
  TimePilot.configure do |c|
39
- c.feature 'secret_feature'
44
+ c.feature "secret_feature"
40
45
  end
41
46
 
42
47
  describe TimePilot do
@@ -50,102 +55,102 @@ describe TimePilot do
50
55
  @jane = Employee.new(@nedap.id, @healthcare.id, 22)
51
56
  end
52
57
 
53
- it 'allows multiple configure blocks to add features' do
54
- TimePilot.features.must_equal ['planning', 'secret_feature']
55
- @acme.planning_enabled?.must_equal false
56
- @acme.secret_feature_enabled?.must_equal false
58
+ it "allows multiple configure blocks to add features" do
59
+ _(TimePilot.features).must_equal %w[planning secret_feature]
60
+ _(@acme.planning_enabled?).must_equal false
61
+ _(@acme.secret_feature_enabled?).must_equal false
57
62
  end
58
63
 
59
- it 'defines a getter on company' do
60
- TimePilot.redis.sadd 'timepilot:planning:company_ids', @acme.id
61
- @acme.planning_enabled?.must_equal true
62
- @acme.instance_variable_get("@planning_enabled").must_equal true
64
+ it "defines a getter on company" do
65
+ TimePilot.redis.sadd "timepilot:planning:company_ids", @acme.id
66
+ _(@acme.planning_enabled?).must_equal true
67
+ _(@acme.instance_variable_get("@planning_enabled")).must_equal true
63
68
  end
64
69
 
65
- it 'defines an enabler on company' do
70
+ it "defines an enabler on company" do
66
71
  @nedap.enable_planning
67
- TimePilot.redis.sismember("timepilot:planning:company_ids", @nedap.id).must_equal true
72
+ _(TimePilot.redis.sismember("timepilot:planning:company_ids", @nedap.id)).must_equal true
68
73
  end
69
74
 
70
- it 'defines a disabler on employee' do
75
+ it "defines a disabler on employee" do
71
76
  @nedap.enable_planning
72
- @nedap.planning_enabled?.must_equal true
73
- @nedap.instance_variable_get("@planning_enabled").must_equal true
77
+ _(@nedap.planning_enabled?).must_equal true
78
+ _(@nedap.instance_variable_get("@planning_enabled")).must_equal true
74
79
  @nedap.disable_planning
75
- @nedap.planning_enabled?.must_equal false
76
- @nedap.instance_variable_get("@planning_enabled").must_equal false
80
+ _(@nedap.planning_enabled?).must_equal false
81
+ _(@nedap.instance_variable_get("@planning_enabled")).must_equal false
77
82
  end
78
83
 
79
- it 'defines a getter on team' do
80
- TimePilot.redis.sadd 'timepilot:planning:team_ids', @healthcare.id
81
- @healthcare.planning_enabled?.must_equal true
84
+ it "defines a getter on team" do
85
+ TimePilot.redis.sadd "timepilot:planning:team_ids", @healthcare.id
86
+ _(@healthcare.planning_enabled?).must_equal true
82
87
  end
83
88
 
84
- it 'defines an enabler on team' do
89
+ it "defines an enabler on team" do
85
90
  @retail.enable_planning
86
- TimePilot.redis.sismember("timepilot:planning:team_ids", @retail.id).must_equal true
91
+ _(TimePilot.redis.sismember("timepilot:planning:team_ids", @retail.id)).must_equal true
87
92
  end
88
93
 
89
- it 'defines a disabler on team' do
94
+ it "defines a disabler on team" do
90
95
  @retail.enable_planning
91
- @retail.planning_enabled?.must_equal true
92
- @retail.instance_variable_get("@planning_enabled").must_equal true
96
+ _(@retail.planning_enabled?).must_equal true
97
+ _(@retail.instance_variable_get("@planning_enabled")).must_equal true
93
98
  @retail.disable_planning
94
- @retail.planning_enabled?.must_equal false
95
- @retail.instance_variable_get("@planning_enabled").must_equal false
99
+ _(@retail.planning_enabled?).must_equal false
100
+ _(@retail.instance_variable_get("@planning_enabled")).must_equal false
96
101
  end
97
102
 
98
- it 'defines a getter on employee' do
99
- TimePilot.redis.sadd 'timepilot:planning:employee_ids', @john.id
100
- @john.planning_enabled?.must_equal true
101
- @john.instance_variable_get("@planning_enabled").must_equal true
103
+ it "defines a getter on employee" do
104
+ TimePilot.redis.sadd "timepilot:planning:employee_ids", @john.id
105
+ _(@john.planning_enabled?).must_equal true
106
+ _(@john.instance_variable_get("@planning_enabled")).must_equal true
102
107
  end
103
108
 
104
- it 'defines an enabler on employee' do
109
+ it "defines an enabler on employee" do
105
110
  @jane.enable_planning
106
- TimePilot.redis.sismember("timepilot:planning:employee_ids", @jane.id).must_equal true
111
+ _(TimePilot.redis.sismember("timepilot:planning:employee_ids", @jane.id)).must_equal true
107
112
  end
108
113
 
109
- it 'defines a disabler on employee' do
114
+ it "defines a disabler on employee" do
110
115
  @jane.enable_planning
111
- @jane.planning_enabled?.must_equal true
112
- @jane.instance_variable_get("@planning_enabled").must_equal true
116
+ _(@jane.planning_enabled?).must_equal true
117
+ _(@jane.instance_variable_get("@planning_enabled")).must_equal true
113
118
  @jane.disable_planning
114
- @jane.planning_enabled?.must_equal false
115
- @jane.instance_variable_get("@planning_enabled").must_equal false
119
+ _(@jane.planning_enabled?).must_equal false
120
+ _(@jane.instance_variable_get("@planning_enabled")).must_equal false
116
121
  end
117
122
 
118
- it 'defines a cardinality count on the classes' do
123
+ it "defines a cardinality count on the classes" do
119
124
  @nedap.enable_planning
120
125
  @john.enable_planning
121
126
  @jane.enable_planning
122
- Company.pilot_feature_cardinality(:planning).must_equal 1
123
- Team.pilot_feature_cardinality(:planning).must_equal 0
124
- Employee.pilot_feature_cardinality(:planning).must_equal 2
127
+ _(Company.pilot_feature_cardinality(:planning)).must_equal 1
128
+ _(Team.pilot_feature_cardinality(:planning)).must_equal 0
129
+ _(Employee.pilot_feature_cardinality(:planning)).must_equal 2
125
130
  end
126
131
 
127
- it 'registers classes that include TimePilot::Features' do
128
- TimePilot.group_classes.must_include Company
129
- TimePilot.group_classes.must_include Team
130
- TimePilot.group_classes.must_include Employee
132
+ it "registers classes that include TimePilot::Features" do
133
+ _(TimePilot.group_classes).must_include Company
134
+ _(TimePilot.group_classes).must_include Team
135
+ _(TimePilot.group_classes).must_include Employee
131
136
  end
132
137
 
133
- specify 'company overrides team' do
138
+ specify "company overrides team" do
134
139
  @nedap.enable_planning
135
- @retail.planning_enabled?.must_equal true
136
- @retail.instance_variable_get("@planning_enabled").must_equal true
140
+ _(@retail.planning_enabled?).must_equal true
141
+ _(@retail.instance_variable_get("@planning_enabled")).must_equal true
137
142
  end
138
143
 
139
- specify 'team overrides employee' do
144
+ specify "team overrides employee" do
140
145
  @healthcare.enable_planning
141
- @john.planning_enabled?.must_equal true
142
- @john.instance_variable_get("@planning_enabled").must_equal true
146
+ _(@john.planning_enabled?).must_equal true
147
+ _(@john.instance_variable_get("@planning_enabled")).must_equal true
143
148
  end
144
149
 
145
- specify 'company overrides employee' do
150
+ specify "company overrides employee" do
146
151
  @nedap.enable_planning
147
- @jane.planning_enabled?.must_equal true
148
- @jane.instance_variable_get("@planning_enabled").must_equal true
152
+ _(@jane.planning_enabled?).must_equal true
153
+ _(@jane.instance_variable_get("@planning_enabled")).must_equal true
149
154
  end
150
155
  end
151
156
 
@@ -154,9 +159,9 @@ class CamelCasedModel
154
159
  is_pilot_group
155
160
  end
156
161
 
157
- describe TimePilot, 'converting CamelCase to camel_case' do
162
+ describe TimePilot, "converting CamelCase to camel_case" do
158
163
  it do
159
- CamelCasedModel.time_pilot_groups.must_equal ['camel_cased_model']
164
+ _(CamelCasedModel.time_pilot_groups).must_equal ["camel_cased_model"]
160
165
  end
161
166
  end
162
167
 
@@ -176,34 +181,33 @@ describe TimePilot do
176
181
  end
177
182
  end
178
183
 
179
- specify 'calls redis only once' do
184
+ specify "calls redis only once" do
180
185
  @mock.expect(:pipelined, [true])
181
186
 
182
- @acme.planning_enabled?.must_equal true
187
+ _(@acme.planning_enabled?).must_equal true
183
188
  # Call the feature a second time
184
189
  # If it calls redis you will get
185
190
  # MockExpectationError: No more expects available for :pipelined: []
186
- @acme.planning_enabled?.must_equal true
191
+ _(@acme.planning_enabled?).must_equal true
187
192
  end
188
193
 
189
- specify 'does not call redis to get status after disabling' do
190
- @mock.expect(:srem, true, ['timepilot:planning:company_ids', @acme.id])
194
+ specify "does not call redis to get status after disabling" do
195
+ @mock.expect(:srem, true, ["timepilot:planning:company_ids", @acme.id])
191
196
 
192
197
  @acme.disable_planning
193
198
  # Call the feature again it should hit the instance variable
194
199
  # If it calls redis you will get
195
200
  # MockExpectationError: No more expects available for :pipelined: []
196
- @acme.planning_enabled?.must_equal false
201
+ _(@acme.planning_enabled?).must_equal false
197
202
  end
198
203
 
199
- specify 'does not call redis to get status after enabling' do
200
- @mock.expect(:sadd, true, ['timepilot:planning:company_ids', @acme.id])
204
+ specify "does not call redis to get status after enabling" do
205
+ @mock.expect(:sadd, true, ["timepilot:planning:company_ids", @acme.id])
201
206
 
202
207
  @acme.enable_planning
203
208
  # Call the feature again it should hit the instance variable
204
209
  # If it calls redis you will get
205
210
  # MockExpectationError: No more expects available for :pipelined: []
206
- @acme.planning_enabled?.must_equal true
211
+ _(@acme.planning_enabled?).must_equal true
207
212
  end
208
213
  end
209
-
@@ -1,23 +1,25 @@
1
1
  <!DOCTYPE html>
2
- <html>
2
+ <html lang="en">
3
3
  <head>
4
4
  <meta charset="utf8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>Time Pilot Web</title>
7
7
 
8
8
  <link rel="stylesheet" href="<%= root_path %>stylesheets/pure-min.css">
9
- <style type="text/css">
10
- h1 {
11
- text-align: center;
12
- }
13
- body {
14
- font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
15
- font-weight: 300;
16
- }
17
- .centered {
18
- margin-left: auto;
19
- margin-right: auto;
20
- }
9
+ <style >
10
+ h1 {
11
+ text-align: center;
12
+ }
13
+
14
+ body {
15
+ font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
16
+ font-weight: 300;
17
+ }
18
+
19
+ .centered {
20
+ margin-left: auto;
21
+ margin-right: auto;
22
+ }
21
23
  </style>
22
24
  </head>
23
25
  <body>
@@ -26,20 +28,22 @@
26
28
  <h1>Time Pilot Web</h1>
27
29
  <table class="pure-table pure-table-horizontal pure-table-striped centered">
28
30
  <thead>
29
- <tr>
30
- <th>Feature</th><th>Group</th><th>Count</th>
31
- </tr>
31
+ <tr>
32
+ <th>Feature</th>
33
+ <th>Group</th>
34
+ <th>Count</th>
35
+ </tr>
32
36
  </thead>
33
37
  <tbody>
34
- <% @total_count.each do |feature, groups| %>
35
- <% groups.each do |group, count| %>
36
- <tr>
37
- <td><%= feature %></td>
38
- <td><%= group %></td>
39
- <td><%= count %></td>
40
- </tr>
41
- <% end %>
42
- <% end %>
38
+ <% @total_count.each do |feature, groups| %>
39
+ <% groups.each do |group, count| %>
40
+ <tr>
41
+ <td><%= feature %></td>
42
+ <td><%= group %></td>
43
+ <td><%= count %></td>
44
+ </tr>
45
+ <% end %>
46
+ <% end %>
43
47
  </tbody>
44
48
  </table>
45
49
  </div>
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: time_pilot
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - "@mlangenberg"
8
8
  - "@markoudev"
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-09-19 00:00:00.000000000 Z
12
+ date: 2022-02-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: redis
@@ -61,13 +61,15 @@ executables: []
61
61
  extensions: []
62
62
  extra_rdoc_files: []
63
63
  files:
64
+ - ".github/workflows/ruby.yml"
64
65
  - ".gitignore"
65
- - ".travis.yml"
66
+ - ".tool-versions"
66
67
  - AUTHORS
67
68
  - Gemfile
68
69
  - LICENSE
69
70
  - README.md
70
71
  - Rakefile
72
+ - docker-compose.yml
71
73
  - lib/time_pilot.rb
72
74
  - lib/time_pilot/configuration.rb
73
75
  - lib/time_pilot/time_pilot.rb
@@ -84,7 +86,7 @@ homepage: https://github.com/nedap/time_pilot
84
86
  licenses:
85
87
  - MIT
86
88
  metadata: {}
87
- post_install_message:
89
+ post_install_message:
88
90
  rdoc_options: []
89
91
  require_paths:
90
92
  - lib
@@ -99,9 +101,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
101
  - !ruby/object:Gem::Version
100
102
  version: '0'
101
103
  requirements: []
102
- rubyforge_project:
103
- rubygems_version: 2.7.6
104
- signing_key:
104
+ rubygems_version: 3.2.26
105
+ signing_key:
105
106
  specification_version: 4
106
107
  summary: Configure enabled features for a specific set of users.
107
108
  test_files: []
data/.travis.yml DELETED
@@ -1,7 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.0
4
- - 2.1
5
- - 2.2
6
- services:
7
- - redis-server