productive 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d6bbda2ba26520dea3d18c61ee5dad955d1cff23
4
+ data.tar.gz: c548d9825ab20b7b2c4add3abc57a697a418841b
5
+ SHA512:
6
+ metadata.gz: c92f9cad758a6f5d0287edd37b72515ec8d7dfd0b127ada6f5193b0ae4d31772aa38c3d23507c9a99084b68a94f6393a1cab985101ebfd83c5ec8de04acf852e
7
+ data.tar.gz: 8e61f057da799703f68bd46c4f9074f6158f9482b1e07d8b4aa6f28efef8f77b0ba0eebaf7d881d2c7e0b4969c4edff6b8f139cad85eda940f1e08415fb54c38
@@ -0,0 +1,2 @@
1
+ *.gem
2
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Josip Bišćan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,68 @@
1
+ # Productive API client
2
+
3
+ Productive API client is a gem based on [JsonApiClient](https://github.com/chingor13/json_api_client). It provides resource classes for resources available in Productive API.
4
+
5
+ ## Installation
6
+
7
+ Include the gem in your Gemfile
8
+ ```ruby
9
+ gem 'productive'
10
+ ```
11
+
12
+ Bundle the Gemfile
13
+ ```ruby
14
+ bundle install
15
+ ```
16
+
17
+ ## Initialize
18
+
19
+ If you're using the gem in Rails project, run:
20
+ ```ruby
21
+ rails generate productive API_KEY ACCOUNT_ID
22
+ ```
23
+ which will generate ```config/initializers/productive.rb``` initializer, setting up your `API_KEY` and `ACCOUNT ID`.
24
+
25
+ If you're using the gem in a standalone project, you need to configure the `API_KEY` and `ACCOUNT_ID` and setup the `Productive::Base` resource class:
26
+ ```ruby
27
+ Productive.configure do |config|
28
+ config.api_key = ENV['productive_api_key']
29
+ config.account_id = ACCOUNT_ID
30
+ end
31
+
32
+ Productive::Base.setup
33
+ ```
34
+
35
+ ## Usage
36
+
37
+ For every resource available in Productive API, there is a resource class available for use similar to an `ActiveRecord` class.
38
+
39
+ Some examples:
40
+ ```ruby
41
+ Productive::Project.all
42
+ Productive::Project.paginate(per_page: 50).page(5).find
43
+
44
+ Productive::Project.where(client_id: 1).all
45
+ ```
46
+
47
+ ## Customizing
48
+
49
+ This gem uses a custom `JsonApiPaginator` based on the one available in `JsonApiClient`. If you need a different paginator, you can pass it as a configuration option:
50
+ ```ruby
51
+ Productive.configure do |config|
52
+ config.paginator = MyCustomPaginator
53
+ end
54
+ ```
55
+
56
+ By default, this gem utilises the Productive API available at https://productive.io/api/v2/, but if you need to use a different endpoint, you can pass that as a configuration option:
57
+ ```ruby
58
+ Productive.configure do |config|
59
+ config.base_url = 'http://productive.dev/api/v2/'
60
+ end
61
+ ```
62
+
63
+ ## Credits
64
+ Productive API client is maintained by [Productive](https://productive.io).and sponsored by [Infinum](https://infinum.co).
65
+
66
+ ## License
67
+ Copyright © 2016 Productive, Infinum.
68
+ Productive API client is free software, and may be redistributed under the terms specified in the LICENSE file.
@@ -0,0 +1,31 @@
1
+ require 'rails/generators'
2
+
3
+ class ProductiveGenerator < Rails::Generators::Base
4
+ source_root File.expand_path('../templates', __FILE__)
5
+
6
+ argument :api_key, required: true, desc: 'required'
7
+ argument :account_id, required: true, desc: 'required'
8
+
9
+ gem 'productive'
10
+
11
+ desc 'Configure Productive API client'
12
+
13
+ def create_initializer_file
14
+ unless /^[a-f0-9\-]{36}$/ =~ api_key
15
+ raise Thor::Error, "Invalid Productive API key #{api_key.inspect}\nYou can find the API key on the Settings -> Security page of https://productive.io"
16
+ end
17
+
18
+ unless /^[0-9]*$/ =~ account_id
19
+ raise Thor::Error, "Invalid Productive Account ID #{account_id.inspect}\n"
20
+ end
21
+
22
+ initializer 'productive.rb' do
23
+ <<-EOF
24
+ Productive.configure do |config|
25
+ config.api_key = #{api_key.inspect}
26
+ config.account_id = #{account_id.inspect}
27
+ end
28
+ EOF
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,64 @@
1
+ class JsonApiPaginator
2
+ attr_reader :params, :result_set, :links, :meta
3
+
4
+ def initialize(result_set, data)
5
+ @params = params_for_uri(result_set.uri)
6
+ @result_set = result_set
7
+ @links = data['links']
8
+ @meta = data['meta']
9
+ end
10
+
11
+ def next
12
+ links['next'] ? result_set.links.fetch_link('next') : nil
13
+ end
14
+
15
+ def prev
16
+ links['prev'] ? result_set.links.fetch_link('prev') : nil
17
+ end
18
+
19
+ def first
20
+ links['first'] ? result_set.links.fetch_link('first') : nil
21
+ end
22
+
23
+ def last
24
+ links['last'] ? result_set.links.fetch_link('last') : nil
25
+ end
26
+
27
+ def total_pages
28
+ if links['last']
29
+ uri = result_set.links.link_url_for('last')
30
+ last_params = params_for_uri(uri)
31
+ last_params['page[number]'].to_i
32
+ else
33
+ current_page
34
+ end
35
+ end
36
+
37
+ def total_entries
38
+ meta['total_count'].to_i || per_page * total_pages
39
+ end
40
+ alias_method :total_count, :total_entries
41
+
42
+ def per_page
43
+ params['page[size]'].to_i
44
+ end
45
+
46
+ def current_page
47
+ (params['page[number]'] || 1).to_i
48
+ end
49
+
50
+ def previous_page
51
+ current_page > 1 ? (current_page - 1) : nil
52
+ end
53
+
54
+ def next_page
55
+ current_page < total_pages ? (current_page + 1) : nil
56
+ end
57
+
58
+ private
59
+ def params_for_uri(uri)
60
+ return {} unless uri
61
+ uri = Addressable::URI.parse(uri)
62
+ uri.query_values || {}
63
+ end
64
+ end
@@ -0,0 +1,22 @@
1
+ require 'json_api_client'
2
+
3
+ require 'productive/version'
4
+ require 'productive/configuration'
5
+ require 'productive/resources/base'
6
+ require 'productive/resources/client'
7
+ require 'productive/resources/person'
8
+ require 'productive/resources/project'
9
+
10
+ require 'productive/railtie' if defined?(Rails::Railtie)
11
+
12
+ module Productive
13
+ class << self
14
+ def configure
15
+ yield configuration
16
+ end
17
+
18
+ def configuration
19
+ @configuration ||= Productive::Configuration.new
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,17 @@
1
+ require 'json_api_paginator'
2
+
3
+ module Productive
4
+ class Configuration
5
+ attr_accessor :api_key
6
+ attr_accessor :account_id
7
+ attr_accessor :base_url
8
+ attr_accessor :paginator
9
+
10
+ def initialize
11
+ self.api_key = ENV['PRODUCTIVE_API_KEY']
12
+ self.account_id = nil
13
+ self.base_url = 'https://productive.io/api/v2/'
14
+ self.paginator = JsonApiPaginator
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ require 'rails'
2
+
3
+ module Productive
4
+ class Railtie < Rails::Railtie
5
+ config.after_initialize do
6
+ Productive::Base.setup
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ module Productive
2
+ class Base < JsonApiClient::Resource
3
+ def self.setup
4
+ config = Productive.configuration
5
+ self.site = File.join config.base_url, config.account_id.to_s, '/'
6
+ self.connection_options = {headers: {'X-Auth-Token' => config.api_key}}
7
+ self.paginator = config.paginator
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,4 @@
1
+ module Productive
2
+ class Client < Base
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Productive
2
+ class Person < Base
3
+ end
4
+ end
@@ -0,0 +1,7 @@
1
+ module Productive
2
+ class Project < Base
3
+ has_one :client
4
+ has_one :project_manager, class_name: :person
5
+ has_one :last_actor, class_name: :person
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module Productive
2
+ VERSION = '0.2.0'
3
+ end
@@ -0,0 +1,17 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+ require 'productive/version'
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = 'productive'
6
+ s.version = Productive::VERSION.dup
7
+ s.platform = Gem::Platform::RUBY
8
+ s.summary = 'A JSONAPI-based client to consume Productive API'
9
+ s.homepage = 'https://github.com/infinum/productive_api_client'
10
+ s.description = 'Productive API client'
11
+ s.authors = ['Josip Bišćan']
12
+ s.email = 'josip@infinum.hr'
13
+ s.license = 'MIT'
14
+ s.files = `git ls-files`.split("\n")
15
+
16
+ s.add_dependency 'json_api_client'
17
+ end
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: productive
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Josip Bišćan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-08-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json_api_client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: Productive API client
28
+ email: josip@infinum.hr
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - ".gitignore"
34
+ - Gemfile
35
+ - LICENSE.txt
36
+ - README.md
37
+ - lib/generators/productive/productive_generator.rb
38
+ - lib/json_api_paginator.rb
39
+ - lib/productive.rb
40
+ - lib/productive/configuration.rb
41
+ - lib/productive/railtie.rb
42
+ - lib/productive/resources/base.rb
43
+ - lib/productive/resources/client.rb
44
+ - lib/productive/resources/person.rb
45
+ - lib/productive/resources/project.rb
46
+ - lib/productive/version.rb
47
+ - productive.gemspec
48
+ homepage: https://github.com/infinum/productive_api_client
49
+ licenses:
50
+ - MIT
51
+ metadata: {}
52
+ post_install_message:
53
+ rdoc_options: []
54
+ require_paths:
55
+ - lib
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ requirements: []
67
+ rubyforge_project:
68
+ rubygems_version: 2.5.1
69
+ signing_key:
70
+ specification_version: 4
71
+ summary: A JSONAPI-based client to consume Productive API
72
+ test_files: []