netdocuments 0.0.1

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,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: []