textrepo 0.4.1 → 0.4.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4d26af6dd86e8b79c9e50300f8c31102bf79d5c751e175740a7225c2ca4a9b33
4
- data.tar.gz: 8d398c0848c0a4b06d2a775f3cb6bf1f49489be7f5ba5d8cf7eab2aad068b5c7
3
+ metadata.gz: c2806e2488be378495f29ed25dd9d04937d50706a5d7772b5d93fd4d242a675d
4
+ data.tar.gz: a031757c1eb5fa5ec644b7c6674d030f93aebf07c93ad061ea96711532ab8b79
5
5
  SHA512:
6
- metadata.gz: ef79855cd99ebc3baea4368c00cdc4d439478cfc9733d45eee1e7a08ca005bf0dc15824cb57b46326c982e724acc762b25b722c112f19ae4f67349d575fffdcb
7
- data.tar.gz: 4af657999971e6d3cef41dc5d3ef7ea1017a536b772372d38e79ffb91196c239585a0c932fe10e42f9d7ccbfee8fa477ec31bd97afa9cd4e1c31f0c894772110
6
+ metadata.gz: bcf5e7162744e0d0ba1e0e1745c37b7718749d3aae2ac83c6c8af8f9c032d8b85af38abbbf61d3f19ec49e640060362bcc55085bb7e930868294068314f5da21
7
+ data.tar.gz: d2074f1b5a09a8741e8172d51d90c31f7c17552473d834e866cb3f7f1d43d2f2633a7daa2aa50a12d2a17202aa58f43466c151793a9368eb7b3fb39977a0379b
data/.gitignore CHANGED
@@ -1,8 +1,56 @@
1
- /.bundle/
2
- /.yardoc
3
- /_yardoc/
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
4
  /coverage/
5
- /doc/
5
+ /InstalledFiles
6
6
  /pkg/
7
7
  /spec/reports/
8
+ /spec/examples.txt
9
+ /test/tmp/
10
+ /test/version_tmp/
8
11
  /tmp/
12
+
13
+ # Used by dotenv library to load environment variables.
14
+ # .env
15
+
16
+ # Ignore Byebug command history file.
17
+ .byebug_history
18
+
19
+ ## Specific to RubyMotion:
20
+ .dat*
21
+ .repl_history
22
+ build/
23
+ *.bridgesupport
24
+ build-iPhoneOS/
25
+ build-iPhoneSimulator/
26
+
27
+ ## Specific to RubyMotion (use of CocoaPods):
28
+ #
29
+ # We recommend against adding the Pods directory to your .gitignore. However
30
+ # you should judge for yourself, the pros and cons are mentioned at:
31
+ # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
32
+ #
33
+ # vendor/Pods/
34
+
35
+ ## Documentation cache and generated files:
36
+ /.yardoc/
37
+ /_yardoc/
38
+ /doc/
39
+ /rdoc/
40
+
41
+ ## Environment normalization:
42
+ /.bundle/
43
+ /vendor/bundle
44
+ /lib/bundler/man/
45
+
46
+ # for a library or gem, you might want to ignore these files since the code is
47
+ # intended to run in multiple environments; otherwise, check them in:
48
+ # Gemfile.lock
49
+ # .ruby-version
50
+ # .ruby-gemset
51
+
52
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
53
+ .rvmrc
54
+
55
+ # Used by RuboCop. Remote config files pulled in from inherit_from directive.
56
+ # .rubocop-https?--*
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- textrepo (0.4.1)
4
+ textrepo (0.4.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/Rakefile CHANGED
@@ -35,3 +35,12 @@ end
35
35
  task :clobber => :clean_sandbox
36
36
  CLOBBER << 'test/fixtures/notes'
37
37
  CLOBBER << 'test/fixtures/test_repo'
38
+
39
+ require "rdoc/task"
40
+
41
+ RDoc::Task.new do |rdoc|
42
+ rdoc.generator = "ri"
43
+ rdoc.rdoc_dir = "doc"
44
+ rdoc.rdoc_files.include("lib/**/*.rb")
45
+ rdoc.markup = "markdown"
46
+ end
@@ -1,26 +1,46 @@
1
1
  require 'fileutils'
2
2
 
3
3
  module Textrepo
4
- # A concrete repository which uses the default file system as a storage.
4
+ ##
5
+ # A concrete class which implements Repository interfaces. This
6
+ # repository uses the default file system of the operating system as
7
+ # a text storage.
5
8
  class FileSystemRepository < Repository
6
- attr_reader :path, :extname
9
+ ##
10
+ # Repository root.
11
+ attr_reader :path
7
12
 
13
+ ##
14
+ # Extension of notes sotres in the repository.
15
+ attr_reader :extname
16
+
17
+ ##
18
+ # Default name for the repository which uses when no name is
19
+ # specified in the configuration settings.
8
20
  FAVORITE_REPOSITORY_NAME = 'notes'
21
+
22
+ ##
23
+ # Default extension of notes which uses when no extname is
24
+ # specified in the configuration settings.
9
25
  FAVORITE_EXTNAME = 'md'
10
26
 
11
- # `conf` must be a Hash object. It must hold the follwoing
12
- # values:
27
+ ##
28
+ # Creates a new repository object. The argument, `conf` must be a
29
+ # Hash object. It should hold the follwoing values:
13
30
  #
14
- # - :repository_type (:file_system)
15
- # - :repository_name => basename of the root path for the repository
16
- # - :repository_base => the parent directory path for the repository
17
- # - :default_extname => extname for a file stored into in the repository
31
+ # - MANDATORY:
32
+ # - :repository_type => `:file_system`
33
+ # - :repository_base => the parent directory path for the repository
34
+ # - OPTIONAL: (if not specified, default values are used)
35
+ # - :repository_name => basename of the root path for the repository
36
+ # - :default_extname => extname for a file stored into in the repository
18
37
  #
19
38
  # The root path of the repository looks like the following:
20
39
  # - conf[:repository_base]/conf[:repository_name]
21
40
  #
22
41
  # Default values are set when `repository_name` and `default_extname`
23
42
  # were not defined in `conf`.
43
+ #
24
44
  def initialize(conf)
25
45
  super
26
46
  base = conf[:repository_base]
@@ -30,12 +50,13 @@ module Textrepo
30
50
  @extname = conf[:default_extname] || FAVORITE_EXTNAME
31
51
  end
32
52
 
33
- #
34
- # repository operations
35
- #
36
-
53
+ ##
37
54
  # Creates a file into the repository, which contains the specified
38
55
  # text and is associated to the timestamp.
56
+ #
57
+ # :call-seq:
58
+ # create(Timestamp, Array) => Timestamp
59
+ #
39
60
  def create(timestamp, text)
40
61
  abs = abspath(timestamp)
41
62
  raise DuplicateTimestampError, timestamp if FileTest.exist?(abs)
@@ -45,8 +66,13 @@ module Textrepo
45
66
  timestamp
46
67
  end
47
68
 
69
+ ##
48
70
  # Reads the file content in the repository. Then, returns its
49
71
  # content.
72
+ #
73
+ # :call-seq:
74
+ # read(Timestamp) => Array
75
+ #
50
76
  def read(timestamp)
51
77
  abs = abspath(timestamp)
52
78
  raise MissingTimestampError, timestamp unless FileTest.exist?(abs)
@@ -57,8 +83,13 @@ module Textrepo
57
83
  content
58
84
  end
59
85
 
86
+ ##
60
87
  # Updates the file content in the repository. A new timestamp
61
88
  # will be attached to the text.
89
+ #
90
+ # :call-seq:
91
+ # update(Timestamp, Array) => Timestamp
92
+ #
62
93
  def update(timestamp, text)
63
94
  raise EmptyTextError if text.empty?
64
95
  org_abs = abspath(timestamp)
@@ -75,7 +106,12 @@ module Textrepo
75
106
  new_stamp
76
107
  end
77
108
 
109
+ ##
78
110
  # Deletes the file in the repository.
111
+ #
112
+ # :call-seq:
113
+ # delete(Timestamp) => Array
114
+ #
79
115
  def delete(timestamp)
80
116
  abs = abspath(timestamp)
81
117
  raise MissingTimestampError, timestamp unless FileTest.exist?(abs)
@@ -86,7 +122,12 @@ module Textrepo
86
122
  content
87
123
  end
88
124
 
125
+ ##
89
126
  # Finds entries of text those timestamp matches the specified pattern.
127
+ #
128
+ # :call-seq:
129
+ # entries(String = nil) => Array
130
+ #
90
131
  def entries(stamp_pattern = nil)
91
132
  results = []
92
133
 
@@ -117,12 +158,24 @@ module Textrepo
117
158
  results
118
159
  end
119
160
 
161
+ # :stopdoc:
120
162
  private
121
163
  def abspath(timestamp)
122
- filename = timestamp.to_pathname + ".#{@extname}"
164
+ filename = timestamp_to_pathname(timestamp) + ".#{@extname}"
123
165
  File.expand_path(filename, @path)
124
166
  end
125
167
 
168
+ ##
169
+ # ```
170
+ # %Y %m %d %H %M %S suffix %Y/%m/ %Y%m%d%H%M%S %L
171
+ # "2020-12-30 12:34:56 (0 | nil)" => "2020/12/20201230123456"
172
+ # "2020-12-30 12:34:56 (7)" => "2020/12/20201230123456_007"
173
+ # ```
174
+ def timestamp_to_pathname(timestamp)
175
+ yyyy, mo = Timestamp.split_stamp(timestamp.to_s)[0..1]
176
+ File.join(yyyy, mo, timestamp.to_s)
177
+ end
178
+
126
179
  def write_text(abs, text)
127
180
  FileUtils.mkdir_p(File.dirname(abs))
128
181
  File.open(abs, 'w') { |f|
@@ -1,11 +1,17 @@
1
1
  module Textrepo
2
+ ##
3
+ # Timstamp is generated from a Time object. It converts a time to
4
+ # string in the obvious format, such "20201023122400".
5
+ #
2
6
  class Timestamp
3
7
  include Comparable
4
8
 
5
9
  attr_reader :time, :suffix
6
10
 
7
- # time: a Time instance
8
- # suffix: an Integer instance
11
+ ##
12
+ # :call-seq:
13
+ # new(Time, Integer = nil)
14
+ #
9
15
  def initialize(time, suffix = nil)
10
16
  @time = time
11
17
  @suffix = suffix
@@ -20,26 +26,29 @@ module Textrepo
20
26
  result == 0 ? (sfx <=> osfx) : result
21
27
  end
22
28
 
29
+ ##
30
+ # Generate an obvious time string.
31
+ #
32
+ # ```
23
33
  # %Y %m %d %H %M %S suffix
24
34
  # "2020-12-30 12:34:56 (0 | nil)" => "20201230123456"
25
35
  # "2020-12-30 12:34:56 (7)" => "20201230123456_007"
36
+ # ```
37
+ #
26
38
  def to_s
27
39
  s = @time.strftime("%Y%m%d%H%M%S")
28
40
  s += "_#{"%03u" % @suffix}" unless @suffix.nil? || @suffix == 0
29
41
  s
30
42
  end
31
43
 
32
- # %Y %m %d %H %M %S suffix %Y/%m/ %Y%m%d%H%M%S %L
33
- # "2020-12-30 12:34:56 (0 | nil)" => "2020/12/20201230123456"
34
- # "2020-12-30 12:34:56 (7)" => "2020/12/20201230123456_007"
35
- def to_pathname
36
- @time.strftime("%Y/%m/") + self.to_s
37
- end
38
-
39
44
  class << self
45
+ ##
46
+ # ```
40
47
  # yyyymoddhhmiss sfx yyyy mo dd hh mi ss sfx
41
48
  # "20201230123456" => "2020", "12", "30", "12", "34", "56"
42
49
  # "20201230123456_789" => "2020", "12", "30", "12", "34", "56", "789"
50
+ # ```
51
+ #
43
52
  def split_stamp(stamp_str)
44
53
  # yyyy mo dd hh mi ss sfx
45
54
  a = [0..3, 4..5, 6..7, 8..9, 10..11, 12..13, 15..17].map {|r| stamp_str[r]}
@@ -51,13 +60,6 @@ module Textrepo
51
60
  Timestamp.new(Time.new(year, mon, day, hour, min, sec), sfx)
52
61
  end
53
62
 
54
- # (-2)
55
- # 0 8 |(-1)
56
- # V V VV
57
- # "2020/12/20201230123456" => "2020-12-30 12:34:56"
58
- def parse_pathname(pathname)
59
- parse_s(pathname[8..-1])
60
- end
61
63
  end
62
64
  end
63
65
  end
@@ -1,3 +1,3 @@
1
1
  module Textrepo
2
- VERSION = '0.4.1'
2
+ VERSION = '0.4.2'
3
3
  end
@@ -7,7 +7,7 @@ Gem::Specification.new do |spec|
7
7
  spec.email = ["mnbi@users.noreply.github.com"]
8
8
 
9
9
  spec.summary = %q{A repository to store text with timestamp.}
10
- spec.description = %q{Textrepo is a repository to store text with timestamp. It can manage text with the attached timestamp (read/update/delte).}
10
+ spec.description = %q{Textrepo is a repository to store text with timestamp. It can manage text with the attached timestamp (create/read/update/delete).}
11
11
  spec.homepage = "https://github.com/mnbi/textrepo"
12
12
  spec.license = "MIT"
13
13
  spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: textrepo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - mnbi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-15 00:00:00.000000000 Z
11
+ date: 2020-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.1'
27
27
  description: Textrepo is a repository to store text with timestamp. It can manage
28
- text with the attached timestamp (read/update/delte).
28
+ text with the attached timestamp (create/read/update/delete).
29
29
  email:
30
30
  - mnbi@users.noreply.github.com
31
31
  executables: []