rospatent 1.0.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.
data/lib/rospatent.rb ADDED
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "rospatent/version"
4
+ require_relative "rospatent/configuration"
5
+ require_relative "rospatent/input_validator"
6
+ require_relative "rospatent/cache"
7
+ require_relative "rospatent/logger"
8
+ require_relative "rospatent/patent_parser"
9
+ require_relative "rospatent/client"
10
+ require_relative "rospatent/search"
11
+ require_relative "rospatent/errors"
12
+
13
+ # Load Rails integration if Rails is available
14
+ require_relative "rospatent/railtie" if defined?(Rails)
15
+
16
+ # Main module for the Rospatent API client
17
+ module Rospatent
18
+ class << self
19
+ attr_writer :configuration
20
+
21
+ # Returns the current configuration
22
+ # @return [Rospatent::Configuration] Current configuration
23
+ def configuration
24
+ @configuration ||= Configuration.new
25
+ end
26
+
27
+ # Configure the gem
28
+ # @yield [config] Configuration block
29
+ # @yieldparam [Rospatent::Configuration] config The configuration object
30
+ def configure
31
+ yield(configuration)
32
+ end
33
+
34
+ # Creates a new client instance
35
+ # @param token [String] API token (optional if already set in configuration)
36
+ # @param logger [Rospatent::Logger] Custom logger instance (optional)
37
+ # @param cache [Rospatent::Cache] Custom cache instance (optional)
38
+ # @param options [Hash] Additional client options
39
+ # @return [Rospatent::Client] A new client instance
40
+ def client(token = nil, logger: nil, cache: nil, **)
41
+ Client.new(token: token, logger: logger, cache: cache, **)
42
+ end
43
+
44
+ # Create a shared cache instance
45
+ # @param ttl [Integer] Time to live in seconds
46
+ # @param max_size [Integer] Maximum cache size
47
+ # @return [Rospatent::Cache] Shared cache instance
48
+ def shared_cache(ttl: nil, max_size: nil)
49
+ @shared_cache ||= Cache.new(
50
+ ttl: ttl || configuration.cache_ttl,
51
+ max_size: max_size || configuration.cache_max_size
52
+ )
53
+ end
54
+
55
+ # Create a shared logger instance
56
+ # @param level [Symbol] Log level
57
+ # @param formatter [Symbol] Log formatter (:json or :text)
58
+ # @return [Rospatent::Logger] Shared logger instance
59
+ def shared_logger(level: nil, formatter: nil)
60
+ @shared_logger ||= Logger.new(
61
+ level: level || configuration.log_level,
62
+ formatter: formatter || (configuration.environment == "production" ? :json : :text)
63
+ )
64
+ end
65
+
66
+ # Reset the configuration to defaults
67
+ def reset
68
+ @configuration = Configuration.new
69
+ @shared_cache = nil
70
+ @shared_logger = nil
71
+ end
72
+
73
+ # Clear all shared resources
74
+ def clear_shared_resources
75
+ @shared_cache&.clear
76
+ @shared_cache = nil
77
+ @shared_logger = nil
78
+ end
79
+
80
+ # Get global statistics (if shared cache is being used)
81
+ # @return [Hash] Global usage statistics
82
+ def statistics
83
+ cache_stats = @shared_cache&.statistics || { size: 0, hits: 0, misses: 0 }
84
+
85
+ {
86
+ configuration: {
87
+ environment: configuration.environment,
88
+ cache_enabled: configuration.cache_enabled,
89
+ api_url: configuration.effective_api_url
90
+ },
91
+ cache: cache_stats,
92
+ shared_resources: {
93
+ cache_initialized: !@shared_cache.nil?,
94
+ logger_initialized: !@shared_logger.nil?
95
+ }
96
+ }
97
+ end
98
+
99
+ # Validate the current configuration
100
+ # @return [Array<String>] Array of validation errors (empty if valid)
101
+ def validate_configuration
102
+ errors = []
103
+
104
+ unless configuration.valid_environment?
105
+ errors << "Invalid environment: #{configuration.environment}"
106
+ end
107
+
108
+ errors << "API token is required" if configuration.token.nil? || configuration.token.empty?
109
+
110
+ errors << "Timeout must be positive" if configuration.timeout <= 0
111
+
112
+ errors << "Retry count cannot be negative" if configuration.retry_count.negative?
113
+
114
+ errors
115
+ end
116
+ end
117
+ end
metadata ADDED
@@ -0,0 +1,167 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rospatent
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Aleksandr Dryzhuk
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2025-06-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.13'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.13'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday-follow_redirects
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.3'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: faraday-retry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.3'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '5.20'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '5.20'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.59'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.59'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-minitest
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.34'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.34'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop-rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.6'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.6'
111
+ description: A comprehensive Ruby client for interacting with the Rospatent patent
112
+ search API. Features include automatic caching, request validation, structured logging,
113
+ error handling, and batch operations for efficient patent data retrieval.
114
+ email:
115
+ - dev@ad-it.pro
116
+ executables: []
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - CHANGELOG.md
121
+ - LICENSE.txt
122
+ - README.md
123
+ - lib/generators/rospatent/install/install_generator.rb
124
+ - lib/generators/rospatent/install/templates/README
125
+ - lib/generators/rospatent/install/templates/initializer.rb
126
+ - lib/rospatent.rb
127
+ - lib/rospatent/cache.rb
128
+ - lib/rospatent/client.rb
129
+ - lib/rospatent/configuration.rb
130
+ - lib/rospatent/errors.rb
131
+ - lib/rospatent/input_validator.rb
132
+ - lib/rospatent/logger.rb
133
+ - lib/rospatent/patent_parser.rb
134
+ - lib/rospatent/railtie.rb
135
+ - lib/rospatent/search.rb
136
+ - lib/rospatent/version.rb
137
+ homepage: https://hub.mos.ru/ad/rospatent
138
+ licenses:
139
+ - MIT
140
+ metadata:
141
+ homepage_uri: https://hub.mos.ru/ad/rospatent
142
+ source_code_uri: https://hub.mos.ru/ad/rospatent
143
+ changelog_uri: https://hub.mos.ru/ad/rospatent/blob/main/CHANGELOG.md
144
+ documentation_uri: https://hub.mos.ru/ad/rospatent/blob/main/README.md
145
+ bug_tracker_uri: https://hub.mos.ru/ad/rospatent/issues
146
+ wiki_uri: https://hub.mos.ru/ad/rospatent/wiki
147
+ rubygems_mfa_required: 'true'
148
+ post_install_message:
149
+ rdoc_options: []
150
+ require_paths:
151
+ - lib
152
+ required_ruby_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: 3.3.0
157
+ required_rubygems_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ requirements: []
163
+ rubygems_version: 3.5.22
164
+ signing_key:
165
+ specification_version: 4
166
+ summary: Ruby client for Rospatent API with caching and validation
167
+ test_files: []