nexboard-api 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3e047c812b6cf48c7a5547a9050bdc065cc6cd24
4
+ data.tar.gz: 6774b3d922aa629043e442a394db4c0f90c316bd
5
+ SHA512:
6
+ metadata.gz: ceb3c2311b48125696bcd32ce2800cfe37ea2d4e423a6c797212bd926c0d8ca1d93e786bf12658e2e7dce3dcad4ebb5df86e962841104084358615e9df8fe81c
7
+ data.tar.gz: da197a3152093c18ebbfddf7a8d8d8dafc29f64c06aa2341346c4291f001222086c9c98101355ee5f852d264682fe9c7a0c4c0c122554e6f7c26356887cfdb15
data/README.md ADDED
@@ -0,0 +1,33 @@
1
+ # Nexboard API
2
+
3
+ `nexboard-api` is a wrapper for the Nexboard API (see http://nexboard-api.nexenio.com/) packaged as Ruby Gem.
4
+
5
+ The gem uses Restify (https://github.com/jgraichen/restify) for handling HTTP communication.
6
+
7
+ ## Usage
8
+ Initialize the API with `API key` and `user_id` (both provided with your Nexboard API account). You can optionally add a `template_project_id`, which would be a Nexboard `project_id` where you store boards meant as templates for your application. If you run your own Nexboard server, you can add a custom `base_url`.
9
+
10
+ ```ruby
11
+ require 'nexboard_api'
12
+
13
+ params = {
14
+ api_key = 'my_secret_api_key',
15
+ user_id = 1,
16
+ template_project_id = 123,
17
+ base_url = 'https://my-server.example.com/api/public/'
18
+ }
19
+
20
+ nexboard_api = NexboardApi.new **params
21
+
22
+ ```
23
+
24
+ tbc.
25
+
26
+ ## Contributing
27
+
28
+ - Fork it
29
+ - Create your feature branch (git checkout -b my-new-feature)
30
+ - Commit specs for your feature so that I do not break it later
31
+ - Commit your changes (git commit -am 'Add some feature')
32
+ - Push to the branch (git push origin my-new-feature)
33
+ - Create new Pull Request
@@ -0,0 +1,62 @@
1
+ class NexboardApi
2
+ DEFAULT_BASE_URL = 'https://nexboard.nexenio.com/portal/api/public/'.freeze
3
+
4
+ attr_reader :api_key, :user_id, :template_project_id, :base_url
5
+
6
+ def initialize(api_key:, user_id:, template_project_id: nil, base_url: nil)
7
+ @api_key = api_key
8
+ @user_id = user_id
9
+ @template_project_id = template_project_id unless template_project_id.nil?
10
+ @base_url = if base_url.nil?
11
+ DEFAULT_BASE_URL
12
+ else
13
+ base_url
14
+ end
15
+ end
16
+
17
+ def get_project_ids
18
+ projects = Restify.new(@base_url + 'projects')
19
+ .get(userId: @user_id, token: @api_key)
20
+ .value!
21
+
22
+ projects.data.map{|project| project['project_id']}
23
+ end
24
+
25
+ def create_project(title:, description:)
26
+ data = {
27
+ title: title,
28
+ description: description,
29
+ user_id: @user_id
30
+ }
31
+
32
+ Restify.new(@base_url + 'projects')
33
+ .post(data, token: @api_key)
34
+ .value!
35
+ end
36
+
37
+ def get_boards_for_project(project_id:)
38
+ Restify.new(@base_url + 'projects/{project_id}/boards')
39
+ .get(project_id: project_id, token: @api_key, userId: @user_id)
40
+ .value!
41
+ end
42
+
43
+ def get_template_boards
44
+ return [] if @template_project_id.nil?
45
+ template_boards = get_boards_for_project(project_id: @template_project_id)
46
+ template_boards.data.map{ |board| {board_id: board['boardId'], title: board['title'] } }
47
+ end
48
+
49
+ def create_board_for_project(project_id:, title:, description:, template_id: nil)
50
+ data = {
51
+ project_id: project_id,
52
+ title: title,
53
+ description: description,
54
+ user_id: @user_id
55
+ }
56
+ data.merge!(template_id: template_id) unless template_id.nil?
57
+
58
+ Restify.new(@base_url + 'boards')
59
+ .post(data, token: @api_key)
60
+ .value!
61
+ end
62
+ end
@@ -0,0 +1,20 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.name = 'nexboard-api'
3
+ spec.version = '0.1.0'
4
+ spec.authors = ['Xikolo Development Team']
5
+ spec.email = %w(xikolo-dev@hpi.uni-potsdam.de)
6
+ spec.description = %q{Ruby wrapper for Nexboard API (https://nexboard.nexenio.com)}
7
+ spec.summary = %q{Ruby wrapper for Nexboard API (https://nexboard.nexenio.com)}
8
+ spec.homepage = 'https://github.com/openHPI/nexboard-api'
9
+ spec.license = ''
10
+
11
+ spec.files = Dir['**/*'].grep(/((bin|lib|test|spec|features)\/|
12
+ .*\.gemspec|.*LICENSE.*|.*README.*|.*CHANGELOG.*)/x)
13
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
14
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
15
+ spec.require_paths = %w(lib)
16
+
17
+ spec.add_dependency 'restify'
18
+
19
+ spec.add_development_dependency 'bundler', '~> 1.3'
20
+ end
@@ -0,0 +1,130 @@
1
+ require 'spec_helper'
2
+
3
+ describe NexboardApi do
4
+ let(:api_key) { 'RandomApiKey' }
5
+ let(:user_id) { 1337 }
6
+ let(:params) { {api_key: api_key, user_id: user_id} }
7
+
8
+ let(:api) { NexboardApi.new **params }
9
+
10
+ let(:default_base_url) { 'https://nexboard.nexenio.com/portal/api/public/' }
11
+ let(:default_headers) { {'Content-Type' => 'application/json'} }
12
+
13
+ describe '#initialize' do
14
+ subject { NexboardApi.new **params }
15
+
16
+ it 'should be initialized with correct params' do
17
+ expect(subject.api_key).to eq(api_key)
18
+ expect(subject.user_id).to eq(user_id)
19
+ expect(subject.base_url).to eq(default_base_url)
20
+ end
21
+
22
+ context 'with custom base_url' do
23
+ let(:params) { super().merge(base_url: 'https://p3k.com') }
24
+
25
+ it 'should be initialized with custom base_url' do
26
+ expect(subject.base_url).to eq('https://p3k.com')
27
+ end
28
+ end
29
+
30
+ context 'with template_project_id' do
31
+ let(:params) { super().merge(template_project_id: 666) }
32
+
33
+ it 'should be initialized with template_project_id' do
34
+ expect(subject.template_project_id).to eq(666)
35
+ end
36
+ end
37
+ end
38
+
39
+ describe '#get_project_ids' do
40
+ subject { api.get_project_ids }
41
+
42
+ let!(:projects_stub) do
43
+ stub_request(:get, "#{default_base_url}projects?token=#{api_key}&userId=#{user_id}").
44
+ with(headers: default_headers).
45
+ to_return(status: 200, body: "[{\"project_id\": 1}, {\"project_id\": 3000}]", headers: default_headers)
46
+ end
47
+
48
+ it 'should request Nexboard API' do
49
+ subject
50
+ expect(projects_stub).to have_been_requested
51
+ end
52
+
53
+ it 'should return a list of project ids' do
54
+ expect(subject).to eq([1, 3000])
55
+ end
56
+ end
57
+
58
+ describe '#create_project' do
59
+ let(:create_params) { {title: 'My project', description: 'My description'} }
60
+
61
+ subject { api.create_project **create_params }
62
+
63
+ let!(:create_project_stub) do
64
+ stub_request(:post, "#{default_base_url}projects?token=#{api_key}").
65
+ with(headers: default_headers, body: create_params.merge(user_id: user_id)).
66
+ to_return(status: 200, body: "{}", headers: default_headers)
67
+ end
68
+
69
+ it 'should request Nexboard API' do
70
+ subject
71
+ expect(create_project_stub).to have_been_requested
72
+ end
73
+ end
74
+
75
+ describe '#get_boards_for_project' do
76
+ let(:project_id) { 123 }
77
+
78
+ subject { api.get_boards_for_project project_id: project_id }
79
+
80
+ let(:board) do
81
+ {
82
+ boardId: 1,
83
+ project_id: project_id,
84
+ title: 'My board',
85
+ description: 'My description'
86
+ }
87
+ end
88
+
89
+ let!(:boards_stub) do
90
+ stub_request(:get, "#{default_base_url}projects/#{project_id}/boards?token=#{api_key}&userId=#{user_id}").
91
+ with(headers: default_headers).
92
+ to_return(status: 200, body: "[#{board.to_json}]", headers: default_headers)
93
+ end
94
+
95
+ it 'should request Nexboard API' do
96
+ subject
97
+ expect(boards_stub).to have_been_requested
98
+ end
99
+
100
+ it 'should return a list of board resources' do
101
+ expect(subject.data.to_json).to eq([board].to_json)
102
+ end
103
+ end
104
+
105
+ describe '#create_board_for_project' do
106
+ let(:create_params) { {project_id: 123, title: 'My title', description: 'My description'} }
107
+
108
+ subject { api.create_board_for_project **create_params }
109
+
110
+ let(:create_board_stub) do
111
+ stub_request(:post, "#{default_base_url}boards?token=#{api_key}").
112
+ with(headers: default_headers, body: create_params.merge(user_id: user_id)).
113
+ to_return(status: 200, body: "{}", headers: default_headers)
114
+ end
115
+
116
+ before { create_board_stub; subject }
117
+
118
+ it 'should request Nexboard API' do
119
+ expect(create_board_stub).to have_been_requested
120
+ end
121
+
122
+ context 'with template_id' do
123
+ let(:create_params) { super().merge(template_id: 1234) }
124
+
125
+ it 'should request Nexboard API' do
126
+ expect(create_board_stub).to have_been_requested
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,53 @@
1
+ # This file is copied to spec/ when you run 'rails generate rspec:install'
2
+ require 'simplecov'
3
+ SimpleCov.start do
4
+ at_exit do
5
+ result = SimpleCov.result
6
+ SimpleCov::Formatter::HTMLFormatter.new.format result
7
+ end
8
+ end
9
+
10
+ require 'rspec'
11
+ require 'webmock/rspec'
12
+ require 'nexboard_api'
13
+ require 'restify'
14
+
15
+ # Requires supporting ruby files with custom matchers and macros, etc,
16
+ # in spec/support/ and its subdirectories.
17
+ Dir['spec/support/**/*.rb'].each {|f| require f}
18
+
19
+ RSpec.configure do |config|
20
+ # ## Mock Framework
21
+ #
22
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
23
+ #
24
+ # config.mock_with :mocha
25
+ # config.mock_with :flexmock
26
+ # config.mock_with :rr
27
+
28
+ # Run specs in random order to surface order dependencies. If you find an
29
+ # order dependency and want to debug it, you can fix the order by providing
30
+ # the seed, which is printed after each run.
31
+ # --seed 1234
32
+ config.order = 'random'
33
+
34
+ config.expect_with :rspec do |expectations|
35
+ # Enable only the newer, non-monkey-patching expect syntax.
36
+ # For more details, see:
37
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
38
+ expectations.syntax = :expect
39
+ end
40
+
41
+ # rspec-mocks config goes here. You can use an alternate test double
42
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
43
+ config.mock_with :rspec do |mocks|
44
+ # Enable only the newer, non-monkey-patching expect syntax.
45
+ # For more details, see:
46
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
47
+ mocks.syntax = :expect
48
+
49
+ # Prevents you from mocking or stubbing a method that does not exist on
50
+ # a real object. This is generally recommended.
51
+ mocks.verify_partial_doubles = true
52
+ end
53
+ end
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nexboard-api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Xikolo Development Team
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-08-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: restify
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
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ description: Ruby wrapper for Nexboard API (https://nexboard.nexenio.com)
42
+ email:
43
+ - xikolo-dev@hpi.uni-potsdam.de
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - README.md
49
+ - lib/nexboard_api.rb
50
+ - nexboard-api.gemspec
51
+ - spec/lib/nexboard_api_spec.rb
52
+ - spec/spec_helper.rb
53
+ homepage: https://github.com/openHPI/nexboard-api
54
+ licenses:
55
+ - ''
56
+ metadata: {}
57
+ post_install_message:
58
+ rdoc_options: []
59
+ require_paths:
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ requirements: []
72
+ rubyforge_project:
73
+ rubygems_version: 2.5.1
74
+ signing_key:
75
+ specification_version: 4
76
+ summary: Ruby wrapper for Nexboard API (https://nexboard.nexenio.com)
77
+ test_files:
78
+ - spec/lib/nexboard_api_spec.rb
79
+ - spec/spec_helper.rb