lib/fakeetc/users.rb in fakeetc-0.1.0 vs lib/fakeetc/users.rb in fakeetc-0.2.0

- old
+ new

@@ -1,14 +1,94 @@ -module FakeEtc +module FakeEtc # rubocop:disable Documentation class << self - [:endpwent, - :getpwent, - :getpwnam, - :getpwuid, - :passwd, - :setpwent].each do |m| - define_method(m) do - fail NotImplementedError, "FakeEtc.#{m} not implemented yet" + # Adds users to the FakeEtc user list. + # + # @param user_hash [Hash{String=>Hash{Symbol=>Integer,String}}] + # the list of users that should be added + # + # @example + # FakeEtc.add_users({ + # 'janedoe' => { uid: 10, + # gid: 20, + # gecos: 'Jane Doe', + # dir: '/home/janedoe', + # shell: '/bin/zsh' }, + # 'jackdoe' => { uid: 50, + # gid: 60, + # gecos: 'Jack Doe', + # dir: '/home/jackdoe', + # shell: '/bin/bash' }, + # }) + # + # @return [void] + def add_users(user_hash) + passwd = 'x' + + user_hash.each do |user_name, user_info| + user = Struct::Passwd.new(user_name, + passwd, + user_info[:uid], + user_info[:gid], + user_info[:gecos], + user_info[:dir], + user_info[:shell]) + @users[user_name] = user end + end + + # Clears the user list. + # @return [void] + def clear_users + @users = {} + end + + # Finds a user by their user name. + # @param user_name [String] the user's name + # @return [Struct::Passwd] the user + # @raise [ArgumentError] if no user with the given name can be + # found + def getpwnam(user_name) + user = @users[user_name] + fail ArgumentError, "can't find user for #{user_name}" if user.nil? + user + end + + # Finds a user by their user id. + # @param uid [Integer] the user's id + # @return [Struct::Passwd] the user + # @raise [ArgumentError] if no user with the given id can be found + def getpwuid(uid) + user = @users.values.find { |u| u.uid == uid } + fail ArgumentError, "can't find user for #{uid}" if user.nil? + user + end + + # Returns an entry from the user list. Each successive call + # returns the next entry or `nil` if the end of the list has been + # reached. + # + # To reset scanning the user list, use {endpwent}. + # + # @return [Struct::Passwd] the next entry in the user list + def getpwent + @pwents ||= @users.values + @pwents.shift + end + + # Ends the process of scanning through the user list. + # @return [void] + def endpwent + @pwents = nil + end + alias_method :setpwent, :endpwent + + # Executes a block for each user entry. + # @yield [Struct::Passwd] the user entry + # @return [void] + def passwd + return getpwent unless block_given? + @users.values.each { |u| yield u } + endpwent + nil end end end