sail 3.2.4 → 3.3.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
  SHA256:
3
- metadata.gz: 40fb8e4bc4918c09d226baa2e97666dc61cf6734967538bb62f61d12391c5024
4
- data.tar.gz: 53903455199dbf9fd1d310c50dd538856880cb2a740e11576c929609312099ae
3
+ metadata.gz: 05fca866e54ba0e38f8d78010f0cbe328b694b7f09619b36a2d533d3c5ed8f92
4
+ data.tar.gz: 9f95a6750ae40d4086d46fa56ff75323532ffd72cf109ee6a6425589d2220f4e
5
5
  SHA512:
6
- metadata.gz: bb1365f1162a6b41ef8a57cc54b15f25e37dfa4dde08eb1a556dde193f0bf33600740c72f4e69e652ca4a2c6666bedc564d15af320f010cde018a73cf0d530c4
7
- data.tar.gz: 6002b3b8f33133fd9b0181b9cc52b174e3533f9e28aa493a70ab52194415e44877f017a003a3488641cd673b20d06fce4ca7c8bb04db2be9288a4c5f7ececa39
6
+ metadata.gz: bfb372c20ab721d43af3f0d692ba0b1f5ff7d1c9185a4fe7a997c4e966589b1892b8027fecfed329328dce602f17516b3280030c39a67cf5a4de1c21135d3f0b
7
+ data.tar.gz: 0f238303cd0b2797649996dcf26b1df9a3299f34cc9fb987edf7fa71336ce2bee21bca2c7d416598b208bb87da8c0d45e1784a355e9612d0e1d1cd0960d19bfc
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ![dashboard](https://raw.githubusercontent.com/vinistock/sail/master/app/assets/images/sail/sail.png)
2
2
 
3
- [![Maintainability](https://api.codeclimate.com/v1/badges/00ed468acd8b93f66478/maintainability)](https://codeclimate.com/github/vinistock/sail/maintainability) [![Build Status](https://travis-ci.org/vinistock/sail.svg?branch=master)](https://travis-ci.org/vinistock/sail) [![Test Coverage](https://codeclimate.com/github/vinistock/sail/badges/coverage.svg)](https://codeclimate.com/github/vinistock/sail/coverage) [![Gem Version](https://badge.fury.io/rb/sail.svg)](https://badge.fury.io/rb/sail) ![](http://ruby-gem-downloads-badge.herokuapp.com/sail?color=brightgreen&type=total) [![Mentioned in Awesome Ruby](https://awesome.re/mentioned-badge.svg)](https://github.com/markets/awesome-ruby)
3
+ [![Build Status](https://github.com/vinistock/sail/workflows/Ruby%20on%20Rails/badge.svg?branch=master)](https://github.com/vinistock/sail/actions) [![codecov](https://codecov.io/gh/vinistock/sail/branch/master/graph/badge.svg)](https://codecov.io/gh/vinistock/sail) [![Gem Version](https://badge.fury.io/rb/sail.svg)](https://badge.fury.io/rb/sail) ![](http://ruby-gem-downloads-badge.herokuapp.com/sail?color=brightgreen&type=total) [![Mentioned in Awesome Ruby](https://awesome.re/mentioned-badge.svg)](https://github.com/markets/awesome-ruby)
4
4
 
5
5
  # Sail
6
6
 
@@ -139,10 +139,10 @@ All possible cast types as well as detailed examples of usage can be found in th
139
139
  # Get setting value with appropriate cast type
140
140
  #
141
141
  # Returns setting value with cast or yields it if passed a block
142
- Sail.get("name")
142
+ Sail.get(:name)
143
143
 
144
144
  # This usage will return the result of the block
145
- Sail.get("name") do |setting_value|
145
+ Sail.get(:name) do |setting_value|
146
146
  my_code(setting_value)
147
147
  end
148
148
 
@@ -153,15 +153,15 @@ end
153
153
 
154
154
  # For example, this will ignore ExampleError, but any other error raised will increase
155
155
  # the count until the setting "name" is reset.
156
- Sail.get("name", expected_errors: [ExampleError]) do |value|
156
+ Sail.get(:name, expected_errors: [ExampleError]) do |value|
157
157
  code_that_can_raise_example_error(value)
158
158
  end
159
159
 
160
160
  # Set setting value
161
- Sail.set("name", "value")
161
+ Sail.set(:name, "value")
162
162
 
163
163
  # Reset setting value (requires the sail.yml file!)
164
- Sail.reset("name")
164
+ Sail.reset(:name)
165
165
 
166
166
  # Switcher
167
167
  # This method will take three setting names as parameters
@@ -209,6 +209,47 @@ Response
209
209
  200 OK
210
210
  ```
211
211
 
212
+ ### GraphQL
213
+
214
+ For GraphQL APIs, types and mutations are defined for convenience. Include Sail's Graphql modules to get the appropriate fields.
215
+
216
+ ```ruby
217
+ # app/graphql/types/query_type.rb
218
+
219
+ module Types
220
+ class QueryType < Types::BaseObject
221
+ include Sail::Graphql::Types
222
+ end
223
+ end
224
+
225
+ # app/graphql/types/mutation_type.rb
226
+
227
+ module Types
228
+ class MutationType < Types::BaseObject
229
+ include Sail::Graphql::Mutations
230
+ end
231
+ end
232
+ ```
233
+
234
+ To query settings via GraphQL, use the following pattern.
235
+
236
+ ```graphql
237
+ query {
238
+ sailGet(name: "my_setting")
239
+ sailSwitcher(positive: "positive_case_setting", negative: "negative_case_setting", throttledBy: "throttle_setting")
240
+ }
241
+
242
+ mutation {
243
+ sailSet(name: "my_setting", value: "value") {
244
+ success
245
+ }
246
+
247
+ sailProfileSwitch(name: "my_profile") {
248
+ success
249
+ }
250
+ }
251
+ ```
252
+
212
253
  ## Localization
213
254
 
214
255
  Sail's few strings are all localized for English in [en.yml], making it easy to create translations for the desired languages.
data/Rakefile CHANGED
@@ -20,7 +20,7 @@ require "rspec/core/rake_task"
20
20
  RSpec::Core::RakeTask.new(spec: "app:db:test:prepare")
21
21
  task default: :spec
22
22
 
23
- task :all do
23
+ task all: :environment do
24
24
  system("brakeman --no-pager && rake && rubocop --auto-correct && rails_best_practices")
25
25
  end
26
26
 
@@ -11,7 +11,7 @@ module Sail
11
11
  class UnexpectedCastType < StandardError; end
12
12
 
13
13
  FULL_RANGE = (0...100).freeze
14
- AVAILABLE_MODELS = Dir[Rails.root.join("app", "models", "*.rb")]
14
+ AVAILABLE_MODELS = Dir[Rails.root.join("app/models/*.rb")]
15
15
  .map { |dir| dir.split("/").last.camelize.gsub(".rb", "") }.freeze
16
16
 
17
17
  has_many :entries, dependent: :destroy
@@ -32,11 +32,7 @@ module Sail
32
32
 
33
33
  after_initialize :instantiate_caster
34
34
 
35
- scope :paginated, lambda { |page, per_page|
36
- select(:name, :description, :group, :value, :cast_type, :updated_at)
37
- .offset(page.to_i * per_page)
38
- .limit(per_page)
39
- }
35
+ scope :paginated, ->(page, per_page) { offset(page.to_i * per_page).limit(per_page) }
40
36
 
41
37
  scope :by_query, lambda { |query|
42
38
  if cast_types.key?(query) || query == Sail::ConstantCollection::STALE
@@ -22,13 +22,23 @@
22
22
  <div class="clearfix"></div>
23
23
 
24
24
  <div class="page-links">
25
- <%= link_to("", settings_path(page: [params[:page].to_i - 1, 0].max, monitor_mode: params[:monitor_mode]), method: :get, id: "angle-left-link", title: I18n.t("sail.previous_page")) %>
25
+ <%= link_to("", settings_path(page: [params[:page].to_i - 1, 0].max, monitor_mode: params[:monitor_mode], query: params[:query]), method: :get, id: "angle-left-link", title: I18n.t("sail.previous_page")) %>
26
+ <%= link_to(1, settings_path(page: 0, monitor_mode: params[:monitor_mode], query: params[:query]), method: :get, class: params[:page].to_i.zero? || params[:page].blank? ? "active" : "") %>
26
27
 
27
- <% (0...@number_of_pages).each do |page| %>
28
- <%= link_to(page + 1, settings_path(page: page, monitor_mode: params[:monitor_mode]), method: :get, class: params[:page].to_i == page || params[:page].blank? && page.zero? ? "active" : "") %>
28
+ <% if params[:page].to_i - Sail::ConstantCollection::MAX_PAGES > 1 %>
29
+ ●●●
29
30
  <% end %>
30
31
 
31
- <%= link_to("", settings_path(page: [params[:page].to_i + 1, @number_of_pages - 1].min, monitor_mode: params[:monitor_mode]), method: :get, id: "angle-right-link", title: I18n.t("sail.next_page")) %>
32
+ <% ([params[:page].to_i - Sail::ConstantCollection::MAX_PAGES, 1].max...[@number_of_pages - 1, params[:page].to_i + Sail::ConstantCollection::MAX_PAGES].min).each do |page| %>
33
+ <%= link_to(page + 1, settings_path(page: page, monitor_mode: params[:monitor_mode], query: params[:query]), method: :get, class: params[:page].to_i == page || params[:page].blank? && page.zero? ? "active" : "") %>
34
+ <% end %>
35
+
36
+ <% if params[:page].to_i + Sail::ConstantCollection::MAX_PAGES < @number_of_pages - 1 %>
37
+ ●●●
38
+ <% end %>
39
+
40
+ <%= link_to(@number_of_pages, settings_path(page: @number_of_pages - 1, monitor_mode: params[:monitor_mode], query: params[:query]), method: :get, class: params[:page].to_i == @number_of_pages - 1 ? "active" : "") %>
41
+ <%= link_to("", settings_path(page: [params[:page].to_i + 1, @number_of_pages - 1].min, monitor_mode: params[:monitor_mode], query: params[:query]), method: :get, id: "angle-right-link", title: I18n.t("sail.next_page")) %>
32
42
  </div>
33
43
  </div>
34
44
  <% end %>
@@ -9,6 +9,7 @@ module Sail # :nodoc:
9
9
  autoload :Configuration, "sail/configuration"
10
10
  autoload :Instrumenter, "sail/instrumenter"
11
11
  autoload :Types, "sail/types"
12
+ autoload :Graphql, "sail/graphql"
12
13
 
13
14
  class << self
14
15
  attr_writer :configuration
@@ -20,5 +20,6 @@ module Sail
20
20
  SETTINGS_PER_PAGE = 8
21
21
  MINIMAL_SETTINGS_PER_PAGE = 24
22
22
  INPUT_DATE_FORMAT = "%Y-%m-%dT%H:%m:%S"
23
+ MAX_PAGES = 5
23
24
  end
24
25
  end
@@ -37,6 +37,12 @@ module Sail
37
37
  end
38
38
 
39
39
  config.after_initialize do
40
+ if Rails::VERSION::MAJOR < 5
41
+ warn(
42
+ "DEPRECATION WARNING: Sail will no longer support Rails versions < 5"
43
+ )
44
+ end
45
+
40
46
  errors = [ActiveRecord::NoDatabaseError]
41
47
  errors << PG::ConnectionBad if defined?(PG)
42
48
 
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nocov:
4
+ module Sail
5
+ # Graphql
6
+ #
7
+ # Module to include type definitions
8
+ # for GraphQL APIs.
9
+ module Graphql
10
+ autoload :Mutations, "sail/mutations"
11
+
12
+ module Types # :nodoc:
13
+ extend ActiveSupport::Concern
14
+
15
+ included do
16
+ field :sail_get, ::GraphQL::Types::JSON, null: true do
17
+ description "Returns the value for a given setting."
18
+ argument :name, String, required: true, description: "The setting's name."
19
+ end
20
+
21
+ field :sail_switcher, ::GraphQL::Types::JSON, null: true do
22
+ description "Switches between the positive or negative setting based on the throttle."
23
+ argument :positive, String, required: true, description: "The setting's name if the throttle is bigger than the desired amount."
24
+ argument :negative, String, required: true, description: "The setting's name if the throttle is smaller than the desired amount."
25
+ argument :throttled_by, String, required: true, description: "The throttle setting's name."
26
+ end
27
+
28
+ def sail_get(name:)
29
+ Sail.get(name)
30
+ end
31
+
32
+ def sail_switcher(positive:, negative:, throttled_by:)
33
+ Sail.switcher(
34
+ positive: positive,
35
+ negative: negative,
36
+ throttled_by: throttled_by
37
+ )
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ # :nocov:
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nocov:
4
+ module Sail
5
+ module Graphql
6
+ module Mutations # :nodoc:
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ field :sail_set, mutation: SailSet do
11
+ description "Set the value for a setting."
12
+ argument :name, String, required: true
13
+ argument :value, String, required: true
14
+ end
15
+
16
+ field :sail_profile_switch, mutation: SailProfileSwitch do
17
+ description "Switches to the chosen profile."
18
+ argument :name, String, required: true
19
+ end
20
+ end
21
+
22
+ class SailSet < ::GraphQL::Schema::Mutation # :nodoc:
23
+ argument :name, String, required: true
24
+ argument :value, String, required: true
25
+
26
+ field :success, Boolean, null: false
27
+
28
+ def resolve(name:, value:)
29
+ _, success = Sail.set(name, value)
30
+ { success: success }
31
+ end
32
+ end
33
+
34
+ class SailProfileSwitch < ::GraphQL::Schema::Mutation # :nodoc:
35
+ argument :name, String, required: true
36
+
37
+ field :success, Boolean, null: false
38
+
39
+ def resolve(name:)
40
+ success = Profile.exists?(name: name)
41
+ Profile.switch(name)
42
+
43
+ { success: success }
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ # :nocov:
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sail
4
- VERSION = "3.2.4"
4
+ VERSION = "3.3.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sail
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.4
4
+ version: 3.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vinicius Stock
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-02 00:00:00.000000000 Z
11
+ date: 2019-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sassc-rails
@@ -94,20 +94,6 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: byebug
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
97
  - !ruby/object:Gem::Dependency
112
98
  name: capybara
113
99
  requirement: !ruby/object:Gem::Requirement
@@ -136,20 +122,6 @@ dependencies:
136
122
  - - ">="
137
123
  - !ruby/object:Gem::Version
138
124
  version: '0'
139
- - !ruby/object:Gem::Dependency
140
- name: codeclimate-test-reporter
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - "~>"
144
- - !ruby/object:Gem::Version
145
- version: '1.0'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - "~>"
151
- - !ruby/object:Gem::Version
152
- version: '1.0'
153
125
  - !ruby/object:Gem::Dependency
154
126
  name: database_cleaner
155
127
  requirement: !ruby/object:Gem::Requirement
@@ -375,7 +347,9 @@ files:
375
347
  - lib/sail/configuration.rb
376
348
  - lib/sail/constant_collection.rb
377
349
  - lib/sail/engine.rb
350
+ - lib/sail/graphql.rb
378
351
  - lib/sail/instrumenter.rb
352
+ - lib/sail/mutations.rb
379
353
  - lib/sail/railtie.rb
380
354
  - lib/sail/types.rb
381
355
  - lib/sail/types/ab_test.rb
@@ -402,7 +376,7 @@ licenses:
402
376
  metadata: {}
403
377
  post_install_message: |
404
378
  **************************************************************************
405
- Sail 3.2.4!
379
+ Sail 3.3.0!
406
380
 
407
381
  For major version upgrades, check the CHANGELOG and run the updater to
408
382
  create necessary migrations.