billomat 0.1.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. checksums.yaml +5 -5
  2. data/.editorconfig +30 -0
  3. data/.github/workflows/documentation.yml +38 -0
  4. data/.github/workflows/test.yml +59 -0
  5. data/.gitignore +5 -0
  6. data/.rubocop.yml +53 -0
  7. data/.simplecov +3 -0
  8. data/.yardopts +6 -0
  9. data/CHANGELOG.md +48 -0
  10. data/Dockerfile +29 -0
  11. data/Envfile +6 -0
  12. data/Gemfile +3 -1
  13. data/Makefile +135 -0
  14. data/README.md +42 -17
  15. data/Rakefile +74 -3
  16. data/billomat.gemspec +28 -22
  17. data/config/docker/.bash_profile +3 -0
  18. data/config/docker/.bashrc +48 -0
  19. data/config/docker/.inputrc +17 -0
  20. data/doc/assets/project.svg +68 -0
  21. data/docker-compose.yml +9 -0
  22. data/lib/billomat/actions/cancel.rb +3 -5
  23. data/lib/billomat/actions/complete.rb +8 -12
  24. data/lib/billomat/actions/email.rb +6 -10
  25. data/lib/billomat/actions/pdf.rb +4 -10
  26. data/lib/billomat/actions/uncancel.rb +3 -6
  27. data/lib/billomat/actions.rb +0 -1
  28. data/lib/billomat/configuration.rb +2 -1
  29. data/lib/billomat/gateway.rb +52 -24
  30. data/lib/billomat/models/base.rb +26 -27
  31. data/lib/billomat/models/client.rb +3 -4
  32. data/lib/billomat/models/contact.rb +18 -0
  33. data/lib/billomat/models/credit_note.rb +18 -0
  34. data/lib/billomat/models/credit_note_item.rb +18 -0
  35. data/lib/billomat/models/invoice.rb +6 -11
  36. data/lib/billomat/models/invoice_item.rb +3 -3
  37. data/lib/billomat/models/invoice_payment.rb +3 -4
  38. data/lib/billomat/models/tag.rb +18 -0
  39. data/lib/billomat/models/template.rb +18 -0
  40. data/lib/billomat/models.rb +6 -2
  41. data/lib/billomat/search.rb +12 -14
  42. data/lib/billomat/version.rb +1 -1
  43. data/lib/billomat.rb +15 -18
  44. metadata +117 -20
  45. data/.travis.yml +0 -18
  46. data/doc/assets/logo.png +0 -0
  47. data/doc/assets/project.png +0 -0
  48. data/doc/assets/project.xcf +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 33bd513552938f033a44cf0309bebfeb794f22d9
4
- data.tar.gz: 5a503ad79b891559bdd417ea02e956f53fb5795a
2
+ SHA256:
3
+ metadata.gz: 1d00f8873b7ea8c178761b0ebca4200541d9eaa25ac2cb67500f0b22caf29482
4
+ data.tar.gz: e7e0f542aa48d665ef1957676b785dc801e27b0f9e754b7ea31318e869142a92
5
5
  SHA512:
6
- metadata.gz: c5d1f9f84e01b162360a92d479ce6f6974cb51831975f240be7c14ed5a1ef7e0f0f176955bdd048a50f7e07f94522dc99a73b72bfe608cb4f05fee2b0b51c63a
7
- data.tar.gz: 1aa0161801c5b0e7bd1efd1292aa95223d30294e108a2510095058f22d91fa1a5cc54595c7f2ec3f0cfe0545dcca0b37e2271293169083bb099c9d0f3562d390
6
+ metadata.gz: fff72d6a694ed3b199999291aac06da32f5517de090426b8190467a1a404076095deeae152a007dd96ff4c7722433ab6916523905fd68f5fccfee00456d634cb
7
+ data.tar.gz: 1e5d35d889fbba13ee6fbca7193a21ea4bf8d10e6baab532b9ad989bcc55c70990801d7558969d79531ad3c8d58f1b10f0b61bf947957a39e58782d096d347c0
data/.editorconfig ADDED
@@ -0,0 +1,30 @@
1
+ # http://editorconfig.org
2
+ root = true
3
+
4
+ [*]
5
+ indent_style = space
6
+ indent_size = 2
7
+ end_of_line = lf
8
+ charset = utf-8
9
+ trim_trailing_whitespace = true
10
+ insert_final_newline = true
11
+
12
+ [*.md]
13
+ trim_trailing_whitespace = true
14
+
15
+ [*.json]
16
+ indent_style = space
17
+ indent_size = 2
18
+
19
+ [*.yml]
20
+ indent_style = space
21
+ indent_size = 2
22
+
23
+ [Makefile]
24
+ trim_trailing_whitespace = true
25
+ indent_style = tab
26
+ indent_size = 4
27
+
28
+ [*.sh]
29
+ indent_style = space
30
+ indent_size = 2
@@ -0,0 +1,38 @@
1
+ name: Build Documentation
2
+ on:
3
+ repository_dispatch:
4
+ types: [documentation]
5
+
6
+ concurrency:
7
+ group: 'docs'
8
+
9
+ jobs:
10
+ docs:
11
+ name: Build gem documentation
12
+ runs-on: ubuntu-20.04
13
+ timeout-minutes: 5
14
+ steps:
15
+ - uses: actions/checkout@v2
16
+
17
+ - name: Install the correct Ruby version
18
+ uses: ruby/setup-ruby@v1
19
+ with:
20
+ ruby-version: 2.5
21
+ bundler-cache: true
22
+
23
+ - name: Prepare the virtual environment
24
+ uses: hausgold/actions/ci@master
25
+ with:
26
+ clone_token: '${{ secrets.CLONE_TOKEN }}'
27
+ settings: '${{ github.repository }}'
28
+ target: ci/gem-test
29
+
30
+ - name: Build gem documentation
31
+ run: make docs
32
+
33
+ - name: Upload the code coverage report
34
+ run: coverage
35
+
36
+ - name: Add this job to the commit status
37
+ run: commit-status '${{ job.status }}'
38
+ if: always()
@@ -0,0 +1,59 @@
1
+ name: Test
2
+ on:
3
+ push:
4
+ branches:
5
+ - '**'
6
+ schedule:
7
+ - cron: '0 0 * * MON'
8
+
9
+ concurrency:
10
+ group: '${{ github.ref }}'
11
+ cancel-in-progress: true
12
+
13
+ jobs:
14
+ test:
15
+ name: 'Test the gem (Ruby ${{ matrix.ruby }})'
16
+ runs-on: ubuntu-20.04
17
+ timeout-minutes: 5
18
+ strategy:
19
+ fail-fast: false
20
+ matrix:
21
+ ruby: [2.3, 2.4, 2.5, 2.6]
22
+ steps:
23
+ - uses: actions/checkout@v2
24
+
25
+ - name: Install the correct Ruby version
26
+ uses: ruby/setup-ruby@v1
27
+ with:
28
+ ruby-version: ${{ matrix.ruby }}
29
+ bundler-cache: true
30
+
31
+ - name: Prepare the virtual environment
32
+ uses: hausgold/actions/ci@master
33
+ with:
34
+ clone_token: '${{ secrets.CLONE_TOKEN }}'
35
+ settings: '${{ github.repository }}'
36
+ target: ci/gem-test
37
+
38
+ - name: Run the gem tests
39
+ run: make test
40
+
41
+ - name: Upload the code coverage report
42
+ run: coverage
43
+
44
+ trigger-docs:
45
+ name: Trigger the documentation upload
46
+ runs-on: ubuntu-20.04
47
+ timeout-minutes: 2
48
+ needs: test
49
+ if: github.ref == 'refs/heads/master'
50
+ steps:
51
+ - name: Prepare the virtual environment
52
+ uses: hausgold/actions/ci@master
53
+ with:
54
+ clone_token: '${{ secrets.CLONE_TOKEN }}'
55
+ settings: '${{ github.repository }}'
56
+ target: ci/noop
57
+
58
+ - name: Trigger the documentation upload
59
+ run: workflow documentation
data/.gitignore CHANGED
@@ -3,9 +3,14 @@
3
3
  /Gemfile.lock
4
4
  /_yardoc/
5
5
  /coverage/
6
+ /doc/api/
6
7
  /pkg/
7
8
  /spec/reports/
8
9
  /tmp/
10
+ /vendor/
11
+ /gemfiles/vendor/
12
+ /Gemfile.lock
13
+ *.gemfile.lock
9
14
 
10
15
  billomat*.gem
11
16
 
data/.rubocop.yml ADDED
@@ -0,0 +1,53 @@
1
+ require: rubocop-rspec
2
+
3
+ Rails:
4
+ Enabled: true
5
+
6
+ Documentation:
7
+ Enabled: true
8
+
9
+ AllCops:
10
+ DisplayCopNames: true
11
+ TargetRubyVersion: 2.5
12
+ Exclude:
13
+ - bin/**/*
14
+ - vendor/**/*
15
+ - build/**/*
16
+ - gemfiles/**/*
17
+
18
+ Metrics/BlockLength:
19
+ Exclude:
20
+ - Rakefile
21
+ - '*.gemspec'
22
+ - spec/**/*.rb
23
+ - '**/*.rake'
24
+ - doc/**/*.rb
25
+
26
+ # Document all the things.
27
+ Style/DocumentationMethod:
28
+ Enabled: true
29
+ RequireForNonPublicMethods: true
30
+
31
+ # It's a deliberate idiom in RSpec.
32
+ # See: https://github.com/bbatsov/rubocop/issues/4222
33
+ Lint/AmbiguousBlockAssociation:
34
+ Exclude:
35
+ - "spec/**/*"
36
+
37
+ # Because +expect_any_instance_of().to have_received()+ is not
38
+ # supported with the +with(hash_including)+ matchers
39
+ RSpec/MessageSpies:
40
+ EnforcedStyle: receive
41
+
42
+ # Because nesting makes sense here to group the feature tests
43
+ # more effective. This increases maintainability.
44
+ RSpec/NestedGroups:
45
+ Max: 4
46
+
47
+ # Disable regular Rails spec paths.
48
+ RSpec/FilePath:
49
+ Enabled: false
50
+
51
+ # Because we just implemented the ActiveRecord API.
52
+ Rails/SkipsModelValidations:
53
+ Enabled: false
data/.simplecov ADDED
@@ -0,0 +1,3 @@
1
+ SimpleCov.start 'test_frameworks' do
2
+ add_filter '/vendor/bundle/'
3
+ end
data/.yardopts ADDED
@@ -0,0 +1,6 @@
1
+ --output-dir=doc/api
2
+ --plugin activesupport-concern
3
+ --markup=rdoc
4
+ -
5
+ README.md
6
+ lib/**/*.rb
data/CHANGELOG.md ADDED
@@ -0,0 +1,48 @@
1
+ ### 0.3.0
2
+
3
+ * Improve error handling (breaking change, as we are now raising
4
+ `Billomat::GatewayError`s rather than just the client's
5
+ `RestClient::Exception`) (#15)
6
+ * Added bang variants to API methods
7
+ (`Billomat::Models::Base#{save!,create!,update!,delete!}`) (#16)
8
+ * Added `CreditNote` and `CreditNoteItem` models (#14)
9
+ * Moved to GitHub Actions
10
+ * Migrated to our own coverage reporting
11
+
12
+ ### 0.2.0
13
+
14
+ * Add codeclimate test runner
15
+ * Update codeclimate reporter id
16
+ * Switched to SVG project teasers
17
+ * Updated Travis CI and Code Climate configs (#11)
18
+ * Changed travis-ci.org to travis-ci.com links
19
+ * Adds templates and tags to models (#13)
20
+
21
+ ### 0.1.6
22
+
23
+ * Support registered apps
24
+ * Added `app_id` and `app_secret` to configuration (#9)
25
+
26
+ ### 0.1.5
27
+
28
+ * Added contact support
29
+
30
+ ### 0.1.4
31
+
32
+ * Made timeout configurable
33
+
34
+ ### 0.1.3
35
+
36
+ * Added `#as_json` to base model
37
+
38
+ ### 0.1.2
39
+
40
+ * Small fixes and code coverage
41
+
42
+ ### 0.1.1
43
+
44
+ * Improved documentation and README
45
+
46
+ ### 0.1.0
47
+
48
+ * Initial release
data/Dockerfile ADDED
@@ -0,0 +1,29 @@
1
+ FROM hausgold/ruby:2.5
2
+ MAINTAINER Hermann Mayer <hermann.mayer@hausgold.de>
3
+
4
+ # Update system gem
5
+ RUN gem update --system
6
+
7
+ # Install system packages and the latest bundler
8
+ RUN apt-get update -yqqq && \
9
+ apt-get install -y \
10
+ build-essential locales sudo vim \
11
+ ca-certificates \
12
+ bash-completion inotify-tools && \
13
+ echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen && /usr/sbin/locale-gen && \
14
+ gem install bundler -v '~> 2.0' --no-document --no-prerelease && \
15
+ gem install bundler -v '~> 1.0' --no-document --no-prerelease
16
+
17
+ # Add new web user
18
+ RUN mkdir /app && \
19
+ adduser web --home /home/web --shell /bin/bash \
20
+ --disabled-password --gecos ""
21
+ COPY config/docker/* /home/web/
22
+ RUN chown web:web -R /app /home/web /usr/local/bundle && \
23
+ mkdir -p /home/web/.ssh
24
+
25
+ # Set the root password and grant root access to web
26
+ RUN echo 'root:root' | chpasswd
27
+ RUN echo 'web ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
28
+
29
+ WORKDIR /app
data/Envfile ADDED
@@ -0,0 +1,6 @@
1
+ LANG=en_US.UTF-8
2
+ LANGUAGE=en_US.UTF-8
3
+ LC_ALL=en_US.UTF-8
4
+
5
+ # Just fix this, so Appraisals with Rails 4 are working fine
6
+ BUNDLER_VERSION=1.17.3
data/Gemfile CHANGED
@@ -1,4 +1,6 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in billomat.gemspec
4
6
  gemspec
data/Makefile ADDED
@@ -0,0 +1,135 @@
1
+ MAKEFLAGS += --warn-undefined-variables -j1
2
+ SHELL := bash
3
+ .SHELLFLAGS := -eu -o pipefail -c
4
+ .DEFAULT_GOAL := all
5
+ .DELETE_ON_ERROR:
6
+ .SUFFIXES:
7
+ .PHONY:
8
+
9
+ # Environment switches
10
+ MAKE_ENV ?= docker
11
+ COMPOSE_RUN_SHELL_FLAGS ?= --rm
12
+
13
+ # Directories
14
+ VENDOR_DIR ?= vendor/bundle
15
+
16
+ # Host binaries
17
+ AWK ?= awk
18
+ BASH ?= bash
19
+ COMPOSE ?= docker-compose
20
+ DOCKER ?= docker
21
+ GREP ?= grep
22
+ ID ?= id
23
+ MKDIR ?= mkdir
24
+ RM ?= rm
25
+ XARGS ?= xargs
26
+
27
+ # Container binaries
28
+ BUNDLE ?= bundle
29
+ GEM ?= gem
30
+ RAKE ?= rake
31
+ RUBOCOP ?= rubocop
32
+ YARD ?= yard
33
+
34
+ # Define a generic shell run wrapper
35
+ # $1 - The command to run
36
+ ifeq ($(MAKE_ENV),docker)
37
+ define run-shell
38
+ $(COMPOSE) run $(COMPOSE_RUN_SHELL_FLAGS) \
39
+ -e LANG=en_US.UTF-8 -e LANGUAGE=en_US.UTF-8 -e LC_ALL=en_US.UTF-8 \
40
+ -e HOME=/home/web -e BUNDLE_APP_CONFIG=/app/.bundle \
41
+ -u `$(ID) -u` test bash -c 'sleep 0.1; echo; $(1)'
42
+ endef
43
+ else ifeq ($(MAKE_ENV),baremetal)
44
+ define run-shell
45
+ $(1)
46
+ endef
47
+ endif
48
+
49
+ all:
50
+ # Billomat
51
+ #
52
+ # install Install the dependencies
53
+ # update Update the local Gemset dependencies
54
+ # clean Clean the dependencies
55
+ #
56
+ # test Run the whole test suite
57
+ # test-style Test the code styles
58
+ #
59
+ # docs Generate the Ruby documentation of the library
60
+ # stats Print the code statistics (library and test suite)
61
+ # notes Print all the notes from the code
62
+ # release Release a new Gem version (maintainers only)
63
+ #
64
+ # shell Run an interactive shell on the container
65
+ # shell-irb Run an interactive IRB shell on the container
66
+
67
+ install:
68
+ # Install the dependencies
69
+ @$(MKDIR) -p $(VENDOR_DIR)
70
+ @$(call run-shell,$(BUNDLE) check || $(BUNDLE) install --path $(VENDOR_DIR))
71
+ @$(call run-shell,GEM_HOME=vendor/bundle/ruby/$${RUBY_MAJOR}.0 \
72
+ $(GEM) install bundler -v "~> 1.0")
73
+
74
+ test: \
75
+ test-specs \
76
+ test-style
77
+
78
+ test-specs:
79
+ # Run the whole test suite
80
+ @$(call run-shell,$(BUNDLE) exec $(RAKE) stats spec)
81
+
82
+ test-style: \
83
+ test-style-ruby
84
+
85
+ test-style-ruby:
86
+ # Run the static code analyzer (rubocop)
87
+ @$(call run-shell,$(BUNDLE) exec $(RUBOCOP) -a)
88
+
89
+ clean:
90
+ # Clean the dependencies
91
+ @$(RM) -rf $(VENDOR_DIR)
92
+ @$(RM) -rf $(VENDOR_DIR)/Gemfile.lock
93
+ @$(RM) -rf pkg
94
+ @$(RM) -rf coverage
95
+
96
+ clean-containers:
97
+ # Clean running containers
98
+ ifeq ($(MAKE_ENV),docker)
99
+ @$(COMPOSE) down
100
+ endif
101
+
102
+ clean-images:
103
+ # Clean build images
104
+ ifeq ($(MAKE_ENV),docker)
105
+ @-$(DOCKER) images | $(GREP) rimless \
106
+ | $(AWK) '{ print $$3 }' \
107
+ | $(XARGS) -rn1 $(DOCKER) rmi -f
108
+ endif
109
+
110
+ distclean: clean clean-containers clean-images
111
+
112
+ shell:
113
+ # Run an interactive shell on the container
114
+ @$(call run-shell,$(BASH) -i)
115
+
116
+ shell-irb:
117
+ # Run an interactive IRB shell on the container
118
+ @$(call run-shell,bin/console)
119
+
120
+ docs:
121
+ # Build the API documentation
122
+ @$(call run-shell,$(BUNDLE) exec $(YARD) -q && \
123
+ $(BUNDLE) exec $(YARD) stats --list-undoc --compact)
124
+
125
+ notes:
126
+ # Print the code statistics (library and test suite)
127
+ @$(call run-shell,$(BUNDLE) exec $(RAKE) notes)
128
+
129
+ stats:
130
+ # Print all the notes from the code
131
+ @$(call run-shell,$(BUNDLE) exec $(RAKE) stats)
132
+
133
+ release:
134
+ # Release a new gem version
135
+ @$(BUNDLE) exec $(RAKE) release
data/README.md CHANGED
@@ -1,11 +1,20 @@
1
- ![Billomat](doc/assets/project.png)
1
+ ![Billomat](doc/assets/project.svg)
2
2
 
3
- [![Build Status](https://travis-ci.org/hausgold/billomat.svg?branch=master)](https://travis-ci.org/hausgold/billomat)
3
+ [![Continuous Integration](https://github.com/hausgold/billomat/actions/workflows/test.yml/badge.svg?branch=master)](https://github.com/hausgold/billomat/actions/workflows/test.yml)
4
4
  [![Gem Version](https://badge.fury.io/rb/billomat.svg)](https://badge.fury.io/rb/billomat)
5
- [![Maintainability](https://api.codeclimate.com/v1/badges/49baf848f42a2e5b95db/maintainability)](https://codeclimate.com/github/hausgold/billomat/maintainability)
6
- [![Test Coverage](https://api.codeclimate.com/v1/badges/49baf848f42a2e5b95db/test_coverage)](https://codeclimate.com/github/hausgold/billomat/test_coverage)
5
+ [![Test Coverage](https://automate-api.hausgold.de/v1/coverage_reports/billomat/coverage.svg)](https://knowledge.hausgold.de/coverage)
6
+ [![Test Ratio](https://automate-api.hausgold.de/v1/coverage_reports/billomat/ratio.svg)](https://knowledge.hausgold.de/coverage)
7
+ [![API docs](https://automate-api.hausgold.de/v1/coverage_reports/billomat/documentation.svg)](https://www.rubydoc.info/gems/billomat)
7
8
 
8
- This gem provides a Ruby API for [billomat.com](https://billomat.com) - an online accounting service.
9
+ This gem provides a Ruby API for [billomat.com](https://billomat.com) - an
10
+ online accounting service.
11
+
12
+ - [Installation](#installation)
13
+ - [Usage](#usage)
14
+ - [Configuration](#configuration)
15
+ - [Basic usage](#basic-usage)
16
+ - [Development](#development)
17
+ - [Contributing](#contributing)
9
18
 
10
19
  ## Installation
11
20
 
@@ -37,15 +46,29 @@ or inside an initializer.
37
46
 
38
47
  ```ruby
39
48
  Billomat.configure do |config|
40
- config.subdomain = 'example' # Subdomain, e.g. example.billomat.net
41
- config.api_key = '4aefdc...' # API key
42
- config.timeout = 5 # timeout in seconds
49
+ # Subdomain, e.g. example.billomat.net
50
+ config.subdomain = 'example'
51
+ # API key
52
+ config.api_key = '4aefdc...'
53
+ # timeout in seconds
54
+ config.timeout = 5
55
+
56
+ # You can also configure a registerd app to increase your
57
+ # API call limit as described here:
58
+ # https://www.billomat.com/en/api/basics/rate-limiting/
59
+ config.app_id = '12345'
60
+ config.app_secret = 'c3df...'
43
61
  end
44
62
  ```
45
63
 
46
64
  ### Basic usage
47
65
 
48
- Currently there is basic support for the models `Invoice`, `Client`, `InvoicePayment`, `InvoiceItem`
66
+ Currently there is basic support for the models:
67
+ * `Invoice`
68
+ * `Client`
69
+ * `InvoicePayment`
70
+ * `InvoiceItem`
71
+ * `Contact`
49
72
 
50
73
  ```ruby
51
74
  Billomat::Models::Invoice.where(invoice_number: 'RE1234')
@@ -62,17 +85,19 @@ client.delete
62
85
  => true
63
86
  ```
64
87
 
65
- ### Documentation
66
-
67
- The RubyDoc is available [here](http://www.rubydoc.info/gems/billomat).
68
-
69
-
70
88
  ## Development
71
89
 
72
- 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.
90
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run
91
+ `rake spec` to run the tests. You can also run `bin/console` for an interactive
92
+ prompt that will allow you to experiment.
73
93
 
74
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
94
+ To install this gem onto your local machine, run `bundle exec rake install`. To
95
+ release a new version, update the version number in `version.rb`, and then run
96
+ `bundle exec rake release`, which will create a git tag for the version, push
97
+ git commits and tags, and push the `.gem` file to
98
+ [rubygems.org](https://rubygems.org).
75
99
 
76
100
  ## Contributing
77
101
 
78
- Bug reports and pull requests are welcome on GitHub at https://github.com/hausgold/billomat.
102
+ Bug reports and pull requests are welcome on GitHub at
103
+ https://github.com/hausgold/billomat.
data/Rakefile CHANGED
@@ -1,6 +1,77 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+ require 'rails/code_statistics'
6
+ require 'pp'
3
7
 
4
8
  RSpec::Core::RakeTask.new(:spec)
5
9
 
6
- task :default => :spec
10
+ task default: :spec
11
+
12
+ # Load some railties tasks
13
+ load 'rails/tasks/statistics.rake'
14
+ load 'rails/tasks/annotations.rake'
15
+
16
+ # Clear the default statistics directory constant
17
+ #
18
+ # rubocop:disable Style/MutableConstant because we define it
19
+ Object.send(:remove_const, :STATS_DIRECTORIES)
20
+ ::STATS_DIRECTORIES = []
21
+ # rubocop:enable Style/MutableConstant
22
+
23
+ # Monkey patch the Rails +CodeStatistics+ class to support configurable
24
+ # patterns per path. This is reuqired to support top-level only file matches.
25
+ class CodeStatistics
26
+ DEFAULT_PATTERN = /^(?!\.).*?\.(rb|js|coffee|rake)$/.freeze
27
+
28
+ # Pass the possible +pattern+ argument down to the
29
+ # +calculate_directory_statistics+ method call.
30
+ def calculate_statistics
31
+ Hash[@pairs.map do |pair|
32
+ [pair.first, calculate_directory_statistics(*pair[1..-1])]
33
+ end]
34
+ end
35
+
36
+ # Match the pattern against the individual file name and the relative file
37
+ # path. This allows top-level only matches.
38
+ def calculate_directory_statistics(directory, pattern = DEFAULT_PATTERN)
39
+ stats = CodeStatisticsCalculator.new
40
+
41
+ Dir.foreach(directory) do |file_name|
42
+ path = "#{directory}/#{file_name}"
43
+
44
+ if File.directory?(path) && (/^\./ !~ file_name)
45
+ stats.add(calculate_directory_statistics(path, pattern))
46
+ elsif file_name =~ pattern || path =~ pattern
47
+ stats.add_by_file_path(path)
48
+ end
49
+ end
50
+
51
+ stats
52
+ end
53
+ end
54
+
55
+ # Configure all code statistics directories
56
+ vendors = [
57
+ [:unshift, 'Top-levels', 'lib', %r{lib(/billomat)?/[^/]+\.rb$}],
58
+ [:unshift, 'Top-levels specs', 'spec', %r{spec/[^/]+_spec\.rb$}],
59
+
60
+ [:unshift, 'Actions', 'lib/billomat/actions'],
61
+
62
+ [:unshift, 'Models matchers', 'lib/billomat/models'],
63
+ [:unshift, 'Models matchers specs', 'spec/models']
64
+ ].reverse
65
+
66
+ vendors.each do |method, type, dir, pattern|
67
+ ::STATS_DIRECTORIES.send(method, [type, dir, pattern].compact)
68
+ ::CodeStatistics::TEST_TYPES << type if type.include? 'specs'
69
+ end
70
+
71
+ # Setup annotations
72
+ ENV['SOURCE_ANNOTATION_DIRECTORIES'] = 'spec,doc'
73
+
74
+ desc 'Enumerate all annotations'
75
+ task :notes do
76
+ SourceAnnotationExtractor.enumerate '@?OPTIMIZE|@?FIXME|@?TODO', tag: true
77
+ end