diff --git a/flipper.gemspec b/flipper.gemspec index 48c25f957..73cfa8c1a 100644 --- a/flipper.gemspec +++ b/flipper.gemspec @@ -35,4 +35,6 @@ Gem::Specification.new do |gem| gem.metadata = Flipper::METADATA gem.add_dependency 'concurrent-ruby', '< 2' + + gem.required_ruby_version = ">= #{Flipper::REQUIRED_RUBY_VERSION}" end diff --git a/lib/flipper/engine.rb b/lib/flipper/engine.rb index 612eff425..faa0eea66 100644 --- a/lib/flipper/engine.rb +++ b/lib/flipper/engine.rb @@ -83,5 +83,9 @@ def self.default_strict_value :warn end end + + def self.deprecated_rails_version? + Gem::Version.new(Rails.version) < Gem::Version.new(Flipper::NEXT_REQUIRED_RAILS_VERSION) + end end end diff --git a/lib/flipper/ui/action.rb b/lib/flipper/ui/action.rb index 54d647dbf..58c9537df 100644 --- a/lib/flipper/ui/action.rb +++ b/lib/flipper/ui/action.rb @@ -53,6 +53,7 @@ def feature_name style-src 'self' 'unsafe-inline'; style-src-attr 'unsafe-inline' ; style-src-elem 'self'; + connect-src https://www.flippercloud.io; CSP # Public: Call this in subclasses so the action knows its route. diff --git a/lib/flipper/ui/public/js/version.js b/lib/flipper/ui/public/js/version.js new file mode 100644 index 000000000..945f66822 --- /dev/null +++ b/lib/flipper/ui/public/js/version.js @@ -0,0 +1,33 @@ +// Get the latest release from RubyGems.org and show a badge if it's not the current version +function checkLatestRelease() { + // Skip check if last check was less than 1 day ago + if(localStorage.getItem('flipper.releaseCheckedAt') > new Date().getTime() - 86400000) return + + // store the last time we checked for a new version + localStorage.setItem('flipper.releaseCheckedAt', new Date().getTime()) + + fetch('https://www.flippercloud.io/release.json').then(response => { + // Something went wrong, so just give up + if(!response.ok) return + + response.json().then(release => { + localStorage.setItem('flipper.release', JSON.stringify(release)) + showReleaseBadge() + }) + }) +} + +// Show a badge if a new release is available +function showReleaseBadge() { + const badge = document.querySelector('#new-version-badge') + const release = JSON.parse(localStorage.getItem('flipper.release') || false) + + if(!badge || !release || badge.dataset.version === release.version) return + + badge.innerText = `${release.version} available!` + badge.setAttribute('href', release.changelog_uri) + badge.classList.remove('d-none') +} + +checkLatestRelease() +showReleaseBadge() diff --git a/lib/flipper/ui/views/layout.erb b/lib/flipper/ui/views/layout.erb index 9bf1ce42b..b050575a0 100644 --- a/lib/flipper/ui/views/layout.erb +++ b/lib/flipper/ui/views/layout.erb @@ -21,6 +21,20 @@ DocsSettings • Version: <%= Flipper::VERSION %> + + + + <% if Flipper.deprecated_ruby_version? %> + + Ruby <%= RUBY_VERSION %> deprecated + + <% end %> + + <% if defined?(Rails) && Flipper::Engine.deprecated_rails_version? %> + + Rails <%= Rails.version %> deprecated + + <% end %>