netdocuments 0.0.1

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: 89874c198a59a40e7aec1be860b935b5cb414259
4
+ data.tar.gz: 08d0337c9e1f2636846b63911b4a2b075969fefe
5
+ SHA512:
6
+ metadata.gz: f2a452c532c4ac8a5ccd6e0624dbc0f5eac17c9b083f5c68acb232d52393138f8515ecb23a62933ed2d7a90476c1a8d55648a88c122f1b85025b6297096043f0
7
+ data.tar.gz: d38c321c4214b5d89c07ff7bbe6c457692d442e39a36aa4617ef3e77763bee4e3269ba3122427bebbb20ae7b05d53958dd974720a94cb75d7b80ed5c7f4dce17
@@ -0,0 +1,33 @@
1
+ require 'json'
2
+ require 'httparty'
3
+ require 'time_difference'
4
+ require 'parallel'
5
+ require 'logger'
6
+ require_relative 'netdocuments/base'
7
+ require_relative 'netdocuments/cabinet'
8
+ require_relative 'netdocuments/folder'
9
+ require_relative 'netdocuments/node'
10
+ require_relative 'netdocuments/document'
11
+ require_relative 'netdocuments/path_formatter'
12
+ require_relative 'netdocuments/configuration'
13
+ require_relative 'netdocuments/client'
14
+ require_relative 'netdocuments/access_token_master'
15
+
16
+ #$logger = Logger.new("/var/log/netdocuments.log")
17
+
18
+
19
+
20
+ module Netdocuments
21
+
22
+ class << self
23
+ attr_writer :configuration
24
+ end
25
+
26
+ def self.configuration
27
+ Configuration.new
28
+ end
29
+
30
+ def self.configure
31
+ yield(configuration)
32
+ end
33
+ end
@@ -0,0 +1,38 @@
1
+ module Netdocuments
2
+ class AccessTokenMaster
3
+
4
+ attr_reader :token,:grant_type,:client_secret,:url,:refresh_token
5
+
6
+ def initialize(opts = {})
7
+ @grant_type = 'refresh_token'
8
+ @url = 'https://api.vault.netvoyage.com/v1/OAuth'
9
+ @client_secret = opts[:client_secret]
10
+ @refresh_token = opts[:refresh_token]
11
+ @generated_at = Time.now
12
+ @validity = 30 #this is in minutes
13
+ @token = get_token
14
+ end
15
+
16
+ def get_token
17
+ response = HTTParty.post(@url,
18
+ body: {
19
+ grant_type: @grant_type,
20
+ refresh_token: @refresh_token
21
+ },
22
+ headers: {
23
+ 'Authorization' => "Basic #{@client_secret}"
24
+ }
25
+ )
26
+ response['access_token']
27
+ end
28
+
29
+
30
+ def valid?
31
+ last_generated_minutes_ago <= @validity
32
+ end
33
+
34
+ def last_generated_minutes_ago
35
+ TimeDifference.between(@generated_at,Time.now).in_minutes
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,37 @@
1
+ module Netdocuments
2
+ class Base
3
+
4
+ END_POINT = 'https://api.vault.netvoyage.com'
5
+
6
+ def post(opts = {})
7
+ HTTParty.post(END_POINT + opts[:url],
8
+ :body => opts[:body],
9
+ :headers => opts[:headers])
10
+ end
11
+
12
+
13
+ def get(opts = {})
14
+ HTTParty.get(END_POINT + opts[:url],
15
+ query: opts[:query],
16
+ headers: opts[:headers])
17
+ end
18
+
19
+ def put(opts = {})
20
+ HTTParty.put(END_POINT + opts[:url],
21
+ body: opts[:query],
22
+ headers: opts[:headers])
23
+ end
24
+
25
+
26
+ def validate_config!
27
+ #$logger.info "Token is: #{@client.access_token.valid? ? 'valid' : 'invalid'} ..Last generated: #{@client.access_token.last_generated_minutes_ago} minutes ago. "
28
+ if @client.access_token.valid?
29
+ true
30
+ else
31
+ # $logger.info "Fetching new token..."
32
+ @client.get_token!
33
+ end
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,42 @@
1
+ module Netdocuments
2
+ class Cabinet < Base
3
+
4
+ attr_reader :id
5
+
6
+ def initialize(client,opts = {})
7
+ @client = client
8
+ validate_config!
9
+ @headers = {'Authorization' => "Bearer #{@client.access_token.token}"}
10
+ @id = opts[:id] if opts[:id]
11
+ end
12
+
13
+
14
+ def find_folder_tree_and_update_file_path
15
+ subfolders_count = 0
16
+ Parallel.map(folders,in_threads: 50) do |folder|
17
+ subfolders = folder.subfolders
18
+ subfolders_count = subfolders.count #folder.subfolders.flatten.count
19
+ #$logger.info "Collected: #{subfolders_count}"
20
+ Parallel.map(subfolders,in_threads: 75){|node| node.update }
21
+ end
22
+ subfolders_count
23
+ end
24
+
25
+ def folder_tree
26
+ folders.collect {|folder| folder.subfolders}
27
+ end
28
+
29
+ def folders
30
+ # $logger.info "Fetching folders..."
31
+ response = get(url: "/v1/Cabinet/#{@id}/folders",
32
+ query: {'$select' => "standardAttributes"},
33
+ headers: @headers)
34
+ response["ndList"]["standardList"]["ndProfile.DocumentStat"].collect {|i| Netdocuments::Folder.new(@client,{id: i['id'],name: i['name']})}
35
+ end
36
+
37
+
38
+ def info
39
+ get(url: "/v1/Cabinet/#{@id}/info",headers: @headers)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,18 @@
1
+ module Netdocuments
2
+ class Client
3
+
4
+ attr_reader :refresh_token,:client_secret,:access_token
5
+
6
+
7
+ def initialize(opts = {})
8
+ @refresh_token = opts[:refresh_token]
9
+ @client_secret = opts[:client_secret]
10
+ end
11
+
12
+
13
+ def get_token
14
+ @access_token = Netdocuments::AccessTokenMaster.new(client_secret: @client_secret,
15
+ refresh_token: @refresh_token)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,10 @@
1
+ module Netdocuments
2
+ class Configuration
3
+
4
+ attr_accessor :cabinet_id
5
+
6
+ def initialize
7
+ @cabinet_id = 'abc'
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,26 @@
1
+ module Netdocuments
2
+ class Document < Base
3
+
4
+ def initialize(client,opts = {})
5
+ @client = client
6
+ validate_config!
7
+ @headers = {'Authorization' => "Bearer #{@client.access_token.token}"}
8
+ @id = opts[:id] if opts[:id]
9
+ @name = opts[:name] if opts[:name]
10
+ @query = opts[:query] if opts[:query]
11
+ @parent = opts[:parent] if opts[:parent]
12
+ end
13
+
14
+
15
+ def info
16
+ get(url: "/v1/Document/#{@id}/info",headers: @headers)
17
+ end
18
+
19
+ def update_info(opts = {})
20
+ put(url: "/v1/Document/#{@id}/info",
21
+ query: opts[:query],
22
+ headers: @headers.merge({'Content-Type' => 'application/json'}))
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,93 @@
1
+ module Netdocuments
2
+ class Folder < Base
3
+
4
+ attr_reader :id,:name,:query,:parent,:cabinet_id,:client
5
+
6
+ def initialize(client,opts = {})
7
+ @client = client
8
+ validate_config!
9
+ @headers = {'Authorization' => "Bearer #{@client.access_token.token}"}
10
+ @id = opts[:id] if opts[:id]
11
+ @name = opts[:name] if opts[:name]
12
+ @query = opts[:query] if opts[:query]
13
+ @parent = opts[:parent] if opts[:parent]
14
+
15
+ end
16
+
17
+
18
+ def cabinet_id
19
+ Netdocuments.configuration.cabinet_id
20
+ end
21
+
22
+ def create
23
+ post(url: '/v1/Folder',
24
+ body: {
25
+ name: @name,
26
+ parent: @parent
27
+ },
28
+ headers: @headers)
29
+ end
30
+
31
+ def info
32
+ get(url: "/v1/Folder/#{@id}/info",
33
+ headers: @headers)
34
+ end
35
+
36
+ def folder_content
37
+ begin
38
+ response = get(url: "/v1/Folder/#{id}",
39
+ query: {'$select' => 'standardAttributes'},
40
+ headers: @headers)
41
+ response["ndList"]["standardList"].nil? ? [] : [response["ndList"]["standardList"]["ndProfile.DocumentStat"]].flatten
42
+ rescue Exception => e
43
+ #$logger.error "======== #{id} ======== #{e.message}"
44
+ #$logger.error e.backtrace.join("\n")
45
+ []
46
+ end
47
+
48
+ end
49
+
50
+
51
+ def folder_extraction(opts = {})
52
+ contents = Netdocuments::Folder.new(@client, {id: opts[:id]}).folder_content
53
+ col = contents.collect do |folder|
54
+ obj = Netdocuments::Node.new(@client,name: folder['name'],
55
+ id: folder['id'],
56
+ extension: folder['extension'],
57
+ parent: opts[:parent])
58
+ obj
59
+ end
60
+ end
61
+
62
+
63
+ def subfolders
64
+ # $logger.info "Starting subfolder collection for: #{name}"
65
+ nodes = []
66
+ ids = [{id: @id,parent: "WorkspaceResetTest/#{name}"}]
67
+ loop do
68
+ sleep 0.5
69
+ r = ids.collect do |id|
70
+ folder_extraction(id)
71
+ end.flatten!
72
+ nodes << r
73
+ folders = r.select {|i| i.extension == 'ndfld'}
74
+ ids = folders.collect {|o| {id: o.id,parent: "#{o.parent}/#{o.name}"}}
75
+ break if ids.count == 0
76
+ end
77
+ nodes.flatten!
78
+ end
79
+
80
+
81
+ def ancestry
82
+ response = get(url: "/v1/Folder/#{@id}/ancestry",headers: @headers)
83
+ end
84
+
85
+ def update_info(opts = {})
86
+ response = put(url: "/v1/Folder/#{@id}/info",
87
+ query: opts[:query],
88
+ headers: @headers.merge({'Content-Type' => 'application/json'}))
89
+ end
90
+
91
+
92
+ end
93
+ end
@@ -0,0 +1,27 @@
1
+ module Netdocuments
2
+ class Node < Base
3
+
4
+
5
+ attr_reader :name,:id,:extension,:parent,:client
6
+
7
+ def initialize(client,opts = {})
8
+ @client = client
9
+ validate_config!
10
+ @name = opts[:name]
11
+ @id = opts[:id]
12
+ @extension = opts[:extension]
13
+ @parent = opts[:parent]
14
+ end
15
+
16
+ def update
17
+ # $logger.info "Updating #{name} with file path as #{parent}"
18
+ if extension == 'ndfld'
19
+ q1 = {'customAttributes' => [{"id" => "48","value" => Netdocuments::PathFormatter.new(parent).format}]}
20
+ Netdocuments::Folder.new(@client,id: id).update_info({query: q1.to_json})
21
+ else
22
+ q1 = {'customAttributes' => [{"id" => "48","value" => Netdocuments::PathFormatter.new(parent).format}]}
23
+ Netdocuments::Document.new(@client,id: id).update_info({query: q1.to_json})
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ module Netdocuments
2
+ class PathFormatter
3
+
4
+ attr_reader :path
5
+ def initialize(path)
6
+ @path = path
7
+ end
8
+
9
+ def format
10
+ arr = @path.split('/')
11
+ root_node = arr.last
12
+ arr.pop
13
+ arr.join(' / ') + " / " + root_node
14
+ end
15
+ end
16
+ end
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: netdocuments
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - ankit8898
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.2'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 3.2.0
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '3.2'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 3.2.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: rspec-collection_matchers
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.1'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 1.1.2
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '1.1'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 1.1.2
53
+ - !ruby/object:Gem::Dependency
54
+ name: httparty
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ type: :development
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ - !ruby/object:Gem::Dependency
68
+ name: time_difference
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ - !ruby/object:Gem::Dependency
82
+ name: parallel
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ description: A ruby wrapper to access the Netdocuments Rest API
96
+ email: ankit.gupta8898@gmail.com
97
+ executables: []
98
+ extensions: []
99
+ extra_rdoc_files: []
100
+ files:
101
+ - lib/netdocuments.rb
102
+ - lib/netdocuments/access_token_master.rb
103
+ - lib/netdocuments/base.rb
104
+ - lib/netdocuments/cabinet.rb
105
+ - lib/netdocuments/client.rb
106
+ - lib/netdocuments/configuration.rb
107
+ - lib/netdocuments/document.rb
108
+ - lib/netdocuments/folder.rb
109
+ - lib/netdocuments/node.rb
110
+ - lib/netdocuments/path_formatter.rb
111
+ homepage: https://rubygems.org/gems/netdocuments
112
+ licenses:
113
+ - MIT
114
+ metadata: {}
115
+ post_install_message: Thanks for installing!
116
+ rdoc_options: []
117
+ require_paths:
118
+ - lib
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ requirements: []
130
+ rubyforge_project:
131
+ rubygems_version: 2.4.5
132
+ signing_key:
133
+ specification_version: 4
134
+ summary: Ruby wrapper for Netdocuments API
135
+ test_files: []