diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..df8deec --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +*.gem +Gemfile.lock + +## Documentation cache and generated files: +/.yardoc/ +/_yardoc/ +/doc/ +/rdoc/ +fastlane/README.md +fastlane/report.xml diff --git a/.rspec b/.rspec new file mode 100644 index 0000000..79b4f5e --- /dev/null +++ b/.rspec @@ -0,0 +1,3 @@ +--require spec_helper +--color +--format d diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 0000000..f503e4b --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,157 @@ +# kind_of? is a good way to check a type +Style/ClassCheck: + EnforcedStyle: kind_of? + +# It's better to be more explicit about the type +Style/BracesAroundHashParameters: + Enabled: false + +# specs sometimes have useless assignments, which is fine +Lint/UselessAssignment: + Exclude: + - '**/spec/**/*' + +# We could potentially enable the 2 below: +Style/IndentHash: + Enabled: false + +Style/AlignHash: + Enabled: false + +# HoundCI doesn't like this rule +Style/DotPosition: + Enabled: false + +# We allow !! as it's an easy way to convert ot boolean +Style/DoubleNegation: + Enabled: false + +# Sometimes we allow a rescue block that doesn't contain code +Lint/HandleExceptions: + Enabled: false + +# Cop supports --auto-correct. +Lint/UnusedBlockArgument: + Enabled: false + +# Needed for $verbose +Style/GlobalVars: + Enabled: false + +# We want to allow class Fastlane::Class +Style/ClassAndModuleChildren: + Enabled: false + +# $? Exit +Style/SpecialGlobalVars: + Enabled: false + +Metrics/AbcSize: + Enabled: false + +Metrics/MethodLength: + Enabled: false + +Metrics/CyclomaticComplexity: + Enabled: false + +# The %w might be confusing for new users +Style/WordArray: + MinSize: 19 + +# raise and fail are both okay +Style/SignalException: + Enabled: false + +# Better too much 'return' than one missing +Style/RedundantReturn: + Enabled: false + +# Having if in the same line might not always be good +Style/IfUnlessModifier: + Enabled: false + +# and and or is okay +Style/AndOr: + Enabled: false + +# Configuration parameters: CountComments. +Metrics/ClassLength: + Max: 320 + + +# Configuration parameters: AllowURI, URISchemes. +Metrics/LineLength: + Max: 370 + +# Configuration parameters: CountKeywordArgs. +Metrics/ParameterLists: + Max: 17 + +Metrics/PerceivedComplexity: + Max: 18 + +# Sometimes it's easier to read without guards +Style/GuardClause: + Enabled: false + +# We allow both " and ' +Style/StringLiterals: + Enabled: false + +# something = if something_else +# that's confusing +Style/ConditionalAssignment: + Enabled: false + +# Better to have too much self than missing a self +Style/RedundantSelf: + Enabled: false + +# e.g. +# def self.is_supported?(platform) +# we may never use `platform` +Lint/UnusedMethodArgument: + Enabled: false + +# the let(:key) { ... } +Lint/ParenthesesAsGroupedExpression: + Exclude: + - '**/spec/**/*' + +# This would reject is_ in front of methods +# We use `is_supported?` everywhere already +Style/PredicateName: + Enabled: false + +# We allow the $ +Style/PerlBackrefs: + Enabled: false + +# Disable '+ should be surrounded with a single space' for xcodebuild_spec.rb +Style/SpaceAroundOperators: + Exclude: + - '**/spec/actions_specs/xcodebuild_spec.rb' + +AllCops: + Include: + - '**/fastlane/Fastfile' + Exclude: + - '**/lib/assets/custom_action_template.rb' + - './vendor/**/*' + +# We're not there yet +Style/Documentation: + Enabled: false + +# Added after upgrade to 0.38.0 +Style/MutableConstant: + Enabled: false + +# length > 0 is good +Style/ZeroLengthPredicate: + Enabled: false + +# Adds complexity +Style/IfInsideElse: + Enabled: false \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..3b35e45 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,4 @@ +# os: osx # enable this if you need macOS support +language: ruby +rvm: + - 2.2.4 diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..2aa2e3e --- /dev/null +++ b/Gemfile @@ -0,0 +1,6 @@ +source 'https://rubygems.org' + +gemspec + +plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') +eval(File.read(plugins_path), binding) if File.exist?(plugins_path) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8ccb34f --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Kirill Pahnev + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..365a910 --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +# latest_hockey_build_number plugin + +[![fastlane Plugin Badge](https://rawcdn.githack.com/fastlane/fastlane/master/fastlane/assets/plugin-badge.svg)](https://rubygems.org/gems/fastlane-plugin-latest_hockey_build_number) + +## Getting Started + +This project is a [fastlane](https://github.com/fastlane/fastlane) plugin. To get started with `fastlane-plugin-latest_hockey_build_number`, add it to your project by running: + +```bash +fastlane add_plugin latest_hockey_build_number +``` + +Once you've added the plugin, add the latest_hockey_build_number action to your Fastfile. Like this: + +```ruby +platform :ios do + beta do + version_number = latest_hockey_build_number + end +end +``` + + +## About latest_hockey_build_number + +Gets latest version number of the app with the bundle id from HockeyApp. Special thanks to [nikolaykasyanov](https://github.com/nikolaykasyanov) who published the [gist](https://gist.github.com/nikolaykasyanov/fa9f727a2659450f49825a238546ea8b). + +## Example + +Check out the [example `Fastfile`](fastlane/Fastfile) to see how to use this plugin. Try it by cloning the repo, running `fastlane install_plugins` and `bundle exec fastlane test`. + +## Issues and Feedback + +For any other issues and feedback about this plugin, please submit it to this repository. + +## Troubleshooting + +If you have trouble using plugins, check out the [Plugins Troubleshooting](https://github.com/fastlane/fastlane/blob/master/fastlane/docs/PluginsTroubleshooting.md) doc in the main `fastlane` repo. + +## Using `fastlane` Plugins + +For more information about how the `fastlane` plugin system works, check out the [Plugins documentation](https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Plugins.md). + +## About `fastlane` + +`fastlane` is the easiest way to automate building and releasing your iOS and Android apps. To learn more, check out [fastlane.tools](https://fastlane.tools). diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..05f4f23 --- /dev/null +++ b/Rakefile @@ -0,0 +1,9 @@ +require 'bundler/gem_tasks' + +require 'rspec/core/rake_task' +RSpec::Core::RakeTask.new + +require 'rubocop/rake_task' +RuboCop::RakeTask.new(:rubocop) + +task default: [:spec, :rubocop] diff --git a/circle.yml b/circle.yml new file mode 100644 index 0000000..3c3bb8d --- /dev/null +++ b/circle.yml @@ -0,0 +1,9 @@ +test: + override: + - bundle exec rake +machine: + ruby: + version: 2.2.4 +# Enable xcode below if you need macOS +# xcode: +# version: "7.3" diff --git a/fastlane-plugin-latest_hockey_build_number.gemspec b/fastlane-plugin-latest_hockey_build_number.gemspec new file mode 100644 index 0000000..bd0fc5f --- /dev/null +++ b/fastlane-plugin-latest_hockey_build_number.gemspec @@ -0,0 +1,28 @@ +# coding: utf-8 +lib = File.expand_path("../lib", __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'fastlane/plugin/latest_hockey_build_number/version' + +Gem::Specification.new do |spec| + spec.name = 'fastlane-plugin-latest_hockey_build_number' + spec.version = Fastlane::LatestHockeyBuildNumber::VERSION + spec.author = %q{Kirill Pahnev} + spec.email = %q{kirill.pahnev@gmail.com} + + spec.summary = %q{Gets latest version number of the app with the bundle id from HockeyApp} + # spec.homepage = "https://github.com//fastlane-plugin-latest_hockey_build_number" + spec.license = "MIT" + + spec.files = Dir["lib/**/*"] + %w(README.md LICENSE) + spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) + spec.require_paths = ['lib'] + + # spec.add_dependency 'your-dependency', '~> 1.0.0' + + spec.add_development_dependency 'pry' + spec.add_development_dependency 'bundler' + spec.add_development_dependency 'rspec' + spec.add_development_dependency 'rake' + spec.add_development_dependency 'rubocop' + spec.add_development_dependency 'fastlane', '>= 1.103.0' +end diff --git a/fastlane/Fastfile b/fastlane/Fastfile new file mode 100644 index 0000000..55098ac --- /dev/null +++ b/fastlane/Fastfile @@ -0,0 +1,3 @@ +lane :test do + latest_hockey_build_number +end diff --git a/fastlane/Pluginfile b/fastlane/Pluginfile new file mode 100644 index 0000000..e0576b0 --- /dev/null +++ b/fastlane/Pluginfile @@ -0,0 +1 @@ +# Autogenerated by fastlane diff --git a/lib/fastlane/plugin/latest_hockey_build_number.rb b/lib/fastlane/plugin/latest_hockey_build_number.rb new file mode 100644 index 0000000..c050074 --- /dev/null +++ b/lib/fastlane/plugin/latest_hockey_build_number.rb @@ -0,0 +1,16 @@ +require 'fastlane/plugin/latest_hockey_build_number/version' + +module Fastlane + module LatestHockeyBuildNumber + # Return all .rb files inside the "actions" and "helper" directory + def self.all_classes + Dir[File.expand_path('**/{actions,helper}/*.rb', File.dirname(__FILE__))] + end + end +end + +# By default we want to import all available actions and helpers +# A plugin can contain any number of actions and plugins +Fastlane::LatestHockeyBuildNumber.all_classes.each do |current| + require current +end diff --git a/lib/fastlane/plugin/latest_hockey_build_number/actions/latest_hockey_build_number_action.rb b/lib/fastlane/plugin/latest_hockey_build_number/actions/latest_hockey_build_number_action.rb new file mode 100644 index 0000000..bad7818 --- /dev/null +++ b/lib/fastlane/plugin/latest_hockey_build_number/actions/latest_hockey_build_number_action.rb @@ -0,0 +1,70 @@ +require 'json' +require 'net/http' + +module Fastlane + module Actions + class LatestHockeyBuildNumberAction < Action + def self.run(config) + host_uri = URI.parse('https://rink.hockeyapp.net') + http = Net::HTTP.new(host_uri.host, host_uri.port) + http.use_ssl = true + list_request = Net::HTTP::Get.new('/api/2/apps') + list_request['X-HockeyAppToken'] = config[:api_token] + list_response = http.request(list_request) + app_list = JSON.parse(list_response.body)['apps'] + + app_index = app_list.find_index { |app| app['platform'] == 'iOS' && app['bundle_identifier'] == config[:bundle_id] } + + if app_index.nil? then + UI.error "No application with bundle id #{config[:bundle_id]}" + return nil + end + + app_identifier = app_list[app_index]['public_identifier'] + + details_request = Net::HTTP::Get.new("/api/2/apps/#{app_identifier}/app_versions?page=1") + details_request['X-HockeyAppToken'] = config[:api_token] + details_response = http.request(details_request) + + app_details = JSON.parse(details_response.body) + latest_build = app_details['app_versions'][0] + + if latest_build.nil? then + UI.error "The app has no versions yet" + return nil + end + + return latest_build['version'] + end + + def self.description + "Gets latest version number of the app with the bundle id from HockeyApp" + end + + def self.authors + ["pahnev", "FlixBus (original author)"] + end + + def self.available_options + [ + FastlaneCore::ConfigItem.new(key: :api_token, + env_name: "FL_HOCKEY_API_TOKEN", + description: "API Token for Hockey Access", + verify_block: proc do |value| + UI.user_error!("No API token for Hockey given, pass using `api_token: 'token'`") unless value and !value.empty? + end), + FastlaneCore::ConfigItem.new(key: :bundle_id, + env_name: "FL_HOCKEY_BUNDLE_ID", + description: "Bundle ID of the application", + verify_block: proc do |value| + UI.user_error!("No bundle ID for Hockey given, pass using `bundle_id: 'bundle id'`") unless value and !value.empty? + end), + ] + end + + def self.is_supported?(platform) + [:ios].include? platform + end + end + end +end diff --git a/lib/fastlane/plugin/latest_hockey_build_number/helper/latest_hockey_build_number_helper.rb b/lib/fastlane/plugin/latest_hockey_build_number/helper/latest_hockey_build_number_helper.rb new file mode 100644 index 0000000..f149dd1 --- /dev/null +++ b/lib/fastlane/plugin/latest_hockey_build_number/helper/latest_hockey_build_number_helper.rb @@ -0,0 +1,12 @@ +module Fastlane + module Helper + class LatestHockeyBuildNumberHelper + # class methods that you define here become available in your action + # as `Helper::LatestHockeyBuildNumberHelper.your_method` + # + def self.show_message + UI.message("Hello from the latest_hockey_build_number plugin helper!") + end + end + end +end diff --git a/lib/fastlane/plugin/latest_hockey_build_number/version.rb b/lib/fastlane/plugin/latest_hockey_build_number/version.rb new file mode 100644 index 0000000..c8c6550 --- /dev/null +++ b/lib/fastlane/plugin/latest_hockey_build_number/version.rb @@ -0,0 +1,5 @@ +module Fastlane + module LatestHockeyBuildNumber + VERSION = "0.1.0" + end +end diff --git a/spec/latest_hockey_build_number_action_spec.rb b/spec/latest_hockey_build_number_action_spec.rb new file mode 100644 index 0000000..2a571f9 --- /dev/null +++ b/spec/latest_hockey_build_number_action_spec.rb @@ -0,0 +1,9 @@ +describe Fastlane::Actions::LatestHockeyBuildNumberAction do + describe '#run' do + it 'prints a message' do + expect(Fastlane::UI).to receive(:message).with("The latest_hockey_build_number plugin is working!") + + Fastlane::Actions::LatestHockeyBuildNumberAction.run(nil) + end + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 0000000..3e7d92d --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,10 @@ +$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__) + +# This module is only used to check the environment is currently a testing env +module SpecHelper +end + +require 'fastlane' # to import the Action super class +require 'fastlane/plugin/latest_hockey_build_number' # import the actual plugin + +Fastlane.load_actions # load other actions (in case your plugin calls other actions or shared values)