growi-client 0.9.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.
@@ -0,0 +1,73 @@
1
+ require 'rest-client'
2
+ require 'json'
3
+ require 'yaml'
4
+ require 'uri'
5
+
6
+ require 'growi/client/apireq/api_request_pages'
7
+ require 'growi/client/apireq/api_request_attachments'
8
+
9
+ # Growi のクライアントクラス
10
+ class GrowiClient
11
+
12
+ # コンストラクタ
13
+ def initialize(growi_url: '', access_token: '', rest_client_param: {})
14
+ raise ArgumentError, 'Config `growi_url` is required.' if growi_url.empty?
15
+ raise ArgumentError, 'Config `access_token` is required.' if access_token.empty?
16
+
17
+ @growi_url = growi_url
18
+ @access_token = access_token
19
+ @rest_client_param = rest_client_param
20
+ @cp_entry_point = URI.join(growi_url, '/_api/').to_s
21
+ end
22
+
23
+ # APIリクエストを送信する
24
+ # @param [ApiRequestBase] req APIリクエスト
25
+ # @return [String] APIリクエストの応答(JSON形式)
26
+ def request(req)
27
+ req.param[:access_token] = @access_token
28
+ return req.execute URI.join(@cp_entry_point, req.entry_point).to_s,
29
+ rest_client_param: @rest_client_param
30
+ end
31
+
32
+ # ページIDを取得する
33
+ # @param [String] path_exp ページパス
34
+ # @return [String] ページID
35
+ def page_id(path_exp: nil)
36
+ ret = request(GApiRequestPagesList.new path_exp: path_exp)
37
+ return nil if (ret.kind_of? CPInvalidRequest || ret.data.nil?)
38
+ return ret.data.find { |page| URI.unescape(page.path) == path_exp }&.id
39
+ end
40
+
41
+ # ページが存在するか調べる
42
+ # @param [String] path ページパス
43
+ # @return [true/false] ページの存在
44
+ def page_exist?(path_exp: nil)
45
+ return !page_id(path_exp: path_exp).nil?
46
+ end
47
+
48
+ # ページに添付ファイルが存在するか調べる
49
+ # @param [String] path_exp ページパス(正規表現)
50
+ # @param [String] attachment_name 添付ファイル名
51
+ # @return [true/false] 添付ファイルの存在
52
+ def attachment_exist?(path_exp: nil, attachment_name: nil)
53
+ ret = request(GApiRequestAttachmentsList.new page_id: page_id(path_exp: path_exp))
54
+ return ret&.ok && ret&.data&.find { |a| a.originalName == attachment_name } != nil
55
+ end
56
+
57
+ # 指定した添付ファイルのIDを取得する
58
+ # @param [String] path_exp ページパス(正規表現)
59
+ # @return [String] attachment's file name
60
+ def attachment_id(path_exp: nil, attachment_name: nil)
61
+ ret = request(GApiRequestAttachmentsList.new page_id: page_id(path_exp: path_exp))
62
+ return ret&.data&.find { |a| a.originalName == attachment_name }&._id
63
+ end
64
+
65
+ # 指定した添付ファイル情報を取得する
66
+ # @param [String] path_exp ページパス(正規表現)
67
+ # @return [String] attachment's file name
68
+ def attachment(path_exp: nil, attachment_name: nil)
69
+ ret = request(GApiRequestAttachmentsList.new page_id: page_id(path_exp: path_exp))
70
+ return ret&.data&.find { |a| a.originalName == attachment_name }
71
+ end
72
+
73
+ end
@@ -0,0 +1,36 @@
1
+ require 'growi/client/model/growi_model'
2
+
3
+ # Growi Attachment model class
4
+ class GrowiAttachment < GrowiModelBase
5
+ attr_reader :_id, :fileFormat, :fileName, :originalName, :filePath,
6
+ :creator, :page, :__v, :createdAt, :fileSize, :url
7
+
8
+ # Constractor
9
+ # @param [Hash] Attachment model shown as hash
10
+ # @todo Except running register method always called parse method.
11
+ def initialize(params = {})
12
+ init_params = {
13
+ _id: nil, fileFormat: '', fileName: '', originalName: '', filePath: nil,
14
+ creator: nil, page: '', __v: 0, createdAt: '', fileSize: 0, url: ''
15
+ }
16
+
17
+ params = init_params.merge(params.map { |k,v| [k.to_sym, v] }.to_h)
18
+ if (params[:_id] == nil)
19
+ raise ArgumentError.new('Parameters id is required.')
20
+ end
21
+
22
+ GrowiModelFactory.instance.register({
23
+ attachment_creator: Proc.new { |param| param != nil && param.is_a?(String) ? param : GrowiUser.new(param) },
24
+ attachment_createdAt: Proc.new { |date_str|
25
+ date_str != nil && DateTime.parse(date_str) },
26
+ })
27
+ maked_params = {}
28
+ params.each do |k,v|
29
+ maker = GrowiModelFactory.instance.maker('attachment_' + k.to_s)
30
+ maked_params[k] = maker.call(v)
31
+ end
32
+ super(maked_params)
33
+ end
34
+
35
+ end
36
+
@@ -0,0 +1,52 @@
1
+ require 'singleton'
2
+
3
+ require 'growi/client/model/growi_model_base'
4
+ require 'growi/client/model/growi_page'
5
+ require 'growi/client/model/growi_page_revision'
6
+ require 'growi/client/model/growi_user'
7
+ require 'growi/client/model/growi_attachment'
8
+
9
+ # Growi model factory class
10
+ # @abstract include singleton class
11
+ # @attr_reader makers Model maker list
12
+ class GrowiModelFactory
13
+ include Singleton
14
+ attr_reader :makers
15
+
16
+ # Constractor
17
+ def initialize
18
+ @makers = {}
19
+ @makers.default = Proc.new { |param|
20
+ next nil if param == nil
21
+ case param
22
+ when Array, String, Integer then
23
+ ret = param
24
+ when FalseClass then
25
+ ret = false
26
+ when TrueClass then
27
+ ret = true
28
+ end
29
+ next ret
30
+ }
31
+ end
32
+
33
+ # Register model maker
34
+ # @param [Hash] Model factory list
35
+ def register(makers = {})
36
+ makers.each do |model_name, model_make_proc|
37
+ unless model_make_proc.is_a?(Proc)
38
+ raise ArgumentError.new('Maker is required sub class of Class.')
39
+ end
40
+ end
41
+ @makers.merge!(makers)
42
+ end
43
+
44
+ # Get model maker
45
+ # @param [String] model_name Model name
46
+ # @return [Proc] Model maker
47
+ def maker(model_name)
48
+ return @makers[model_name&.to_sym]
49
+ end
50
+
51
+ end
52
+
@@ -0,0 +1,12 @@
1
+ # Growi model base class
2
+ class GrowiModelBase
3
+
4
+ # Constractor
5
+ def initialize(params = {})
6
+ params.each do |k,v|
7
+ instance_variable_set(:"@#{k}", v)
8
+ end
9
+ end
10
+
11
+ end
12
+
@@ -0,0 +1,53 @@
1
+ require 'growi/client/model/growi_model'
2
+
3
+ # Growi Page model class
4
+ class GrowiPage < GrowiModelBase
5
+ GRANT_PUBLIC = 1.freeze
6
+ GRANT_RESTRICTED = 2.freeze
7
+ GRANT_SPECIFIED = 3.freeze
8
+ GRANT_OWNER = 4.freeze
9
+
10
+ STATUS_WIP = 'wip'.freeze
11
+ STATUS_PUBLISHED = 'published'.freeze
12
+ STATUS_DELETED = 'deleted'.freeze
13
+ STATUS_DEPRECATED = 'deprecated'.freeze
14
+
15
+ attr_reader :_id, :redirectTo, :updatedAt, :lastUpdateUser,
16
+ :creator, :path, :__v, :revision, :createdAt,
17
+ :commentCount, :seenUsers, :liker, :grantedUsers,
18
+ :grant, :status, :id
19
+
20
+ # Constract
21
+ # @param [Hash] params Prameters data show as Hash
22
+ # @todo Except running register method always called parse method.
23
+ def initialize(params = {})
24
+ init_params = {
25
+ _id: '', redirectTo: nil, updatedAt: '', lastUpdateUser: '',
26
+ creator: nil, path: nil, __v: 0, revision: nil, createdAt: '',
27
+ commentCount: 0, seenUsers: [], liker: [], grantedUsers: [],
28
+ grant: 0, status: '', id: ''
29
+ }
30
+
31
+ params = init_params.merge(params.map { |k,v| [k.to_sym, v] }.to_h)
32
+ if (params[:_id] == nil || params[:path] == nil || params[:id] == nil)
33
+ raise ArgumentError.new('Parameters _id, path and id are required.')
34
+ end
35
+
36
+ # @note Parameters lastUpdateUser and creator have two patterns ID only or Object.
37
+ GrowiModelFactory.instance.register({
38
+ page_updatedAt: Proc.new { |str| str != nil && DateTime.parse(str) },
39
+ page_lastUpdateUser: Proc.new { |param| param != nil && param.is_a?(String) ? param : GrowiUser.new(param) },
40
+ page_creator: Proc.new { |param| param != nil && param.is_a?(String) ? param : GrowiUser.new(param) },
41
+ page_createdAt: Proc.new { |str| str != nil && DateTime.parse(str) },
42
+ page_revision: Proc.new { |param| param != nil && GrowiPageRevision.new(param) },
43
+ })
44
+ maked_params = {}
45
+ params.each do |k,v|
46
+ maker = GrowiModelFactory.instance.maker('page_' + k.to_s)
47
+ maked_params[k] = maker.call(v)
48
+ end
49
+ super(maked_params)
50
+ end
51
+
52
+ end
53
+
@@ -0,0 +1,34 @@
1
+ require 'growi/client/model/growi_model'
2
+
3
+ # Growi Page revision model class
4
+ class GrowiPageRevision < GrowiModelBase
5
+ attr_reader :_id, :author, :body, :path, :__v, :createdAt, :format
6
+
7
+ # Constractor
8
+ # @param [Hash] User model shown as hash
9
+ # @todo Except running register method always called parse method.
10
+ def initialize(params = {})
11
+ init_params = {
12
+ _id: '', author: nil, body: nil, path: nil, __v: 0, createdAt: nil,
13
+ format: ''
14
+ }
15
+
16
+ params = init_params.merge(params.map { |k,v| [k.to_sym, v] }.to_h)
17
+ if (params[:_id] == nil || params[:path] == nil)
18
+ raise ArgumentError.new('Parameters _id and path are required.')
19
+ end
20
+
21
+ GrowiModelFactory.instance.register({
22
+ page_revision_createdAt: Proc.new { |date_str|
23
+ date_str != nil && DateTime.parse(date_str) },
24
+ })
25
+ maked_params = {}
26
+ params.each do |k,v|
27
+ maker = GrowiModelFactory.instance.maker('page_revision_' + k.to_s)
28
+ maked_params[k] = maker.call(v)
29
+ end
30
+ super(maked_params)
31
+ end
32
+
33
+ end
34
+
@@ -0,0 +1,35 @@
1
+ require 'growi/client/model/growi_model'
2
+
3
+ # Growi User model class
4
+ class GrowiUser < GrowiModelBase
5
+ attr_reader :_id, :email, :username, :name,
6
+ :admin, :createdAt, :status, :lang, :isGravatarEnabled
7
+
8
+ # Constractor
9
+ # @param [Hash] User model shown as hash
10
+ # @todo Except running register method always called parse method.
11
+ def initialize(params = {})
12
+ init_params = {
13
+ _id: nil, email: nil, username: nil, name: '',
14
+ admin: false, createdAt: '', status: 0, lang: '', isGravatarEnabled: false
15
+ }
16
+
17
+ params = init_params.merge(params.map { |k,v| [k.to_sym, v] }.to_h)
18
+ if (params[:_id] == nil || params[:email] == nil || params[:username] == nil)
19
+ raise ArgumentError.new('Parameters id and email and name are required.')
20
+ end
21
+
22
+ GrowiModelFactory.instance.register({
23
+ user_createdAt: Proc.new { |date_str|
24
+ date_str != nil && DateTime.parse(date_str) },
25
+ })
26
+ maked_params = {}
27
+ params.each do |k,v|
28
+ maker = GrowiModelFactory.instance.maker('user_' + k.to_s)
29
+ maked_params[k] = maker.call(v)
30
+ end
31
+ super(maked_params)
32
+ end
33
+
34
+ end
35
+
@@ -0,0 +1,5 @@
1
+ module Growi
2
+ module Client
3
+ VERSION = "0.9.0"
4
+ end
5
+ end
@@ -0,0 +1,89 @@
1
+ box: ruby:2.5.1
2
+
3
+ # Run weseek/growi, mongo, elasticsearch
4
+ services:
5
+ - name: mongo
6
+ id: mongo:3.4
7
+
8
+ build:
9
+ # Steps make up the actions in your pipeline
10
+ # Read more about steps on our dev center:
11
+ # http://devcenter.wercker.com/docs/steps/index.html
12
+ steps:
13
+ - bundle-install
14
+
15
+ - script:
16
+ name: "Install utility tools"
17
+ code: |
18
+ apt-get update
19
+ apt-get install -y netcat
20
+
21
+ - script:
22
+ name: "Wait for MongoDB connection"
23
+ code: |
24
+ echo Wait for connect to $MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT
25
+ while ! nc -q 1 $MONGO_PORT_27017_TCP_ADDR $MONGO_PORT_27017_TCP_PORT </dev/null; do
26
+ echo "...waiting 3s"; sleep 3;
27
+ done
28
+
29
+ - internal/docker-run:
30
+ image: weseek/growi:3.1.12
31
+ name: growi
32
+ env: >
33
+ MONGO_URI=mongodb://$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/growi
34
+ PASSWORD_SEED=empty
35
+ FILE_UPLOAD=local
36
+
37
+ - script:
38
+ name: "Wait for GROWI connection"
39
+ code: |
40
+ echo Wait for connect to growi:3000
41
+ while ! nc -q 1 growi 3000 < /dev/null; do
42
+ echo "...waiting 3s"; sleep 3;
43
+ done
44
+ export GROWI_URL=http://growi:3000
45
+
46
+ - script:
47
+ name: "Create admin user"
48
+ code: |
49
+ export ADMIN_USER_NAME=admin1
50
+ export ADMIN_USER_PASS=admin1pass
51
+ LOGIN_COOKIE=login.cookie
52
+ OUTPUT_PAGE_NAME=installer.html
53
+ curl $GROWI_URL/installer -c ${LOGIN_COOKIE} -o ${OUTPUT_PAGE_NAME}
54
+ CSRF=`grep data-csrftoken ${OUTPUT_PAGE_NAME} | awk -F'=' '{ print $2 }' | sed -e s/\"//g`
55
+ curl $GROWI_URL/installer/createAdmin -b ${LOGIN_COOKIE} -X POST \
56
+ -d "registerForm[name]=${ADMIN_USER_NAME}&registerForm[username]=${ADMIN_USER_NAME}&registerForm[email]=${ADMIN_USER_NAME}@localhost&registerForm[password]=${ADMIN_USER_PASS}&_csrf=${CSRF}"
57
+
58
+ - script:
59
+ name: "Login as admin1"
60
+ code: |
61
+ OUTPUT_PAGE_NAME=login.html
62
+ curl $GROWI_URL/login -c ${LOGIN_COOKIE} -o ${OUTPUT_PAGE_NAME}
63
+ CSRF=`grep data-csrftoken ${OUTPUT_PAGE_NAME} | awk -F'=' '{ print $2 }' | sed -e s/\"//g`
64
+ curl $GROWI_URL/login -b ${LOGIN_COOKIE} -X POST -d "loginForm[username]=${ADMIN_USER_NAME}&loginForm[password]=${ADMIN_USER_PASS}&_csrf=${CSRF}"
65
+
66
+ - script:
67
+ name: "Generate API token"
68
+ code: |
69
+ OUTPUT_PAGE_NAME=apiToken.html
70
+ curl $GROWI_URL/me/apiToken -b ${LOGIN_COOKIE} -o ${OUTPUT_PAGE_NAME}
71
+ CSRF=`grep data-csrftoken ${OUTPUT_PAGE_NAME} | awk -F'=' '{ print $2 }' | sed -e s/\"//g`
72
+ curl $GROWI_URL/me/apiToken -b ${LOGIN_COOKIE} -X POST -d "apiTokenForm[confirm]=1&_csrf=${CSRF}"
73
+ curl $GROWI_URL/me/apiToken -b ${LOGIN_COOKIE} -o ${OUTPUT_PAGE_NAME}
74
+ export APITOKEN=`grep -A 10 'Current API Token' ${OUTPUT_PAGE_NAME} | grep '<input' | awk -F'value=' '{ print $2 }' | awk -F'"' '{ print $2 }'`
75
+
76
+ - script:
77
+ name: "Export environment variables"
78
+ code: |
79
+ export GROWI_URL=$GROWI_URL
80
+ export GROWI_ACCESS_TOKEN=$APITOKEN
81
+
82
+ - script:
83
+ name: "View environment variables"
84
+ code: |
85
+ env
86
+
87
+ - script:
88
+ name: rspec
89
+ code: bundle exec rspec
metadata ADDED
@@ -0,0 +1,153 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: growi-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ platform: ruby
6
+ authors:
7
+ - Ryu Sato
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-01-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.15'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.15'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec-json_matcher
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.1'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rest-client
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: json
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.1'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.1'
97
+ description: growi-client is client of growi with use API.
98
+ email:
99
+ - ryu@weseek.co.jp
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".rspec"
106
+ - ".travis.yml"
107
+ - CODE_OF_CONDUCT.md
108
+ - Gemfile
109
+ - LICENSE
110
+ - LICENSE.txt
111
+ - README.md
112
+ - Rakefile
113
+ - bin/console
114
+ - bin/setup
115
+ - growi-client.gemspec
116
+ - lib/growi-client.rb
117
+ - lib/growi/client/apireq/api_request_attachments.rb
118
+ - lib/growi/client/apireq/api_request_base.rb
119
+ - lib/growi/client/apireq/api_request_pages.rb
120
+ - lib/growi/client/client.rb
121
+ - lib/growi/client/model/growi_attachment.rb
122
+ - lib/growi/client/model/growi_model.rb
123
+ - lib/growi/client/model/growi_model_base.rb
124
+ - lib/growi/client/model/growi_page.rb
125
+ - lib/growi/client/model/growi_page_revision.rb
126
+ - lib/growi/client/model/growi_user.rb
127
+ - lib/growi/client/version.rb
128
+ - wercker.yml
129
+ homepage: https://github.com/ryu-sato/growi-client
130
+ licenses:
131
+ - MIT
132
+ metadata: {}
133
+ post_install_message:
134
+ rdoc_options: []
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ required_rubygems_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ requirements: []
148
+ rubyforge_project:
149
+ rubygems_version: 2.7.6
150
+ signing_key:
151
+ specification_version: 4
152
+ summary: Client of growi
153
+ test_files: []