growi-client 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []